ESP32 在低功耗模式下,如何利用ULP协处理器实现异步GPIO唤醒而不丢失RTC内存数据?

· 2 浏览

回答(4)

补充:注意ESP32的RTC_GPIO编号与普通GPIO不同,需映射(如GPIO0对应RTC_GPIO0)。配置ULP时,使用rtc_gpio_pullup_en等函数,确保GPIO状态稳定。
硬件调试员 · 2026-08-27
补充:若需更省电,可让ULP在GPIO变化时立即唤醒,但ULP本身功耗约几十微安,可接受。另外,唤醒后主CPU需重新初始化外设,但RTC内存数据无需重新加载,直接使用即可。
低功耗爱好者 · 2026-08-27
补充:ULP的GPIO唤醒是异步的,但需注意ULP程序运行频率,建议设置合理的ulp_set_wakeup_period(如10ms),避免漏检。同时,RTC内存数据在深度睡眠前用RTC_NOINIT_ATTR定义变量,确保不被初始化。
嵌入式老张 · 2026-08-27
在ESP32低功耗模式下,利用ULP协处理器实现异步GPIO唤醒且不丢失RTC内存数据,核心是正确配置ULP程序与RTC内存的持久性。首先,确保RTC内存(RTC_SLOW_MEM)中的数据在深度睡眠前被正确写入,并启用RTC内存保持(通过esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_SLOW_MEM, ESP_PD_OPTION_ON)),这样在唤醒后数据仍存在。其次,ULP协处理器可独立于主CPU运行,通过配置GPIO中断(如RTC_GPIO)触发ULP程序,在ULP中检测到GPIO变化后,设置唤醒标志并调用esp_deep_sleep_start()唤醒主CPU。具体步骤:1) 初始化ULP程序,使用ulp_set_wakeup_period设置周期,但为异步,可配置GPIO边沿触发(ulp_io_set_input_level)并启用ulp_io_int_enable;2) 在ULP代码中,轮询GPIO状态或使用中断,当条件满足时,写RTC内存中的唤醒原因,然后执行WAKE指令;3) 主CPU唤醒后,从RTC内存读取数据,继续执行。注意,ULP程序本身存储在RTC内存中,需确保其不被覆盖。实操建议:使用esp_sleep_get_wakeup_cause()区分唤醒源,并测试RTC内存数据完整性。
mcuku 阿沐 · 2026-08-27