2. MCU 工作模式详解:从主动到待机,功耗与唤醒时间的权衡

做低功耗设计,说白了就是跟 MCU 的“工作模式”打交道。你想想看,芯片不可能一直全速跑,那功耗谁也扛不住。所以厂商设计了多种模式,让你在不同场景下“按需用电”。

我个人习惯把 MCU 的工作模式看成汽车的档位:主动模式是“运动档”,性能拉满;睡眠模式是“空档”,发动机还在转但没挂挡;深度睡眠是“熄火但通电”,能听个收音机;停机模式是“全车断电”,只有门锁还工作;待机模式嘛,就是电瓶线都拔了,只留个时钟。

下面这张图,是我自己总结的 MCU 工作模式层级关系,你可以先有个整体印象。

MCU 工作模式层级与功耗关系图 MCU 工作模式层级与功耗关系 功耗递减 → 唤醒时间递增 主动模式 (Active) CPU全速运行,所有外设可用 睡眠模式 (Sleep) CPU 时钟停止,外设时钟可选保持 深度睡眠模式 (Deep Sleep) CPU 掉电,SRAM 保持,部分外设运行 停机模式 (Stop) 主时钟关闭,SRAM 保持,RTC 可选运行 待机模式 (Standby) 关键指标 • 功耗:mA → μA → nA • 唤醒:ns → μs → ms • 数据保持:全部 → 部分 → 无

2.1 主动模式:性能全开,功耗也全开

主动模式是 MCU 的“出厂设置”。CPU 全速运行,所有外设时钟都开着,想干啥都行。这时候的功耗,通常是几十 mA 甚至上百 mA(看主频和外设数量)。

我记得有一次做数据采集器,客户要求 1 秒采一次样,我一开始就用的主动模式。结果一算,电池撑不过 3 天。后来才意识到,大部分时间 CPU 都在空转,白白浪费电。

主动模式适用场景:

  • 需要实时响应的中断处理
  • 大量数据运算(如 FFT、加密)
  • 外设频繁通信(SPI、UART 高速收发)

2.2 睡眠模式:CPU 歇了,外设还能干活

睡眠模式下,CPU 的时钟被停了,但外设的时钟可以继续跑。说白了就是“大脑休息,手脚还能动”。

这时候的功耗,通常能降到主动模式的 1/10 到 1/100。唤醒时间也很快,几个时钟周期就能恢复,一般在几微秒到几十微秒。

我经常在需要“等待外设事件”的场景用睡眠模式。比如等待 UART 接收数据,或者等待定时器溢出。CPU 没必要在那死等,睡一觉,等外设中断来了再醒。

我的习惯: 在进入睡眠前,先把不用的外设时钟关掉。虽然睡眠模式本身功耗不高,但外设时钟开着,那电流也是实打实的。

2.3 深度睡眠模式:CPU 掉电,SRAM 保命

深度睡眠模式,是低功耗设计里最常用的模式之一。CPU 直接掉电,但 SRAM 里的数据还保留着。部分外设(比如 RTC、低功耗定时器、LPUART)还能继续工作。

功耗能降到微安级别。唤醒时间就长了,因为 CPU 需要重新上电、复位、加载程序,一般要几十微秒到几百微秒。

我曾经在一个电池供电的温湿度记录仪里,就用深度睡眠模式。每 10 分钟醒来一次,采集数据存到 Flash,然后继续睡。一节 CR2032 电池,撑了两年多。

注意: 进入深度睡眠前,一定要把 GPIO 的状态处理好。我见过有人没做处理,结果引脚漏电,比 CPU 本身功耗还大。嗯,这坑我踩过。

2.4 停机模式:主时钟全关,只留 RTC

停机模式比深度睡眠更进一步。主时钟(HSE、HSI)全部关闭,系统时钟完全停止。SRAM 内容保持,但大部分外设都歇了。只有 RTC 和几个低功耗定时器还能跑。

功耗可以做到 1 μA 以下。唤醒时间也更长,因为要重新启动主时钟、锁相环,通常需要几百微秒到几毫秒。

我一般在需要“长时间待机,定时唤醒”的场景用停机模式。比如电池供电的烟雾报警器,平时啥也不干,就靠 RTC 每 10 秒唤醒一次,检测一下传感器。

模式 CPU 状态 SRAM 状态 外设状态 典型功耗 唤醒时间
主动模式 运行 保持 全部可用 mA 级 —
睡眠模式 时钟停止 保持 可选保持 几百 μA 几 μs
深度睡眠 掉电 保持 部分运行 几 μA 几十 μs
停机模式 掉电 保持 RTC 等 1 μA 以下 几百 μs
待机模式 掉电 丢失 仅 RTC 几十 nA 几 ms

2.5 待机模式:功耗最低,代价也最大

待机模式是 MCU 的“终极省电模式”。CPU 掉电、SRAM 掉电、所有外设都掉电,只有 RTC 和几个唤醒引脚还带电。说白了,芯片几乎“死”了,只留一口气。

功耗可以做到几十 nA,但代价是 SRAM 里的数据全丢了。唤醒后,程序要从头开始执行,跟复位差不多。唤醒时间也最长,要几毫秒。

我一般只在“设备长期不用,偶尔唤醒报个到”的场景用待机模式。比如资产追踪器,一天醒来一次,发个 GPS 位置,然后继续睡。

避坑指南: 我曾经在一个项目中,把待机模式的唤醒引脚配置错了,结果芯片死活唤不醒。后来查手册才发现,待机模式的唤醒引脚有专门的电气特性,不能随便接。嗯,从那以后,我每次用待机模式,都会仔细看数据手册的“唤醒引脚”章节。

2.6 如何选择:一个简单的决策流程

说了这么多,到底该用哪个模式?我一般按这个思路来:

  1. 需要保持 SRAM 数据吗? 不需要 → 待机模式。需要 → 看下一步。
  2. 需要外设继续工作吗? 不需要 → 停机模式。需要 → 看下一步。
  3. 需要 CPU 快速响应吗? 不需要 → 深度睡眠。需要 → 看下一步。
  4. 外设工作频率高吗? 高 → 睡眠模式。低 → 深度睡眠。

当然,这只是个参考。实际项目中,还要考虑唤醒源、唤醒时间、外设功耗等因素。我建议你画个流程图,把每个模式的条件列清楚,这样选型时一目了然。

我的经验: 不要一上来就追求最低功耗。先保证功能正常,再逐步优化。我见过有人为了省电,直接上待机模式,结果数据丢了,功能全废。低功耗设计,是平衡的艺术,不是极端的选择。