低功耗与电源管理
本文性质声明:本机无开发板,全部内容未实测,为手册级框架。站内对照:emb-devtools(串口日志)、emb-gpio-timer(GPIO 上下拉)、os-scheduling(唤醒延迟的量级参照)。所有电流数值以你的器件手册为准。
一、睡眠模式:深度与唤醒时间的交换
MCU 的低功耗是一张阶梯,每一级都是”睡得多深 vs 醒得多快”:
| 模式 | 睡什么 | 唤醒时间 | 保留 |
|---|---|---|---|
| Idle/ Sleep | 只停 CPU 时钟 | 纳秒级(中断直接继续) | 全部 |
| Stop / Deep Sleep | 停大部分时钟、保持 RAM | 微秒级 | RAM、寄存器(部分) |
| Standby / Shutdown | 几乎全停 | 毫秒级(等于重启) | 少数备份域 |
| 关断(VBAT 域) | 只留 RTC/备份寄存器 | 上电序列 | 备份域 |
选型的核心是唤醒间隔:每秒醒一次干活 1ms——睡眠深度要覆盖”睡 999ms”,Stop 级通常够;一分钟醒一次——Standby 级的收益才值得那几毫秒重启。深睡的隐藏成本:上下文保存/恢复(深睡丢的寄存器要重配)、时钟重稳定(PLL 锁定时钟要等——用 HSI 起步或接受等待)、外设状态重建(I2C 从机可能已经掉了)。
唤醒源要配对:RTC 闹钟(定时唤醒的标准)、IO 中断(按键/传感器中断唤醒——注意电平 vs 边沿,深睡期电平型会反复触发)、通信事件(UART 起始位、I2C 地址匹配——从机场景)、看门狗(emb-reliability 的分层)。
二、电流测量:量级与三个陷阱
低功耗电流从微安到纳安——测量手段不对,差一个数量级是常态:
- 量级对应工具:>1mA 万用表可以;µA 级要源表/纳安表;nA 级(Standby 漏电)要静电计级。开发板自带的电流探头有底噪(板上前级自己耗电),测被测系统不是测板子。
- 动态电流 ≠ 平均电流:MCU 醒着时 10mA、睡了 10µA、每秒醒 1ms——平均 ≈ (10mA×1ms + 10µA×999ms)/1s ≈ 20µA。用示波器抓 Vshunt 看占空比,别用稳态读数推断。
- 调试器是功耗黑洞:SWD 挂着时深睡进不去(调试器保持时钟和电源域)——功耗数据必须是拔掉调试器、独立供电下测的。同理:板上的电源指示 LED、USB 转串口的芯片、上拉电阻,每一个都是 μA–mA 级的”地板功耗”,测系统功耗时要逐个排除。
三、关断清单:深睡前的每一滴
睡前的优化清单(按常见收益排序):
- GPIO 状态:浮空输入是 CMOS 的漏电源——没用到的引脚全设模拟输入或上拉;输出引脚保持确定电平(别让推挽输出在半电压区抖动);外部上拉/下拉在深睡期还在拉电流——必要时软件切掉。
- 外设时钟门控:深睡模式默认关大部分,但浅睡(Idle)时没用到的外设时钟要手动关(RCC 的时钟使能位);外设的使能位(ADC/UART/SPI)也要关——只关时钟不关使能,外设还在耗。
- 模拟外设:ADC/PLL/内部基准的功耗常被忘——PLL 醒来后如果不需要高频,切回内部低速时钟再睡。
- 电源域与 LDO:支持多电源域的芯片,把不用的域单独断(要外部电路配合——LDO 的使能脚由 MCU 控制)。
- 代码路径:醒着的时间越短越省——中断里做完赶紧睡,别在主循环里转悠;轮询改中断(emb-rtos-basics 的 idle hook 是挂
__WFI()的标准位置)。
验证方法:每改一项重测平均电流——没有”改前改后”对比的低功耗优化都是感觉良好(本站 dbg-benchmark 的测量纪律同款)。
四、电池与续航预算
续航估算就是一道除法,难在分子:
续航(小时) = 电池容量(mAh) × 可用深度 / 平均电流(mA)
三个实务点:
- 平均电流的测量口径:第三节的动态占空比法——取一个完整使用周期(含最坏情况:上报失败重试、按键突发),别取”稳态运行”的美好值。
- 可用深度:锂电放到 0% 伤电池,通常按 80–90% 算;低温容量跳水(-20℃ 可能只剩 60%)要按使用场景留余量;自放电(每月 1–3%)对长待机设备(一换一次电池的传感器)是主项。
- 功耗预算表:设计初期就按”外设 × 占空比”列一张表(MCU 睡/醒、无线模块发射/接收/睡、传感器每次量测、LED 每次闪烁),总和超预算就在表上砍——发射功率降一档、上报间隔翻倍、去掉心跳——这比事后抠代码有效得多。
五、排障索引
| 症状 | 入口 |
|---|---|
| 电流比预期大 10 倍 | IO 浮空/外部上拉;板载 LED 和 USB 芯片没排除(第二节) |
| 睡下去就醒不来 | 唤醒源配错(电平中断反复触发);或中断标志没清 |
| 深睡进不去 | 调试器挂着;有外设在请求时钟;看门狗在跑 |
| 唤醒后外设不工作 | 深睡丢了外设状态——重新初始化清单漏项 |
| 续航只有估算一半 | 平均电流口径错(用了稳态值);重试/失败路径没算进去 |
六、未实测清单
- 本文所有功耗行为与数值——无开发板,未测。
- 具体型号的睡眠/唤醒参数——以你的器件手册为准。
- 电流测量的实操——未部署仪器。
- 用户 Linux 开发机上的项目功耗——该机不可达,未涉及。