4. 电源模式详解:从 Run 到 Shutdown 的完整图谱

做电池供电项目,第一关就是搞懂 STM32L4 到底能「睡」多深。我见过不少工程师,上来就调 Stop 模式,结果电流死活降不下去——其实不是代码问题,是模式没选对。

STM32L4 提供了 7 种电源模式,从全速运行的 Run 到几乎断电的 Shutdown。每种模式都有自己的「省电哲学」和「唤醒代价」。选对了,续航翻倍;选错了,要么功能跑不起来,要么电池白费。

核心原则: 功耗越低,唤醒越慢,保留的功能越少。没有完美的模式,只有最适合你场景的模式。
STM32L4 电源模式层级与唤醒代价 Run Sleep Low-power Run Stop 0 / Stop 1 / Stop 2 Standby Shutdown ~200 μA/MHz 全功能 唤醒:立即 ~100 μA/MHz CPU 停 唤醒:~5 μs ~50 μA 低频运行 唤醒:立即 1.5 μA / 1.2 μA / 0.8 μA 唤醒:5~10 μs ~0.3 μA 仅备份域 唤醒:~50 μs ~0.02 μA 几乎断电 唤醒:~200 μs

4.1 Run 模式:全速前进

Run 模式就是芯片的「正常工作状态」。CPU 全速跑,所有外设想开就开。这时候的功耗主要看主频——L4 系列在 80 MHz 下大约 200 μA/MHz,也就是 16 mA 左右。

说实话,电池供电项目里,Run 模式待的时间越短越好。我习惯的做法是:干活时全速跑,干完立刻睡。别让芯片在 Run 模式里闲着,那等于在烧电池。

4.2 Sleep 模式:CPU 休息,外设继续

Sleep 模式只停了 CPU 内核,外设时钟还在跑。说白了就是「CPU 打盹,手下人继续干活」。适合那种需要外设自己处理数据、CPU 偶尔看一眼的场景。

举个例子:你用 DMA 搬运 ADC 数据,CPU 完全可以去睡。等 DMA 传完了,再通过中断把 CPU 叫醒。

我的习惯: 只要 CPU 在等外设,就进 Sleep。别用空循环 delay,那是浪费电。我早期一个项目就是靠把 delay 全换成 Sleep,续航从 3 天拉到了 7 天。

4.3 Low-power Run 模式:低频苟活

这个模式比较特殊——CPU 还能跑,但只能跑低频(最高 2 MHz)。电压调节器也切到低功耗模式。适合那种「需要持续处理,但处理量不大」的场景。

我记得有个传感器采集项目,每秒只需要读一次数据,算一下平均值。用 Run 模式太浪费,用 Stop 模式又得频繁唤醒。最后选了 Low-power Run,电流降到 50 μA 左右,完美。

4.4 Stop 模式:三兄弟的抉择

Stop 模式是电池供电项目的主力。L4 系列给了三个版本:Stop 0、Stop 1、Stop 2。它们的区别说白了就是:省多少电 vs 保留多少功能。

特性 Stop 0 Stop 1 Stop 2
典型电流 ~1.5 μA ~1.2 μA ~0.8 μA
SRAM 保留 全部 全部 全部
唤醒源 全部 全部 部分(LPUART/LPTIM/RTC)
唤醒时间 ~5 μs ~7 μs ~10 μs
适用场景 需要快速响应 平衡型 极致省电

怎么选?我一般这样判断:

  • 如果唤醒后要立刻干活(比如响应按键),选 Stop 0
  • 如果只是定时醒来采个样,选 Stop 2
  • Stop 1 嘛……说实话我很少用,它有点不上不下
注意: Stop 2 模式下,不是所有外设都能唤醒芯片。LPUART、LPTIM、RTC 可以,但普通 UART、TIM 不行。我曾经在这上面栽过跟头——用普通 UART 做唤醒,结果芯片死活不醒。

4.5 Standby 模式:深度睡眠

Standby 模式比 Stop 更狠——它把大部分电源域都关了,只保留备份域(RTC、备份寄存器、部分 SRAM)。电流能降到 0.3 μA 左右。

代价是什么?唤醒后芯片会复位,程序从头开始跑。不过别担心,RTC 和备份寄存器的数据还在。你可以通过检查复位标志来判断是不是从 Standby 唤醒的。

// 检查是否从 Standby 唤醒
if (__HAL_PWR_GET_FLAG(PWR_FLAG_SB) != RESET) {
    // 是 Standby 唤醒,恢复现场
    __HAL_PWR_CLEAR_FLAG(PWR_FLAG_SB);
} else {
    // 正常上电,做初始化
}

我有个产品,平时 99% 的时间都在 Standby,每小时醒来一次发个数据包。两节 AA 电池撑了两年多。

4.6 Shutdown 模式:终极省电

Shutdown 是 L4 系列最深的睡眠模式。电流只有 0.02 μA,几乎等于断电。但代价也最大:所有 SRAM 内容丢失,备份域也断电。唤醒后完全复位,连 RTC 都得重新配置。

什么时候用?只有一种情况:设备要长期闲置,或者电池电量已经极低。比如一个户外传感器,半年才唤醒一次。这时候 Shutdown 就是最佳选择。

关键区别: Standby 保留备份域(RTC 还能跑),Shutdown 连备份域都断电。如果你需要 RTC 计时,只能用 Standby。

4.7 实战选型指南

说了这么多,到底怎么选?我整理了一个快速决策流程:

  1. 需要 CPU 持续运行? → Run 或 Low-power Run
  2. CPU 可以停,外设继续? → Sleep
  3. 需要保留 SRAM,快速唤醒? → Stop 0/1/2
  4. 可以接受复位,但要保留 RTC? → Standby
  5. 可以接受完全复位,极致省电? → Shutdown

嗯,这里要注意:不要为了省电而省电。我见过有人为了把电流从 1 μA 降到 0.8 μA,从 Stop 1 换到 Stop 2,结果唤醒源不够用,被迫加了个外部 RTC,反而更费电。选模式要看你整个系统的需求,别只看芯片的电流表。

最后说一句:测量永远比估算靠谱。数据手册上的电流值是理想情况,实际电路还有漏电、外围器件功耗。我每次换电源模式,都会用万用表实测一下,心里才踏实。