【嵌入式面试】STM32 低功耗高频面试题
【嵌入式面试】STM32 低功耗高频面试题
低功耗设计是电池供电设备的刚需,也是嵌入式面试中出镜率极高的考点,围绕 Sleep/Stop/Standby 三种模式、唤醒机制与工程实践层层展开。本文整理了 20 道高频面试题,覆盖模式对比、唤醒源、时钟与 GPIO 处理、功耗测量及 FreeRTOS Tickless,文中电流数据为典型值(以 STM32F103/F407 为例),精确值请以对应型号数据手册为准。
三种低功耗模式
1. STM32 有哪些低功耗模式?分别有什么特点?
STM32 主要有三种低功耗模式:Sleep(睡眠)、Stop(停止)和Standby(待机)(部分新系列还有 Shutdown、Standby+RTC 等细分)。Sleep 只停止 CPU 内核时钟,外设、SRAM、Flash 全部继续工作;Stop 停止所有时钟,但 SRAM 与寄存器内容全部保留;Standby 切断内部 1.8V 数字区域电源,SRAM/寄存器内容全部丢失,仅备份域(RTC、备份寄存器)与唤醒电路继续供电。三者功耗依次降低,唤醒时间依次变长。
2. Sleep、Stop、Standby 的功耗量级大概是多少?
以 STM32F103(72MHz)为例:Sleep 模式典型电流约 14~20mA;Stop 模式约 20µA 量级;Standby 模式约 2µA 量级。STM32F407(168MHz)量级类似:Sleep 约十几 mA,Stop 典型约 27µA,Standby 典型约 3µA。回答时说出"mA / 几十 µA / 2~3µA"三个量级即可,并补充说明这些是典型值,随温度、外设开关、电压调节器配置和供电电压变化,精确数值要以数据手册为准。
3. 为什么 Sleep 模式省电有限,电流还在 mA 级?
Sleep 模式只是关闭了 CPU 内核时钟,但所有外设时钟、SRAM、Flash 与总线仍在工作,外设电路持续耗电,内核本身的静态功耗也依然存在。要想大幅降低功耗,必须关闭外设时钟门控,并进一步进入 Stop/Standby 模式;Sleep 通常只用于"短暂等待事件、要求极快唤醒"的场景。
4. Stop 与 Standby 的核心区别是什么?
核心区别在数据是否保留。Stop 模式下 SRAM 和所有寄存器内容保留,唤醒后从暂停处继续执行,相当于一次"深度睡眠";Standby 模式下 1.8V 数字区断电,SRAM/寄存器内容丢失,唤醒等价于一次复位,程序从头开始执行,仅备份域数据(RTC 时间、备份寄存器)保留。因此 Stop 唤醒快(µs 级)、状态不丢,但电流较高;Standby 电流最低,但唤醒后需要重新初始化全部状态。
5. 实际项目中如何选择 Sleep / Stop / Standby?
按唤醒延迟、数据保留需求和功耗预算三者权衡:需要极快响应且外设保持工作选 Sleep;需要保留运行现场、可接受几十 µA 电流选 Stop(配 RTC/LPTIM 周期唤醒最常用);长时间待机、只关心 RTC 计时和备份寄存器、能接受"复位式"恢复选 Standby。电池供电的仪表、遥控器等设备常用 Standby + RTC 闹钟周期唤醒,兼顾最低功耗与定时功能。
6. 进入 Stop/Standby 前需要做哪些准备工作?
① 关闭不需要的外设时钟,RCC 外设时钟门控对应位清零,停止 DMA 传输;② 配置好唤醒源并使能对应 EXTI/中断;③ 将空闲 GPIO 配置为固定电平(模拟输入或确定的上/下拉),避免浮空输入漏电;④ 配置 Cortex-M 内核 SCR 的 SLEEPDEEP 位以及 PWR_CR 的 PDDS 位,选择进入 Stop 还是 Standby;⑤ 若接了调试器,注意 DBGMCU 低功耗调试位的影响;⑥ 最后执行 __WFI()/__WFE() 指令进入低功耗。
唤醒机制
7. 三种模式的唤醒源分别是什么?
Sleep:任何中断或事件都能唤醒。Stop:任何 EXTI 中断/事件(外部引脚、PVD、RTC 闹钟、USB/以太网唤醒线等),部分型号还支持 I2C 地址匹配、USART 唤醒等外设唤醒源。Standby:NRST 复位、RTC 闹钟/唤醒定时器/篡改/时间戳事件、WKUP 引脚(如 PA0)上升沿、IWDG 复位。注意 Stop 可由普通 EXTI 引脚唤醒,而 Standby 只能用专用的 WKUP 引脚或 RTC/复位类事件唤醒。
8. Standby 唤醒后程序如何恢复执行?如何判断?
Standby 唤醒相当于一次复位,CPU 从头开始执行 main(复位向量),所有 RAM 数据清零。判断方法:读取 PWR_CSR 的 SBF(Standby Flag),若为 1 说明本次启动来自 Standby 唤醒(而非上电复位),据此可跳过初始化或恢复备份域数据;读完再写 PWR_CR 的 CWUF 清除唤醒标志。F4 等系列同样通过 PWR 状态寄存器判断。
9. WKUP 引脚(PA0)为什么能唤醒 Standby?和普通 EXTI 有什么区别?
Standby 模式下 1.8V 数字区断电,EXTI 外设本身已无时钟无法工作,因此只能靠仍供电的唤醒电路检测专用引脚:F1/F4 上 WKUP 对应 PA0 上升沿(通过 PWR_CSR 的 EWUP 位使能)。它不经过 EXTI,而是独立的电源唤醒逻辑,这也是普通 GPIO 中断无法唤醒 Standby、必须用 WKUP 引脚的原因。
10. RTC 闹钟如何唤醒 Stop/Standby?需要配置什么?
步骤:① 使能 PWR 时钟并置 PWR_CR 的 DBP 位开放备份域访问;② 选择 LSE 作为 RTC 时钟,配置闹钟时间并使能闹钟中断;③ 把 RTC 闹钟事件映射到 EXTI 17(F1/F4)并使能该 EXTI 上升沿;④ 进入 Stop/Standby 后 RTC 仍由备份域供电继续计时,闹钟触发产生 EXTI17 事件将芯片唤醒。这是低功耗产品"定时唤醒"最常用的方案。
11. 为什么 RTC 在 Stop/Standby 下还能继续工作?
RTC、备份寄存器和备份 SRAM 位于备份域,由 VBAT 引脚(或主电源 VDD 正常时)独立供电,不依赖内部 1.8V 数字电源。因此 Stop/Standby 下即便主电源域断电,RTC 仍以 LSE 32.768kHz 持续走时,闹钟照样触发。这也是设计上要求 VBAT 接电池/电容的原因。
12. 外部中断唤醒 Stop 需要配置哪些东西?
把唤醒引脚配置为带内部上下拉的输入,在 EXTI 中使能对应线路并选择上升沿/下降沿触发,同时使能 NVIC 中对应的 EXTI 中断;进入 Stop 前保证该 EXTI 已使能且无挂起。唤醒后在中断服务程序里清除 EXTI 挂起位(PR),否则退出低功耗后可能立刻再次触发。F1/F4 的 Stop 模式下普通 EXTI 引脚均可用作唤醒源。
13. __WFI 与 __WFE 有什么区别?
__WFI(Wait For Interrupt)等待中断唤醒,即使中断被 PRIMASK 屏蔽也会唤醒(只是不执行 ISR 直接继续);__WFE(Wait For Event)等待事件唤醒,事件来源包括 SEV 指令产生的事件、外部事件线等。WFE 的优点是不改变中断响应时序、可用 SEV 软件触发,适合自旋等待场景;在低功耗进入时两者都能用,裸机常用 WFI,多核/RTOS 移植中常用 WFE+SEV 做核间通知。
14. 退出 Stop 模式后系统时钟为什么要重新配置?
Stop 模式下 HSE 和 HSI 振荡器都被停止,唤醒后时钟不会自动恢复原配置,若仍按原系统时钟设置运行,CPU 可能以错误频率工作甚至跑飞。所以进入 Stop 前应先将系统时钟切换/依赖 HSI,或在唤醒后重新等待 HSE 稳定(HSE_RDY 标志)并重新执行系统时钟初始化(如复用 SystemInit 逻辑)。这是"唤醒后死机/异常"最常见的排查点。
工程实践
15. 如何测量 STM32 的低功耗电流?有哪些坑?
静态电流可用万用表 µA 档串联在电源回路里,动态电流用串联采样电阻 + 示波器测压降换算。常见坑:① 调试器(ST-LINK/J-Link)接入会持续耗电且阻止真正进入低功耗,测量时必须断开 SWD 或禁用 DBGMCU 低功耗调试;② 板载 LDO、LED、分压电阻本身就有 mA 级耗电,应直接给芯片供电;③ 上电浪涌可能烧 µA 档保险丝,先上 mA 档再切换;④ 万用表 µA 档内阻较大,读数需等程序稳定进入低功耗后再记录。
16. 低功耗下外设时钟如何处理?为什么关闭外设时钟能省电?
进入 Stop/Standby 前要把不用的外设时钟门控关掉(RCC->AHBxENR/APBxENR 对应位置 0),并停止 DMA、ADC 等模块。原因:外设时钟一旦使能,其数字逻辑持续翻转耗电,即使不工作也有动态功耗;某些模拟外设(如 ADC、比较器)即使时钟关掉,只要使能仍会漏电,因此还要关闭外设本身。时钟门控是"运行态省电"的第一手段。
17. 降低功耗的工程手段有哪些?
① 降低系统时钟频率(如 72MHz→8MHz)按需调速;② 关闭不用外设的时钟门控;③ 空闲 GPIO 设模拟输入或固定电平,避免浮空;④ 按需进入 Sleep/Stop/Standby 并用 RTC/LPTIM 周期唤醒;⑤ RTOS 下启用 FreeRTOS Tickless;⑥ 断开调试器,量产禁用调试口;⑦ 用外部 MOSFET 开关切断传感器等外设电源;⑧ 预算允许时换 STM32L 系列(L0/L4 的 Stop 电流可到 µA 级以下)。
18. GPIO 在低功耗设计中如何配置才省电?
浮空输入的电平不确定,输入缓冲器会因电平波动产生漏电,必须避免;空闲引脚应配置为模拟输入(关闭输入/输出缓冲,最省电),或配置为确定电平的上拉/下拉输入。输出引脚要固定到明确电平,不要悬空驱动外部负载。进入低功耗前统一扫描一遍 GPIO 配置,是降低待机漏电流最有效的手段之一。
19. FreeRTOS Tickless 的原理与配置要点?
Tickless 的思想是:空闲任务预计空闲时间较长时,不按 SysTick 周期醒来,而是直接进入低功耗模式,直到下一个任务到期时间或外部事件才唤醒。配置:置 configUSE_TICKLESS_IDLE 为 1,实现 portSUPPRESS_TICKS_AND_SLEEP() 回调——用 LPTIM 或 RTC 在预计唤醒时刻前定时,唤醒后补偿 SysTick 计数(tick 补偿),保证任务调度时间不失真。注意低功耗定时器本身的唤醒抖动以及 Stop 模式下 SysTick 停止的问题。
20. 为什么接了调试器后电流下不来?
调试器通过 SWD 引脚持续访问芯片,且若 DBGMCU 低功耗调试位(DBG_STOP/DBG_STANDBY)被使能,内核时钟和调试逻辑在低功耗模式下仍保持运行,芯片无法真正进入低功耗。因此量产固件要禁用调试访问或断开 SWD,测量功耗时必须拔掉调试器,只在开发阶段用 DBGMCU 配置保持调试能力。这也是"仿真正常、实测电流异常高"的经典原因。

