4. 低功耗模式概述:Sleep、Stop、Standby模式的区别与适用场景

做嵌入式项目,尤其是电池供电的设备,低功耗是绕不开的坎。STM32 提供了三种低功耗模式:Sleep、Stop 和 Standby。很多初学者一上来就懵了——到底该用哪个?

我刚开始做低功耗项目时也踩过坑。有一次做一款便携式传感器,选错了模式,导致设备待机电流居高不下,电池两天就耗光了。后来才搞明白,这三种模式各有各的脾气。

说白了,它们就是处理器在「省电」和「响应速度」之间做的三种不同取舍。下面我带你一个一个看。

4.1 三种模式的核心差异

先看一张对比表,心里有个底:

特性 Sleep 模式 Stop 模式 Standby 模式
CPU 状态 停止 停止 断电
SRAM 保持 全部保持 全部保持 仅备份域
寄存器状态 全部保持 全部保持 丢失
外设时钟 可关闭 全部关闭 全部关闭
唤醒源 任意中断/事件 特定中断/事件 WKUP 引脚/RTC/复位
唤醒时间 ~1 µs ~10 µs ~100 µs 以上
典型电流 ~mA 级 ~µA 级 ~nA 级

你想想看,从 Sleep 到 Standby,省电效果越来越好,但代价是唤醒越来越慢,数据保持越来越少。这就是一个典型的「鱼和熊掌不可兼得」的问题。

4.2 Sleep 模式——最轻量的省电

Sleep 模式是最简单的。CPU 内核停了,但 SRAM、寄存器、外设都还在正常工作。说白了,就是让 CPU 先歇着,外设该干嘛干嘛。

适用场景:

  • 需要频繁响应中断,但 CPU 大部分时间在空转
  • 对唤醒速度要求极高(微秒级)
  • 数据必须完整保持,不能有任何丢失

我在项目中用过 Sleep 模式做数据采集。传感器每 1 毫秒产生一次中断,CPU 只需要花 10 微秒处理数据,剩下 990 微秒都在空转。用 Sleep 模式后,功耗直接降了 60%。

我的习惯: 进入 Sleep 前,先把不用的外设时钟关掉。虽然 Sleep 模式本身不关外设时钟,但手动关掉 ADC、SPI 这些模块的时钟,还能再省一点。

4.3 Stop 模式——功耗与功能的平衡点

Stop 模式就狠一些了。所有时钟都停了,包括 HSI、HSE、PLL。但 SRAM 和寄存器内容还在。唤醒时,系统时钟需要重新稳定,所以比 Sleep 慢一些。

适用场景:

  • 需要定期唤醒做任务(比如每秒采集一次数据)
  • 数据量不大,但需要保持上下文
  • 电池供电设备的主流选择

我曾经做过一个温湿度记录仪,就是用的 Stop 模式。每 10 秒唤醒一次,采集数据后存到 Flash,然后继续睡。一节 CR2032 电池撑了半年多。

注意: Stop 模式下,唤醒后时钟需要重新配置。我见过有人忘了重新使能 HSE,结果系统跑在 HSI 上,串口波特率全乱了。嗯,这里要特别小心。

4.4 Standby 模式——极致省电

Standby 模式是最省电的,也是最「狠」的。除了备份域(RTC、备份寄存器),整个芯片几乎都断电了。唤醒后,程序从头开始执行,就像按了复位键一样。

适用场景:

  • 设备大部分时间处于深度休眠
  • 唤醒频率极低(几分钟甚至几小时一次)
  • 对功耗要求极其苛刻(nA 级)

我记得有一次做户外环境监测设备,要求电池用一年。最后只能上 Standby 模式,每小时唤醒一次,采集完数据就睡。唤醒电流只有几十纳安,电池几乎不耗电。

关键点: Standby 模式下,程序是「冷启动」。你需要通过检查复位标志来判断是上电复位还是 Standby 唤醒。这个判断很重要,不然每次唤醒都重新初始化,数据就丢了。

4.5 三种模式的选择策略

怎么选?我一般按这个思路来:

  1. 先看唤醒频率——频率高(毫秒级)选 Sleep,中等(秒级)选 Stop,极低(分钟级以上)选 Standby
  2. 再看数据保持需求——数据量大且不能丢,选 Sleep 或 Stop;数据可以重新获取,选 Standby
  3. 最后看唤醒时间要求——对响应速度敏感,选 Sleep;能接受几十微秒延迟,选 Stop;不差那几百微秒,选 Standby

下面这张图能帮你快速决策:

低功耗模式选择决策流程 开始选择 唤醒频率高还是低? 高频(毫秒级) 中频(秒级) 低频(分钟级) Sleep 模式 Stop 模式 Standby 模式 各模式典型参数 • Sleep:电流 ~mA,唤醒 ~1µs,数据全保持 • Stop:电流 ~µA,唤醒 ~10µs,数据全保持 • Standby:电流 ~nA,唤醒 ~100µs+,数据仅备份域 • 唤醒频率越高,越倾向于选择 Sleep 或 Stop

4.6 实际项目中的避坑指南

最后,分享几个我踩过的坑:

  • GPIO 状态没处理好——进入低功耗前,GPIO 要设置成合适的电平。我曾经有个引脚悬空,结果在 Stop 模式下产生了额外的漏电流,功耗翻了一倍。
  • RTC 时钟源选错——Standby 模式下只有 LSE 或 LSI 能工作。我见过有人用 HSE 分频给 RTC,结果进入 Standby 后 RTC 直接停了。
  • 唤醒后忘了重新配置时钟——Stop 模式唤醒后,系统默认跑在 HSI。如果你的外设需要 HSE,记得在唤醒代码里重新使能并切换。
  • 调试器影响功耗——接上调试器后,芯片可能无法真正进入低功耗模式。测量功耗时,记得拔掉调试器。
我曾经踩过的坑: 有一次做产品,Stop 模式下电流始终降不下来。查了两天,最后发现是 PA0 引脚接了上拉电阻,但内部上拉没关。关掉后,电流从 50µA 降到了 3µA。细节决定成败啊。