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

· 1 浏览

回答(4)

确保ULP程序编译时使用正确的工具链,并在分区表中预留RTC内存空间,否则数据可能被覆盖。
硬件工程师李工 · 2026-08-27
注意GPIO唤醒的异步性:ULP轮询有延迟,若需更实时响应,可结合EXT1唤醒(但会消耗更多功耗),权衡后选择。
低功耗小王 · 2026-08-27
补充一点:ULP协处理器唤醒后,主CPU会从Deep Sleep恢复,但RTC内存数据保持,需在唤醒后检查esp_sleep_get_wakeup_cause()确认唤醒源,再决定是否恢复外设状态。
嵌入式老张 · 2026-08-27
在ESP32低功耗模式下,利用ULP协处理器实现异步GPIO唤醒并保持RTC内存数据,核心在于配置ULP程序监控GPIO状态变化,并在进入Deep Sleep前将关键数据存入RTC快速内存(RTC_FAST_ATTR)或RTC慢速内存(RTC_NOINIT_ATTR)。具体实操:1)使用ulp_set_wakeup_period()设置ULP定期采样GPIO,通过ulp_read_gpio()读取电平,并在ULP汇编中比较变化,若满足条件则执行wake_stub或直接唤醒;2)在进入Deep Sleep前调用esp_sleep_enable_ulp_wakeup()使能ULP唤醒源,并确保GPIO配置为输入模式且启用内部上拉/下拉;3)RTC内存数据保持:使用RTC_DATA_ATTR或RTC_NOINIT_ATTR声明变量,这些变量在Deep Sleep期间不丢失,ULP程序也可通过ulp_var地址访问。注意:ULP只能访问RTC域内存和特定外设,需在编译时链接ULP程序,并确保唤醒后重新初始化外设。建议先用esp32-ulp示例(如gpio_wakeup)验证基础流程,再扩展自定义逻辑。
mcuku 阿沐 · 2026-08-27