一、低功耗设计的必要性在电池供电的嵌入式系统中低功耗设计是核心需求主要体现在三个方面电池续航CR2032电池220mAh在待机10μA时可工作超2.5年待机1mA时仅能工作9天以上。芯片散热100mA电流3.3V时功耗达330mW封装热阻约50℃/W温升约16℃低功耗可降低发热。法规要求EP待机要求0.5W需满足Energy Star、CEFCC等能效标准。低功耗设计的目标是实现更长续航、更低发热、更小体积。二、STM32四种功耗模式STM32提供四种功耗模式功耗从Run到Standby依次递减唤醒时间递增模式CPU状态时钟状态SRAM状态典型电流唤醒速度RunONONKeep~30mA-SleepOFFONKeep~2mAFastStopOFFOFFKeep~20μAMediumStandbyOFFOFFLost~2μASlow2.1 Sleep模式特点CPU停止取指外设时钟继续运行SRAM和寄存器保持。功耗~2mA。唤醒任意中断/事件唤醒唤醒时间~6个时钟周期。适用场景短暂休眠快速响应外部事件。2.2 Stop模式特点全部时钟停止SRAM和寄存器数据保持。功耗~20μA。唤醒EXTI外部中断、RTC闹钟唤醒唤醒时间~10μs。适用场景间歇工作按键唤醒、定时采集。2.3 Standby模式特点最省电SRAM和寄存器数据丢失仅保留RTC和Backup寄存器。功耗~2μA。唤醒系统复位需重新启动程序。适用场景长时间休眠对数据保持无要求。三、唤醒源详解STM32支持四种唤醒源可灵活配置唤醒方式EXTI外部中断GPIO边沿触发如按键唤醒。RTC闹钟定时唤醒如每10分钟采集一次数据。WKUP引脚专用唤醒引脚PA0上升沿触发。独立看门狗IWDG超时复位唤醒。唤醒流程事件触发→时钟恢复→系统恢复→继续执行。四、功耗测量与计算4.1 测量方法万用表μA档适合粗略测量。功耗分析仪高精度测量。Rshunt ADC在线测量。4.2 续航计算功耗公式功耗 电流 × 电压续航公式Life(h) 电池容量(mAh) / 平均电流(mA)平均电流公式I_avg (T_act×I_act T_slp×I_slp) / (T_act T_slp)示例CR2032电池220mAhActive电流5mA工作15分钟Sleep电流20μA休眠59分钟。平均电流I_avg (5×15 0.02×59) / 60 ≈ 0.183mA续航Life 220 / 0.183 ≈ 1202小时 ≈ 50天五、代码实现Stop模式 EXTI唤醒 RTC定时唤醒以下是基于HAL库的完整代码实现适用于STM32F103系列5.1 配置唤醒源/* 1. 配置EXTI唤醒源PA0按键 */ void EXTI_Wakeup_Init(void) { GPIO_InitTypeDef GPIO_InitStruct {0}; __HAL_RCC_GPIOA_CLK_ENABLE(); GPIO_InitStruct.Pin GPIO_PIN_0; GPIO_InitStruct.Mode GPIO_MODE_IT_RISING; GPIO_InitStruct.Pull GPIO_NOPULL; HAL_GPIO_Init(GPIOA, GPIO_InitStruct); HAL_NVIC_SetPriority(EXTI0_IRQn, 2, 0); HAL_NVIC_EnableIRQ(EXTI0_IRQn); } /* 2. 配置RTC定时唤醒每30秒唤醒一次 */ RTC_HandleTypeDef hrtc; void RTC_Wakeup_Init(void) { RTC_AlarmTypeDef sAlarm {0}; hrtc.Instance RTC; hrtc.Init.HourFormat RTC_HOURFORMAT_24; hrtc.Init.AsynchPrediv 127; hrtc.Init.SynchPrediv 255; HAL_RTC_Init(hrtc); sAlarm.AlarmTime.Seconds 30; sAlarm.AlarmMask RTC_ALARMMASK_DATEWEEKDAY | RTC_ALARMMASK_HOURS | RTC_ALARMMASK_MINUTES; HAL_RTC_SetAlarm_IT(hrtc, sAlarm, RTC_FORMAT_BIN); HAL_NVIC_SetPriority(RTC_Alarm_IRQn, 1, 0); HAL_NVIC_EnableIRQ(RTC_Alarm_IRQn); }5.2 进入Stop模式void Enter_Stop_Mode(void) { HAL_SuspendTick(); HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI); SystemClock_Config(); HAL_ResumeTick(); }5.3 主循环逻辑int main(void) { HAL_Init(); SystemClock_Config(); EXTI_Wakeup_Init(); RTC_Wakeup_Init(); while (1) { // 主循环执行任务如传感器采集、数据发送 HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_0); // 状态指示 HAL_Delay(100); // 进入Stop模式 Enter_Stop_Mode(); } }5.4 中断回调函数void EXTI0_IRQHandler(void) { HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0); } void HAL_RTC_AlarmEventCallback(RTC_HandleTypeDef *hrtc) { // RTC闹钟唤醒后的处理 HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_1); }六、总结STM32低功耗设计的核心要点四种模式Run/Sleep/Stop/Standby功耗递减。Sleep模式CPU停止时钟继续~2mA任意中断唤醒。Stop模式时钟停止SRAM保持~20μAEXTI/RTC唤醒。Standby模式最省电~2μASRAM丢失复位重启。唤醒源EXTI RTC WKUP引脚 IWDG。续航公式Life 电池容量 / 平均电流加权平均。通过合理选择功耗模式和唤醒源可显著延长电池供电设备的续航时间满足低功耗设计需求。