zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    将1、2、3、……、n这n个连续自然数分成g组,使每组的和相等。g组中个数最多的一组有几个?
    磁带机、驱动器、磁带库、机械手之间的区别
    Mysql基础命令
    pip 加速下载
    NBU命令之 nbftconfig :配置与光纤传输 (FT) 服务器和 SAN 客户端相关的属性
    IEDriverServer.exe驱动问题汇总
    系统集成项目管理工程师考试2020介绍
    LTO1,LTO2,LTO3,LTO4,LTO5 LTO6 磁带读写速度和兼容性及LTO6主要参数
    Mysql 备份方式 MySQL Agent & MySQL Enterprise Backup & Percona XtraBackup
    Netbackuk命令之bpclntcmd
  • 原文地址:https://www.cnblogs.com/dengziqi/p/14148849.html
Copyright © 2011-2022 走看看