单片机基础核心知识点汇总(二十六)

目录

前言

[一、STM32 三种低功耗模式对比](#一、STM32 三种低功耗模式对比)

二、核心注意事项

三、休眠模式代码示例

四、停机模式代码示例

五、待机模式代码示例

[六、GPIO 功耗处理关键代码](#六、GPIO 功耗处理关键代码)

[七、RTOS 下低功耗实现思路](#七、RTOS 下低功耗实现思路)

八、常见低功耗踩坑点

九、功耗优化分层策略

小结


前言

前面篇章我们学习了状态机、内存管理、按键驱动。很多产品电池供电,低功耗是量产硬性指标。很多新手只是简单关闭外设,功耗下降不明显,甚至唤醒异常。

本篇讲解 STM32 三类低功耗模式,寄存器配置、唤醒源、代码实现、功耗裁剪要点。

一、STM32 三种低功耗模式对比

  1. 休眠模式:CPU 停止,外设保持运行,任意中断唤醒,功耗相对较高,唤醒速度快。
  2. 停机模式:主时钟关闭,SRAM 内容保留,多个外部中断唤醒,功耗大幅降低。
  3. 待机模式:SRAM 数据丢失,仅备份域保持,功耗最低,只能特定引脚或者 RTC 唤醒,唤醒等同于复位。

二、核心注意事项

  1. 进入低功耗前,未使用 GPIO 必须配置,浮空引脚会产生漏电流,拉高整体功耗。
  2. ADC、SPI、I2C、定时器等不用外设,要关闭外设时钟。
  3. 中断唤醒时,中断服务函数尽量简短,减少唤醒后的运行时间,尽快再次进入休眠。

三、休眠模式代码示例

复制代码
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();
}

八、常见低功耗踩坑点

  1. 引脚浮空,漏电大,功耗降不下来
  2. 进入停机前没有关闭外设时钟
  3. 停机唤醒后忘记重新初始化系统时钟,程序运行异常
  4. 频繁唤醒,导致平均功耗居高不下
  5. 待机模式下,SRAM 数据丢失,需要提前保存关键数据到 Flash

九、功耗优化分层策略

  1. 软件层面:缩短唤醒工作时长,非必要不频繁唤醒
  2. 外设层面:不用外设关闭时钟
  3. IO 层面:闲置引脚全部配置模拟输入
  4. 电源层面:不用的外部芯片断电

小结

低功耗开发不只是调用一行休眠函数,是 IO、外设、时钟、唤醒逻辑的整套组合设计。

休眠适合需要快速唤醒场景;停机是电池产品最常用方案;待机适合长时间休眠、极少唤醒场景。

相关推荐
LCG米5 小时前
STM32硬件CRC外设实测:多项式固定陷阱、CRC-32校验不匹配根因与软件查表法耗时对比落地
stm32·单片机·嵌入式硬件
La Pulga9 小时前
【FreeRTOS源码学习笔记】任务切换
单片机·mcu·学习·嵌入式·freertos·实时操作系统
女神下凡13 小时前
芯参谋(85):Linux_PPI_NAND_驱动开发指南
linux·运维·arm开发·驱动开发·单片机·嵌入式硬件·设计规范
硅基手札15 小时前
【Linux 内核专栏 19】20 · 嵌入式子系统 — GPIO·pinctrl·clock·regulator
linux·运维·单片机·linux内核·嵌入式开发·调试定位
何粥学17 小时前
Vivado 2024.2 开发记录(AC820 Zynq-7020)——软件使用,点亮led灯
单片机·嵌入式硬件·zynq
Sakura_j_h_17 小时前
51 单片机驱动四位数码管:动态扫描、限流电阻与消影的取舍
单片机·嵌入式硬件·51单片机·嵌入式·数码管·动态扫描·限流电阻
HANDY0920018 小时前
从“不照人”到“剂量达标”:扇叶遮挡式UV-C空气消毒的工程边界与可验证评估框架
开发语言·人工智能·嵌入式硬件·智能家居
飞凌嵌入式21 小时前
千次静电放电试炼,守住飞凌嵌入式硬件可靠底线
嵌入式硬件
蹊黎1 天前
Linux 下用 C 语言实现进度条
linux·c语言·单片机
无敌贵点大王1 天前
从寄存器层面重学STM32(6)——串口USART实战部分
stm32·单片机·嵌入式硬件