3、STM32L4功耗模式深度解析:Run/Sleep/Low-power Run/Stop/Standby五种模式详解、电压调节器(Range1/2)与功耗关系。
做低功耗产品,说白了就是跟电池的每一毫安时较劲。STM32L4 系列之所以在物联网圈子里这么火,就是因为它把「省电」这件事做到了极致。今天咱们就把它那五种功耗模式掰开揉碎了讲清楚。
我个人习惯把 STM32L4 的功耗模式看作一个「阶梯」——从全速狂奔到几乎断电,每一级都有它的用武之地。你想想看,一个智能门锁,平时 99% 的时间都在待机,偶尔才响应一下开锁指令,如果一直让 CPU 全速跑着,那电池撑不了几天。
3.1 五种功耗模式速览
先给个全景图,方便你脑子里有个框架。这五种模式,功耗从高到低排列:
| 模式 | 典型功耗 | 唤醒时间 | 核心是否供电 | 主要用途 |
|---|---|---|---|---|
| Run | ~100 µA/MHz | — | 是 | 正常运算、通信 |
| Sleep | ~50 µA/MHz | 几个时钟周期 | 是(CPU 时钟停) | 等待外设中断 |
| Low-power Run | ~8 µA | — | 是(低频运行) | 低负载持续处理 |
| Stop | ~1.5 µA | ~5 µs | 是(SRAM 保持) | 深度待机、RTC 运行 |
| Standby | ~0.1 µA | ~50 µs | 否(SRAM 丢失) | 极低功耗休眠 |
嗯,这里要注意,上面的数字只是参考值。实际项目中,外设有没有关、IO 电平对不对、温度多少,都会影响最终结果。我在一个表贴式传感器项目里就吃过这个亏——数据手册上写 Stop 模式 1.5 µA,结果焊完板子一测,3.8 µA。后来查了半天,发现是一个没用的 GPIO 悬空了,漏电。
3.2 Run 模式与 Sleep 模式
Run 模式没什么好说的,就是正常干活。CPU 全速跑,外设该开的开。但这里有个关键点——电压调节器。
STM32L4 内部有个可编程的电压调节器,它有两个范围:
- Range 1:输出电压约 1.2V,支持最高 80 MHz 主频。适合需要算力的场景。
- Range 2:输出电压约 1.0V,最高只支持 26 MHz。但功耗能降 30%~40%。
我建议你养成一个习惯:不需要高频时,主动切到 Range 2。比如你只是定时采集一下 ADC 数据,26 MHz 绰绰有余,何必让 CPU 在 80 MHz 下空转?
关键代码:切换电压调节器范围
// 切换到 Range 2(低电压模式)
HAL_PWREx_EnableLowPowerRunMode(); // 先进入 Low-power Run
// 或者手动设置:
__HAL_RCC_PWR_CLK_ENABLE();
PWR->CR1 |= PWR_CR1_VOS_0; // VOS = 10 表示 Range 2
// 注意:切换前必须确保系统时钟 ≤ 26 MHz
Sleep 模式就简单了——CPU 的时钟停了,但外设还在跑。你想想看,如果你在等一个 UART 数据,CPU 没必要在那轮询,睡一觉等中断叫醒它就行。唤醒延迟只有几个时钟周期,几乎感觉不到。
我曾经在一个手持设备里,把主循环中所有等待操作都改成了 Sleep + 中断唤醒,整体功耗降了 40%。
3.3 Low-power Run 模式
这个模式比较特殊。它本质上还是 Run,但 CPU 只能跑 2 MHz(MSI 振荡器),而且电压调节器强制工作在 Range 2。功耗大概 8 µA 左右。
什么时候用?举个例子:你有一个传感器,每 100 ms 读一次数据,做一次简单的滤波计算。如果用正常 Run 模式,CPU 在 80 MHz 下跑 1 ms 就干完了,剩下 99 ms 在 Sleep。但如果你用 Low-power Run,虽然跑得慢(2 MHz),但功耗低啊。算下来,总能耗可能更低。
我的经验:Low-power Run 适合那种「持续有活干,但活不重」的场景。比如心率监测算法,每 10 ms 要处理一次数据,用 Sleep 模式频繁唤醒反而浪费,不如让它在 2 MHz 下慢慢跑。
3.4 Stop 模式——最常用的深度休眠
Stop 模式是我项目里用得最多的。它把 CPU 和大部分外设的时钟都停了,但 SRAM 和寄存器内容保持。功耗能降到 1.5 µA 左右,唤醒只要 5 µs。
这里有个坑:Stop 模式下,电压调节器可以配置成两种状态:
- Stop 0:调节器保持开启,唤醒最快(~3 µs),但功耗稍高(~3 µA)。
- Stop 1:调节器进入低功耗模式,唤醒稍慢(~5 µs),但功耗更低(~1.5 µA)。
- Stop 2:进一步关闭部分内部参考电压,功耗可到 ~0.8 µA,但唤醒时间 ~7 µs。
我个人习惯:如果唤醒后要做的事情不紧急,就用 Stop 2。比如一个温湿度采集器,每 10 秒醒一次,多等 2 µs 根本无所谓。
注意:进入 Stop 模式前,一定要把不用的外设时钟关掉。我见过有人进了 Stop 模式,功耗还是 20 µA,一查发现 SPI 和 I2C 的时钟没关,外设还在偷偷耗电。
// 进入 Stop 2 模式示例
HAL_PWREx_EnterSTOP2Mode(PWR_STOPENTRY_WFI);
3.5 Standby 模式——终极省电
Standby 模式是真正的「关机」——除了 RTC 和备份域,整个芯片几乎断电。SRAM 里的数据全丢,唤醒后相当于复位重跑。功耗低到 0.1 µA 级别。
唤醒源只有几个:RTC 闹钟、WKUP 引脚、复位。唤醒时间比较长,大概 50 µs。
什么时候用 Standby?当你的设备大部分时间都在「沉睡」,偶尔醒一下干完活就继续睡。比如一个电池供电的烟雾报警器,每 60 秒检测一次,检测完就进 Standby。数据不需要保持,因为每次醒来重新初始化就行。
我曾经做过一个资产追踪器,用 CR2032 纽扣电池供电,要求工作一年。方案就是:GPS 定位 + 上报数据(耗时 5 秒)→ 进 Standby(59 分 55 秒)。最终实测功耗平均下来不到 2 µA,电池确实撑了一年多。
3.6 知识结构图
下面这张图帮你理清这五种模式的关系和切换路径:
3.7 电压调节器 Range 1 vs Range 2 实战对比
这个点太容易忽略了。很多人拿到开发板,默认就是 Range 1,跑 80 MHz。但你知道吗?Range 2 下跑 26 MHz,功耗只有 Range 1 下跑 80 MHz 的 1/3 左右。
| 参数 | Range 1 | Range 2 |
|---|---|---|
| 核心电压 | 1.2V | 1.0V |
| 最大主频 | 80 MHz | 26 MHz |
| 典型功耗 (Run) | ~8 mA @ 80 MHz | ~2.5 mA @ 26 MHz |
| Flash 等待周期 | 4 个等待周期 | 1 个等待周期 |
| 适用场景 | 高速运算、通信 | 低负载持续处理 |
避坑指南:切换 Range 时,一定要先降频再降压。我曾经在代码里直接切 Range 2,忘了把系统时钟从 80 MHz 降到 26 MHz 以下,结果芯片直接跑飞了。正确的顺序是:
- 降低系统时钟 ≤ 26 MHz
- 修改 PWR->CR1 中的 VOS 位
- 等待电压调节器稳定(检查 PWR->SR2 的 VOSF 标志位)
3.8 总结一下我的选择策略
做项目时,我一般这么选:
- 需要高频运算(比如 FFT、加密)→ Run + Range 1
- 中等负载,间歇工作 → Run + Range 2,空闲时进 Sleep
- 持续低负载(比如传感器滤波)→ Low-power Run
- 大部分时间待机,偶尔响应 → Stop 2 + RTC 唤醒
- 极低功耗,数据不保留 → Standby + WKUP 引脚唤醒
嗯,说白了就是:别让 CPU 闲着,也别让 CPU 忙着干没必要的事。选对模式,电池寿命能差出好几倍。