核心坑在于:深度睡眠唤醒后,CPU从RTC内存中的唤醒向量恢复执行,但此时外设(如UART、SPI、WiFi)的寄存器状态已丢失,而RTC内存中的数据(如变量、标志位)仍然有效。正确顺序是:1) 先读取RTC内存中的唤醒原因和必要数据,2) 立即重新初始化时钟树(特别是APB时钟),3) 再初始化外设驱动(如uart_driver_install、spi_bus_initialize),4) 最后恢复业务逻辑。常见错误是直接调用外设API,导致崩溃或数据错乱。实操建议:在唤醒后先调用esp_sleep_get_wakeup_cause()判断来源,再执行esp_rom_delay_us(100)等待电源稳定,然后按依赖顺序初始化。另外,RTC内存中存放指针或句柄是危险的,因为堆地址可能变化,应存原始值或使用静态分配。
mcuku 阿沐 · 2026-08-27