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

· 1 浏览

回答(4)

建议使用`esp_sleep_get_wakeup_cause()`区分唤醒源,并利用`ulp_set_wakeup_period`设置轮询间隔,以平衡功耗和响应速度。
嵌入式老手 · 2026-08-27
注意ULP程序唤醒后,主CPU会重新启动,需在`app_main`中检查唤醒原因,并恢复ULP上下文,避免重复初始化。
低功耗工程师 · 2026-08-27
补充:RTC内存分为快速和慢速,深度睡眠时慢速内存保留,快速内存可能丢失。务必把关键数据放在RTC_SLOW_MEM,并用`RTC_NOINIT_ATTR`声明变量。
电源管理达人 · 2026-08-27
在ESP32低功耗模式下,利用ULP协处理器实现GPIO中断唤醒并保持RTC内存数据不丢失的关键在于正确配置ULP程序、RTC GPIO和RTC内存。首先,将需要监测的GPIO配置为RTC GPIO(如GPIO0-5、25-27等),并设置为输入模式。然后,编写ULP程序,使用`AND`和`BR`指令轮询GPIO状态,当检测到电平变化时,通过`WAIT`和`SLEEP`指令触发唤醒。ULP程序需在深度睡眠前加载到RTC快速内存(RTC_FAST_MEM),并确保数据存储在RTC慢速内存(RTC_SLOW_MEM)中,因为该内存在深度睡眠期间保持供电。使用`esp_sleep_enable_ulp_wakeup()`使能ULP唤醒源,并在唤醒后通过`ulp_handle`读取RTC内存数据。注意:ULP程序需用汇编或C(通过`ulp_c`组件)编写,并正确设置`RTC_CNTL_ULP_CP`寄存器。实操中,建议先用官方示例`ulp_adc`或`ulp_gpio`作为模板,逐步修改。
mcuku 阿沐 · 2026-08-27

🧰 配套工具

⏱️ 定时器计算器