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 模式切换与状态机

为了让你更直观地理解这些模式之间的关系,我画了一张状态切换图:

STM32L4低功耗模式状态切换图 STM32L4 低功耗模式状态切换 运行模式 睡眠模式 停止模式 待机模式 VBAT模式 WFI/WFE SLEEPDEEP PDDS + SLEEPDEEP 中断/事件 唤醒事件 复位 VDD掉电 VDD恢复 说明:从待机模式唤醒相当于一次复位,程序从main函数重新执行。VBAT模式是硬件自动切换的。

从这张图可以看得很清楚:

  • 睡眠和停止模式可以通过中断/事件直接回到运行模式,数据不丢失
  • 待机模式唤醒后是复位,程序重新跑
  • VBAT模式是硬件自动切换的,不需要软件干预

2.7 选型建议

说了这么多,到底该用哪种模式?我个人的经验是这样的:

  • 需要频繁响应(ms级):用睡眠模式。比如按键扫描、短时通信。
  • 需要定时唤醒,保留数据:用Stop 1。这是最常用的低功耗模式,适合传感器采集、物联网终端。
  • 需要极低功耗,可以接受复位:用待机模式。适合长时间休眠、定时上报的设备。
  • 需要RTC持续走时,主电源可能断电:用VBAT模式。适合需要记录时间的设备。

一个小技巧: 在实际项目中,我经常把Stop 1和待机模式结合起来用。平时用Stop 1保持数据,如果电池电压过低,就进入待机模式,把最后的关键数据存到备份SRAM里。这样既保证了数据安全,又延长了电池寿命。