Wake and Sleep Using FreeRTOS on STM32F4/Cortex-M4

groger57 wrote on Tuesday, September 19, 2017:

I’m using an STM32F4 and have FreeRTOS 9.0.0 implemented.
There’s now a requirement to sleep (then wake) the device for short intervals to save battery power. Are there some examples using FreeRTOS on how this could be implemented?

Thank you for any guidance on this.

xz8987f wrote on Tuesday, September 19, 2017:

there are two basic things you can use:

You might have a read at https://mcuoneclipse.com/2013/07/06/low-power-with-freertos-tickless-idle-mode/ and https://mcuoneclipse.com/2014/02/09/iot-freertos-down-to-the-micro-amps/.

I hope this helps,

heinbali01 wrote on Tuesday, September 19, 2017:

There’s now a requirement to sleep the device for short intervals

Often it is more beneficial to sleep for longer intervals like 30 seconds or more. It is necessary to use tickless idle for that.

Can you tell which situations ( = i.e. which interrupts ) should wake-up your device? When that situation occurs, should it wake-up immediately?

Beside those great references mentioned by Erich, don’t forget to read AN4365 and RM0090 about the STM32F4 Power Controller.

Also think about each GPIO : pins that are defined as outputs, and/or pins that have an internal pull enabled, may consume power, depending on the circuit. When their actual output during sleep is not important, consider making them “inputs”. Floating ( undefined ) inputs may also increase consumption: when a level is around VCC / 2, the input logic may be unstable ( on/ off/ on). In those cases an internal pull may be useful.

Good luck.

groger57 wrote on Tuesday, September 19, 2017:

Thank you for the references, I’ll be sure to read them.

The sleep duration will be only 2 seconds, then it will self-wake. I was plannng on using the RTC to accomplish this. In my case, I have no external oscillator, but have already configured and tested the LSI for the RTC and it appears to be “ticking”. For what I would like to do, it’s accuracy should be OK.

The reason for doing so is to save power - the controller can be sleeping for up to 2 seconds, self-wake, check for the presence of a signal, and if there is a signal, execure the tasks. If not, back to sleep. I’m hoping to save at least 50% of the overall power consumption, provided there’s not a penalty for sleep/wake itself.

Yes - I already have all unused pins set as inputs and pulled high.