第2章 低功耗模式概览:STM32低功耗模式分类与CAN FD行为
做嵌入式系统,尤其是电池供电的设备,功耗永远是绕不开的话题。我记得刚入行那会儿,总觉得单片机跑起来就行,功耗嘛,大不了换个大电池。直到有一次做车载节点,客户要求静态电流低于50μA,我才真正开始认真研究低功耗模式。
这一章,咱们就把STM32的低功耗模式彻底捋一遍。重点看看CAN FD在这些模式下的表现——毕竟这是咱们课程的核心。
2.1 STM32低功耗模式分类
STM32的低功耗模式,说白了就是三种:Sleep(睡眠)、Stop(停止)、Standby(待机)。它们之间的区别,我习惯用一个比喻来解释:
- Sleep模式:就像你坐在工位上闭目养神。CPU不干活了,但所有外设都还通着电,随时能醒过来干活。
- Stop模式:相当于你离开工位去茶水间接杯水。CPU和大部分外设都断电了,但SRAM和寄存器里的数据还保留着。回来就能接着干。
- Standby模式:这是最狠的——直接下班回家。除了几个唤醒引脚和RTC,几乎全部断电。数据?不好意思,SRAM内容全丢了,得重新初始化。
这三种模式,功耗逐级降低,但唤醒代价也逐级增大。你想想看,没有免费的午餐。
| 模式 | CPU状态 | SRAM/寄存器 | 典型功耗(@48MHz) | 唤醒时间 |
|---|---|---|---|---|
| Sleep | 停止 | 保留 | ~5 mA | ~6 个CPU周期 |
| Stop | 断电 | 保留 | ~500 μA | ~10 μs |
| Standby | 断电 | 丢失 | ~2 μA | ~50 μs |
嗯,这里要注意:上面的功耗数据只是参考值。实际项目中,功耗还跟供电电压、温度、外设开启数量有很大关系。我曾经在一个项目中,就因为忘了关一个GPIO的上拉电阻,Standby模式硬生生多了20μA。
2.2 各模式功耗对比
咱们再深入一点。STM32内部其实还有更细的划分。比如Stop模式,又分为Stop0、Stop1、Stop2。区别在于内部稳压器的供电策略不同。
- Stop0:主稳压器保持开启,唤醒最快,但功耗最高。
- Stop1:主稳压器关闭,使用低功耗稳压器,功耗降低,唤醒稍慢。
- Stop2:进一步关闭部分模拟外设,功耗最低,但唤醒后需要重新配置某些外设。
我个人习惯,在需要快速响应CAN FD报文的场景下,优先用Stop0。因为唤醒延迟小,不会丢帧。如果对功耗要求极其苛刻,比如电池要撑一年,那我会考虑Standby模式,但代价是唤醒后要重新初始化CAN FD控制器。
关键指标对比
从Sleep到Standby,功耗差了三个数量级。但唤醒时间也从纳秒级变成了微秒级。选型时,一定要权衡好“功耗”和“响应速度”这对矛盾。
2.3 唤醒源介绍
每种模式都有对应的唤醒源。我整理了一张表,方便你对照查阅:
| 唤醒源 | Sleep | Stop | Standby |
|---|---|---|---|
| 任何中断(EXTI、外设等) | ✓ | ✓(需配置为唤醒事件) | ✗ |
| RTC闹钟/唤醒定时器 | ✓ | ✓ | ✓ |
| WKUP引脚(PA0、PC13等) | ✓ | ✓ | ✓ |
| CAN FD报文(需特定配置) | ✓ | ✓(Stop0/1) | ✗ |
| USART/SPI/I2C | ✓ | ✓(部分型号) | ✗ |
| NRST复位引脚 | ✓ | ✓ | ✓ |
看到没?CAN FD报文作为唤醒源,在Standby模式下是不支持的。这是硬件限制,没办法。所以如果你要用CAN FD唤醒,只能选Sleep或Stop模式。
避坑指南
我曾经在一个项目中,想当然地以为CAN FD能在Standby模式下唤醒MCU。结果调试了两天,发现根本不行。后来查手册才明白——Standby模式下,CAN FD控制器的时钟和电源都被切断了,它连报文都收不到,更别提唤醒了。
2.4 CAN FD在低功耗下的行为
这是本章的重点。CAN FD在低功耗模式下,到底怎么工作?
说白了,CAN FD控制器本身有独立的低功耗状态。它不依赖于MCU的主状态。STM32的CAN FD外设支持两种低功耗模式:
- Sleep模式(CAN FD内部):CAN FD控制器进入低功耗,但时钟还在。它能检测总线活动,一旦检测到有效报文,就产生唤醒中断。
- Deep Sleep模式:CAN FD控制器完全关闭,时钟停止。只能通过MCU主动唤醒。
咱们课程主要用的是CAN FD Sleep模式。因为只有这个模式,才能实现“报文唤醒”的功能。
具体流程是这样的:
- MCU进入Stop模式,CAN FD控制器进入Sleep模式。
- 总线上出现有效CAN FD报文。
- CAN FD控制器的接收检测电路检测到总线活动。
- CAN FD控制器产生唤醒中断(通过EXTI线)。
- MCU从Stop模式唤醒,进入中断服务函数。
- 在中断中,重新配置CAN FD控制器,使其进入正常模式。
- 接收报文,处理数据。
嗯,这里有个细节:CAN FD控制器从Sleep模式切换到正常模式,需要一定的时间。我记得手册上写的是大约10~20个CAN位时间。如果总线速率是1Mbps,那就是10~20μs。这段时间内,总线上的报文可能会丢失。
实战技巧
为了避免丢帧,我通常会在CAN FD唤醒中断中,先清空接收FIFO,然后重新使能接收中断。这样能保证唤醒后的第一帧报文被正确接收。
2.5 知识结构总览
为了让你更直观地理解本章的知识体系,我画了一张图:
这张图把三种模式、各自特点、以及CAN FD的行为串在了一起。你可以把它当作本章的“思维导图”。
2.6 小结
这一章,咱们把STM32的低功耗模式彻底过了一遍。从Sleep到Standby,功耗越来越低,但唤醒代价也越来越大。CAN FD在低功耗下的行为,说白了就是:只有Sleep和Stop模式支持报文唤醒,Standby不行。