從零開始的ESP8266探索(08)-EEPROM使用測試


EEPROM可以在不使用文件和文件系統的情況下用來固化一些數據,常見的比如用來保存SSID或是Password,保存用戶名及密碼,保存用戶設置等數據,這樣就可以不用每次都通過燒寫程序來改變系統運行時的初值了。可以實現更復雜的應用。

使用說明

其實EEPROM使用非常簡單的,也沒必要專門開個帖子寫,看看官方說明和例程分分鍾就會了。

EEPROM

This is a bit different from standard EEPROM class. You need to call EEPROM.begin(size) before you start reading or writing, size being the number of bytes you want to use. Size can be anywhere between 4 and 4096 bytes.

EEPROM.write does not write to flash immediately, instead you must call EEPROM.commit() whenever you wish to save changes to flash. EEPROM.end() will also commit, and will release the RAM copy of EEPROM contents.

EEPROM library uses one sector of flash located just after the SPIFFS.

Three examples included.

Note that the sector needs to be re-flashed every time the changed EEPROM data needs to be saved, thus will wear out the flash memory very quickly even if small amounts of data are written. Consider using one of the EEPROM libraries mentioned down below.

EEPROM 

這是一個有點不同於標准的EEPROM類。您需要在開始讀寫之前調用EEPROM.begin(size), size是您想要使用的字節數。大小可以在4到4096個字節之間。eepm。

EEPROM.write不會立即寫入Flash,而是EEPROM.commit()在您希望將更改保存到Flash時必須調用EEPROM.end()也將提交,並將釋放EEPROM內容的RAM副本。

EEPROM庫僅在SPIFFS之后使用一個閃存扇區。

包括三個例子。

請注意,每次需要保存更改的EEPROM數據時,都需要重新刷新該扇區,因此即使寫入少量數據,也會非常快地耗盡閃存。考慮使用下面提到的EEPROM庫之一。

 

 

EEPROM主要幾點如下:

Arduino for esp8266 中用的EEPROM其實是從外部flash中存儲器最末尾開辟的4096字節空間,結合官方說明,我們每次操作寫入的數據在4~4096字節之間;
根據上一條,EEPROM可操作的地址為0~4095;
調用#include <EEPROM.h>來使用EEPROM;
使用EEPROM時,首先調用EEPROM.begin(size),size為需要讀寫的數據字節最大地址+1,取值4~4096;
使用EEPROM.write(addr,data)來寫數據,參數分別為地址&數據,寫數據后需要通過EEPROM.commit()或EEPROM.end()將數據保存到EEPROM;
使用EEPROM.read(addr)來讀數據;
更多內容可以參考官方例程:https://github.com/esp8266/Arduino/tree/master/libraries/EEPROM

程序測試
寫數據
/*
該代碼向EEPROM寫入4096字節數據
*/
#include <EEPROM.h>

int addr = 0; //EEPROM數據地址

void setup()
{
Serial.begin(9600);
Serial.println("");
Serial.println("Start write");

EEPROM.begin(4096); //申請操作到地址4095(比如你只需要讀寫地址為100上的一個字節,該處也需輸入參數101)
for(addr = 0; addr<4096; addr++)
{
int data = addr%256; //在該代碼中等同於int data = addr;因為下面write方法是以字節為存儲單位的
EEPROM.write(addr, data); //寫數據
}
EEPROM.commit(); //保存更改的數據

Serial.println("End write");
}

void loop()
{
}

讀數據
/*
該代碼從EEPROM讀取4096字節數據
*/
#include <EEPROM.h>

int addr = 0;

void setup()
{
Serial.begin(9600);
Serial.println("");
Serial.println("Start read");

EEPROM.begin(4096); //申請操作到地址4095(比如你只需要讀寫地址為100上的一個字節,該處也需輸入參數101)
for(addr = 0; addr<4096; addr++)
{
int data = EEPROM.read(addr); //讀數據
Serial.print(data);
Serial.print(" ");
delay(2);
if((addr+1)%256 == 0) //每讀取256字節數據換行
{
Serial.println("");
}
}

Serial.println("End read");
}

void loop()
{
}


讀取測試結果

 

 


注意事項
當你需要分多次寫EEPROM時,切記之后每次EEPROM.begin(size);中輸入的size必須大於等於之前每次輸入的值。簡單點的話可以每次寫入時這里都輸入你可能會用到的最大值,比如如果對時間和內存要求不高的話這里可以寫死4096。

你每次操作EEPROM,根據你輸入的size,會建立一個size大小的緩存並從EEPROM地址0開始讀取size長度數據到該緩存,你之后的讀寫操作是對這個緩存的操作。當你提交寫入的時候,程序才會把緩存中的數據寫入EEPROM,但是EEPROM的寫入是以扇區為單位的(4096字節),那么在寫入的時候從地址0開始的size個數數據時ok的,但后面4096-size個數據就可能會被改變(我目前遇到的就是后面的數據都變255了)。這應該是這個庫的一個邏輯bug。因為ESP8266的EEPROM並非真正的EEPROM,只是從flash上划了一個扇區用,所以讀寫都只能按扇區來。

總結
EEPROM的使用非常簡單,沒有什么太多可以說的。
————————————————
版權聲明:本文為CSDN博主「Naisu_kun」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/Naisu_kun/article/details/82915959


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM