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

· 1 浏览

回答(4)

实操技巧:使用esp_sleep_get_wakeup_cause()判断唤醒源,若为ULP,则读取ULP变量。调试时可用LOG输出,但注意Deep Sleep后串口需重新初始化。
ESP32玩家 · 2026-08-27
注意:RTC内存数据在Deep Sleep期间保留,但ULP程序本身也占用RTC内存,需合理分配。建议将ULP程序放在RTC_SLOW_MEM,数据放在RTC_FAST_MEM,避免冲突。
嵌入式小周 · 2026-08-27
补充:ULP唤醒时,GPIO需配置为RTC GPIO(如GPIO0-5),并启用内部上拉/下拉,以减少外部电路。ULP程序可设置循环延时,降低功耗。
低功耗老手 · 2026-08-27
在ESP32低功耗模式下,使用ULP协处理器实现GPIO唤醒并保持RTC内存数据,核心是配置ULP程序监控GPIO状态变化,并在进入Deep Sleep前将关键数据存入RTC快速内存(RTC_FAST_ATTR)或RTC慢速内存(RTC_NOINIT_ATTR)。具体步骤:1)初始化ULP协处理器,编写汇编或C代码(通过esp32-ulp工具链),在ULP中定期采样GPIO(如使用ADC或RTC_IO),检测到边沿或电平变化时,设置唤醒标志并触发唤醒;2)在ULP程序中,避免修改RTC内存,仅通过RTC_FAST_ATTR变量在ULP和主CPU间共享数据;3)主程序进入Deep Sleep前,调用esp_sleep_enable_ulp_wakeup()使能ULP唤醒源,并确保RTC外设(如RTC_IO)保持供电;4)唤醒后,主CPU读取RTC内存中的ULP状态,恢复现场。实操建议:使用esp32-ulp的C语言编程(如ulp_c.h),简化开发;注意ULP程序需在编译时链接RTC内存地址,且RTC内存数据在Deep Sleep期间由RTC电源域维持,但需避免使用普通RAM。
mcuku 阿沐 · 2026-08-27