what are the main used ways of how to handle deep sleep of some microcontroller (atmega or a cortex m0/m0+) with waking up periodically? Right now, I'm building a Sigfox GPS tracker that should send GPS position every ~10 minutes and this interval should be configurable. I solved this problem in previous projects either by using external RTC IC (temperature compensated for great precision) or counting of 8sec intervals (let's see https://github.com/rocketscream/Low-Power). What are the other ways and their advantages? My plan is to either stick to the Arduino ecosystem or switch to the STM32 world (maybe with a bit of help of mbed platform). I really appreciate all your feedback.
Generally an RTC interrupt is the best way to go for a long period in deep sleep. If you can use the RTC built into the micro this will generally give you a simpler implementation but may not be the absolute lowest power possible or most accurate.
If you do go the mbed route then this library will probably be of use. However take care, some of the boards are not really well designed for lower power, while the processor will go into deep sleep on just about all of them some of the boards can't shut the rest of the circuits into low power modes and so the total system deep sleep power draw can be far higher that you'd hope for. Other boards are better able to cope with this and can get down to tiny power consumptions.
Your problem here is your 10 minutes mark, because (as you already know) the maximum interval of the watchdog timer of ATmega MCU is just 8 seconds.
One option would be to use a low-power, programmable, external timer like TPL5110. You can set an interval of up to 120 minutes by selecting the appropriate value of the programming resistor.
This kind of timers can be used to drive the gate of a logic-level P-channel MOSFET that acts as a switch for the power line of the Arduino (and for other parts of the circuit, if you want to cut down power consumption), like this:
Then, you simply you do all your stuff on the
setup() function and leave
loop() empty. You can switch off the Arduino by sending back a DONE signal to the TPL5110 at the end for your