ESP32 RTC RAM EEPROM:深度睡眠下数据持久保存方法,拯救你的闪存

引言

在嵌入式开发中,存储数据的持久性至关重要。ESP32 提供了多种存储选项,其中闪存(Flash)是最常用的存储介质。然而,闪存存在写入次数有限的限制,频繁写入会导致其寿命缩短。特别是 ESP32 的 EEPROM 实现将数据存储在闪存的 NVS 区域,每次写入都会触发整个 EEPROM 的重写操作,这会加速闪存的磨损。

RTC RAM: 深度睡眠的守护者

ESP32 拥有一个内部的实时时钟 (RTC) 区域,其中包含 RAM,该区域在 ESP32 进入深度睡眠模式时仍然保持供电。这为我们提供了一种在深度睡眠模式下保持数据持久性的方法,有效地延长了闪存的寿命。

ESP32_RTC_EEPROM 库:模拟 EEPROM 的利器

ESP32_RTC_EEPROM 库利用 RTC RAM 模拟 Arduino EEPROM 的功能,将数据存储在 RTC RAM 中,并在深度睡眠模式下保留数据。该库提供了与 Arduino EEPROM 相似的接口,使开发人员能够轻松地将现有代码移植到新的存储方案。

使用场景

该库适用于以下场景:

  • • 需要数据在深度睡眠模式下保持持久性,例如记录启动次数、传感器数据、配置信息等。

  • • 现有代码已使用 Arduino EEPROM.h 库,希望迁移到更持久且低功耗的存储方式。

注意事项

  • • 数据在重启或重新刷写固件后会丢失。

  • • RTC RAM 的容量有限,仅能存储少量数据。

库的使用

  1. 1. 安装库

    • • 使用 Arduino IDE 的库管理器搜索并安装 ESP32_RTC_EEPROM 库。

    • • 或将该库的代码克隆到 Arduino 库文件夹中。

  2. 2. 替换代码

    • • 在代码中将 #include <EEPROM.h> 替换为 #include <ESP32_RTC_EEPROM.h>。

  3. 3. 开始使用

    • • 使用 EEPROM.begin(size) 初始化库,其中 size 指示要使用的 RTC RAM 容量。

    • • 使用 EEPROM.read(address) 读取数据,EEPROM.write(address, data) 写入数据。

示例代码

#define BUTTON_GPIO GPIO_NUM_0
#define BUTTON_ACTIVE LOW

#include <ESP32_RTC_EEPROM.h>

voidsetup() {
  Serial.begin(115200);

// 初始化 RTC EEPROM,使用 512 字节的空间
  EEPROM.begin(512);

// 读取启动次数
uint8_t bootcount = EEPROM.read(0);

// 增加启动次数
  bootcount++;

// 打印启动次数
  Serial.println("Boot count: " + String(bootcount));

// 检查数据是否从 NVS 恢复
if (EEPROM.wasRestored()) {
    Serial.println("(This value was restored from NVS, so we may have missed a few.)");
  }

// 写入新的启动次数
  EEPROM.write(0, bootcount);

// 每 10 次启动备份一次数据到 NVS
if (bootcount % 10 == 0) {
    Serial.println("Backing up the current EEPROM data from RTC RAM to NVS (flash).");
    EEPROM.toNVS();
  }

// 进入深度睡眠模式
  Serial.println("Going to deep sleep, wake me up with the button.");

// 设置唤醒条件:按钮按下
esp_sleep_enable_ext0_wakeup(BUTTON_GPIO, BUTTON_ACTIVE);

// 进入深度睡眠模式
esp_deep_sleep_start();
}

voidloop() {
// 此处不执行任何操作
}

可选的 NVS 备份

该库提供 EEPROM.toNVS() 函数将 RTC RAM 中的数据备份到 NVS 区域,以便在重启或重新刷写固件后恢复数据。可以使用 EEPROM.fromNVS() 函数手动从 NVS 恢复数据。

总结

ESP32_RTC_EEPROM 库提供了一种简单且高效的解决方案,使开发人员能够在 ESP32 进入深度睡眠模式时保存数据,有效地延长闪存的寿命。该库易于使用,并与 Arduino EEPROM 接口兼容,使其成为开发人员的理想选择。

项目地址:https://github.com/ropg/ESP32_RTC_EEPROM


发表评论