3. SoC电源状态管理:从指令到实战

电源状态管理,说白了就是让芯片在“干活”和“歇着”之间找到最佳平衡点。ARM Cortex-M 系列提供了 WFI/WFE 这样的基础指令,而各家芯片厂商又在此基础上封装了自己的低功耗模式。这一章,我们就从指令层一直聊到具体芯片的实战配置。

3.1 WFI 与 WFE:Cortex-M 的睡眠指令

WFI(Wait For Interrupt)和 WFE(Wait For Event)是 Cortex-M 内核最底层的睡眠指令。它们的作用都是暂停 CPU 执行,直到某个事件发生才唤醒。

指令 唤醒源 典型场景
WFI 任何中断(需使能) 等待中断的轮询替代方案
WFE 事件(中断或SEV指令) 自旋锁、多核同步

我个人习惯在空闲任务里直接调用 WFI。为什么?因为 WFI 能让 CPU 立即进入睡眠,功耗从几十毫安降到微安级别。你想想看,如果系统 90% 的时间都在 idle,那这行指令就能省下 90% 的功耗。

核心要点:WFI/WFE 只是暂停 CPU 内核,外设和内存仍然保持供电。要更深的睡眠,需要配合 SoC 的电源管理单元(PMU)。

3.2 STM32 的低功耗模式:Stop 与 Standby

STM32 把低功耗模式分成了三个等级:Sleep、Stop 和 Standby。Sleep 就是 WFI,Stop 会关闭大部分时钟,Standby 则几乎切断所有电源。

3.2.1 Stop 模式

Stop 模式下,CPU 和大部分外设时钟都停了,但 SRAM 和寄存器内容保留。唤醒速度很快,大概几微秒。我在项目中常用 Stop 模式做“间歇性工作”——比如传感器每 10 秒采集一次数据,中间 9.9 秒都待在 Stop 里。

// STM32 进入 Stop 模式的典型配置
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);

避坑指南:我曾经在 Stop 模式下忘记重新配置系统时钟,导致唤醒后外设工作异常。记住,从 Stop 唤醒后,需要手动重新初始化时钟源。

3.2.2 Standby 模式

Standby 模式更狠——它几乎关掉了所有电源,只保留备份域和唤醒逻辑。SRAM 内容会丢失,程序需要重新执行。唤醒电流可以低到 1μA 以下,但唤醒时间也长,大概几百微秒到几毫秒。

参数 Stop 模式 Standby 模式
SRAM 保持 是 否
典型电流 ~10μA ~1μA
唤醒时间 ~5μs ~500μs
唤醒源 任意中断 RTC、WKUP 引脚

3.3 nRF52 系列:SYSTEM_ON 与 SYSTEM_OFF

Nordic 的 nRF52 系列把电源状态分得更简洁:SYSTEM_ON 和 SYSTEM_OFF。嗯,这里要注意,SYSTEM_ON 并不是一直全速运行,它内部还分了很多子状态。

3.3.1 SYSTEM_ON

SYSTEM_ON 状态下,系统时钟可以运行,也可以进入 WFI/WFE 睡眠。nRF52 的睡眠电流可以做到 1.6μA 左右,而且 RAM 和 GPIO 状态都保持。我习惯在 BLE 连接间隔的空闲期让系统进入 SYSTEM_ON + WFI,这样既能快速响应蓝牙事件,又不会浪费电。

3.3.2 SYSTEM_OFF

SYSTEM_OFF 是 nRF52 的最深睡眠模式,电流只有 0.3μA。但代价是——所有 RAM 内容丢失,GPIO 状态不保持,只有少数几个唤醒源(GPIO 电平变化、比较器、NFC 唤醒)能把它叫醒。

// nRF52 进入 SYSTEM_OFF
NRF_POWER->SYSTEMOFF = 1;
// 执行到这行后,芯片立即断电

重要提醒:进入 SYSTEM_OFF 前,一定要确保所有外设已经正确关闭,尤其是高频时钟和射频部分。我曾经因为忘记关闭 RADIO 外设,导致 SYSTEM_OFF 电流比预期高了 10 倍。

3.4 三种架构的电源状态对比

为了让你看得更清楚,我把三种架构的电源状态整理成了一张对比表:

特性 Cortex-M WFI/WFE STM32 Stop/Standby nRF52 ON/OFF
最浅睡眠 CPU 暂停 Sleep(WFI) SYSTEM_ON + WFI
中等睡眠 — Stop SYSTEM_ON(低功耗模式)
最深睡眠 — Standby SYSTEM_OFF
RAM 保持 是 Stop 保持 / Standby 丢失 ON 保持 / OFF 丢失
唤醒源数量 所有中断 Stop 多 / Standby 少 ON 多 / OFF 极少

3.5 电源状态切换的核心逻辑

下面这张图展示了从全速运行到最深睡眠的完整路径。我建议你把它当作设计低功耗系统的“路线图”。

电源状态切换流程图 全速运行 WFI / WFE 睡眠 Stop / SYSTEM_ON Standby / SYSTEM_OFF 关键决策点 • 需要快速响应 → 选 WFI 或 Stop(微秒级唤醒) • 需要极低功耗 → 选 Standby 或 SYSTEM_OFF(微安级电流) • 需要保持 RAM 数据 → 不要进入 Standby 或 SYSTEM_OFF

3.6 实战中的选择策略

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

  1. 先看唤醒时间要求:如果需要在 10μs 内响应,只能选 WFI 或 Stop 模式。
  2. 再看功耗目标:如果系统需要电池跑一年,Standby 或 SYSTEM_OFF 几乎是唯一选择。
  3. 最后看数据保持需求:如果 RAM 里的数据不能丢,就别碰 Standby 和 SYSTEM_OFF。

个人经验:我在一个 BLE 门锁项目里,白天用 Stop 模式(响应开锁指令快),晚上用 Standby 模式(省电)。两种模式通过 RTC 定时切换,效果很好。

电源状态管理不是一锤子买卖。同一个产品,不同场景可能需要不同的睡眠深度。理解了 WFI/WFE、Stop/Standby、SYSTEM_ON/OFF 的区别,你就能在设计时做出更灵活的选择。