【ESP32教程】ESP32EEPROM的使用(使用示例中的eeprom class用法)
目录
前言
使用环境
使用方法
原创不易,点个赞或者点个关注激励笔者分享更多优质原创内容吧!
开源万岁!
前言
从ESP32板子的官方库中可以找到EEPROM库,但是阅读README.md文件可知,ESP32并没有EEPROM,而是使用内部FLASH模拟出来EEPROM的,这是为了和以前的Arduino程序兼容。
以下是README.md文件的原文:
## EEPROM
EEPROM is deprecated. For new applications on ESP32, use Preferences. EEPROM is provided for backwards compatibility with existing Arduino applications.
EEPROM is implemented using a single blob within NVS, so it is a container within a container. As such, it is not going to be a high performance storage method. Preferences will directly use nvs, and store each entry as a single object therein.
注意,NVS为非易失性存储,是在FLASH中开辟出来的一块区域,用于模拟EEPROM以存储数据。
使用环境
Arduino IDE V2.0.0-rc9.2
ESP32-Wroom-DA Module
ESP32-Wroom-DA Module的示例中的EEPROM->eeprom_class
![](/assets/blank.gif)
使用方法
- 首先包含头文件
#include "EEPROM.h"
- 然后定义你要存储的变量
EEPROMClass NAMES("eeprom0");
EEPROMClass HEIGHT("eeprom1");
EEPROMClass AGE("eeprom2");
EEPROMClass FIRST_POWER_ON__JUDGE("eeprom3");//用于存储数据,判断是否为初次上电
示例这里定义了三种要存储的数据,分别是姓名、身高和年龄,我们可以按照自己的需要修改。
- 接着对EEPROM的初始化文件进行封装(以下程序部分为示例提供,有一定修改)
很多细节在注释里已经详细说明,请仔细阅读下面代码的注释
主要添加的有初次上电的判断以及初次上电的数据初始化
void EEPROM_Init()
{Serial.begin(115200); //串口初始化Serial.println("__________EEPROM Initializing...__________");delay(1000);Serial.println("Testing EEPROMClass\n");//以下是EEPROM的初始化if (!NAMES.begin(0x500)) {
//这里填入的0x500为你所需要的空间的大小的字节数,此处为0x500个字节Serial.println("Failed to initialise NAMES");Serial.println("Restarting...");delay(1000);ESP.restart(); //初始化失败就重启ESP32}if (!HEIGHT.begin(0x200)) {Serial.println("Failed to initialise HEIGHT");Serial.println("Restarting...");delay(1000);ESP.restart();}if (!AGE.begin(0x100)) {Serial.println("Failed to initialise AGE");Serial.println("Restarting...");delay(1000);ESP.restart();}if (!FIRST_POWER_ON__JUDGE.begin(2)) {Serial.println("Failed to initialise FIRST_POWER_ON__JUDGE");Serial.println("Restarting...");delay(1000);ESP.restart();}/*如果是初次上电,就进行初始化*/
//这一步主要是为了在EEPROM里写入自己需要的初始化数据
//只在ESP32第一次上电时初始化一次,后面不会再初始化if(FIRST_POWER_ON__JUDGE.readUChar(0) != 0xA5 || \ FIRST_POWER_ON__JUDGE.readUChar(1) != 0x5A){
//EEPROM出厂时的内容一般都初始化为
//0xFF,所以我们判断是否为0xA5和0x5A
//来判断该EEPROM是否为第一次上电,如
//果不是0xA5和0x5A,则为第一次上电,执行第一次上电的初始化
//并写入0xA5和0x5A,下次上电就不会再次执行初始化Serial.println("EEPROM first use initialization.");//串口提示该EEPROM为第一次上电使用
//写入已经上电标志位FIRST_POWER_ON__JUDGE.writeUChar(0, 0xA5);FIRST_POWER_ON__JUDGE.writeUChar(1, 0x5A);FIRST_POWER_ON__JUDGE.commit();//以下写入你自己的数据初始化代码,格式与写上电标志位的代码一样//写入数据后记得要写commit();//如NAMES.commit();//写入后commit的数据才会真正保存到EEPROM中,掉电不易失}Serial.println("__________EEPROM has initialized__________");//提示初始化完成// Serial.println("__________First Power On Judge__________");// Serial.printf("0x%08x\n", (uint32_t)FIRST_POWER_ON__JUDGE.readChar(0));// Serial.printf("0x%08x\n", (uint32_t)FIRST_POWER_ON__JUDGE.readChar(1));
}
- 写入数据时,如下面代码
USERNAME.writeString(counter * SIZE__USERNAME, OrderInfo.userName);
“USERNAME”为自己定义的数据种类
“writeString”表示要写入的是字符串
括号内:
第一个参数为要写入的数据的地址,假设为USERNAME分配了20个名字的空间,每个名字为8个字节大小,那么
第0个名字写在地址0,
第1个名字写在地址8,
...
以此类推
所以此处使用了一个counter标识存储的是第几个名字,SIZE__USERNAME为名字的大小(8个字节)
第二个参数为要存储的数据,也就是要存储的username
存储的数据写入后,必须调用.commit()方法才能真正将数据存储进EEPROM,代码如下
USERNAME.commit();
- 读取数据时,如下
USERNAME.readString(counter * SIZE__USERNAME);
“USERNAME”为自己定义的数据种类
“writeString”表示要读取的是字符串
括号内为要读取的数据地址
当然,除了字符串的存储和读取,还可以存储其他类型的数据,整形,浮点数,字符通通可以,此处不再赘述,有需要请自行搜索相关函数。
原创不易,点个赞或者点个关注激励笔者分享更多优质原创内容吧!
开源万岁!
【ESP32教程】ESP32EEPROM的使用(使用示例中的eeprom class用法)相关推荐
- 实用ExtJS教程100例-006:ExtJS中Window的用法示例
在前面几个示例中,我们演示了MessageBox的各种用法,今天这篇文章将演示如何使用Window. 我们首先来创建一个窗口: var win = Ext.create("Ext.windo ...
- XamarinAndroid组件教程RecylerView适配器设置动画示例
XamarinAndroid组件教程RecylerView适配器设置动画示例 [示例1-3]下面将在RecylerView的子元素进行滚动时,使用适配器动画.具体的操作步骤如下: (1)创建一个名为R ...
- 接口文档示例_在示例中使用Android中的Work Manager
接口文档示例 在本文中,我们将介绍如何在android中使用工作管理器. 工作管理器是android体系结构组件的一部分,并且可以很好地替代所有先前的调度选项. 其他调度选项,例如JobSchedul ...
- 变分模态分解_Android小部件示例中的模态对话框(弹出)
变分模态分解 在此示例中,我们将看到如何在主屏幕中创建一个可以打开弹出对话框的Android小部件. 如您所知,Android Widgets是小型应用程序,基本上可以做两件事. 按下时启动新的活动, ...
- php this指针的用法,C#_C#中this指针的用法示例,本文实例展示了C#中this指针的 - phpStudy...
C#中this指针的用法示例 本文实例展示了C#中this指针的用法,对于初学者进一步牢固掌握C#有很大帮助,具体内容如下: 一.this指针是什么: 这里有一些面向对象编程的概念需要说明:类(Cla ...
- java coin介绍_代码示例中的Java 7:Project Coin
java coin介绍 该博客通过代码示例介绍了一些新的Java 7功能,这些项目在Project Coin一词下进行了概述. Project Coin的目标是向JDK 7添加一组小的语言更改.这些更 ...
- Visual Paradigm 教程[UML]:如何在UML中绘制活动图?
下载Visual Paradigm最新版本 活动图由活动和状态之间的活动,状态和转换组成,描述了如何协调活动以提供服务,例如,单个用例中的事件如何相互关联,或者用例集合如何协调创建 组织的工作流程. ...
- Tapestry 教程(七)在Tapestry中一起使用Hibernate
为什么80%的码农都做不了架构师?>>> 好了,你填写了所有的输入域,提交了这个表单(没有任何验证错误),瞧:你又回到了相同的表单,所有的格子里面都是空的.发生了什么,数据都到 ...
- a标签去下划线 菜鸟教程_HTML下划线标签示例教程
a标签去下划线 菜鸟教程 HTML provides different styling options for the text. Underlining the HTML text is one ...
最新文章
- Maven+mybatis教程
- 相机夜视原理——红外补光
- LeetCode Integer Break(整数拆分问题)
- 一个线程池 bug 引发的 GC 思考!
- SAP OData Multiple Origin composition test - Opportunity Creation case
- [leetcode]Pascal#39;s Triangle II
- Akka STM –与STM Ref和Agent进行乒乓球比赛
- 迪美特TVZ8双核智能高清播放器 在电视上编程不是梦
- 菜鸟程序员如何提升自己的潜在价值
- MySql增加用户、授权、修改密码等语句
- 【数据结构和算法笔记】:数据结构概述
- std::string与output-operator的兼容问题
- 第一百天 how can i 坚持
- 面板x轴模式包括哪些_虎扑轻跃 | 体验一汽大众探岳X
- Eratosthenes筛法
- 网站视频倍速播放和进度自定义调整
- 帝国理工大学计算机本科笔试题,共同努力 成功申请帝国理工学院计算机科学专业...
- introduce page
- R语言生存分析:Cox回归
- 红芯宣布获得2.5亿元C轮系列融资,要做1亿人的安全工作入口