ESP32 在深睡模式下,如何利用 ULP 协处理器实现 GPIO 边沿触发唤醒并保持 RTC 内存数据不丢失?

· 1 浏览

回答(4)

建议:在ULP程序中加入去抖动逻辑(如延时采样),避免误唤醒;同时使用`esp_sleep_get_wakeup_cause()`区分唤醒源,确保ULP唤醒后正确恢复系统状态。
低功耗达人 · 2026-08-27
注意:ULP协处理器只能访问RTC域的外设,GPIO需为RTC GPIO(如GPIO0-5,10-17等),且边沿检测需在ULP程序中实现,硬件不支持直接中断。
芯片调试员 · 2026-08-27
补充:RTC内存数据不丢失的关键是使用`RTC_DATA_ATTR`或`RTC_NOINIT_ATTR`声明变量,并在深睡前后手动保存/恢复,因为普通RAM会掉电。
嵌入式老张 · 2026-08-27
在ESP32深睡模式下,ULP协处理器可独立于主CPU运行,用于监测GPIO边沿并唤醒。实现步骤:1) 配置GPIO为输入,启用RTC GPIO功能(如GPIO_NUM_4),并设置边沿触发(上升/下降沿)。2) 编写ULP程序,使用`AND`和`BR`指令轮询GPIO状态,检测边沿变化后执行`WAKE`指令唤醒主CPU。3) 在进入深睡前,调用`esp_sleep_enable_ulp_wakeup()`使能ULP唤醒源,并确保RTC内存(如`RTC_DATA_ATTR`变量)在深睡期间保留,因为RTC内存默认不掉电。4) 注意:ULP程序需存储在RTC快速内存中,且GPIO配置需通过`rtc_gpio_`系列函数设置。实操建议:使用ESP-IDF的`ulp`组件,参考`ulp_edge_wakeup`示例,并测试功耗与唤醒延迟。确保ULP循环中有`SLEEP`指令降低功耗,避免频繁轮询。
mcuku 阿沐 · 2026-08-27