跳到正文

低功耗与电源管理

本文性质声明:本机无开发板,全部内容未实测,为手册级框架。站内对照: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 的分层)。

二、电流测量:量级与三个陷阱

低功耗电流从微安到纳安——测量手段不对,差一个数量级是常态:

  1. 量级对应工具:>1mA 万用表可以;µA 级要源表/纳安表;nA 级(Standby 漏电)要静电计级。开发板自带的电流探头有底噪(板上前级自己耗电),测被测系统不是测板子。
  2. 动态电流 ≠ 平均电流:MCU 醒着时 10mA、睡了 10µA、每秒醒 1ms——平均 ≈ (10mA×1ms + 10µA×999ms)/1s ≈ 20µA。用示波器抓 Vshunt 看占空比,别用稳态读数推断。
  3. 调试器是功耗黑洞:SWD 挂着时深睡进不去(调试器保持时钟和电源域)——功耗数据必须是拔掉调试器、独立供电下测的。同理:板上的电源指示 LED、USB 转串口的芯片、上拉电阻,每一个都是 μA–mA 级的”地板功耗”,测系统功耗时要逐个排除。

三、关断清单:深睡前的每一滴

睡前的优化清单(按常见收益排序):

  1. GPIO 状态:浮空输入是 CMOS 的漏电源——没用到的引脚全设模拟输入或上拉;输出引脚保持确定电平(别让推挽输出在半电压区抖动);外部上拉/下拉在深睡期还在拉电流——必要时软件切掉。
  2. 外设时钟门控:深睡模式默认关大部分,但浅睡(Idle)时没用到的外设时钟要手动关(RCC 的时钟使能位);外设的使能位(ADC/UART/SPI)也要关——只关时钟不关使能,外设还在耗。
  3. 模拟外设:ADC/PLL/内部基准的功耗常被忘——PLL 醒来后如果不需要高频,切回内部低速时钟再睡。
  4. 电源域与 LDO:支持多电源域的芯片,把不用的域单独断(要外部电路配合——LDO 的使能脚由 MCU 控制)。
  5. 代码路径:醒着的时间越短越省——中断里做完赶紧睡,别在主循环里转悠;轮询改中断(emb-rtos-basics 的 idle hook 是挂 __WFI() 的标准位置)。

验证方法:每改一项重测平均电流——没有”改前改后”对比的低功耗优化都是感觉良好(本站 dbg-benchmark 的测量纪律同款)。

四、电池与续航预算

续航估算就是一道除法,难在分子:

续航(小时) = 电池容量(mAh) × 可用深度 / 平均电流(mA)

三个实务点:

  1. 平均电流的测量口径:第三节的动态占空比法——取一个完整使用周期(含最坏情况:上报失败重试、按键突发),别取”稳态运行”的美好值。
  2. 可用深度:锂电放到 0% 伤电池,通常按 80–90% 算;低温容量跳水(-20℃ 可能只剩 60%)要按使用场景留余量;自放电(每月 1–3%)对长待机设备(一换一次电池的传感器)是主项。
  3. 功耗预算表:设计初期就按”外设 × 占空比”列一张表(MCU 睡/醒、无线模块发射/接收/睡、传感器每次量测、LED 每次闪烁),总和超预算就在表上砍——发射功率降一档、上报间隔翻倍、去掉心跳——这比事后抠代码有效得多。

五、排障索引

症状入口
电流比预期大 10 倍IO 浮空/外部上拉;板载 LED 和 USB 芯片没排除(第二节)
睡下去就醒不来唤醒源配错(电平中断反复触发);或中断标志没清
深睡进不去调试器挂着;有外设在请求时钟;看门狗在跑
唤醒后外设不工作深睡丢了外设状态——重新初始化清单漏项
续航只有估算一半平均电流口径错(用了稳态值);重试/失败路径没算进去

六、未实测清单

  • 本文所有功耗行为与数值——无开发板,未测。
  • 具体型号的睡眠/唤醒参数——以你的器件手册为准。
  • 电流测量的实操——未部署仪器。
  • 用户 Linux 开发机上的项目功耗——该机不可达,未涉及。