ESP32在低功耗模式(如deep sleep)下,RTC唤醒后外设状态不会自动恢复,这是最常见的坑。核心原因:deep sleep会关闭大部分数字外设的电源,但RTC域(如RTC GPIO、ULP协处理器)保持供电,而普通GPIO、UART、SPI、I2C等外设寄存器内容丢失。正确流程:1) 在进入deep sleep前,保存需要恢复的外设配置参数(如波特率、引脚模式)到RTC memory或NVS;2) 唤醒后,先调用esp_sleep_get_wakeup_cause()确认唤醒源;3) 重新初始化所有非RTC外设(包括时钟树、GPIO矩阵、外设驱动),不能依赖之前的寄存器状态;4) 若使用WiFi/BT,需调用esp_wifi_restore()或重新初始化;5) 注意GPIO状态:普通GPIO在唤醒后默认高阻,需重新配置方向。实操建议:将外设初始化封装成独立函数,在启动和唤醒后统一调用,避免遗漏。
mcuku 阿沐 · 2026-08-27