目录
[一、STM32 三种低功耗模式对比](#一、STM32 三种低功耗模式对比)
[六、GPIO 功耗处理关键代码](#六、GPIO 功耗处理关键代码)
[七、RTOS 下低功耗实现思路](#七、RTOS 下低功耗实现思路)
前言
前面篇章我们学习了状态机、内存管理、按键驱动。很多产品电池供电,低功耗是量产硬性指标。很多新手只是简单关闭外设,功耗下降不明显,甚至唤醒异常。
本篇讲解 STM32 三类低功耗模式,寄存器配置、唤醒源、代码实现、功耗裁剪要点。
一、STM32 三种低功耗模式对比
- 休眠模式:CPU 停止,外设保持运行,任意中断唤醒,功耗相对较高,唤醒速度快。
- 停机模式:主时钟关闭,SRAM 内容保留,多个外部中断唤醒,功耗大幅降低。
- 待机模式:SRAM 数据丢失,仅备份域保持,功耗最低,只能特定引脚或者 RTC 唤醒,唤醒等同于复位。
二、核心注意事项
- 进入低功耗前,未使用 GPIO 必须配置,浮空引脚会产生漏电流,拉高整体功耗。
- ADC、SPI、I2C、定时器等不用外设,要关闭外设时钟。
- 中断唤醒时,中断服务函数尽量简短,减少唤醒后的运行时间,尽快再次进入休眠。
三、休眠模式代码示例
void enter_sleep_mode(void)
{
//关闭不需要外设时钟
__HAL_RCC_TIM2_CLK_DISABLE();
//进入休眠,WFI等待中断唤醒
__WFI();
}
四、停机模式代码示例
void enter_stop_mode(void)
{
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
//唤醒后,需要重新配置系统时钟
SystemClock_Config();
}
五、待机模式代码示例
void enter_standby_mode(void)
{
__HAL_RCC_PWR_CLK_ENABLE();
HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1);
HAL_PWR_EnterSTANDBYMode();
}
六、GPIO 功耗处理关键代码
void unused_gpio_config(void)
{
GPIO_InitTypeDef gpio_conf = {0};
__HAL_RCC_GPIOA_CLK_ENABLE();
gpio_conf.Pin = GPIO_PIN_All;
gpio_conf.Mode = GPIO_MODE_ANALOG;
gpio_conf.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &gpio_conf);
}
未使用引脚设置为模拟输入,消除上下拉和浮空漏电,是降功耗最容易忽略的点。
七、RTOS 下低功耗实现思路
RTOS 空闲任务是进入低功耗的最佳位置。
空闲任务检测所有任务都阻塞,执行进入停机 / 休眠函数,唤醒后继续调度任务。
void vApplicationIdleHook(void)
{
enter_stop_mode();
}
八、常见低功耗踩坑点
- 引脚浮空,漏电大,功耗降不下来
- 进入停机前没有关闭外设时钟
- 停机唤醒后忘记重新初始化系统时钟,程序运行异常
- 频繁唤醒,导致平均功耗居高不下
- 待机模式下,SRAM 数据丢失,需要提前保存关键数据到 Flash
九、功耗优化分层策略
- 软件层面:缩短唤醒工作时长,非必要不频繁唤醒
- 外设层面:不用外设关闭时钟
- IO 层面:闲置引脚全部配置模拟输入
- 电源层面:不用的外部芯片断电
小结
低功耗开发不只是调用一行休眠函数,是 IO、外设、时钟、唤醒逻辑的整套组合设计。
休眠适合需要快速唤醒场景;停机是电池产品最常用方案;待机适合长时间休眠、极少唤醒场景。