freertos心跳中断_STM32与FreeRTOS实现低功耗

news/2024/7/24 12:47:59 标签: freertos心跳中断

在工作过程中,遇到这样一个产品,它基于 Cortex-M7 内核的 STM32F769 芯片,同时使用了 FreeRTOS

实时操作系统。

由于该产品使用电池供电,因此有着低功耗的需求。

接下来,我将简单描述一下 STM32 与 FreeRTOS 各自的低功耗特性,以及在配合使用时如何去实现产品的低功耗。

一、STM32F769 芯片的三种低功耗模式

STM32F769 支持三种低功耗模式,它们分别是:SLEEP、STOP和STANDBY,其省电能力依次增强。

SLEEP

在 SLEEP 模式下,只有 Cortex-M7 内核停止了工作,而外设仍然在运行。

在进入 SLEEP 模式后,所有中断均可唤醒 MCU,从而退出 SLEEP 模式。

STOP

在 STOP 模式下,内核停止工作,并且所有的时钟(如 HCLK, PCLK1, PCLK2

等)也停止工作,即所有外设停止工作,这里有一点要特别注意,此时 SYSTICK 也会被停掉。当然,我们产品中的 RTC

还在继续运行,因为它的时钟源为外部的 32.768K 晶振。

在进入 STOP 模式后,只有外部中断(EXTI)才能唤醒 MCU(由于 RTC 中断挂在外部中断线上,所以 RTC 中断也能唤醒

MCU)。

STANDBY

在 STANDBY 模式下,内核、所有的时钟、以及后备 1.2V 电源全部停止工作。

从 STANDBY 模式中唤醒后,系统相当于执行了一次复位操作,程序会从头来过。

综上所述,很明显地,在STM32 提供的这三种低功耗模式中,我们只能使用其中的 SLEEP 和 STOP 这两种,STANDBY

不适用。

二、FreeRTOS 的低功耗实现

在启动任务调度器时,FreeRTOS 会创建一个 IDLE 任务,其任务优先级最低,当且仅当所有其它任务均被阻塞时,IDLE

任务才会获得 CPU 使用权。

因此,可以很容易想到在 IDLE 任务里去实现进入与退出 STM32F769 的低功耗模式,即在切入 IDLE 任务后,让 STM32

也进入低功耗模式,而在即将切换出 IDLE 任务之前,去唤醒 STM32。

另外,较新版本的 FreeRTOS 中,增加了 Tickless mode,更详细的介绍请查看参考文献[2].

三、整个产品的低功耗实现

那么在 IDLE 任务里,要如何去确定当前 STM32 应该是进入 SLEEP 还是 STOP 模式呢?

考虑到 SLEEP 和 STOP 两者之间的差异,即 SLEEP 下任何中断均可唤醒 STM32,而在 STOP

下,只能通过外部中断去唤醒,所以,我们的产品采用了如下的机制:

在可确定的将来的一段时间内,如果程序员知道这期间会发生一个非外部中断,这时,就不能让 STM32 进入 STOP

模式。因为,一旦进入了 STOP,STM32 就只能响应外部中断,而不能对非外部中断(如串口、I2C 等外设中断)作出响应。

举个例子会更便于理解。假设这样一个场景 —— 通过中断去读取 I2C 数据。在程序员配置好 I2C 读取数据中断后,系统就处于等待

I2C 中断的状态。之后如果产生了 I2C 中断,就代表数据已经读取完毕,程序员接下来就可以去处理数据了。

接上面的,在配置好 I2C 读取数据中断后,如果此时 IDLE 任务得到执行,那么,这种情况下就不能让 STM32 进入 STOP

模式,而只能进入 SLEEP 模式。一旦产生了 I2C 中断,则 STM32 就会从 SLEEP 中被唤醒。而如果之前 STM32

进入了 STOP 模式,那么这个 I2C 中断就会被略掉了。

所以,在这个产品中,我们提供了两个接口,disable_enter_stop_mode 和

enable_enter_stop_mode,分别用来告知,当前不能进入 STOP 模式和当前可以进入 STOP 模式了。

整理一下,我们可以得到如下的流程图:

