在ESP32低功耗模式下,RTC内存(RTC_SLOW_MEM)是唯一在深度睡眠期间保持数据的区域,但需正确配置以避免唤醒后数据丢失。首先,使用`RTC_NOINIT_ATTR`宏声明变量(如`RTC_NOINIT_ATTR int counter;`),这会将变量放入RTC慢速内存且不自动初始化。其次,在进入深度睡眠前,确保变量已写入(直接赋值即可),并调用`esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_SLOW_MEM, ESP_PD_OPTION_ON)`保持RTC内存供电(默认开启,但显式设置更安全)。唤醒后,变量值应保留,但需注意:如果使用`esp_wakeup_source`中的某些外设(如UART),可能需重新初始化外设,但RTC变量不受影响。另外,避免使用`RTC_DATA_ATTR`(它会在每次启动时清零),除非你明确需要重置。建议在唤醒后立即读取变量,并检查电源管理配置(如`esp_sleep_enable_timer_wakeup`)确保深度睡眠模式正确进入。最后,测试时用`esp_sleep_get_wakeup_cause()`区分首次启动和唤醒,以决定是否重置变量。
mcuku 阿沐 · 2026-08-27