4. STM32L4 低功耗模式详解:从 Sleep 到 Shutdown 的完整对比

低功耗设计,说白了就是跟电流较劲。STM32L4 给了我们 6 种低功耗模式,从浅睡到深度关机,每种都有它的脾气。我刚开始接触 L4 系列时,总觉得模式越多越麻烦,后来才发现——选对模式,功耗能差好几个数量级。

这一章,咱们把 Sleep、Low-power Run、Stop 0/1/2、Standby 和 Shutdown 这六种模式掰开揉碎,看看它们各自能省多少电,又得付出什么代价。

4.1 模式总览:一张图看懂所有模式

先看整体结构。我习惯把这六种模式按功耗和唤醒速度排个序,画成一张图,心里就有数了。

核心思路:功耗越低,唤醒越慢,保留的寄存器越少。这是嵌入式低功耗设计的第一条铁律。

STM32L4 低功耗模式层级图 Sleep ~100 μA/MHz Low-power Run ~8 μA @ 2 MHz Stop 0 ~100 μA Stop 1 ~30 μA Stop 2 ~3 μA Standby ~0.3 μA Shutdown ~0.03 μA 说明: • 箭头方向表示功耗递减,唤醒时间递增 • Stop 0/1/2 共享相同的唤醒源,但保留的 SRAM 区域不同 • Standby 和 Shutdown 会丢失大部分寄存器内容,需重新初始化

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 模式选择决策树

说了这么多,到底怎么选?我总结了一个简单的判断流程:

  1. CPU 还需要跑吗? → 是 → Low-power Run
  2. 需要保留所有 SRAM 吗? → 是 → Stop 0 或 Stop 1
  3. 32 KB SRAM 够用吗? → 是 → Stop 2
  4. 能接受唤醒后重新初始化吗? → 是 → Standby
  5. 需要极致省电,连 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 几乎无 长期存储