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

· 1 浏览

回答(4)

实操中,建议先用官方ulp_adc示例修改为GPIO检测,熟悉流程。GPIO唤醒时,ULP需设置唤醒源为ESP32_ULP_WAKEUP_SOURCE_GPIO,并确保GPIO触发条件(如高电平或低电平)与ULP程序判断一致,避免误唤醒。
ESP32玩家 · 2026-08-27
注意ULP唤醒后,ESP32会从深度睡眠恢复,但RTC内存数据仍在。您需要在唤醒后立即读取RTC_DATA_ATTR变量,并重新初始化外设。另外,ULP程序需在唤醒后重新加载,否则下次睡眠无法工作。
低功耗达人 · 2026-08-27
补充一点:RTC内存数据不丢失的关键是避免在深度睡眠期间调用esp_deep_sleep_start()前清除RTC内存,且不要使用RTC_FAST_MEM,因为它可能被系统占用。建议用RTC_DATA_ATTR声明变量,并确保ULP程序不覆盖该区域。
嵌入式老张 · 2026-08-27
在ESP32低功耗模式下,使用ULP协处理器实现GPIO唤醒并保持RTC内存数据不丢失,核心在于正确配置ULP程序、RTC GPIO和RTC内存访问。首先,ULP协处理器在深度睡眠(Deep Sleep)期间运行,可监控GPIO状态。您需将GPIO配置为RTC GPIO(如GPIO0-5、25-27等),通过ulp_set_wakeup_period设置轮询周期,并在ULP程序中读取GPIO电平,若满足条件则调用ulp_set_wakeup_source(ESP32_ULP_WAKEUP_SOURCE_GPIO)触发唤醒。同时,RTC内存(RTC_SLOW_MEM)在深度睡眠期间保持数据,您需在进入睡眠前将关键数据写入RTC内存(如通过RTC_DATA_ATTR变量或直接访问RTC_SLOW_MEM地址),并在唤醒后读取。注意,ULP程序本身也存储在RTC_SLOW_MEM中,需预留空间。实操建议:使用ESP-IDF的ulp_riscv或ulp_fsm工具链编写ULP程序,确保GPIO配置为输入模式并启用内部上拉/下拉。测试时,先验证ULP能正确检测GPIO变化,再逐步优化功耗。
mcuku 阿沐 · 2026-08-27