3. 低功耗基础

做低功耗设计,说白了就是跟MCU的“作息时间”打交道。你想想看,一个芯片不可能永远满负荷运转,它得有休息的时候。关键就在于,怎么休息、休息到什么程度、醒来要多快。

我刚开始做低功耗项目时,总觉得把芯片扔进Sleep模式就完事了。结果一测电流,比预期高了好几倍。后来才明白——不同模式下的电流差异,能差出好几个数量级。今天我们就把这四种模式掰开揉碎了讲清楚。

3.1 四种工作模式的核心差异

先看一张总览图,把四种模式放在一起对比,你就能直观感受到它们的“功耗阶梯”。

MCU四种工作模式功耗与唤醒时间对比 Active 电流:mA级 唤醒:无 CPU全速运行 Sleep 电流:百μA级 唤醒:μs级 CPU暂停,外设运行 Deep Sleep 电流:μA级 唤醒:ms级 仅保留RTC/唤醒IO Standby 电流:nA级 唤醒:ms~s级 几乎全部断电 功耗递减 → 唤醒时间递增 → 典型应用场景 • Active:传感器数据采集、算法运算、通信处理 • Sleep:等待传感器就绪、短时空闲等待 • Deep Sleep:周期性上报(如温湿度采集,每分钟一次) • Standby:电池供电设备长期待机(如门磁、烟感)

3.2 Active模式——全速运转

Active模式就是MCU的正常工作状态。CPU全速运行,所有外设想开就开。这时候的电流,通常在mA级别。拿STM32L4系列来说,跑在80MHz时,电流大概在2~5mA之间,具体看你开了多少外设。

我有个习惯:在Active模式下,尽量把事干完,然后赶紧睡。别让CPU空转。空转就是浪费电。

小技巧: 在Active模式下,可以用WFI(Wait For Interrupt)指令让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。但代价是唤醒时间变长,通常要几毫秒。因为系统需要重新锁相环、恢复时钟。

注意: 进入Deep Sleep前,一定要把不用的外设时钟关掉。我曾经有个项目,进Deep Sleep后电流还有20μA,查了半天发现是DMA的时钟没关。关掉后直接降到2μ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醒来,先切到内部低速时钟,等外部晶振稳定了再切回来。顺序错了,系统可能直接死机。

核心原则: 能睡就睡,能深睡就别浅睡。但一定要算好唤醒时间和功耗的平衡。别为了省电,把实时性搞丢了。