想象你是写字楼的物业经理老周。整栋楼白天灯火通明,几百号人同时办公、电梯上上下下、空调全开——这是电费报表上最刺眼的数字。但真正让老周头疼的,不是白天的热闹,而是凌晨三点:明明没人上班,为什么电表还在转?是走廊灯没关完,是值班室监控在录,还是哪条线路悄悄漏电? 单片机(MCU)的电源管理,和物业经理的烦恼一模一样。芯片只有指甲盖大小,内部却有 CPU 核、内存、各种外设,每个模块都在“耗电”。想做出一块电池能用一年的物联网设备,关键不在于芯片多强,而在于你有多会“安排它睡觉”——降低运行频率、关闭不用的外设、在合适时机进入深度睡眠、用最省电的方式唤醒。这篇文章会带你认识 MCU 的四种“作息档位”,学会配置时钟、处理引脚细节、用万用表测量真实功耗,最后掌握一套权衡功耗与响应速度的实战心法。学完你就能给项目设计出真正省电的电池供电方案。
电源管理是嵌入式工程师的“基本功中的基本功”。掌握低功耗设计,你才能胜任可穿戴、物联网、车规电子等高价值岗位,让产品从“能用一天”变成“能用一年”。
可视化演示
动态演示MCU电源管理与低功耗模式实的核心机制,通过架构/数据/状态/性能四种模式展示关键概念与交互流程。
本节配有交互动效(进入视口后自动加载,约 3KB)。
MCU电源管理与低功耗模式实:MCU低 MCU低功耗模式分类与功耗层次 睡眠模式的时钟门控与快速唤醒机 核心机制可视化 MCU电源管理与低功耗模式实整体架构与关键组件
功耗来源与指标
老周拿到季度电费单,发现支出由两类构成:一类是白天的“干活电”——灯光、空调、电脑,对应的正是芯片里的动态功耗,也就是 CMOS 晶体管不停翻转开关所消耗的能量;另一类是“漏电”——老化的线缆悄悄流失,对应芯片里的静态功耗,是晶体管明明关断却依然存在的泄漏电流。
对 MCU 来说,动态功耗主要取决于三件事:负载电容、电压、频率。你可以把 CMOS 门电路想成一个小秋千:频率是每秒荡几下,电压是秋千荡多高,电容是秋千座有多重。三者相乘,就是单位时间消耗的能量。
除了动态功耗,深亚微米工艺下静态漏电越来越不可忽视。芯片进入待机后动态部分几乎归零,剩下的就是漏电——这就是为什么数据手册会标“待机电流 0.3uA”而不是 0。uA(微安)和 mA(毫安)之间差 1000 倍,设计时务必分清:手环待机用 uA 算,跑算法用 mA 算,平均功率则要看两种状态的占比。
老周明白了,要省钱,既得减少“干活时的浪费”(降频降压),也得堵住“不干活时的漏风”(深度睡眠关漏电)。接下来,他把楼上所有房间的灯分成四档,对应芯片的四种低功耗模式——这是下一节的故事。
- P_dyn 动态功耗数字电路翻转开关时消耗的功率,单位是 W 或 mW。
- C 等效负载电容每个门电路要充放电的寄生电容,由芯片工艺决定,你改不了它。
- V 工作电压核心供电电压。它带平方,是你手里最强的省电杠杆。
- f 翻转频率时钟每跳一下,门电路翻转一次。频率降一半,动态功耗就降一半。
低功耗模式总览
老周把整栋楼的夜间照明分成四档:加班档、值班档、留守档、断电档。加班档是大家还在干活、只关掉走廊大灯——对应 Sleep 睡眠模式,内核停止、外设继续跑;值班档是只留保安前台的监控——对应 Stop 停机模式,主时钟停摆、RAM 数据保持、RTC 电子表继续走时,电流降到微安级;留守档是整栋楼只留消防报警和门卫座机——对应 Standby 待机模式,备份域保持、大部分 RAM 丢失、唤醒等于复位,电流 1uA 以下;断电档是只留一部紧急电话——对应 Shutdown 掉电模式,几乎全部断电,仅剩极少量唤醒源。
选档位的本质,是拿“数据保持 + 唤醒速度”去换功耗。这三种收益每一样都有代价,而代价的量化基准就是电池寿命公式。
常见 MCU 型号基本都提供 Sleep / Stop / Standby / Shutdown 这几档(名称略有差异)。Sleep 唤醒最快(几微秒)但省电有限;Standby 最省电(0.3uA)但唤醒从复位开始,要重新初始化。选模式前问三句话:需要 RAM 保持吗?需要 RTC 继续走时吗?能接受复位式唤醒吗?三个答案都指向“越浅越好”,那就别盲目追求最深的档位。
老周给每层楼都定了档位规则,但他知道,光有档位还不够——总闸在哪里才是关键。芯片的总闸,就是时钟系统。
- T_battery 电池可用时间电池从满电到耗尽的总时长,单位是小时。
- C_battery 电池容量额定容量,单位 mAh,比如纽扣电池 240mAh。
- I_avg 平均电流工作与睡眠按时间加权的平均电流,单位 mA。
时钟系统配置
老周发现,即使整栋楼锁了门,配电房的几个大变压器还在嗡嗡响——对应 MCU 里即使进了睡眠,如果主 PLL 倍频器和高频晶振还在跑,功耗依然下不来。时钟就是芯片的“心跳”:心跳越快功耗越高,但有些“心跳”只是为了让某一个房间的灯亮着。
MCU 通常有两类时钟:一类是高速主时钟,由内部 RC 振荡器(HSI)、外部晶振(HSE)和 PLL 组成,负责 CPU 算数和高速外设;另一类是低速时钟,典型是 32.768kHz 晶振(LSE),只给 RTC 和看门狗用,功耗极低。低功耗设计的第一步,就是让高速时钟在睡觉时完全停摆,只留低速时钟值班。
具体操作就三件事:进睡眠前把 CPU 时钟源从 PLL 切到 HSI(内部 RC 起振快、关停方便);关闭 AHB/APB 总线上不用外设的时钟门控,比如 SPI、USART、ADC 的时钟;把系统时钟降到满足当前任务的最低频率。唤醒后还要记得重新配置 PLL,否则芯片会一直以低速甚至错误的时钟运行,外设波特率、定时器周期全会漂移。
老周拉掉了所有不必要电闸,但他很快发现,要让“断电”安全落地,必须有一套严格的入睡流程——这就是睡前检查清单。
- I_active 工作电流Run 模式下的总电流,近似随频率线性上升。
- I_base 基础电流即使频率为 0,电路仍有基础漏电和偏置电流。
- k × f 频率相关项k 是每 MHz 的电流系数(查数据手册),f 是当前主频。这一项是你能实际省下的部分。
进入流程设计
每次放假锁门,老周都按固定顺序做四件事:确认最后一个人出门(关中断)、照一遍巡逻记录(保存外设状态)、布防报警系统(配置唤醒源)、最后拉下全楼总闸(执行睡眠指令)。顺序错了,不是锁了人就是忘了布防。
MCU 进入低功耗的流程也一样。第一步,用原子操作关掉可屏蔽中断,防止睡到一半被无关中断吵醒;第二步,把需要保持的外设状态(寄存器值)保存到 RAM;第三步,使能真正需要的唤醒源,比如 RTC 闹钟、外部按键中断;第四步,执行 WFI(等待中断)或 WFE(等待事件)指令让内核停摆。两者差异在于:WFI 必须由中断触发唤醒,WFE 还可以由事件直接唤醒,延迟略有不同。
此外还要注意“进入和退出瞬间的尖峰电流”:切换时钟、给电源域电容充电会形成几毫安的短时尖峰。如果设备唤醒频率很高,比如每毫秒一次,尖峰的贡献就不能忽略。工程上有个口诀:任务能攒着一起做,就别频繁醒。
老周锁好了门,布好了防。可真正的考验是——半夜报警响了,门卫要多久才能接到电话?这就要看唤醒机制了。
- D 占空比一个周期里工作时间的比例,取值 0 到 1。
- I_on 工作电流执行任务时的电流,包括唤醒、计算、通信时的消耗。
- I_off 睡眠电流低功耗模式下的电流。
唤醒机制设计
老周给大楼设计了三种“叫醒”方式:门口的门铃(外部中断),一按就响;走廊的定时闹钟(RTC 闹钟),到点就响;值班室的电话(低功耗定时器),由保安定时拨给各家。不同的方式决定了他要留多少“耳朵”在值班,以及醒过来要花多长时间。
MCU 的唤醒源同样分三类:EXTI 外部中断,用 GPIO 检测按键、传感器信号等边沿事件;RTC 闹钟,定时唤醒去做周期性任务;LPTIM 低功耗定时器,在 Stop 模式下用 LSE 低速时钟继续计数。它们的共同点是:从“几乎全停”的状态重新启动时钟、恢复寄存器状态、跳到中断服务程序或复位入口。
模式越深,唤醒延迟越长:Sleep 几微秒、Stop 几十微秒、Standby 从复位开始要几百微秒到几毫秒。如果用外部中断唤醒 Standby,对应的 GPIO 必须保持可唤醒能力,同时注意唤醒后不会自动恢复上下文,需要重新初始化。
门铃响了,老周却发现问题:冬天楼里有些窗户关不严,冷风飕飕往里灌——这就像芯片里那些悬空的引脚,正在悄悄漏电。
- T_wake 唤醒总耗时从睡眠状态到能执行用户代码的总时间。
- T_startup 时钟起振振荡器从停到稳的建立时间,RC 快、晶振慢。
- T_ready 恢复就绪寄存器恢复、电源域重新上电的时间,与所选模式有关。
GPIO与外设
电表显示夜间仍有 0.5mA 的“幽灵电流”,老周拿着热成像仪一照:原来是三楼会议室窗户漏风,空调自动启动补偿。芯片也一样:悬空的 GPIO 引脚处于不定态,内部数字缓冲器被噪声反复触发,导致额外功耗。
处理方式有三招。第一,把不用的 GPIO 设为模拟输入,这是最省电的配置,因为模拟输入不驱动数字缓冲器;第二,必须复用为数字信号的引脚,设置确定的上下拉电阻,不让它在高低电平之间漂移;第三,把外接传感器、电平转换芯片等外围器件的供电用 MOS 管或负载开关切断——主芯片睡了,传感器还在耗电,等于白睡。
还有一个常见坑在板子外围:开发板上的电源指示灯、串口转 USB 芯片、稳压器的静态电流,可能远大于 MCU 待机电流。产品做低功耗,要么在设计上去掉调试电路,要么在软件里控制外围供电。GPIO 配置不要用“默认设置”,要逐脚明确它的电平方向。
窗户缝都堵上了,老周终于可以拿电表来一次真正的夜间抄表——是时候用数据说话了。
- P_pull 上拉损耗上拉电阻上的静态功率。
- V 电源电压上拉所接的电源,通常是 VDD。
- R_pull 上拉阻值常见 10kΩ 到 100kΩ,阻值越大越省电。
功耗实测调试
老周在每层楼配电箱装了高精度电表,深夜逐层读表,发现“第三层数字为什么比设计多了一倍?”——原来保洁阿姨留了一盏台灯没关。芯片也一样:你以为它睡了,其实某个外设或引脚还在偷偷工作。
测量工具用串联式微安电流表,或者把万用表微安档串联在电源路径上。注意:不要在 MCU 唤醒工作的瞬间用微安档去量毫安级电流——会烧保险丝或超量程。工程做法是预留测试跳线:待机时用微安表,工作时用毫安表或看电流波形。
实测有几个要点:测试时关闭串口日志,printf 会唤醒芯片并产生毫安级消耗;调试器(JTAG/SWD)在睡眠时要断开或关闭调试时钟;测量时把板载 LED、传感器外设从板子上断开。优化迭代顺序建议:先确认模式真的进入(看电流表读数是否骤降),再逐个关闭外设时钟,然后处理 GPIO,最后考虑降压和降频,每一步都能找到对应的“漏电点”。
老周把所有“幽灵用电”一个一个揪出来,最终账单降到了设计值。但这才完成一半——他还得面对租户投诉“电梯不够快”的压力。
- I_k 第 k 段电流把工作过程分成 n 个阶段,如运行、通信、睡眠。
- t_k 第 k 段时长每个阶段持续的时间。
- Σt_k 总时长一个完整周期的总时间,也就是所有分段时长之和。
实战权衡策略
整栋楼的用电策略不是越省越好:你把电梯全关了,楼上租户立刻投诉。产品也一样,电池寿命和响应速度是跷跷板的两端。真正的设计师要先读需求:这个设备多久需要响应一次?用户能接受几百毫秒的唤醒延迟吗?
拿一个温湿度传感器举例:环境变化是缓慢的,完全可以用 RTC 每 5 分钟醒来一次,读传感器、发数据、立刻回去睡。但智能门锁呢?用户按指纹后必须在几百毫秒内响应,那就不能睡太深,或者要用外部中断(按键触发)实现快速唤醒。这个决策的量化指标就是占空比。
实战中还常见两种架构:一是裸机状态机加定时唤醒,简单可控,适合单任务采集场景;二是低功耗 RTOS(比如 FreeRTOS 的 tickless 模式),系统在空闲时自动进入低功耗、有任务时自动唤醒,适合多任务场景。选型时要判断三件事:RAM 是否需要在睡眠中保持(决定用 Stop 还是 Standby);唤醒后启动时间是否影响业务窗口;电池类型是否支持瞬时大电流(纽扣电池内阻大,需要做任务分时或电流整形)。
老周最终在“省电”和“用户体验”之间找到了平衡:白天 9 点前全楼安静待机,9 点后逐层唤醒工作,高峰期间歇高速运转。这颗 MCU 也终于学会了——用最少的能量,办最恰当的事。
- D 占空比核心设计指标,越低平均功耗越小。
- T_work 工作时间每一轮唤醒后执行任务的时间。
- T_sleep 睡眠时间两轮任务之间的低功耗睡眠时间。
AI 应用场景
可穿戴健康手环的端侧AI
阶段:端侧模型推理 + 低功耗调度
解决的问题:手环要连续采集加速度计和心率数据,若 MCU 一直运行 TinyML 模型做活动识别,200mAh 电池撑不过一天。传统做法是持续采样 + 持续推理,功耗居高不下。
具体案例:某健康手环采用“事件驱动”架构:平时进入 Standby 待机,加速度计检测到手臂大幅运动后通过外部中断唤醒 MCU,在 10ms 内完成活动识别推理,结果存入 RAM,再交由 RTC 定时同步。AI 模型只在“有动作”时运行,整体平均功耗从 2mA 降到 15uA,续航从 1 天提升到 20 天。
LoRa 农业传感器的周期上报
阶段:端侧数据预处理 + 周期性传输
解决的问题:农田温湿度传感器分布在偏远地区,更换电池的人工成本极高。传统方案常开 LoRa 收发器,几周就没电。
具体案例:产品用 Stop 模式 + RTC 每 15 分钟唤醒一次,采集温湿度后做简单的异常检测(超过阈值才立即上报),正常数据周期性发送后立刻回睡。配合太阳能小电池,系统平均电流做到 10uA 以下,两节 AA 电池可用三年。
智能门锁的快速响应与长待机
阶段:端侧生物特征匹配 + 按需唤醒
解决的问题:门锁要求指纹识别在 1 秒内完成,又要求待机一年以上。睡眠太深解锁慢,睡眠太浅耗电快,矛盾突出。
具体案例:方案采用“双重唤醒”:平时 Stop 模式维持 RAM 和 RTC,指纹传感器检测到手指接触后通过中断快速唤醒 MCU,运行人脸/指纹匹配 AI 模型,成功后立即回到睡眠。同时把外围通信模块的供电用负载开关切断,待机电流从 800uA 降到 3uA。
Python 演示
# -*- coding: utf-8 -*-"""Estimate average current and battery life for MCU low-power designs.""" def average_current(i_run_ua, t_run_ms, i_sleep_ua, t_sleep_ms): """Return average current in uA over one duty cycle.""" total_ms = t_run_ms + t_sleep_ms if total_ms <= 0: return 0.0 return (i_run_ua * t_run_ms + i_sleep_ua * t_sleep_ms) / total_ms def battery_life_hours(avg_ua, capacity_mah, derate=0.8): """Return battery life in hours. avg_ua is average current in uA.""" if avg_ua <= 0: return float('inf') # capacity_mah = mAh, avg_ua = uA -> hours = mAh * 1000 / uA return capacity_mah * 1000.0 * derate / avg_ua def pretty_duration(hours): """Format hours into a human-readable string.""" if hours >= 24 * 365: return "{:.1f} years".format(hours / (24.0 * 365.0)) if hours >= 24: return "{:.1f} days".format(hours / 24.0) return "{:.1f} hours".format(hours) def main(): print("=== MCU Low-Power Duty-Cycle Estimator ===") i_run = float(input("Run current (uA, e.g. 5000): ") or 5000) t_run = float(input("Run time per cycle (ms, e.g. 10): ") or 10) i_sleep = float(input("Sleep current (uA, e.g. 1.4): ") or 1.4) t_sleep = float(input("Sleep time per cycle (ms, e.g. 990): ") or 990) cap = float(input("Battery capacity (mAh, e.g. 240): ") or 240) avg = average_current(i_run, t_run, i_sleep, t_sleep) life_h = battery_life_hours(avg, cap) duty = t_run / (t_run + t_sleep) * 100.0 print("Average current: {:.2f} uA".format(avg)) print("Duty cycle: {:.2f} %".format(duty)) print("Estimated battery life: {}".format(pretty_duration(life_h))) if __name__ == "__main__": main()
def average_current(i_run_ua, t_run_ms, i_sleep_ua, t_sleep_ms):定义平均电流函数,参数带单位后缀,避免弄混 uA 和 mA。total_ms = t_run_ms + t_sleep_ms先算一个完整工作周期的总时长,作为加权平均的分母。return (i_run_ua * t_run_ms + i_sleep_ua * t_sleep_ms) / total_ms电流按时长加权平均,这正是正文里的占空比公式。def battery_life_hours(avg_ua, capacity_mah, derate=0.8):电池寿命估算函数,derate是放电效率系数,留 20% 余量。return capacity_mah * 1000.0 * derate / avg_uamAh 乘以 1000 转成 uAh,再除以平均电流 uA,得到小时数。duty = t_run / (t_run + t_sleep) * 100.0占空比百分比,是衡量“醒多久”的核心指标。print("Estimated battery life: {}".format(pretty_duration(life_h)))把小时数格式化成年/天,直接可读。
常见误区
误区反正都要睡,直接选功耗最低的 Standby 甚至 Shutdown 模式不就行了?这样最省电。
正解不对。Standby 唤醒等于复位,RAM 全部丢失。如果你要保留传感器校准值、网络会话状态,就得额外存 Flash 或用备份寄存器,而且唤醒启动时间很长。很多时候 Stop 模式(典型 1uA 级)已经足够低,还能保留全部 RAM 和快速唤醒。选模式不是选最低,而是选“刚好够用”的那一档。
为何常见:看数据手册时,大家习惯只盯着“最低电流”那一列,忽略了“唤醒方式 / RAM 保持”这些前提条件。
误区进入休眠后 GPIO 不工作,悬空就悬空吧,不会有什么影响。
正解悬空的 GPIO 处于不定态,内部数字缓冲器会被噪声反复触发,产生持续漏电,甚至引发微小振荡。实测中,几个悬空引脚可能多出几十到几百微安的电流。正确做法是把不用的引脚设为模拟输入,或配置确定的上下拉电平。
为何常见:因为代码里确实没用到这些引脚,初学者容易忽略“没用到 ≠ 没影响”。
误区只要调用了 HAL_PWR_EnterSTOPMode 或者类似的 sleep 函数,芯片就自动省电了。
正解库函数只是执行了进入指令。如果外设时钟没关、GPIO 悬空、调试器还挂着、串口没关,电流可能还是几百微安甚至毫安级。低功耗是“系统级的配合”:时钟、引脚、外设、唤醒源全部安排好,睡眠才真正生效。
为何常见:因为 IDE 里函数名看起来像一个完整动作,让人误以为是一键省电。
误区把开发板接上电流表,读数看着不高就通过了。
正解开发板上有板载 LED、调试器芯片、稳压器和电平转换电路,这些静态功耗可能比 MCU 待机电流大几十倍。测功耗必须用最小系统板,或者自己画功耗测试板。否则你测的是“开发板的功耗”,而不是“MCU 的功耗”。
为何常见:开发板方便,而且 LED 亮着会让人感觉“板子还活着”,反而掩盖了真实数据。
误区从睡眠唤醒后代码能跑,时钟配置就不用再处理了。
正解从 Stop 模式唤醒后,系统时钟可能回到内部 RC(HSI)而不是之前配置的 PLL / 外部晶振,导致串口波特率、定时器周期、ADC 采样率全部漂移。唤醒后的第一件事通常是重新配置时钟树,再恢复外设。这也是“唤醒 = 新的开始”的设计理念。
为何常见:因为代码运行看起来正常,只有通信协议出错时才暴露,排查时很容易忽略时钟源。
面试题
Q1. 下列哪种低功耗模式的电流通常最低?
- A.待机模式← 正确答案
- B.睡眠模式
- C.停机模式
- D.运行模式
答案:A。Standby(待机)模式下主时钟、内核、大部分外设都关闭,只剩备份域和少量唤醒源,典型电流可低至 0.3uA。Sleep(睡眠)只是内核停止,外设和时钟仍在跑;Stop(停机)主时钟停止但 RAM 保持;Run(运行)是正常工作状态,电流最大。好比整栋楼断电档位最省电。
Q2. 执行哪条指令可以让内核进入睡眠等待状态?
- A.WFI← 正确答案
- B.NOP
- C.SWI
- D.BX
答案:A。WFI(Wait For Interrupt)是 ARM 内核的休眠指令,执行后内核停摆,直到中断到来才唤醒。NOP 是空操作不进入低功耗;SWI 是软件中断,通常用于系统调用;BX 是跳转指令。就像按下“待机键”的是 WFI,其他按键都只是晃了一下。
Q3. 停机模式下,下列哪项仍然保持有效?
- A.内核执行
- B.SRAM 内容← 正确答案
- C.PLL 输出
- D.Flash 时钟
答案:B。Stop 停机模式下主时钟停止,CPU 不能执行代码,PLL 和 Flash 时钟都停了,但 SRAM 内容依靠低功耗电源域保持,所以唤醒后还能读到之前的变量。相当于楼里值班档:人睡了,但前台记录本(RAM)原封不动。
Q4. 从待机模式唤醒后,芯片的行为相当于?
- A.复位启动← 正确答案
- B.中断返回
- C.原地继续
- D.进入死循环
答案:A。Standby 待机模式会丢失大部分 RAM 和寄存器上下文,唤醒后芯片相当于从头复位,从复位向量重新执行启动代码。因此唤醒后必须重新初始化时钟和外设。如果希望唤醒后像中断一样回到原处继续执行,应该选 Stop 停机模式。
Q5. 下列哪些措施可以有效降低 MCU 系统的平均功耗?
- A.降低工作频率← 正确答案
- B.延长睡眠时长← 正确答案
- C.关闭外设时钟← 正确答案
- D.提高供电电压
答案:ABC。降低频率可减少动态功耗;延长睡眠时间可减小占空比;关闭外设时钟可避免外设空转耗电。提高电压反而会让动态功耗按平方上升,方向完全相反。好比物业想省电,应该关灯、限时开空调,而不是把电压调高让设备更费电。
Q6. 哪种外设不能在待机模式下继续维持定时唤醒功能?
- A.独立看门狗
- B.RTC 闹钟
- C.ADC 连续采样← 正确答案
- D.外部低速晶振
答案:C。ADC 是模拟外设,在待机模式下电源域被切断,无法工作。独立看门狗(IWDG)用内部低速 RC 时钟可以在待机时继续计数;RTC 闹钟依赖低速晶振保持走时,是标准的定时唤醒源;外部低速晶振(LSE)为 RTC 提供时钟源,也可继续运行。所以只有 ADC 不能做唤醒源。
Q7. 进入停机模式前,通常需要做好哪些准备?
- A.保存外设状态← 正确答案
- B.配置唤醒中断← 正确答案
- C.断开所有电源
- D.切换低速时钟← 正确答案
答案:ABD。进入 Stop 前要保存外设寄存器状态以便恢复,要配置好唤醒源(如 RTC 或 EXTI 中断),还要把系统时钟源切换到低速时钟并关闭 PLL。“断开所有电源”是掉电模式(Shutdown)的行为,不是 Stop 的流程。这就像睡前锁门、布防、关大灯,但配电房总闸不能拉。
Q8. 动态功耗与下列哪组因素成正比?
- A.电压平方与频率← 正确答案
- B.电压与频率平方
- C.电容与电压
- D.电流与电阻
答案:A。动态功耗公式为 P = C × V² × f,与电压的平方和翻转频率成正比。电压的影响力最大:3.3V 降到 1.8V,功耗可降到约 1/3。电压与频率平方、电容与电压、电流与电阻都不是动态功耗的正比关系,后者更像是欧姆定律或静态功耗的表述。
Q9. 测量 MCU 待机微安级电流的正确工具是?
- A.高精度uA电流表← 正确答案
- B.普通万用表电压档
- C.示波器电压探头
- D.用LED指示电流
答案:A。微安级电流必须用高精度微安电流表串联在电源回路中测量。万用表电压档测的是电压不是电流;示波器电压探头也不能直接测电流;LED 指示只能粗略判断通断,本身还会消耗毫安级电流,干扰测量。量程匹配很重要,就像用精细的秤才能称出几粒米的重量。
Q10. 关于 WFE 与 WFI 两条休眠指令,下列说法正确的是?
- A.WFE 可由事件唤醒← 正确答案
- B.WFI 只能由中断唤醒
- C.WFI 可由中断唤醒← 正确答案
- D.WFE 不能由中断唤醒
答案:AC。WFE(Wait For Event)既可以被事件唤醒,也可以被中断唤醒;WFI(Wait For Interrupt)主要靠中断唤醒,也可被调试事件唤醒,并非“只能”由中断唤醒。区别就像 WFE 是“有人按门铃就醒”,WFI 是“门铃响了才醒”——但门外有人路过触发感应灯(事件)时,WFE 也会醒,WFI 不会。