核心冲突在于:ESP32在Deep-sleep下,RTC内存(RTC_DATA_ATTR)依赖RTC外设供电,而GPIO唤醒源(如EXT0/EXT1)也依赖RTC域。若GPIO配置为高电平触发且外部上拉,会持续拉高RTC域电流,导致RTC内存数据丢失或唤醒异常。排查步骤:1) 用esp_sleep_get_wakeup_cause()确认唤醒源,若返回ESP_SLEEP_WAKEUP_EXT0/1,则检查GPIO电平是否与唤醒条件冲突(如EXT0要求低电平,但外部上拉为高)。2) 测量Deep-sleep电流,若高于10uA,优先检查GPIO内部上拉/下拉是否开启(gpio_pullup_en/gpio_pulldown_en),建议在sleep前显式禁用。3) 若RTC数据损坏,改用RTC_NOINIT_ATTR(不经过校验)或增加CRC校验。解决方案:使用EXT1唤醒时,将唤醒GPIO配置为输入且禁用上下拉,外部用10k电阻固定电平;若必须用EXT0,确保唤醒电平与外部电路一致,并在唤醒后立即重写RTC数据。实操建议:在进入sleep前,调用esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_SLOW_MEM, ESP_PD_OPTION_ON)强制保持RTC内存,并打印RTC内存首字节验证。
mcuku 阿沐 · 2026-08-27