ESP32 在低功耗模式下,如何利用ULP协处理器实现GPIO唤醒并保持RTC内存数据不丢失的完整配置流程?

· 1 浏览

回答(4)

若需在唤醒后快速恢复,可在ULP中记录唤醒时间戳到RTC内存,主CPU唤醒后直接读取,避免重新初始化外设。
电源管理专家 · 2026-08-27
RTC内存数据不丢失的关键是使用`RTC_DATA_ATTR`定义变量,并确保在深度睡眠前调用`esp_sleep_pd_config`关闭RTC外设电源域,但保留RTC内存。
低功耗小能手 · 2026-08-27
注意ULP程序中的GPIO唤醒需配置为边沿触发,且ULP运行频率较低,建议在GPIO信号稳定后延时再采样,避免抖动误唤醒。
嵌入式老张 · 2026-08-27
在ESP32低功耗模式下,利用ULP协处理器实现GPIO唤醒并保持RTC内存数据不丢失,需遵循以下完整流程:首先,在软件中启用ULP协处理器,通过`esp_sleep_enable_ulp_wakeup()`配置ULP唤醒源。其次,ULP程序需在RTC内存中运行,因此需将ULP程序加载到RTC快速内存(`RTC_SLOW_MEM`),并确保其变量存储在RTC内存中(使用`RTC_DATA_ATTR`或`RTC_NOINIT_ATTR`属性)。GPIO唤醒配置:在ULP程序中,使用`ulp_set_wakeup_period()`设置唤醒周期,并在GPIO中断触发时,通过`ulp_io_set_state()`或`ulp_gpio`相关API配置GPIO为输入模式,启用边沿触发(如下降沿),当检测到信号时,ULP执行`ulp_wakeup()`唤醒主CPU。同时,主CPU进入深度睡眠前,调用`esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_SLOW_MEM, ESP_PD_OPTION_ON)`确保RTC慢速内存不掉电,并调用`esp_deep_sleep_start()`。数据保持:所有需保留的数据必须存放在RTC内存中,且避免使用堆栈或全局变量(非RTC属性)。最后,唤醒后,主CPU通过`esp_sleep_get_wakeup_cause()`验证唤醒源,并读取RTC内存中的数据。实操建议:使用ESP-IDF的`ulp`组件示例(如`ulp_adc`或`ulp_gpio`)作为参考,并确保ULP程序编译时指定`-mno-save-restore`以优化。
mcuku 阿沐 · 2026-08-27