2. STM32L4低功耗模式详解:睡眠、停止、待机与VBAT模式
低功耗设计,说白了就是让芯片在“没事干”的时候尽量少耗电。STM32L4系列在这方面做得相当极致,提供了四种主要的低功耗模式。我刚开始接触L4系列时,也被这几种模式搞得有点晕——它们之间的区别不仅仅是“谁更省电”,还涉及唤醒源、寄存器保持、IO状态等一系列细节。
咱们一个一个来看。
2.1 睡眠模式(Sleep Mode)
这是最浅的睡眠。CPU核心停了,但外设还在跑。打个比方:你躺在床上闭着眼,但耳朵还在听周围的声音。
在睡眠模式下,CPU时钟被关闭,但所有外设时钟仍然使能。SRAM和寄存器内容全部保持。唤醒速度极快,几乎是瞬间。
关键参数:
- 典型电流:约 100 µA/MHz(取决于外设开启数量)
- 唤醒时间:几个CPU周期
- 唤醒源:任何中断或事件
我有个项目需要频繁处理传感器数据,每次处理间隔只有几毫秒。这种情况下,睡眠模式是最合适的——省不了太多电,但响应快,不会丢数据。
2.2 停止模式(Stop Mode)
停止模式就深入多了。CPU停了,大部分外设时钟也停了,但SRAM和寄存器内容依然保持。这相当于你睡着了,但身体机能还在维持。
STM32L4的停止模式还分两种:Stop 0 和 Stop 1。Stop 0保留更多外设状态,唤醒稍快;Stop 1更省电,但唤醒稍慢。
| 特性 | Stop 0 | Stop 1 |
|---|---|---|
| 典型电流 | 约 8 µA | 约 3 µA |
| 唤醒时间 | 约 5 µs | 约 10 µs |
| SRAM保持 | 全部 | 全部 |
| RTC运行 | 支持 | 支持 |
我的经验: 如果你需要RTC定时唤醒,同时保留所有数据,Stop 1是最常用的选择。我在一个电池供电的温湿度记录仪上用了Stop 1,配合RTC每10秒唤醒一次,整机平均电流做到了15 µA左右。
2.3 待机模式(Standby Mode)
待机模式就狠了。CPU、外设、SRAM全部断电,只保留备份域和唤醒逻辑。这相当于你关机睡觉,只留一个闹钟。
进入待机模式后,SRAM内容全部丢失,程序会从复位向量重新执行。所以,如果你需要保留数据,必须把数据存到备份SRAM(4 KB)里。
注意: 待机模式的唤醒源非常有限——只有RTC闹钟、WKUP引脚上升沿、复位和入侵检测。别指望用普通中断唤醒,它根本不会响应。
我曾经犯过一个错误:在待机模式下想用UART中断唤醒,结果芯片死活不响应。查了半天手册才发现,待机模式下UART的时钟都断了,怎么可能唤醒?后来改用了RTC闹钟唤醒,问题解决。
待机模式的典型电流可以做到 0.3 µA 左右,是所有模式里最省电的(除了VBAT)。
2.4 VBAT模式
VBAT模式不是严格意义上的“运行模式”,而是电池备份模式。当主电源VDD掉电时,芯片自动切换到VBAT引脚供电,只维持备份域(RTC、备份寄存器、备份SRAM)的工作。
这个模式主要用于:
- 系统主电源断电后,RTC继续走时
- 保存关键配置数据到备份寄存器
- 维持唤醒逻辑(WKUP引脚)
VBAT模式的电流极低,典型值 0.25 µA(RTC开启,LSE时钟)。一颗CR2032纽扣电池可以撑好几年。
实用场景: 我在一个工业数据记录仪上用了VBAT模式。设备平时用24V供电,断电后自动切换到纽扣电池,RTC继续计时,同时备份SRAM里保存了最后100条记录。等主电源恢复,系统能准确知道断电时间,数据也不会丢。
2.5 四种模式功耗对比
我把这四种模式的关键参数整理成了一张表,方便你对比选型:
| 模式 | 典型电流 | 唤醒时间 | SRAM保持 | 外设状态 | 唤醒源 |
|---|---|---|---|---|---|
| 睡眠 | ~100 µA/MHz | ~几个周期 | 全部 | 全部运行 | 任何中断 |
| Stop 0 | ~8 µA | ~5 µs | 全部 | 大部分停止 | RTC、中断、事件 |
| Stop 1 | ~3 µA | ~10 µs | 全部 | 大部分停止 | RTC、中断、事件 |
| 待机 | ~0.3 µA | ~50 µs | 丢失 | 全部断电 | RTC、WKUP、复位 |
| VBAT | ~0.25 µA | N/A | 备份域 | 仅备份域 | N/A |
你想想看,从睡眠到待机,电流差了三个数量级。选对模式,电池寿命能差出好几倍。
2.6 模式切换与状态机
为了让你更直观地理解这些模式之间的关系,我画了一张状态切换图:
从这张图可以看得很清楚:
- 睡眠和停止模式可以通过中断/事件直接回到运行模式,数据不丢失
- 待机模式唤醒后是复位,程序重新跑
- VBAT模式是硬件自动切换的,不需要软件干预
2.7 选型建议
说了这么多,到底该用哪种模式?我个人的经验是这样的:
- 需要频繁响应(ms级):用睡眠模式。比如按键扫描、短时通信。
- 需要定时唤醒,保留数据:用Stop 1。这是最常用的低功耗模式,适合传感器采集、物联网终端。
- 需要极低功耗,可以接受复位:用待机模式。适合长时间休眠、定时上报的设备。
- 需要RTC持续走时,主电源可能断电:用VBAT模式。适合需要记录时间的设备。
一个小技巧: 在实际项目中,我经常把Stop 1和待机模式结合起来用。平时用Stop 1保持数据,如果电池电压过低,就进入待机模式,把最后的关键数据存到备份SRAM里。这样既保证了数据安全,又延长了电池寿命。