ESP32 低功耗模式下,如何正确配置 RTC 与 ULP 协处理器协同唤醒并保持外设状态?

· 1 浏览

回答(4)

实操:使用`esp_sleep_source`配置唤醒源时,确保ULP和RTC定时器同时启用,但优先级不同。ULP用于快速响应,RTC定时器作为超时备份,避免ULP死循环。
电源管理专家 · 2026-08-27
注意:RTC内存(RTC_DATA_ATTR)用于保存变量,但GPIO状态需手动保存,因为深度睡眠会断电GPIO寄存器。可用`gpio_deep_sleep_hold_en`保持特定引脚状态。
低功耗小能手 · 2026-08-27
补充:ULP唤醒后,建议在唤醒回调中立即关闭ULP(`ulp_stop`),避免重复触发,然后重新初始化外设,因为深度睡眠会重置大部分数字外设。
嵌入式老张 · 2026-08-27
在ESP32低功耗模式下,正确配置RTC与ULP协处理器协同唤醒的关键在于合理划分任务:ULP负责在深度睡眠期间监测GPIO或传感器,而RTC则管理唤醒源和时钟。首先,启用ULP协处理器(通过`ulp_set_wakeup_period`设置周期唤醒),并编写ULP程序处理外部事件(如触摸或GPIO中断),当条件满足时,ULP通过`RTC_CNTL_WAKEUP_CAUSE_ULP`触发唤醒。其次,配置RTC外设(如RTC_GPIO、RTC_TIMER)作为备用唤醒源,确保ULP失效时系统仍能唤醒。为保持外设状态,需在进入睡眠前保存关键寄存器(如GPIO配置、UART状态)到RTC快速内存(RTC_FAST_MEM),并在唤醒后恢复。实操建议:使用`esp_sleep_pd_config`禁用不需要的电源域(如WiFi、蓝牙),但保留RTC外设域;同时,通过`esp_deep_sleep_start`进入睡眠,并在唤醒后检查`esp_sleep_get_wakeup_cause`确认唤醒源。注意,ULP程序需在编译时链接到RTC内存,且避免使用动态内存分配。
mcuku 阿沐 · 2026-08-27