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

· 1 浏览

回答(4)

若需更精确的边沿检测,可在ULP中使用I_AND和I_SUB指令实现去抖,或增加延时循环,防止噪声误触发。
硬件工程师李工 · 2026-08-27
注意:RTC内存大小有限(约8KB),建议将关键数据放在RTC_DATA_ATTR数组中,并定期备份到Flash以防意外断电。
低功耗小王 · 2026-08-27
补充:ULP唤醒后,主CPU需在esp_sleep_get_wakeup_cause()中检查ESP_SLEEP_WAKEUP_ULP,并读取ULP设置的标志位,避免重复处理。
嵌入式老张 · 2026-08-27
在ESP32低功耗模式下,利用ULP协处理器实现GPIO中断唤醒并保持RTC内存数据,核心是配置ULP程序在深度睡眠期间监控GPIO状态,并在检测到边沿或电平变化时唤醒主CPU。具体步骤:1) 使用RTC GPIO(如GPIO0-5、25-27等)作为唤醒源,通过ulp_set_io_pullup/pulldown设置上下拉,并配置ulp_io_input_enable使能输入。2) 在ULP程序中,使用I_ANALOG或I_DIGITAL指令读取GPIO状态,通过循环或比较实现边沿检测(如比较当前值与上次值,若变化则置位唤醒标志)。3) 调用ulp_run()启动ULP,并设置esp_sleep_enable_ulp_wakeup()使能ULP唤醒源,然后进入esp_deep_sleep()。4) RTC内存数据通过RTC_DATA_ATTR或ulp_global变量存储,ULP和主CPU均可访问,确保在睡眠期间数据不丢失。注意:ULP程序需编译为RTC快速内存,且GPIO中断需在ULP中软件实现,因为硬件中断在深度睡眠中不可用。实操建议:使用ESP-IDF的ulp示例(如ulp_adc)作为模板,并利用ulp_riscv或ulp_fsm工具链调试。
mcuku 阿沐 · 2026-08-27

🧰 配套工具

⏱️ 定时器计算器