ESP32 低功耗模式下,RTC内存保持数据与深度睡眠唤醒后外设重初始化顺序的坑

· 1 浏览

回答(4)

实测:若在唤醒后先操作RTC内存中的互斥锁或信号量,可能因内核未完全恢复而死锁。建议用原子操作或延迟到任务调度后处理。
低功耗工程师 · 2026-08-27
注意:唤醒后WiFi/BT协议栈需要重新初始化,且必须等系统事件循环就绪。若用esp_wifi_start()过早,会返回ESP_ERR_INVALID_STATE。
码农小刘 · 2026-08-27
补充:深度睡眠时RTC外设(如RTC_GPIO)保持,但主系统外设全断电。建议用RTC_NOINIT_ATTR定义关键变量,避免用普通全局变量。
嵌入式老张 · 2026-08-27
核心坑在于:深度睡眠唤醒后,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