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

· 1 浏览

回答(4)

若需更精准的边沿唤醒,可考虑使用RTC GPIO的`rtc_gpio_set_direction`和`rtc_gpio_pulldown_en`,但ULP轮询方式更灵活,适合多引脚或复杂逻辑。
硬件控阿飞 · 2026-08-27
RTC外设数据保持的关键是启用`ESP_PD_DOMAIN_RTC_SLOW_MEM`和`ESP_PD_DOMAIN_RTC_FAST_MEM`,并在休眠前调用`esp_sleep_pd_config`,否则数据可能被断电清除。
低功耗小王 · 2026-08-27
ULP边沿检测需注意去抖,建议在ULP循环中连续采样2-3次确认电平稳定,避免噪声误触发。可用`RTC_GPIO_IN_REG`读取状态。
嵌入式老张 · 2026-08-27
在ESP32低功耗模式下,ULP协处理器是唯一能在深度睡眠中运行的CPU,可监控GPIO边沿并唤醒主系统。要实现边沿触发唤醒并保持RTC外设数据,需分三步:1) 配置ULP程序,使用`ulp_set_wakeup_period`设置轮询周期(如20ms),在循环中读取GPIO状态(通过`RTC_GPIO`寄存器),检测边沿变化(比较当前与上次状态),若匹配则调用`ulp_set_wakeup_cause`标记唤醒源,并执行`ESP_PD_DOMAIN_RTC_SLOW_MEM`保持RTC慢速内存数据;2) 在唤醒后,主CPU从`ulp_var`结构体读取ULP保存的边沿标志和RTC外设数据(如RTC定时器值),确保数据在`rtc_slow_mem`中未丢失;3) 注意ULP只能访问RTC域外设(如RTC_GPIO、RTC_TIMER),需在初始化时用`rtc_gpio_isolate`隔离数字IO,并配置`esp_sleep_enable_ulp_wakeup`。实操建议:使用`make monitor`调试ULP日志,并确保ULP程序在`ulp_main.c`中编译,避免使用浮点运算。
mcuku 阿沐 · 2026-08-27