一、STM32低功耗模式


- 电池类产品,一般要求低功耗设计,比如农业物联网的节点采集设备
- 低功耗设计,除了MCU,软件硬件设计同等重要,以STC15低功耗实战为例说明
- Tickless模式主要针对睡眠模式当然,也可以自行使用停机模式,待机模式
- 由于STM32物联网实战板的硬件没有低功耗设计,本例程只讲解Tickless模式原理与应用
- STM32的3种低功耗详细讲解与应用编程,直接观看stm32物联网实战的视频,不再重复讲解
本次重点讲解FreeRTOS的Tickless模式
对于操作系统Freertos来说是使用睡眠模式的,停机和待机也可以用在操作系统上,但是需要修改代码
Freertos使用的是睡眠模式中的WFI模式,这是因为systick中断可以唤醒系统
二、Tickless模式
Tickless 低功耗机制是当前小型 RTOS 所采用的通用低功耗方法,比如FreeRTOS,RTX 和 uCOS-I等
Tickless 是怎样一种模式呢?
仅从字母上看,Tick 是滴答时钟的意思,less 是 Tick 的后缀,表示较少的,整体看就是表示减少滴答时钟节拍运行。
在FreeRTOS系统中,当用户任务都被挂起或者阻塞时,最低优先级的空闲任务会得到执行。那么STM32 支持的低功耗模式就可以放在空闲任务里面实现。为了实现低功耗最优设计,我们还不能直接把睡眠模式放空闲任务,因为Tick中断停止,将导致无法及时运行阻塞超时的任务,所以不能关闭Tick中断也就是不能直接失眠,进入空闲任务后,首先要计算可以执行低功耗的最大时间,也就是求出下一个要执行的高优先级任务还剩多少时间。然后就是把低功耗的唤醒时间设置为这个求出的时间(其实就是重载Systick),如果没有其它中断或事件唤醒STM32,到时间后Systick中断会将STM32唤醒,继续执行任务。
这个就是所谓的 Tickless 模式。从上面的讲解中可以看出,实现Tickless模式最麻烦的是计算低功耗可以执行的时间。这个难题,FreeRTOS 已为我们做好。
2、Tickless模式配置
① 将宏定义configUSE_TICKLESS_IDLE设置为1即可


② 配置 configEXPECTED_IDLE_TIME_BEFORE_SLEEP,只有当系统可运行于低功耗模式的时钟节拍数大于等于这个参数时,系统才可以进入到低功耗模式。
看一下前面的代码

先计算出来低功耗的时间:xExpectedIdleTime = prvGetExpectedIdleTime();
然后判断这个计算的时间是否大于这个参数
此参数已在 FreeRTOS.h文件中定义了,默认为2,用户可以自定义时,不能小于2

三、程序
- 如何在进入低功耗模式前关闭外设,退出模式后恢复,进一步降低系统功耗
- 如何在Tickless框架中应用待机与停机模式
1、首先系统初始化之后就会启动rtos内核

2、然后启动空闲任务

在空闲任务中监测是否开启了低功耗Tickless模式,也就是前面说的configUSE_TICKLESS_IDLE宏

以上这部分不需要我们去管,我们只需要修改前面说的两个宏
正式编程
1、STM32cubeMX配置
开启低功耗模式


2、configEXPECTED_IDLE_TIME_BEFORE_SLEEP设置
尽量不要在源码里面修改

我们可以在配置文件.h中进行修改,这样修改,后面我们在cubmx中再重新生成的话也不会被覆盖


3、在进入与退出Tickless模式时增加代码,通常是关闭外设等,此例程是关闭数码管显示,作为演示用。
进入低功耗和退出低功耗都会进入这两个函数,所以我们要在这两个函数中加入操作
需要处理这两个函数,第一个函数就是处理进入睡眠模式前,在里面关闭外设和时钟等。第二个函数中就需要恢复

比如这里我们在函数中加入关闭数码管

数码管的刷新任务中有这个获取任务通知,当任务中获取到了任务通知,会更新数码管,让数码管亮起来,当进入休眠的时候,又会关闭数码管,这样数码管就会一闪一闪的,但是如果时间太短,人眼无法看到,所以要想办法能够看到,办法就是在获取任务通知之前延时几十毫秒

