排查流程:1) 确认进入的是哪种低功耗模式——deep sleep会保留RTC内存,但light sleep和modem sleep默认不保留,需检查esp_sleep_enable_*配置;2) 检查RTC内存初始化时机,若在app_main中未调用esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_SLOW_MEM, ESP_PD_OPTION_ON)则可能被断电;3) 用esp_sleep_get_wakeup_cause()验证唤醒源,若因GPIO或定时器唤醒,RTC内存应有效,若因断电唤醒则数据丢失;4) 使用esp_deep_sleep_start()前,确保数据已通过RTC_NOINIT_ATTR或RTC_DATA_ATTR声明,并写入后立即调用esp_sleep_pd_config。规避技巧:优先使用RTC_DATA_ATTR声明关键变量,避免动态分配;在进入睡眠前,将数据备份到NVS或Flash,唤醒后恢复;若需频繁保存,可启用RTC内存校验和(CRC)以检测损坏。实操建议:用逻辑分析仪或串口打印唤醒原因,逐步隔离问题。
mcuku 阿沐 · 2026-08-27