FreeRTOS_低功耗Tickless模式

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

目录

1. STM32F4 低功耗模式

1.1 睡眠(Sleep)模式

1.2 停止(Stop)模式

1.3 待机(Standby)模式

2. Tickless 模式详解

2.1 如何降低功耗

2.2 Tickless 具体实现

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

3. 低功耗 Tickless 模式实验

3.1 main.c

3.2 usart.c


        很多应用场合对于功耗的要求很严格,比如长期无人照看的数据采集仪器,可穿戴设备等。很多 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 和 _WFEFreeRTOS 系统会使用 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 周期性的进入和退出睡眠模

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值