一、低功耗设计的必要性

在电池供电的嵌入式系统中,低功耗设计是核心需求,主要体现在三个方面:

  1. 电池续航:CR2032电池(220mAh)在待机10μA时可工作超2.5年,待机1mA时仅能工作9天以上。
  2. 芯片散热:100mA电流@3.3V时功耗达330mW,封装热阻约50℃/W,温升约16℃,低功耗可降低发热。
  3. 法规要求: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支持四种唤醒源,可灵活配置唤醒方式:

  1. EXTI外部中断:GPIO边沿触发(如按键唤醒)。
  2. RTC闹钟:定时唤醒(如每10分钟采集一次数据)。
  3. WKUP引脚:专用唤醒引脚(PA0,上升沿触发)。
  4. 独立看门狗(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低功耗设计的核心要点:

  1. 四种模式:Run/Sleep/Stop/Standby,功耗递减。
  2. Sleep模式:CPU停止,时钟继续,~2mA,任意中断唤醒。
  3. Stop模式:时钟停止,SRAM保持,~20μA,EXTI/RTC唤醒。
  4. Standby模式:最省电,~2μA,SRAM丢失,复位重启。
  5. 唤醒源:EXTI + RTC + WKUP引脚 + IWDG。
  6. 续航公式Life = 电池容量 / 平均电流(加权平均)。

通过合理选择功耗模式和唤醒源,可显著延长电池供电设备的续航时间,满足低功耗设计需求。

 

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