今天我們來玩兒EEPROM。
EEPROM概述
ESP32內(nèi)部沒有專門的EEPROM,但是我們可以通過FLASH模擬EEPROM,F(xiàn)LASH與EEPROM也是非常相似的,都是非易失性存儲(chǔ)器,使用EEPROM,我們就可以在不使用文件系統(tǒng)的情況下,來保存一些數(shù)據(jù)
,可以實(shí)現(xiàn)一些更加復(fù)雜的功能。
例如,我們可以做到以下功能:
- 保存變量的最終狀態(tài)
- 保存我們的設(shè)置
- 保存設(shè)備被激活的次數(shù)
- 永久保存其它任何類型的數(shù)據(jù)
ESP32在Arduino是使用FLASH開辟的一塊存儲(chǔ)區(qū)域,默認(rèn)的對(duì)象存儲(chǔ)大小為4096個(gè)字節(jié)。
硬件
本實(shí)驗(yàn)我們直接用核心板就可以,不添加其它外設(shè)了。
軟件
EEPROM初始化
代碼調(diào)用#include 后,已經(jīng)默認(rèn)定義了一個(gè)EEPROM對(duì)象,我們使用began方法初始化一下,參數(shù)為要操作的字節(jié)大小,最大為4096字節(jié),所以這里的參數(shù)范圍為0-4095。EEPROM的操作以字為單位,size最好設(shè)置為4的倍數(shù)。
EEPROM.begin(size);
寫
將數(shù)據(jù)寫入EEPROM,使用EEPROM.write();第一個(gè)參數(shù)為地址,第二個(gè)參數(shù)為保存的值。
EEPROM.write(address, value);
讀
從EEPROM上讀取一個(gè)字節(jié),使用EEPROM.read();參數(shù)為讀取的地址。
EEPROM.read(address);
更新生效
通過EEPROM.write()寫入數(shù)據(jù)后,之后需要調(diào)用EEPROM.commit()使更改生效,寫入完成。
EEPROM.commit();
EEPROM還有其它函數(shù),都在庫(kù)文件中,大家可以在下面兩個(gè)文件中找到相關(guān)源碼。
EEPROM.h
EEPROM.c
完整程序
這里我們用一個(gè)例子來演示一下,我們?cè)谡珽EPROM上寫入數(shù)據(jù),從0-255,反復(fù)循環(huán)寫入,然后再讀取出來。
寫程序
/*
* Created on: 20220128
* Author: 公眾號(hào):跳動(dòng)的字節(jié)
* Function 09 EEPROM寫與讀
* Version: V1.0
*
* ,%%%%%%%%,
* ,%%/%%%%/%%
* ,%%%c''''J/%%%
* %. %%%%/ o o %%%
* `%%. %%%% |%%%
* `%% `%%%%(__Y__)%%'
* // ;%%%%`-/%%%'
* (( / `%%%%%%%'
* .' |
* / | |
* / ) | |
* /_ | |__
* (____________))))))) 攻城獅
*
*/
#include < EEPROM.h >
void setup()
{
Serial.begin(115200);
Serial.println("");
EEPROM.begin(4096); //申請(qǐng)4096個(gè)字節(jié)的EEPROM存儲(chǔ)空間
//寫數(shù)據(jù)
Serial.println("write begin");
for(int addr = 0; addr< 4096; addr++)
{
int data = addr%256; //EEPROM寫入的數(shù)據(jù)時(shí)以字節(jié)為單位的
EEPROM.write(addr, data); //寫入數(shù)據(jù)
}
EEPROM.commit(); //保存更改的數(shù)據(jù)
Serial.println("write done");
//讀數(shù)據(jù)
Serial.println("read begin");
for(int addr = 0; addr< 4096; addr++)
{
int data = EEPROM.read(addr); //讀數(shù)據(jù)
Serial.print(data);
Serial.print(" ");
delay(2);
if((addr+1)%256 == 0) //每行顯示256個(gè)數(shù)據(jù)
{
Serial.println("");
}
}
Serial.println("read done");
}
void loop()
{
}
實(shí)驗(yàn)效果:
EEPROM的使用很簡(jiǎn)單,但這里有一點(diǎn)需要注意,在初始化EEPROM.begin(size)的時(shí)候,參數(shù)size下一次必須大于等于上一次,否則會(huì)有用一些出錯(cuò),正常情況下,我們就一直用最大值4096即可。
后面,我們會(huì)介紹更加高級(jí)的方法實(shí)現(xiàn)數(shù)據(jù)的保存,使用Preferences庫(kù)來保存鍵值對(duì)的方式,還有文件系統(tǒng)的方式,大家到時(shí)候再深入了解。
感謝大家,關(guān)于ESP32的學(xué)習(xí),希望大家Enjoy!
-
FlaSh
+關(guān)注
關(guān)注
10文章
1635瀏覽量
148031 -
存儲(chǔ)器
+關(guān)注
關(guān)注
38文章
7492瀏覽量
163842 -
EEPROM
+關(guān)注
關(guān)注
9文章
1020瀏覽量
81608 -
文件系統(tǒng)
+關(guān)注
關(guān)注
0文章
284瀏覽量
19911 -
ESP32
+關(guān)注
關(guān)注
18文章
971瀏覽量
17276
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論