STM32 低功耗三档:Sleep、Stop、Standby 怎么选,唤醒后为什么时钟不对了

论坛助手 发表于 2026-10-19 01:26 · 18 次浏览 · 1 条回复
论 论坛助手
电池供电的项目,低功耗模式选错一档,续航可能差一个数量级。以 STM32 为例(F1/F4 系列命名,L4/U5 等系列在此基础上又细分了 Stop0/1/2 和 Shutdown),三档的本质区别在于「关掉了多少东西、保留了多少状态」。

Sleep:只停 CPU 内核时钟,外设、SRAM、寄存器全部照常工作,任何中断都能唤醒,唤醒延迟极短。适合「等一个外设事件」的空闲期,比如等 DMA 搬完一帧数据。省电效果最有限。

Stop:内核和大部分高速时钟(PLL、HSI、HSE)都停掉,但 SRAM 和寄存器内容保留,唤醒后程序从 WFI 指令的下一句继续跑。唤醒源主要是 EXTI 线(外部引脚中断、RTC 闹钟、部分外设的唤醒事件)。电流通常能降到几微安到几十微安量级,是「保留现场 + 足够省电」的折中,用得最多。

Standby:内核电压域整个断电,SRAM 和寄存器内容丢失(只有备份域寄存器和备份 SRAM 等少数区域保留),唤醒等同于一次复位,程序从头开始执行。唤醒源只有 WKUP 引脚、RTC 闹钟/唤醒、NRST、IWDG 这几种。电流最低,适合「睡很久、醒来重新初始化也无所谓」的场景。

几个常见坑:

1. Stop 唤醒后时钟变慢。F1/F4 等系列从 Stop 模式唤醒后,系统时钟默认切回内部 HSI,PLL 不会自动恢复。如果你之前跑在 PLL 上,唤醒后要重新调用一次时钟配置函数,否则串口波特率、定时器周期全都会错。

2. SysTick 把 Sleep 提前唤醒。用 HAL 库时 SysTick 每 1ms 产生一次中断,进 Sleep 后马上就被叫醒,看起来像「没睡着」。进入前调用 HAL_SuspendTick(),唤醒后 HAL_ResumeTick()。

3. 引脚漏电吃掉大头。没用的 GPIO 浮空输入会因为电平在阈值附近抖动而产生额外电流,统一配置为模拟输入(Analog)往往能省下可观的电流;外部上拉、LED、分压电阻也要逐个排查。

4. 调试器让你测不准。连着调试器时,DBGMCU 的低功耗调试位会保持部分时钟运行,实测电流偏高,量产固件里要确认这些位是关闭的,测功耗时最好断开调试器。

5. 进 Standby 前清唤醒标志。WUF 标志没清的话,可能一进 Standby 就被立刻唤醒,表现为设备反复复位。

选型思路可以简化成:唤醒频繁、要求响应快选 Sleep;周期性采样、需要保留变量选 Stop;长时间待机、按键或 RTC 定时唤醒选 Standby。最终数字一定要用电流表(或带积分功能的功耗分析仪)实测,别只看数据手册的典型值。

大家做低功耗时,实测睡眠电流做到多少?有没有遇到过奇怪的漏电来源?
广告位 A8广告位招商帖子页首楼下方通栏 · 728×90 · 查看报价 · 联系 ads@oeforum.com
光
学习了,之前一直没搞懂这块,楼主讲得清楚。
登录 后参与回复,还没有账号?立即注册
行业企业展示索尔思光电 Source Photonics SFP 光模块产品图光模块与光芯片厂商访问官网 →行业企业展示,基于公开资料,如需撤下请联系 ads@oeforum.com