低功耗设计要点:从功耗模型到GPIO倒灌
可穿戴与电池设备是星球课程的重要应用场景(手表类 MCU 兼顾 GPU 绘制与功耗,现在的市面上手表中的MCU都是带GPU,以后LVGL大行其道,Jack)。本专题合并低功耗相关的问答,从方法论到硬件细节。
一、先建功耗模型,再谈优化
低功耗的第一步不是关外设,而是针对功耗模型做有条件的待机时长优化:量化"每次任务间隔多久",再决定睡多深(针对低功耗的功耗模型,做有条件的待机时间时长优化是做低功耗的开始,Jack)。实践中给出的分级策略(我看了咱发的低功耗相关的内容,关于手表低功耗关闭 cpu 这块,我有两个问题想问下,Jack):
- 几十毫秒以内的任务间隔:不进深睡,最多 WFI / Sleep;
- 几百毫秒级:视芯片唤醒时间与业务实时性,进 Stop / light sleep;
- 秒级以上:deep sleep,部分外设断电;
- 分钟级以上:RF、屏幕、传感器等高功耗域彻底断电。
关键判据是能量收支:不看瞬间电流峰值,而看"一次关断再唤醒的总能耗"是否真的小于"一直等待",这必须实测。像 RF 模块重新上电瞬间的 inrush 是正常现象,省电方案要按模块实测情况衡量。
二、GPIO 倒灌:低功耗调试的经典问题
GPIO 倒灌的本质:MCU 某个电源域已掉电,但外部信号仍给 GPIO 高电平,电流经 GPIO 内部保护结构、ESD 二极管、钳位电路或输入缓冲路径反向灌入芯片电源域(我看了咱发的低功耗相关的内容,关于手表低功耗关闭 cpu 这块,我有两个问题想问下,Jack)。
典型现象清单:
- 产品进低功耗后整机电流异常偏大;
- MCU 明明关断了某电源域,VDD/VBAT/IOVDD 上仍有"虚电压";
- 断开某根外设线后,低功耗电流立刻恢复正常;
- 某外设断电后其通信线仍被另一模块拉高;
- 关机后某些 GPIO 还有电平,芯片处于半上电状态。
排查手段即"断线法":逐根断开外部信号定位倒灌路径。硬件配合方案(Load-switcher 负载开关)见 Load-switcher(Jack)。此外还有一个两难:整板掉电后电荷释放太慢会导致下次上电不稳定、放电太快则休眠-开机循环更耗电,需要结合具体板子实测权衡。
三、软件侧:事件驱动是低功耗的前提
轮询扫描按键会产生大量"空扫",为了这些空扫设备无法进低功耗。正确做法是事件驱动:基于中断计数 + 队列传输,按键线程平时阻塞不占 CPU,按下才被唤醒(问:按键模块是怎么进行的 答:,Jack;机制详解见 什么是事件驱动? 事件驱动简,Jack)。
硬件配合上,STM32 的 FCLK 与 HCLK 分离设计专门服务低功耗:CPU 休眠时 HCLK 可以给 CPU 断供时钟,但 FCLK 仍驱动中断查询等唤醒门电路,保证能被唤醒(STM32中的FCLK和HCLK时钟的区别,Jack)。
四、开放问题
APP/RTOS 如何与 MCU 低功耗模式配合、底层低功耗模式如何实现 TICKLESS 等机制,是社区仍持续讨论的方向(我想问一下关于嵌入式低功耗相关,海底 提问),可结合 04-RTOS 目录的 Tickless 相关笔记延伸阅读。
来源笔记
- 现在的市面上手表中的MCU都是带GPU,以后LVGL大行其道 | Jack
- 针对低功耗的功耗模型,做有条件的待机时间时长优化是做低功耗的开始 | Jack
- 我看了咱发的低功耗相关的内容,关于手表低功耗关闭 cpu 这块,我有两个问题想问下 | Jack
- Load-switcher | Jack
- 问:按键模块是怎么进行的 答: | Jack
- 什么是事件驱动? 事件驱动简 | Jack
- STM32中的FCLK和HCLK时钟的区别 | Jack
- 我想问一下关于嵌入式低功耗相关 | 海底