100.STM32低功耗设计实战:从原理到代码实现
·
一、低功耗设计的必要性
在电池供电的嵌入式系统中,低功耗设计是核心需求,主要体现在三个方面:
- 电池续航: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状态 | 典型电流 | 唤醒速度 |
|---|---|---|---|---|---|
| Run | ON | ON | Keep | ~30mA | - |
| Sleep | OFF | ON | Keep | ~2mA | Fast |
| Stop | OFF | OFF | Keep | ~20μA | Medium |
| Standby | OFF | OFF | Lost | ~2μA | Slow |
2.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电池(220mAh),Active电流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μA,EXTI/RTC唤醒。
- Standby模式:最省电,~2μA,SRAM丢失,复位重启。
- 唤醒源:EXTI + RTC + WKUP引脚 + IWDG。
- 续航公式:
Life = 电池容量 / 平均电流(加权平均)。
通过合理选择功耗模式和唤醒源,可显著延长电池供电设备的续航时间,满足低功耗设计需求。
更多推荐


所有评论(0)