EEPROM前言

  在EPS32中已经将EEPROM弃用。对于ESP32上的新应用程序,建议使用NVS为首选项。提供EEPROM是为了向后兼容现有的Arduino应用程序。EEPROM是使用NVS中的单个blob实现的,因此它是容器(Flash)中的容器(NVS)(弟中弟)。因此,它不会是一种高性能存储方法。首选项将直接使用nvs,并将每个条目存储为其中的单个对象。所以现在的EEPROM也仅是在函数功能上向后兼容,实际储存方式已经完全变了,这需要我们在实际应用中注意。NVS小知识链接

主要API介绍

    bool begin(size_t size);   // 开启一块分区访问存储
    uint8_t read(int address);  // 读取指定地址数据
    void write(int address, uint8_t val); // 在指定地址保存数据
    uint16_t length();   // 获取申请的分区大小
    bool commit();  // 将数据从缓存区存入flash中
    void end();  // 结束访问

  在实际应用中主要思路是,先申明begin(想要保存的数据大小),再利用write(地址偏移,单个字符数据0-255),当所有数据通过write写完后,一定要记得中commit()提交,使数据从暂存区保存到flash中,实现掉电保护。read的使用直接利用地址偏移可以直接读出数据。

例子1(随机数的保存)

 1 #include <Arduino.h>
 2 #include "EEPROM.h"
 3 
 4 int addr = 0;
 5 #define EEPROM_SIZE 64
 6 void setup()
 7 {
 8   Serial.begin(9600);
 9   Serial.println("start...");
10   if (!EEPROM.begin(EEPROM_SIZE)) // 申请存储空间
11   {
12     Serial.println("failed to initialise EEPROM"); delay(1000000);
13   }
14   Serial.println(" bytes read from Flash . Values are:");
15   for (int i = 0; i < EEPROM_SIZE; i++)
16   {
17     Serial.print(byte(EEPROM.read(i))); Serial.print(" "); //直接读出数据
18   }
19   Serial.println();
20   Serial.println("writing random n. in memory");
21 }
22 
23 void loop()
24 {
25   int val = byte(random(10020));
26   EEPROM.write(addr, val);
27   Serial.print(val); Serial.print(" ");
28   addr = addr + 1;
29   if (addr == EEPROM_SIZE)
30   {
31     Serial.println();
32     addr = 0;
33     EEPROM.commit();
34     Serial.print(EEPROM_SIZE);
35     Serial.println(" bytes written on Flash . Values are:");
36     for (int i = 0; i < EEPROM_SIZE; i++)
37     {
38       Serial.print(byte(EEPROM.read(i))); Serial.print(" ");
39     }
40     Serial.println(); Serial.println("----------------------------------");
41   }
42   delay(100);
43 }

特殊API直接调用

  前面的写入与读取只能是单字符的读取与写入,官方为了方便调用,还提供了对于各数据类型的支持:

uint8_t readByte(int address);
    int8_t readChar(int address);
    uint8_t readUChar(int address);
    int16_t readShort(int address);
    uint16_t readUShort(int address);
    int32_t readInt(int address);
    uint32_t readUInt(int address);
    int32_t readLong(int address);
    uint32_t readULong(int address);
    int64_t readLong64(int address);
    uint64_t readULong64(int address);
    float_t readFloat(int address);
    double_t readDouble(int address);
    bool readBool(int address);
    size_t readString(int address, char* value, size_t maxLen);
    String readString(int address);
    size_t readBytes(int address, void * value, size_t maxLen);
    template <class T> T readAll (int address, T &);

    size_t writeByte(int address, uint8_t value);
    size_t writeChar(int address, int8_t value);
    size_t writeUChar(int address, uint8_t value);
    size_t writeShort(int address, int16_t value);
    size_t writeUShort(int address, uint16_t value);
    size_t writeInt(int address, int32_t value);
    size_t writeUInt(int address, uint32_t value);
    size_t writeLong(int address, int32_t value);
    size_t writeULong(int address, uint32_t value);
    size_t writeLong64(int address, int64_t value);
    size_t writeULong64(int address, uint64_t value);
    size_t writeFloat(int address, float_t value);
    size_t writeDouble(int address, double_t value);
    size_t writeBool(int address, bool value);
    size_t writeString(int address, const char* value);
    size_t writeString(int address, String value);
    size_t writeBytes(int address, const void* value, size_t len);
    template <class T> T writeAll (int address, const T &);
View Code

相关文章:

  • 2021-12-05
  • 2021-12-30
  • 2022-12-23
  • 2021-12-31
  • 2021-05-03
  • 2022-12-23
  • 2021-05-18
  • 2021-11-28
猜你喜欢
  • 2022-01-05
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案