一、低功耗基础:STM32低功耗模式概述
做嵌入式开发的朋友,十有八九都会碰到功耗问题。我最早接触低功耗设计,是在一个手持设备项目上——电池就那么一小块,客户要求待机三个月。那时候我才意识到,光会点灯、跑RTOS远远不够,功耗才是硬门槛。
STM32的低功耗能力,说实话在同级别MCU里算很能打的。它提供了三种核心低功耗模式:Sleep、Stop、Standby。每种模式对应不同的功耗等级、唤醒方式和恢复速度。你想想看,这就像汽车的怠速、熄火和彻底断电——场景不同,选择就不同。
1.1 三种低功耗模式对比
先看一张对比表,把三种模式的核心差异说清楚。这张表我建议你收藏,选型时直接翻出来对照。
| 特性 | Sleep模式 | Stop模式 | Standby模式 |
|---|---|---|---|
| CPU时钟 | 关闭 | 关闭 | 关闭 |
| SRAM/寄存器 | 保持 | 保持 | 丢失(仅备份域保留) |
| 外设时钟 | 可配置(部分关闭) | 全部关闭 | 全部关闭 |
| 典型功耗 | ~mA级 | ~μA级 | ~nA级 |
| 唤醒源 | 任意中断/事件 | EXTI、RTC、USART等 | WKUP引脚、RTC、NRST |
| 唤醒时间 | ~μs | ~μs(数μs到数十μs) | ~ms(数ms) |
| 代码继续执行 | 是(从WFI/WFE后继续) | 是(从中断服务后继续) | 否(相当于复位) |
嗯,这里要注意——Standby模式虽然功耗最低,但代价也最大。SRAM和寄存器内容全丢了,唤醒后系统从头执行,就像按了复位键。我有个项目就踩过这个坑:用Standby做间歇采集,结果每次唤醒后ADC校准参数没了,数据全偏。后来改用Stop模式,功耗多几μA,但省心多了。
1.2 三种模式的工作状态详解
Sleep模式
说白了就是CPU睡觉,外设还醒着。执行WFI或WFE指令后,CPU时钟停摆,但SRAM、寄存器、外设时钟都还在跑。这时候功耗大概在mA级别,具体看外设开了多少。
我习惯用Sleep模式做「等待事件」的场景。比如等待UART收到一帧数据,或者等待定时器溢出。唤醒速度极快,几乎感觉不到延迟。
Stop模式
这个模式有意思——它把内部所有时钟都关了,包括HSE、HSI、PLL。但SRAM和寄存器内容靠VDD电压域维持着。功耗能降到μA级,唤醒后时钟重新启动,程序从断点继续执行。
Stop模式是我项目里用得最多的。它比Sleep省电得多,又比Standby灵活。唤醒源也丰富:RTC闹钟、外部中断、USART唤醒都可以。我曾经在一个数据记录仪上,用Stop模式配合RTC,每10秒唤醒一次采集数据,两节AA电池撑了半年。
Standby模式
这是STM32的「深度睡眠」。除了备份域(RTC、备份寄存器、WKUP引脚)还带电,其他全部断电。功耗可以低到几十nA,但代价是唤醒后系统复位,所有未保存的数据都会丢失。
Standby适合什么场景?远程传感器节点、资产追踪器、或者那种「一年唤醒几次」的设备。我记得有个客户做牛羊定位项圈,电池要撑两年,只能用Standby模式,每天上报一次位置。
1.3 功耗测量基础
做低功耗设计,不会测功耗等于闭眼开车。我见过太多人「感觉功耗应该很低」,结果一上电流表傻眼了。
测量功耗有几种常用方法:
- 万用表直接测量:串联在电源回路里,测平均电流。适合静态功耗评估,但测不到瞬态尖峰。
- 串联采样电阻+示波器:在电源路径上串一个10Ω或1Ω电阻,用示波器测电阻两端电压波形。能捕捉到唤醒瞬间的电流尖峰——这个很重要,有时候平均电流不高,但尖峰能把电源拉崩。
- 专用功耗分析仪:比如Joulescope、Otii,能同时测电压、电流、能量,还能做积分统计。如果公司预算允许,强烈建议备一台。
另外,测量时要注意几点:
- 断开调试器!ST-Link的SWD接口在调试时会额外供电,影响测量结果。
- 所有GPIO要配置成模拟输入或固定电平输出,浮空引脚会漏电。
- 如果板上有LDO,LDO自身的静态功耗也要算进去。
1.4 知识结构图:低功耗模式选择逻辑
下面这张图是我自己画的选择逻辑,帮你快速判断该用哪种模式。每次做新项目,我都会先走一遍这个流程。
1.5 本章小结
这一章我们聊了STM32三种低功耗模式的核心差异、适用场景和功耗测量方法。说白了,没有最好的模式,只有最合适的模式。Sleep模式适合「短睡」,Stop模式适合「午休」,Standby模式适合「冬眠」。
下一章开始,我们会用CubeMX实际配置这些模式,手把手带你走一遍。到时候你会发现,工具用对了,低功耗设计其实没那么玄乎。