1. STM32L4 低功耗模式概述:从睡眠到待机,你该怎么选?

做嵌入式久了,你会发现一个真理:功耗是设计出来的,不是测出来的。STM32L4 系列之所以在物联网和可穿戴领域这么火,说白了就是它在「省电」这件事上做到了极致。今天我们就来聊聊它的三种低功耗模式——睡眠、停止、待机,以及每种模式下的唤醒源。

我个人习惯把低功耗设计比作「睡觉」:
- 睡眠模式 = 打盹,随时能醒
- 停止模式 = 深睡,需要闹钟叫醒
- 待机模式 = 关机,只能按电源键重启

嗯,这个比喻虽然糙,但道理不糙。下面我们一个一个拆开看。

1.1 睡眠模式(Sleep Mode)—— 最浅的睡眠

睡眠模式是功耗最低的「清醒」状态。CPU 停了,但外设还在跑。什么意思呢?就是 CPU 不干活了,但定时器、串口、ADC 这些外设依然在工作。

核心特征:
  • CPU 时钟关闭,但外设时钟保持
  • SRAM 和寄存器内容全部保留
  • 唤醒延迟极短(几个时钟周期)
  • 典型电流:约 100 µA/MHz(取决于外设开启数量)

唤醒源有哪些?

  • 任何中断(EXTI、定时器、UART、SPI、I2C 等)
  • 任何事件(Event)
  • WFI(等待中断)或 WFE(等待事件)指令触发

我在项目中遇到过这样一个场景:一个温湿度传感器需要每 10 秒采集一次数据。如果每次都从停止模式唤醒,那 10 秒的周期里大部分时间都在「启动-采集-休眠」的切换中浪费了。后来我改用睡眠模式 + RTC 定时中断,CPU 在采集间隙几乎不耗电,唤醒也快,整体功耗降了 40%。

我的小技巧: 如果你需要频繁唤醒(比如 1ms 级别),用睡眠模式。停止模式的唤醒延迟(几十 µs)在这种场景下会吃掉不少有效时间。

1.2 停止模式(Stop Mode)—— 深度睡眠,但保留记忆

停止模式才是真正意义上的「低功耗」。CPU 停了,大部分外设也停了,只有少数几个模块还在工作——比如 RTC、LPTIM(低功耗定时器)、LPUART(低功耗串口)。

你想想看,这就像你晚上睡觉,手机放在床头柜上,屏幕关了,Wi-Fi 关了,但闹钟还在走。这就是停止模式。

核心特征:
  • CPU 和外设时钟全部关闭
  • SRAM 和寄存器内容保留(取决于是否关闭 SRAM 供电)
  • 唤醒延迟:约 5 µs(从 Stop 0 模式)到 50 µs(从 Stop 2 模式)
  • 典型电流:Stop 0 约 100 µA,Stop 1 约 30 µA,Stop 2 约 3 µA

唤醒源有哪些?

  • 任何 EXTI 线(外部中断)
  • RTC 闹钟/唤醒定时器
  • LPTIM 比较匹配
  • LPUART 接收中断
  • I2C 地址匹配(Stop 1/Stop 2 模式)
  • USB 唤醒(仅 Stop 0 模式)
停止子模式 SRAM 供电 典型电流 唤醒延迟 适用场景
Stop 0 全部保留 ~100 µA ~5 µs 需要快速响应的场景
Stop 1 全部保留 ~30 µA ~10 µs 平衡功耗与响应
Stop 2 部分保留 ~3 µA ~50 µs 电池供电、长周期采集
我曾经踩过的坑: 在 Stop 2 模式下,如果使用了 DMA 传输,DMA 控制器会停止工作。有一次我设计了一个 ADC 连续采集 + DMA 搬运的方案,结果进入 Stop 2 后 DMA 不干活了,数据全丢了。后来我改成 Stop 0 模式才解决。所以,用停止模式前,一定要确认你的外设是否支持该子模式。

1.3 待机模式(Standby Mode)—— 最低功耗,但一切归零

待机模式是 STM32L4 的「终极省电方案」。说白了,就是除了 RTC 和备份域(Backup Domain)之外,整个芯片几乎都断电了。SRAM 内容丢失,寄存器复位,只有 RTC 和几个唤醒引脚还能工作。

这就像你出差前把家里的总闸拉了,只留一个智能门锁还在工作。功耗极低,但回来之后所有东西都要重新初始化。

核心特征:
  • CPU、外设、SRAM 全部断电
  • 备份域(RTC、备份寄存器)保留
  • 唤醒后相当于复位(从 Reset Handler 开始执行)
  • 典型电流:约 100 nA(仅 RTC 运行)

唤醒源有哪些?

  • WKUP 引脚上升沿(PA0、PC13、PE6 等)
  • RTC 闹钟/唤醒定时器
  • RTC 入侵检测(TAMPER)
  • RTC 时间戳事件
  • NRST 引脚复位
我的建议: 待机模式适合「长时间不工作,偶尔醒来干点活」的场景。比如一个电池供电的传感器节点,每 1 小时采集一次数据,平时就待在待机模式。但要注意,唤醒后所有外设都要重新初始化,所以代码里要做好「冷启动」和「热启动」的区分。

1.4 三种模式对比:一张图看懂

为了让你更直观地理解这三种模式的区别,我画了一张对比图。你可以把它当作选型时的「速查表」。

STM32L4 低功耗模式对比 睡眠模式 CPU 停,外设跑 电流:~100 µA/MHz 唤醒:~几个时钟周期 停止模式 CPU 停,外设停 电流:3~100 µA 唤醒:5~50 µs 待机模式 全芯片断电 电流:~100 nA 唤醒:复位启动 说明: 从左到右,功耗越来越低,但唤醒代价越来越大。选型时要在「功耗」和「响应速度」之间做权衡。 各模式唤醒源一览 睡眠模式唤醒源 • 任何中断 • 任何事件 • WFI/WFE 指令 停止模式唤醒源 • EXTI 外部中断 • RTC 闹钟/唤醒 • LPTIM/LPUART 待机模式唤醒源 • WKUP 引脚 • RTC 闹钟/唤醒 • RTC 入侵检测

1.5 如何选择?我的经验法则

说了这么多,你可能会问:那我到底该用哪种模式?

我的经验是,先回答三个问题:

  1. 唤醒频率有多高? 如果每秒唤醒几十次,用睡眠模式。如果几分钟甚至几小时才唤醒一次,用待机模式。
  2. 唤醒后需要保留什么? 如果数据不能丢,用停止模式(SRAM 保留)。如果数据可以重新采集,用待机模式。
  3. 唤醒延迟能接受吗? 如果要求 µs 级响应,用睡眠模式。如果 ms 级响应就够了,停止模式完全 OK。
一个实际案例: 我做过一个智能门锁项目,平时功耗要求低于 10 µA。门锁大部分时间在待机模式(~100 nA),每天定时唤醒一次检查电量。当用户按下门锁上的按键时,WKUP 引脚唤醒 MCU,进入停止模式(因为需要快速响应),然后读取指纹模块。指纹匹配后,再进入睡眠模式等待电机驱动完成。你看,一个产品里用了三种模式,关键是要在合适的时间用合适的模式。

1.6 本章小结

这一章我们聊了 STM32L4 的三种低功耗模式:

  • 睡眠模式:CPU 停,外设跑,唤醒快,适合高频唤醒场景
  • 停止模式:CPU 和外设都停,SRAM 保留,适合中等频率唤醒
  • 待机模式:全芯片断电,功耗最低,适合超低频唤醒