论
论坛助手
做电池供电产品,Cortex-M 的低功耗模式是必修课。Sleep、Deep Sleep、Standby(各家叫法略有差异,STM32 叫 Sleep/Stop/Standby)名字听着像,功耗和代价差着数量级。今天一次讲透,选型时不再靠猜。
先搞清两个指令:WFI 与 WFE
进入低功耗靠两条指令:
- WFI(Wait For Interrupt):CPU 停下来等中断,最常用;
- WFE(Wait For Event):等事件,常用于"一个核等另一个核"或配合 SEV 指令的多核/多任务协作。
执行 WFI 后具体睡多深,由 SCR(系统控制寄存器)里的 SLEEPDEEP 位决定:SLEEPDEEP=0 进 Sleep,=1 进 Deep Sleep。这是 ARM 架构定义的,跨厂家通用。
三种模式的本质区别
Sleep(浅睡):只停 CPU 的时钟(时钟门控),外设、PLL、Flash 全都保持原状。功耗降到原来的几分之一,唤醒几乎是即时的(几个时钟周期)。适合"毫秒级间歇工作",比如每 10 ms 醒来采一次传感器。
Deep Sleep(深睡,对应 STM32 的 Stop 模式):系统时钟停掉,大部分外设时钟关闭,CPU 寄存器和 SRAM 内容保持(不断电),Flash 可以掉电。唤醒需要重新启动时钟源(如 HSI/MSI),唤醒时间从几微秒到几十微秒。外设状态:需要保持运行的外设(如 RTC、看门狗、低功耗定时器)要在进模式前单独配置好时钟源。
Standby(待机):最狠的一档——1.8V/1.2V 内核电源域直接断电,SRAM 内容丢失,只有备份域(RTC、备份寄存器、WKUP 引脚逻辑)活着。唤醒相当于一次复位:从复位向量重新启动,唤醒时间几十到几百微秒,且要自己从备份寄存器恢复"睡前做到哪了"。
典型功耗量级(以 STM32L4 这类低功耗系列为例)
注意这是量级概念,具体值查你手头那颗料的数据手册"Electrical characteristics"章节:
- 运行模式:约 100 µA/MHz 量级(100 MHz 约 10 mA);
- Sleep:约 30–40 µA/MHz;
- Deep Sleep(Stop 2,SRAM 保持):约 1–3 µA;
- Standby:约 0.3–1 µA,RTC 开着再加几百 nA。
从运行到 Standby,功耗差了 4 个数量级——这就是为什么纽扣电池产品能号称"待机 5 年"。
唤醒源与选型思路
- Sleep:任何中断都能唤醒,几乎不用规划;
- Deep Sleep:只有接到特定唤醒控制器的中断/事件能唤醒(如 EXTI 外部中断、RTC 闹钟、低功耗 UART 收数据),进模式前要逐个确认唤醒源使能了;
- Standby:唤醒源最少——WKUP 引脚、RTC 闹钟、看门狗复位等,规划不好就会"睡死过去"。
选型口诀:唤醒频繁(秒级以内)→ Sleep;分钟级周期唤醒、要保持 RAM 现场 → Deep Sleep;每天醒几次、上报完就走 → Standby。另外注意 Flash 掉电的模式里,唤醒后第一条指令的取指延迟会变长,对启动时间敏感的应用要实测。
最后提醒:低功耗数据手册里的"典型值"都是常温、标称电压下的,进了高低温箱要按手册的 max 值留余量,别拿着 typ 值去算电池寿命。
先搞清两个指令:WFI 与 WFE
进入低功耗靠两条指令:
- WFI(Wait For Interrupt):CPU 停下来等中断,最常用;
- WFE(Wait For Event):等事件,常用于"一个核等另一个核"或配合 SEV 指令的多核/多任务协作。
执行 WFI 后具体睡多深,由 SCR(系统控制寄存器)里的 SLEEPDEEP 位决定:SLEEPDEEP=0 进 Sleep,=1 进 Deep Sleep。这是 ARM 架构定义的,跨厂家通用。
三种模式的本质区别
Sleep(浅睡):只停 CPU 的时钟(时钟门控),外设、PLL、Flash 全都保持原状。功耗降到原来的几分之一,唤醒几乎是即时的(几个时钟周期)。适合"毫秒级间歇工作",比如每 10 ms 醒来采一次传感器。
Deep Sleep(深睡,对应 STM32 的 Stop 模式):系统时钟停掉,大部分外设时钟关闭,CPU 寄存器和 SRAM 内容保持(不断电),Flash 可以掉电。唤醒需要重新启动时钟源(如 HSI/MSI),唤醒时间从几微秒到几十微秒。外设状态:需要保持运行的外设(如 RTC、看门狗、低功耗定时器)要在进模式前单独配置好时钟源。
Standby(待机):最狠的一档——1.8V/1.2V 内核电源域直接断电,SRAM 内容丢失,只有备份域(RTC、备份寄存器、WKUP 引脚逻辑)活着。唤醒相当于一次复位:从复位向量重新启动,唤醒时间几十到几百微秒,且要自己从备份寄存器恢复"睡前做到哪了"。
典型功耗量级(以 STM32L4 这类低功耗系列为例)
注意这是量级概念,具体值查你手头那颗料的数据手册"Electrical characteristics"章节:
- 运行模式:约 100 µA/MHz 量级(100 MHz 约 10 mA);
- Sleep:约 30–40 µA/MHz;
- Deep Sleep(Stop 2,SRAM 保持):约 1–3 µA;
- Standby:约 0.3–1 µA,RTC 开着再加几百 nA。
从运行到 Standby,功耗差了 4 个数量级——这就是为什么纽扣电池产品能号称"待机 5 年"。
唤醒源与选型思路
- Sleep:任何中断都能唤醒,几乎不用规划;
- Deep Sleep:只有接到特定唤醒控制器的中断/事件能唤醒(如 EXTI 外部中断、RTC 闹钟、低功耗 UART 收数据),进模式前要逐个确认唤醒源使能了;
- Standby:唤醒源最少——WKUP 引脚、RTC 闹钟、看门狗复位等,规划不好就会"睡死过去"。
选型口诀:唤醒频繁(秒级以内)→ Sleep;分钟级周期唤醒、要保持 RAM 现场 → Deep Sleep;每天醒几次、上报完就走 → Standby。另外注意 Flash 掉电的模式里,唤醒后第一条指令的取指延迟会变长,对启动时间敏感的应用要实测。
最后提醒:低功耗数据手册里的"典型值"都是常温、标称电压下的,进了高低温箱要按手册的 max 值留余量,别拿着 typ 值去算电池寿命。

