目录
[一、STM32 三种低功耗模式核心区别(必考)](#一、STM32 三种低功耗模式核心区别(必考))
[1. 睡眠模式(SLEEP)](#1. 睡眠模式(SLEEP))
[2. 停机模式(STOP)](#2. 停机模式(STOP))
[3. 待机模式(STANDBY)](#3. 待机模式(STANDBY))
[二、为什么你的设备休眠耗电依旧很大?(90% 人的通病)](#二、为什么你的设备休眠耗电依旧很大?(90% 人的通病))
[七、RTC 定时唤醒低功耗(周期性唤醒神器)](#七、RTC 定时唤醒低功耗(周期性唤醒神器))
[1、休眠后功耗依旧几十 mA](#1、休眠后功耗依旧几十 mA)
[5、ADC 未关闭,模拟外设持续漏电](#5、ADC 未关闭,模拟外设持续漏电)
前言
本篇我们反向攻坚 ------低功耗。
现在绝大多数物联网设备、电池设备、穿戴设备、无线传感器、门禁设备,核心难点不是功能实现,而是续航 。 很多新手写完代码功能正常,但设备待机耗电巨大,电池几天就没电,完全无法量产。
STM32 低功耗不是简单开个模式就完事,它是一套系统性优化工程。 很多人踩过的坑: 配置了待机模式功耗依旧高、无法唤醒、唤醒死机、外设未关闭导致漏电、IO 浮空漏电、时钟未降级、休眠卡死。
本篇系统性讲透 STM32 三大低功耗模式、唤醒原理、功耗差异、外设关断、IO 漏电根治、量产级低功耗架构,手把手带你把设备功耗压到微安级。
一、STM32 三种低功耗模式核心区别(必考)
STM32 官方提供三种休眠等级,功耗逐级降低、资源丢失逐级增多,选型错误是功耗高的根源。
1. 睡眠模式(SLEEP)
- CPU 停止运行,外设、时钟、定时器、ADC 全部继续工作
- 功耗下降少
- 任意中断即可唤醒
- 特点:响应最快,几乎无延迟
- 适用:短时休眠、频繁唤醒设备
2. 停机模式(STOP)
- 关闭系统时钟 HSI/HSE
- CPU、定时器、ADC、串口停止
- 保留 SRAM、寄存器数据
- 功耗大幅降低
- 只能外部中断、RTC、看门狗唤醒
- 适用:大部分电池物联网设备(量产最常用)
3. 待机模式(STANDBY)
- 功耗最低,仅保留备份域电路
- SRAM 数据全部丢失、寄存器清空
- 只能 WKUP 引脚、RTC 闹钟唤醒
- 唤醒等同于软重启
- 适用:超长待机、一年免充电设备
工程核心结论: 要保留运行状态 → STOP 停机 要极致省电、不怕重启 → STANDBY 待机
二、为什么你的设备休眠耗电依旧很大?(90% 人的通病)
真正的低功耗瓶颈不是休眠模式 ,而是:IO 漏电 单片机所有浮空 IO、上拉 IO、未关闭模拟外设,都会产生微安级静态漏电流,累积起来功耗爆炸。
六大漏电根源:
- ADC 未关闭,模拟通道持续耗电
- IO 口浮空,高低电平不确定漏电
- IO 外接上拉下拉,休眠持续灌电流
- 定时器、DMA、串口未关闭时钟
- 系统高速时钟未降级
- 外部模块未断电(传感器、LED、模块电源)
三、量产级进入低功耗标准流程(必须按顺序)
想要真正低功耗,不能直接休眠,必须执行休眠预处理
- 关闭所有外设时钟(TIM/ADC/USART/SPI/I2C/DMA)
- 关闭所有中断(除唤醒中断)
- 所有 GPIO 统一配置为模拟输入(杜绝漏电)
- 关闭高速时钟,切换内部低速时钟
- 关闭所有外部模块电源
- 清中断标志、关闭挂起中断
- 进入低功耗模式
四、睡眠模式实战代码
适合需要快速唤醒、频繁工作的场景
void MCU_Enter_Sleep(void)
{
// 进入睡眠模式
HAL_SuspendTick(); // 关闭滴答定时器
__HAL_WFI(); // 等待中断唤醒
HAL_ResumeTick(); // 恢复滴答定时器
}
特点:
- 任意中断立刻唤醒
- 程序继续执行,不会重启
- 功耗降低有限
五、停机模式(STOP)量产核心代码(重点)
工业物联网、电池设备标准用法
void MCU_Enter_StopMode(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
//1. 关闭所有外设时钟
__HAL_RCC_TIM1_CLK_DISABLE();
__HAL_RCC_TIM2_CLK_DISABLE();
__HAL_RCC_TIM3_CLK_DISABLE();
__HAL_RCC_ADC1_CLK_DISABLE();
__HAL_RCC_USART1_CLK_DISABLE();
__HAL_RCC_SPI1_CLK_DISABLE();
__HAL_RCC_I2C1_CLK_DISABLE();
//2. 所有GPIO设为模拟输入,杜绝漏电
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
__HAL_RCC_GPIOC_CLK_ENABLE();
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Pin = GPIO_PIN_All;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
//3. 进入停机模式
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
//4. 唤醒后重新配置系统时钟
SystemClock_Config();
}
停机模式唤醒条件
- 外部中断 EXTI(按键、传感器中断)
- RTC 定时唤醒
- 引脚电平触发唤醒
唤醒后:程序继续运行,变量不丢失,状态保留
六、待机模式(STANDBY)极致省电代码
功耗最低,适合超长期休眠
void MCU_Enter_Standby(void)
{
// 清除待机标志
__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);
// 开启WKUP唤醒
HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1_HIGH);
// 进入待机模式
HAL_PWR_EnterSTANDBYMode();
}
特点:
- 唤醒后程序重启
- SRAM 数据全部丢失
- 功耗可压到 1~2uA
七、RTC 定时唤醒低功耗(周期性唤醒神器)
绝大多数低功耗产品逻辑: 休眠 → 定时唤醒 → 采集数据 → 上传 → 继续休眠
通过 RTC 实现秒 / 分级定时唤醒,是物联网设备标配。 可实现:1 分钟唤醒一次、1 小时唤醒一次,极大提升续航。
八、低功耗开发十大致命坑点
1、休眠后功耗依旧几十 mA
99% 原因:GPIO 未全部设为模拟输入,持续漏电
2、进入低功耗后无法唤醒
原因:唤醒中断未开启、进入模式选错、中断标志未清除
3、唤醒后程序乱跑、死机
原因:唤醒后未重新初始化系统时钟
4、外部模块不断电,休眠依旧耗电
MCU 休眠了,但传感器、LED、模块还在工作
5、ADC 未关闭,模拟外设持续漏电
6、中断挂起未清除,休眠立刻唤醒
7、滴答定时器未关闭,休眠频繁唤醒
8、浮空引脚外接电阻,形成分压漏电
9、停机模式误用外部时钟,导致无法休眠
10、频繁进出休眠导致时序错乱
解决:增加任务空闲判断,无业务再休眠
九、量产设备终极低功耗优化方案
1、硬件层面
- 所有不用 IO 默认模拟输入
- 传感器加可控电源 MOS 管,休眠彻底断电
- 上拉电阻按需配置,禁止浮空分压
- 电源采用 LDO,禁止 DC-DC 轻载耗电
2、软件层面
- 业务执行完毕立刻进入停机模式
- 所有外设用时开启、用完关闭
- 休眠前统一 GPIO 状态
- 采用 RTC 定时唤醒 + 事件唤醒双模式
- 禁止空闲循环空跑
3、功耗梯度策略
- 繁忙阶段:全速运行
- 空闲阶段:睡眠模式
- 长期空闲:停机模式
- 超长待机:待机模式
十、三种模式量产选型总结
- 需要极速响应、频繁唤醒 → 睡眠模式
- 电池设备、保留状态、定时采集 → 停机模式(首选)
- 超长待机、一年续航、无需保存数据 → 待机模式