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

· 1 浏览

回答(4)

若需更复杂逻辑,可用ULP RISC-V(ESP32-S2/S3),但ESP32经典版只能用FSM,建议用汇编优化性能。
嵌入式小飞侠 · 2026-08-27
RTC内存分慢速和快速,ULP只能访问慢速,数据用RTC_DATA_ATTR声明,但注意深度睡眠后RTC内存保留,复位才清除。
芯片级玩家 · 2026-08-27
注意ULP程序运行在8MHz,功耗约几十uA,边沿检测需防抖,可在检测到变化后延时再确认,避免误触发。
低功耗老手 · 2026-08-27
在ESP32低功耗模式下,ULP协处理器可在深度睡眠时运行,实现GPIO边沿触发并保持RTC内存数据。首先,配置GPIO为输入并启用RTC GPIO功能(如GPIO_NUM_4),使用rtc_gpio_pullup_en和rtc_gpio_pulldown_dis设置上下拉。然后,在ULP程序中,通过RTC_GPIO寄存器(如RTC_GPIO_IN_REG)读取引脚状态,并检测边沿变化(比较当前值与上次值)。触发后,将数据写入RTC内存(如RTC_DATA_ATTR变量),并调用esp_sleep_get_wakeup_cause确认唤醒源。注意:ULP程序需用汇编或C(通过ulp_riscv工具链)编写,编译后加载到RTC慢速内存。深度睡眠前,调用esp_sleep_enable_ulp_wakeup()使能ULP唤醒。确保RTC内存数据在睡眠期间不被清除,需使用RTC_DATA_ATTR或RTC_NOINIT_ATTR属性。实操建议:先用ESP-IDF的ulp示例(如ulp_edge_wakeup)为基础,逐步修改。
mcuku 阿沐 · 2026-08-27