引言
在嵌入式开发中,存储数据的持久性至关重要。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. 安装库
• 使用 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