3. 低功耗基础
做低功耗设计,说白了就是跟MCU的“作息时间”打交道。你想想看,一个芯片不可能永远满负荷运转,它得有休息的时候。关键就在于,怎么休息、休息到什么程度、醒来要多快。
我刚开始做低功耗项目时,总觉得把芯片扔进Sleep模式就完事了。结果一测电流,比预期高了好几倍。后来才明白——不同模式下的电流差异,能差出好几个数量级。今天我们就把这四种模式掰开揉碎了讲清楚。
3.1 四种工作模式的核心差异
先看一张总览图,把四种模式放在一起对比,你就能直观感受到它们的“功耗阶梯”。
3.2 Active模式——全速运转
Active模式就是MCU的正常工作状态。CPU全速运行,所有外设想开就开。这时候的电流,通常在mA级别。拿STM32L4系列来说,跑在80MHz时,电流大概在2~5mA之间,具体看你开了多少外设。
我有个习惯:在Active模式下,尽量把事干完,然后赶紧睡。别让CPU空转。空转就是浪费电。
3.3 Sleep模式——浅度睡眠
Sleep模式下,CPU时钟停了,但外设还在跑。比如定时器、UART、I2C这些,都还能工作。一旦有中断,CPU立刻醒来,继续干活。
电流大概在几十到几百μA。唤醒时间很快,几个微秒就能恢复。适合那种“等一会儿再干”的场景。
我记得有个项目,需要每隔10ms采集一次ADC数据。如果每次采集完都进Deep Sleep,唤醒时间太长,根本来不及。后来改用Sleep模式,采集完就睡,定时器中断一叫就醒,完美解决。
3.4 Deep Sleep模式——深度睡眠
Deep Sleep模式就狠多了。CPU停了,大部分外设也停了,只保留几个关键模块:RTC(实时时钟)、唤醒IO、备份寄存器。有些MCU还会保留一小块SRAM不掉电。
电流能降到几个μA。但代价是唤醒时间变长,通常要几毫秒。因为系统需要重新锁相环、恢复时钟。
3.5 Standby模式——几乎关机
Standby模式是功耗最低的模式。说白了,除了唤醒逻辑和RTC,其他全部断电。连SRAM里的数据都没了。
电流能到几十nA。但唤醒时间最长,可能要几百毫秒甚至几秒。因为系统要从头启动,跟冷启动差不多。
这种模式适合那种“几个月才动一次”的设备。比如电池供电的烟雾报警器,平时就待在Standby模式,只有检测到烟雾才醒来报警。
3.6 四种模式电流对比表
下面这张表,是我在实际项目中测出来的典型数据。不同MCU会有差异,但数量级基本一致。
| 工作模式 | 典型电流 | 唤醒时间 | 保留功能 | 适用场景 |
|---|---|---|---|---|
| Active | 1~10 mA | 无 | 全部 | 数据处理、通信 |
| Sleep | 50~500 μA | 1~10 μs | CPU暂停,外设运行 | 短时等待、定时采集 |
| Deep Sleep | 1~10 μA | 1~10 ms | RTC、唤醒IO、备份SRAM | 周期性上报、低功耗待机 |
| Standby | 20~500 nA | 100 ms~2 s | 仅RTC和唤醒逻辑 | 长期待机、电池供电 |
3.7 模式切换的避坑指南
模式切换看着简单,但坑不少。我把自己踩过的坑列出来,你遇到了能少走弯路。
- 外设状态没恢复: 从Deep Sleep醒来后,外设配置可能丢了。我习惯在初始化函数里重新配一遍,别指望硬件能记住。
- GPIO电平没处理: 进入低功耗模式前,把不用的GPIO设成模拟输入或上拉/下拉。浮空引脚会漏电,我曾经因为这个多耗了5μA。
- 唤醒源没配对: 有些MCU的Standby模式只能用特定引脚唤醒。比如PA0,别随便找个引脚就往上接。
- 时钟切换顺序: 从Deep Sleep醒来,先切到内部低速时钟,等外部晶振稳定了再切回来。顺序错了,系统可能直接死机。
核心原则: 能睡就睡,能深睡就别浅睡。但一定要算好唤醒时间和功耗的平衡。别为了省电,把实时性搞丢了。