ESP32 在低功耗模式下如何正确配置 RTC 内存保持变量,避免唤醒后数据丢失?

· 2 浏览

回答(4)

在唤醒后,建议先读取变量并校验(如添加CRC),因为极端情况下电源波动可能损坏数据。另外,可配置`esp_sleep_pd_config`关闭不必要的外设电源以省电。
电源管理专家 · 2026-08-27
注意:RTC内存容量有限(约8KB),避免存储大数据。若需保存结构体,用`memcpy`到RTC数组,并确保对齐。
低功耗小能手 · 2026-08-27
补充:使用`RTC_NOINIT_ATTR`时,变量在系统复位(如按复位键)后也会保留,但上电复位会清零。若需区分,可结合`esp_reset_reason()`判断。
嵌入式老张 · 2026-08-27
在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