a4c26d1e5885305701be709a3d33442f.png

如果当前可以进入 STOP 模式,在真正进入 STOP 之前,还有一件事要做——配置 RTC 唤醒定时器,让其在某一时刻来唤醒

STM32。具体能在 STOP 模式下睡多长时间,由 FreeRTOS 中的 prvGetExpectedIdleTime

接口计算得出。

RTC 唤醒定时器配置完成后,即可通过调用 HAL_PWR_EnterSTOPMode 让 STM32 进入 STOP

模式了。如果此时没有任何中断处于 PENDING 状态,则 STM32 会立即进入 STOP 模式,如果此时有中断处于 PENDING

状态,则 STM32 不会进入 STOP 模式,代码会继续往下执行。

在 STM32 处于 STOP 模式期间,如果产生了任何外部中断(EXTI 中断),则 STM32 会被立马唤醒,不管 RTC

唤醒定时器有没有超时。如果期间一直没有外部中断,那么 STM32 会一直处于 STOP 模式,直到 RTC 唤醒定时器超时,从而将

STM32 唤醒。

另外,由于在 STOP 下,为 FreeRTOS 提供心跳时钟的 SYSTICK 也停止了工作,所以,在被唤醒之后,还需要将在

STOP 下流逝的时间告诉 FreeRTOS。

总之,降低整个产品功耗的基本思想,就是让 FreeRTOS 仅可能多的时间处于 IDLE 任务,让 STM32 尽可能多的时间处于

STOP 模式,最终达到尽可能多的降低功耗的目的。

过段时间有空了,再把相关的代码整理一下贴出来,以供参考。

参考文献:


http://www.niftyadmin.cn/n/797475.html

相关文章

Java秒杀简单设计三:数据封装类

上一篇https://www.cnblogs.com/taiguyiba/p/9828984.html 整合了数据库表和Dao层代码 这一篇继续设计数据封装类: 涉及到获取秒杀地址,查询,返回秒杀结果等内容 1.数据封装: 1.1 秒杀地址封装类Exposer 创建Exposer类&#xff0c…

JS复制到剪贴板

// 将内容复制到剪贴板copyRow(url) {let input document.createElement("input"); // js创建一个input输入框input.value url; // 将需要复制的文本赋值到创建的input输入框中,this.ruleForm.url这个是我要复制的内容document.body.appendChild(input)…

mysql备份要注意哪些_mysqldump备份数据需要注意的细节

导读用mysqldump备份数据时,加上 -w 条件选项过滤部分数据,发现导出结果比实际少了40万,什么情况?问题我的朋友小文前几天遇到一个怪事,他用mysqldump备份数据时,加上了 -w 选项过滤部分数据,发…

了解计算机的发展历程

前言 好好了解一下计算机历史,为什么会发展成今天这个样子?一个完整的计算机系统包括硬件系统和软件系统两部分,二者缺一不可。其实在电子计算机之前也有一些机械式的计算机,从功能上来说也确实可以帮助人类计算,但质的…

兼容各大浏览器导出Excel

// 下载模板downloadModel() {this.$http({url: this.$http.adornUrl("/prod/category/template"),method: "get",responseType: "blob", // 解决文件下载乱码问题}).then(({ data }) > {var blob new Blob([data], {type: "applicatio…

vue 样式class多选、单选,vue多选,vue单选

1.这里通过for循环列出数据&#xff0c;绑定需要写样式的className&#xff1a;原有className‘shop-checked’&#xff1b;选中classNameis-shop-checked <span v-for"(itemIn,index)in data" class"shop-checked-parcel" click"onShopChecked(i…

vooc充电原理_霸榜充电领域?OPPO125W超级闪充再现黑科技,权威外媒实力打Call...

要说这段时间科技圈的大新闻&#xff0c;肯定要数OPPO在闪充沟通会上发布的新一代超级闪充技术了。这其中所包括125W超级闪充技术&#xff0c;经测试可以在5分钟将电量充至41%&#xff0c;实现了20分钟充满等效4000mAh容量电池。此外&#xff0c;OPPO更将熄屏待机充电时的温度严…