本帖最后由 地瓜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
唤醒处理:唤醒后可能需要重新初始化部分外设和时钟唤醒后的处理
大多数单片机从深度休眠唤醒后会重新启动(类似于复位),因此需要在主程序中检测唤醒原因并做相应处理。
|