目录
2.2.1 宏 configUSE_TICKLESS_IDLE
2.2.2 宏 portSUPPRESS_TICKS_AND_SLEEP()
2.2.3 宏 configPRE_SLEEP_PROCESSING() 和 configPOST_SLEEP_PROCESSING()
2.2.4 宏 configEXPECTED_IDLE_TIME_BEFORE_SLEEP
很多应用场合对于功耗的要求很严格,比如长期无人照看的数据采集仪器,可穿戴设备等。很多 MCU 都有相应的低功耗模式,以此来降低设备运行时的功耗,进行裸机开发的时候就可以使用这些低功耗模式。操作系统对于低功耗的支持也非常重要,通过硬件与软件相结合,可以进一步降低系统的功耗。这样开发也非常方便,系统原生支持低功耗,我们只需要按照系统的要求来编写相应的应用层代码即可。FreeRTOS 提供了一个叫做 Tickless 的低功耗模式。
1. STM32F4 低功耗模式
STM32 本身就支持低功耗模式,我们在学习 STM32 的时候知道 STM32F4 共有三种低功耗模式:睡眠模式(Sleep)、停止模式(Stop) 和 待机模式(Standby)!
睡眠模式:
进入睡眠模式:WFI WFE
唤醒:任意中断 唤醒事件
对 1.2V 域时钟的影响:CPU CLK 关闭对其他时钟或模拟时钟源无影响
对 VDD 域时钟的影响:无
调压器:开启
停止模式:
进入停止模式:PDDS 和 LPDS 位 + SLEEPDEEP 位 + WFI 或 WFE
唤醒:任意 EXTI 线(在 EXTI 寄存器中配置,内部线和外部线)
对 1.2V 域时钟的影响:所有 1.2V 域时钟都关闭
对 VDD 域时钟的影响:HSI 和 HSE 振荡器关闭
调压器:开启或处于低功耗模式
待机模式:
进入待机模式:PDDS 位 + SLEEPDEEP 位 + WFI 或 WFE
唤醒:WKUP 引脚上升沿、RTC 闹钟(闹钟 A 或 闹钟 B)RTC 唤醒事件、RTC 入侵事件、RTC 时间戳事件、NRST 引脚外部复位、IWDG 复位
对 1.2V 域时钟的影响:所有 1.2V 域时钟都关闭
对 VDD 域时钟的影响:HSI 和 HSE 振荡器关闭
调压器:关闭
这三种低功耗模式对应三种不同的功耗水平,根据实际的应用环境选择相对应的低功耗模式。
1.1 睡眠(Sleep)模式
进入睡眠模式:
进入睡眠模式有两种指令:WFI(等待中断)和 WFE(等待事件)。根据 cortex-M 内核的 SCR(系统控制寄存器)可以选择使用立即休眠还是退出时休眠,当 SCR 寄存器的 SLEEPONEXIT(bit1) 位为 0 的时候使用立即休眠,当为 1 的时候使用退出时休眠。
CMSIS(Cortex 微控制器软件接口标准)提供了两个函数来操作指令 WFI 和 WFE,我们可以直接使用这两个函数 :_WFI 和 _WFE。FreeRTOS 系统会使用 WFI 指令进入休眠模式。
退出休眠模式:
如果使用 WFI 指令进入休眠模式的话那么任意一个中断都会将 MCU 从休眠模式中唤醒,如果使用 WFE 指令进入休眠模式的话那么当有事件发送的话就会退出休眠模式,比如配置一个 EXIT 线作为事件。
当 STM32F429 处于休眠模式的时候 Cortex-M4F 内核停止运行,但是其他外设运行正常,比如 NVID 、SRAM 等。休眠模式的功耗比其他两个高,但是休眠模式没有唤醒延迟,应用程序可以立即执行。
1.2 停止(Stop)模式
停止模式基于 Cortex-M4F 的深度休眠模式与外设时钟门控,在此模式下 1.2V 域的所有时钟都会停止,PLL、HSI 和 HSE RC 振荡器会被禁止,但是内部 SRAM 的数据会被保留。调压器可以工作在正常模式,也可以配置为低功耗模式。如果有必要的话可以通过将 PWR_CR 寄存器的 FPDS 位置 1 来使 Flash 在停止模式的时候进入掉电状态,当 Flash 处于掉电状态的时候 MCU 从停止模式唤醒以后需要更多的启动延时。
进入停止模式:
WFI(等待中断)或 WFE(等待事件),且
- 1. 将 Cortex-M4F 系统控制寄存器中 SLEEPDEEP 位置 1
- 2. 将电源控制寄存器(PWR_CR)中的 PDDS 位清零
- 3. 通过配置 PWR_CR 中的 LPDS 位选择调压器模式
注意:要进入停止模式,所有 EXTI 线挂起位、RTC 闹钟(闹钟 A 和 闹钟 B)、RTC 唤醒、RTC 入侵和 RTC 时间戳标志必须复位。否则将忽略进入停止模式这一过程,继续执行程序。
退出停止模式:
如果使用 WFI 进入:所有配置为中断模式的 EXTI 线(必须在 NVIC 中使能对应的 EXTI 中断向量)。
如果使用 WFE 进入:所有配置为事件模式的 EXTI 线。
1.3 待机(Standby)模式
相比于前面两种低功耗模式,待机模式的功耗最低。待机模式是基于 Cortex-M4F 的深度睡眠模式的,其中调压器被禁止。1.2V 域断电,PLL、HSI 振荡器和 HSE 振荡器也被关闭。除了备份区域和待机电路相关的寄存器外,SRAM 和其他寄存器的内容都将丢失。
进入待机模式:
WFI(等待中断)或WFE(等待事件),且:
- 1. 将 Cortex-M4F 系统控制寄存器中的 SLEEPDEEP 位置 1
- 2. 将电源控制寄存器 (PWR_CR) 中的 PDDS 位置 1
- 3. 将电源控制/状态寄存器(PWR_CSR)中的 WUF 位清零
- 4. 将与所选唤醒源(RTC 闹钟 A、RTC 闹钟 B、RTC 唤醒、RTC 入侵或 RTC 时间戳标志)对应的 RTC 标志清零
退出待机模式:
WKUP 引脚上升沿、RTC 闹钟(闹钟 A 和闹钟 B)、RTC 唤醒事件、RTC 入侵事件、RTC 时间戳事件、NRST 引脚外部复位和 IWDG 复位
退出待机模式的话会导致 STM32F4 重启,所以待机模式的唤醒延时也是最大的。
2. Tickless 模式详解
2.1 如何降低功耗
一般的简单应用中处理器大量的时间都在处理空闲任务,所以我们就可以考虑当处理器处理空闲任务的时候就进入低功耗模式,当需要处理应用层代码的时候就将处理器从低功耗模式中唤醒。FreeRTOS 就是通过在处理器处理空闲任务的时候将处理器设置为低功耗模式来降低功耗。一般会在空闲任务的钩子函数中执行低功耗相关处理,比如设置处理器进入低功耗模式、关闭其他外设时钟、降低系统主频等等。
FreeRTOS 的系统时钟是由滴答定时器中断来提供的,系统时钟频率越高,那么滴答定时器中断频率也就越高。中断是可以将 STM32F407 从睡眠模式中唤醒的,周期性的滴答定时器中断就会导致 STM32F407 周期性的进入和退出睡眠模

博客围绕STM32F4低功耗展开,介绍了睡眠、停止、待机三种低功耗模式及进入、唤醒方式。还阐述了FreeRTOS的Tickless模式,包括降低功耗原理、解决的问题及具体实现宏。最后给出低功耗Tickless模式实验,通过串口指令控制开发板LED和BEEP。
最低0.47元/天 解锁文章
1092

被折叠的 条评论
为什么被折叠?



