第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模式。因为只有这个模式,才能实现“报文唤醒”的功能。

具体流程是这样的:

  1. MCU进入Stop模式,CAN FD控制器进入Sleep模式。
  2. 总线上出现有效CAN FD报文。
  3. CAN FD控制器的接收检测电路检测到总线活动。
  4. CAN FD控制器产生唤醒中断(通过EXTI线)。
  5. MCU从Stop模式唤醒,进入中断服务函数。
  6. 在中断中,重新配置CAN FD控制器,使其进入正常模式。
  7. 接收报文,处理数据。

嗯,这里有个细节:CAN FD控制器从Sleep模式切换到正常模式,需要一定的时间。我记得手册上写的是大约10~20个CAN位时间。如果总线速率是1Mbps,那就是10~20μs。这段时间内,总线上的报文可能会丢失。

实战技巧

为了避免丢帧,我通常会在CAN FD唤醒中断中,先清空接收FIFO,然后重新使能接收中断。这样能保证唤醒后的第一帧报文被正确接收。

2.5 知识结构总览

为了让你更直观地理解本章的知识体系,我画了一张图:

STM32低功耗模式与CAN FD行为总览 Sleep 模式 Stop 模式 Standby 模式 CPU停止,外设运行 CPU断电,SRAM保留 几乎全部断电 CAN FD可唤醒 CAN FD可唤醒(Stop0/1) CAN FD不可唤醒 核心结论 CAN FD报文唤醒仅支持 Sleep 和 Stop 模式 Standby 模式下 CAN FD 控制器断电,无法检测总线活动

这张图把三种模式、各自特点、以及CAN FD的行为串在了一起。你可以把它当作本章的“思维导图”。

2.6 小结

这一章,咱们把STM32的低功耗模式彻底过了一遍。从Sleep到Standby,功耗越来越低,但唤醒代价也越来越大。CAN FD在低功耗下的行为,说白了就是:只有Sleep和Stop模式支持报文唤醒,Standby不行。