目录
2、宏portSUPPRESS_TICKS_AND_SLEEP()
3、宏configPRE_SLEEP_PROCESSING ()和 configPOST_SLEEP_PROCESSING()
4、宏configEXPECTED_IDLE_TIME_BEFORE_SLEEP
1.了解低功耗Tickless模式
很多应用场合对于空耗的要求很严格,比如长期无人照看的数据采集仪器,可穿戴设备等。 其实很多 MCU 都有相应的低功耗模式,以此来降低设备运行时的功耗,进行裸机开发的时候就可以使用这些低功耗模式。但是现在我们要使用操作系统,因此操作系统对于低功耗的支持也显得尤为重要,这样硬件与软件相结合,可以进一步降低系统的功耗。这样开发也会方便很多,毕竟系统已经原生支持低功耗了,我们只需要按照系统的要求来做编写相应的应用层代码即可。FreeRTOS 提供了一个叫做 Tickless 的低功耗模式。
1.1 STM32F1 低功耗模式
STM32 本身就支持低功耗模式,以本教程使用的 STM32F429 为例,共有三种低功耗模式:
● 睡眠(Sleep)模式
● 停止(Stop)模式
● 待机(Standby)模式
这三种低功耗模式对应三种不同的功耗水平,根据实际的应用环境选择相对应的低功耗模式。
1 睡眠(Sleep)模式
● 进入睡眠模式
进入睡眠模式有两种指令:WFI(等待中断)和WFE(等待事件)。根据Cortex-M 内核的 SCR(系 统控制)寄存器可以选择使用立即休眠还是退出时休眠,当 SCR 寄存器的 SLEEPONEXIT(bit1) 位为 0 的时候使用立即休眠,当为 1 的时候使用退出时休眠。关于立即休眠和退出时休眠的详 细内容请参考《权威指南》“第 9 章 低功耗和系统控制特性”章节。
CMSIS(Cortex 微控制器软件接口标准)提供了两个函数来操作指令 WFI 和 WFE,我们可以 直接使用这两个函数: WFI 和 WFE 。FreeRTOS 系统会使用 WFI 指令进入休眠模式。
● 退出休眠模式
如果使用 WFI 指令进入休眠模式的话那么任意一个中断都会将 MCU 从休眠模式中唤醒, 如果使用WFE指令进入休眠模式的话那么当有事件发生的话就会退出休眠模式,比如配置一个 EXIT 线作为事件。
当 STM32F103 处于休眠模式的时候 Cortex-M3 内核停止运行,但是其他外设运行正常, 比如 NVIC 、SRAM 等。休眠模式的功耗比其他两个高,但是休眠模式没有唤醒延时,应用程 序可以立即运行。
2 停止(Stop)模式
停止模式基于 Cortex-M3 的深度休眠模式与外设时钟门控,在此模式下 1.2V 域的所有时钟都会停止,PLL、HSI 和 HSE RC 振荡器会被禁止,但是内部 SRAM 的数据会被保留。调压器可以工作在正常模式,也可配置为低功耗模式。如果有必要的话可以通过将 PWR_CR 寄存器的FPDS位置1来使 Flash 在停止模式的时候进入掉电状态,当 Flash 处于掉电状态的时候 MCU 从停止模式唤醒以后需要更多的启动延时。停止模式的进入和退出如表所示:
3 待机(Standby)模式
相比于前面两种低功耗模式,待机模式的功耗最低。待机模式是基于 Cortex-M3 的深度睡 眠模式的,其中调压器被禁止。1.2V 域断电,PLL 、HSI 振荡器和 HSE 振荡器也被关闭。除了备份区域和待机电路相关的寄存器外,SRAM 和其他寄存器的内容都将丢失。待机模式的进入和退出如表所示:
退出待机模式的话会导致 STM32F1 重启,所以待机模式的唤醒延时也是最大的。实际应 用中要根据使用环境和要求选择合适的待机模式。关于 STM32 低功耗模式的详细介绍和使用 请参考 ST