在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