STM32 低功耗模式:SLEEP / STOP / STANDBY 怎么选 三种模式速览模式电流(典型)CPUSRAM寄存器唤醒方式唤醒时间SLEEP睡眠~10mA→~1mA停保持保持任一中断几 μsSTOP停止~1mA→~110μA低功耗调压器 PWR_LOWPOWERREGULATOR_ON主调压器约 450μA停保持保持EXTI / RTC几 μsSTANDBY待机~100μA→~2μA掉电掉电掉电RST / RTC / WAKE几 msSLEEP 模式CPU 停转外设继续工作串口能收数据、定时器继续计数。// 进入 SLEEP HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI); // WFI Wait For Interrupt任一中断就会唤醒适合短暂空闲比如等串口数据、等定时器。STOP 模式CPU 和外设都停止SRAM 和寄存器内容保持。所有时钟停振HSE/HSI 关了。// 进入 STOP HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);唤醒后需要重新配置系统时钟// EXTI 回调中唤醒 void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { // 唤醒后先不动main 里恢复时钟 } ​ // main 中 HAL_PWR_EnterSTOPMode(...); // 醒来后从这里继续执行 SystemClock_Config(); // 必须重新配时钟适合几秒到几十秒的空闲。STANDBY 模式最省电。除了 RTC 和唤醒引脚全都断电。醒来相当于复位——从 main 重新执行。// 进入 STANDBY HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1); // PA0 可唤醒 HAL_PWR_EnterSTANDBYMode();醒来判断是否从 STANDBY 复位if (__HAL_PWR_GET_FLAG(PWR_FLAG_SB) ! RESET) { __HAL_PWR_CLEAR_FLAG(PWR_FLAG_SB); printf(Woke from STANDBY\r\n); // 注意STANDBY 唤醒后经历复位需重新初始化串口等外设后方可 printf }适合电池供电、几分钟甚至几小时才工作一次的场景。实测步骤用万用表mA 档串在 VCC 回路里int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); printf(Entering STOP in 3s...\r\n); HAL_Delay(3000); ​ // 进入 STOP HAL_SuspendTick(); // 暂停 SysTick避免醒来后 HAL_Delay 出错 HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI); ​ // 唤醒后 SystemClock_Config(); HAL_ResumeTick(); printf(Woke up!\r\n); ​ while (1) HAL_Delay(1000); }按下 PA0带 EXTI看电流从几 mA 降到几百 μA再按一下回到几 mA。选型指南你想省电多久用哪个等串口数据 1sSLEEP等按键输入几秒~几分钟STOP传感器定时上报几分钟~几天STANDBY RTC 唤醒