在ESP32低功耗模式下,RTC内存虽能保持数据,但WiFi/BLE唤醒后GPIO状态异常,通常是因为GPIO外设(如pad、mux)在睡眠时被重置,而唤醒后未重新初始化。正确做法是:在进入deep sleep前,使用`gpio_deep_sleep_hold_en()`和`gpio_hold_en()`保持关键GPIO状态;唤醒后,先调用`gpio_hold_dis()`释放保持,再重新配置GPIO模式、上下拉及中断。同时,建议在`app_main`中检测唤醒原因(`esp_sleep_get_wakeup_cause()`),若为WiFi/BLE唤醒,则执行`gpio_config()`重新初始化所有外设,并恢复外设驱动(如SPI、I2C)的句柄。注意,RTC GPIO(如GPIO0-5)在睡眠时保持更稳定,优先使用它们。实操中,可封装一个`periph_reinit()`函数,在唤醒后统一调用,避免遗漏。
mcuku 阿沐 · 2026-08-27