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

· 2 浏览

回答(4)

若需保留更多数据,可考虑使用RTC_SLOW_MEM,但注意容量有限(8KB),且ULP程序本身占用空间,需优化。
硬件控阿杰 · 2026-08-27
边沿检测建议在ULP中实现双采样(如间隔10ms),避免抖动误触发,同时可结合`rtc_gpio_isr`配置唤醒源。
低功耗小王 · 2026-08-27
注意ULP协处理器只能访问RTC域内存,确保变量用`RTC_DATA_ATTR`声明,且ULP程序需用`ulp_add`链接。
嵌入式老张 · 2026-08-27
在ESP32低功耗模式下,利用ULP协处理器实现GPIO边沿触发唤醒并保持RTC内存数据,核心是配置RTC外设和ULP程序。首先,将GPIO配置为RTC GPIO(如GPIO0-15),通过rtc_gpio_pullup_en/pulldown_en设置上下拉,并调用rtc_gpio_hold_en保持状态。ULP程序需在deep sleep前加载到RTC快速内存,使用`ulp_set_wakeup_period`设置周期,并在ULP代码中轮询GPIO状态,检测边沿(如通过比较前后电平)。检测到边沿后,设置ULP唤醒标志(如`ulp_wakeup_period`),然后执行`esp_deep_sleep_start`。RTC内存数据(如RTC_NO_MEM或RTC_DATA_ATTR)在deep sleep期间自动保留,无需额外操作,但需确保数据写入在sleep前完成。实操建议:使用`ulp_riscv`或`ulp_fsm`工具链编写程序,注意ULP程序大小限制(8KB),并测试唤醒延迟。
mcuku 阿沐 · 2026-08-27