Arduino ESP8266 EEPROM.h


根據官方說明,各版本的Arduino都自帶一個小容量的EEPROM,在各型號的arduino控制器上的AVR芯片均帶有EEPROM,也有外接的EEPROM芯片,常見arduino控制器的EEPROM大小:
Arduino UNO、Arduino duemilanove-m328、Zduino m328均使用ATmega328芯片,EEPROM都為1K

目的

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

使用說明

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

addr是地址,data是數據,size為需要讀寫的數據字節最大地址+1

 EEPROM.begin(size)

 EEPROM.write(addr,data)

 EEPROM.commit()

 EEPROM.end()

 EEPROM.read(addr)

 

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