[嵌入式C编程与固件开发] 项目中的低功耗设计

[复制链接]
地瓜patch 发表于 2025-8-10 17:36 | 显示全部楼层 |阅读模式
本帖最后由 地瓜patch 于 2025-8-10 17:41 编辑

低功耗是嵌入式系统中延长电池寿命的关键技术,常用单片机低功耗休眠主要有 以下几种模式:
空闲模式(Idle Mode)
休眠模式(Sleep)
深度休眠(Deep Sleep)
待机模式(Standby Mode)
停机模式(Stop Mode)
多种低功耗模式,需要根据项目的实际需求来进行选择。不同模式所停止的时钟和外设不同,需要谨慎选择。
在项目中,我常用深度休眠(Deep Sleep)模式,由中断唤醒。可以显著降低系统功耗,适用于电池供电供电的应用场景。
1.STM32系列单片机深度休眠
void Enter_DeepSleep_Mode(void)
{
   // 使能唤醒引脚(例如PA0)
    HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1);
       // 清除唤醒标志
    __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);
      // 进入深度休眠模式
    HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
       // 唤醒后重新配置时钟(因为深度休眠会关闭部分时钟)
    SystemClock_Config();
}
2.ESP32系列单片机深度休眠
void Enter_DeepSleep(uint64_t sleep_time_us)
{
    // 配置唤醒源(例如定时器唤醒)
    esp_sleep_enable_timer_wakeup(sleep_time_us);
        // 或者配置GPIO唤醒   
// esp_sleep_enable_ext0_wakeup(GPIO_NUM_0, 0); // 低电平唤醒
        // 进入深度休眠
   esp_deep_sleep_start();        // 程序不会执行到这里,唤醒后会从复位开始执行
}

3. AVR单片机深度休眠
void Enter_DeepSleep(void)
{
   // 设置休眠模式为省电模式
    set_sleep_mode(SLEEP_MODE_PWR_DOWN);
        // 使能休眠
    sleep_enable();
        // 配置唤醒中断(例如外部中断0)
    EIMSK |= (1 << INT0); // 使能INT0
        // 进入休眠
   sleep_cpu();
       // 唤醒后继续执行
    sleep_disable();
       // 禁用不再需要的中断
    EIMSK &= ~(1 << INT0);
}

4. MSP430深度休眠示例
void Enter_LPM4(void)
{
// LPM4是MSP430的最低功耗模式
    // 配置唤醒源(例如GPIO中断)
    P1IE |= BIT3;
      // 使能P1.3中断
    P1IES |= BIT3;
     // 下降沿触发
    P1IFG &= ~BIT3;
    // 清除中断标志
       // 进入LPM4模式
    __bis_SR_register(LPM4_bits + GIE);
       // 唤醒后继续执行
}

为了实现有效的低功耗设计需要注意以下事项唤醒源配置:
必须配置至少一个唤醒源,否则单片机将无法唤醒,一般为定时器中断唤醒或外部中断唤醒
IO状态:进入休眠前应设置IO状态为最低功耗配置
外设关闭:关闭不需要的外设时钟和功能
变量保存:深度休眠可能导致RAM数据丢失,需要使用RTC内存或备份寄存器保存关键数据,比如将数据存入flash或eeprom
唤醒处理:唤醒后可能需要重新初始化部分外设和时钟唤醒后的处理

大多数单片机从深度休眠唤醒后会重新启动(类似于复位),因此需要在主程序中检测唤醒原因并做相应处理。

您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:出一块TI-PLABS-AMP-EVM

1806

主题

14843

帖子

29

粉丝
快速回复 在线客服 返回列表 返回顶部
个人签名:出一块TI-PLABS-AMP-EVM

1806

主题

14843

帖子

29

粉丝
快速回复 在线客服 返回列表 返回顶部