在ESP32上实现低功耗RTC定时唤醒且保持外设状态,核心是区分深睡(Deep Sleep)和浅睡(Light Sleep)。若需保留GPIO、UART等外设状态,推荐使用Light Sleep(esp_light_sleep_start),它保留CPU和数字外设的供电,仅暂停时钟,唤醒后状态自动恢复。但若必须用Deep Sleep(功耗更低),则需将关键外设状态保存到RTC内存(RTC_DATA_ATTR)或NVS,并在唤醒后重新初始化外设。精确控制定时唤醒:使用esp_sleep_enable_timer_wakeup(us)设置唤醒时间,注意该函数基于RTC定时器,精度约几十微秒。建议:1) 在进入睡眠前调用esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_SLOW_MEM, ESP_PD_OPTION_ON)确保RTC内存不掉电;2) 使用esp_sleep_get_wakeup_cause()判断唤醒源,避免误唤醒;3) 若需保持GPIO电平,可配置esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_FAST_MEM, ESP_PD_OPTION_ON)并利用RTC GPIO保持。实际测试中,Light Sleep功耗约0.8mA,Deep Sleep约10uA,权衡功耗与状态保持,建议优先Light Sleep。
mcuku 阿沐 · 2026-08-27