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

文摘   2024-11-01 00:01   湖南  

引言

在嵌入式开发中,存储数据的持久性至关重要。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. 替换代码

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

  • 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>

    void setup() {
      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();
    }

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

    可选的 NVS 备份

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

    总结

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

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


    DIY太阳系
    分享嵌入式系统知识,写精华文章!
     最新文章