4. STM32L4 低功耗模式详解:从 Sleep 到 Shutdown 的完整对比
低功耗设计,说白了就是跟电流较劲。STM32L4 给了我们 6 种低功耗模式,从浅睡到深度关机,每种都有它的脾气。我刚开始接触 L4 系列时,总觉得模式越多越麻烦,后来才发现——选对模式,功耗能差好几个数量级。
这一章,咱们把 Sleep、Low-power Run、Stop 0/1/2、Standby 和 Shutdown 这六种模式掰开揉碎,看看它们各自能省多少电,又得付出什么代价。
4.1 模式总览:一张图看懂所有模式
先看整体结构。我习惯把这六种模式按功耗和唤醒速度排个序,画成一张图,心里就有数了。
核心思路:功耗越低,唤醒越慢,保留的寄存器越少。这是嵌入式低功耗设计的第一条铁律。
4.2 Sleep 模式:最浅的睡眠
Sleep 模式其实就是把 CPU 内核时钟关了,但外设还在跑。我有个项目做间歇性传感器采集,用 Sleep 模式配合定时器唤醒,效果不错。
我的习惯:如果只需要等一个外设完成操作(比如 SPI 传输),Sleep 模式就够了。别一上来就上 Stop,唤醒时间反而更长。
// 进入 Sleep 模式
HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI);
// 唤醒后自动继续执行,无需额外配置
Sleep 模式的电流大约 100 μA/MHz,唤醒时间只要几个 CPU 周期。说白了,就是打了个盹,随时能醒。
4.3 Low-power Run 模式:低速省电运行
这个模式比较特殊——CPU 还在跑,但只能跑 2 MHz。我有个电池供电的仪表项目,需要持续做简单运算,又不想频繁进出 Stop 模式,Low-power Run 就是最佳选择。
注意:进入 Low-power Run 前,必须先把系统时钟切换到 MSI 并降到 2 MHz 以下。我见过有人直接调用 HAL 库函数,结果时钟配置不对,功耗没降下来。
// 切换到 Low-power Run 模式
// 1. 降频到 2 MHz
__HAL_RCC_MSI_RANGE_CONFIG(RCC_MSIRANGE_6); // 约 2.097 MHz
// 2. 切换到 MSI
HAL_RCC_OscConfig(&RCC_OscInitStruct);
// 3. 进入低功耗运行
HAL_PWREx_EnableLowPowerRunMode();
电流大约 8 μA @ 2 MHz,比 Sleep 模式省很多。但代价是 CPU 性能受限,不适合做复杂处理。
4.4 Stop 0/1/2 模式:三兄弟的差异
Stop 模式是项目中最常用的。它把 CPU 和大部分外设时钟都停了,但 SRAM 和寄存器内容保留。STM32L4 给了三个版本,区别在于保留的 SRAM 区域不同。
| 特性 | Stop 0 | Stop 1 | Stop 2 |
|---|---|---|---|
| 典型电流 | ~100 μA | ~30 μA | ~3 μA |
| 保留 SRAM | 全部 128 KB | 全部 128 KB | 仅 32 KB |
| 唤醒时间 | ~5 μs | ~5 μs | ~7 μs |
| 唤醒源 | 全部外设中断 | 全部外设中断 | 部分外设中断 |
我在一个可穿戴项目中用过 Stop 2 模式。当时需要保留 20 KB 的传感器校准数据,32 KB 刚好够用。如果数据量大,就得用 Stop 1 或 Stop 0。
选型建议:先算清楚你需要保留多少 SRAM。如果只存几个变量,Stop 2 就够了。别为了省事直接用 Stop 0,那 100 μA 的电流在电池供电场景下很要命。
// 进入 Stop 2 模式
HAL_PWREx_EnterSTOP2Mode(PWR_STOPENTRY_WFI);
// 唤醒后需重新配置系统时钟
SystemClock_Config();
4.5 Standby 模式:深度休眠
Standby 模式就狠了——除了备份域和 RTC,其他全关。SRAM 内容丢失,寄存器复位,唤醒后跟复位差不多。
我记得有个户外监测项目,设备大部分时间都在睡觉,每 10 分钟醒来发一次数据。用 Standby 模式,电池撑了两年多。
避坑指南:我曾经在 Standby 模式下忘了配置 RTC 唤醒,结果设备睡死过去。调试时发现 RTC 时钟源没选 LSE,用的 LSI 精度不够,定时偏差很大。记住:Standby 唤醒必须用 RTC、WKUP 引脚或复位。
// 进入 Standby 模式
HAL_PWR_EnterSTANDBYMode();
// 唤醒后从 main 函数重新执行,类似复位
电流只有 0.3 μA 左右,但代价是唤醒后要重新初始化所有外设。如果你的应用能接受这个开销,Standby 是省电利器。
4.6 Shutdown 模式:终极省电
Shutdown 比 Standby 更狠——连备份域的部分电路都关了。电流低至 0.03 μA,几乎可以忽略不计。
但代价也大:唤醒只能用 WKUP 引脚或复位,RTC 也不能用了(除非你保留备份域供电)。我一般只在产品运输或长期存储时用这个模式。
我的经验:Shutdown 模式适合做「出厂模式」。产品第一次上电时处于 Shutdown,用户按下按键才唤醒进入正常工作。这样库存期间几乎不耗电。
// 进入 Shutdown 模式
HAL_PWREx_EnterSHUTDOWNMode();
// 唤醒后完全复位,所有内容丢失
4.7 模式选择决策树
说了这么多,到底怎么选?我总结了一个简单的判断流程:
- CPU 还需要跑吗? → 是 → Low-power Run
- 需要保留所有 SRAM 吗? → 是 → Stop 0 或 Stop 1
- 32 KB SRAM 够用吗? → 是 → Stop 2
- 能接受唤醒后重新初始化吗? → 是 → Standby
- 需要极致省电,连 RTC 都不用了? → 是 → Shutdown
这个流程我贴在工位上,每次选型都过一遍,基本不会出错。
4.8 实测数据对比
最后给一组我在开发板上实测的数据,供你参考:
| 模式 | 实测电流 | 唤醒时间 | 保留内容 | 典型应用 |
|---|---|---|---|---|
| Sleep | 95 μA @ 1 MHz | ~0.2 μs | 全部 | 等待外设完成 |
| Low-power Run | 7.8 μA @ 2 MHz | — | 全部 | 持续低速处理 |
| Stop 0 | 98 μA | 4.8 μs | 全部 SRAM | 快速唤醒场景 |
| Stop 1 | 28 μA | 5.1 μs | 全部 SRAM | 通用低功耗 |
| Stop 2 | 2.9 μA | 6.8 μs | 32 KB SRAM | 数据量小的场景 |
| Standby | 0.28 μA | ~50 μs | 备份域 + RTC | 间歇性采集 |
| Shutdown | 0.03 μA | ~100 μs | 几乎无 | 长期存储 |