EEPROM(Electrically Erasable Programmable Read-Only Memory),电可擦可编程只读存储器——一种掉电后数据不丢失的存储芯片。
EEPROM可以在不使用文件和文件系统的情况下用来固化一些数据,常见的比如用来保存SSID或者Password,保存用户设置等数据,这样就可以不用每次都通过烧写程序来改变系统运行时的初始值。
Arduino提供了完善的eeprom库,不过需要注意的是ESP8266没有硬件EEPROM,使用的是flash模拟的EEPROM
EEPROM库在Arduino中经常用于存储设定数据。当然基于Arduino的ESP8266也不例外。但是,和真正的Arduino板子不一样的是,ESP8266采用的方式是将flash中某一块4K的存储模拟成EEPROM。至于为什么是4K呢?主要原因是flash是以sector为一个单位,1 sector等于4096Bytes(4KB),操作flash时是以sector为一个整体来操作
读取操作是通过ESP8266 SDK提供的API将flash中的内容读取到Buffer中是没有限制一次就要将4K全读完,Buffer的大小由EEPROM.begin(size)决定,但是由于Buffer大小会占用内存RAM,所以务必按照实际需要来定义大小
写入操作是通过commit将flash eeprom地址的4K 存储内容删除后才将Buffer写入flash中(也就是说就算你buffer只有4个字节,但是最终还是会刷新整个sector)
和标准的EEPROM库不一样的是,你需要在读或者写操作之前先通过 EEPROM.begin(size) 来声明你需要操作的存储大小,size取值范围为4~4096字节
EEPROM.write() 不会立刻把内容写进flash,如果你希望保持到flash去,那么你必须调用 EEPROM.commit()。当然,EEPROM.end() 不仅也能完成commit,同时会释放申请的eeprom ram资源
 
EEPROM库非常简单:

 
函数: begin(size)      该功能用于申请具体大小的ram内存空间并从flash中读取相应数据到内存
size:要申请的内存大小(size取值范围为4~4096字节)
返回值: 无
注意点:size必须大于0
虽然我们可以输入自定义size,但是最终会经过计算得到真正的size(4的倍数),并申请对应的内存空间
 
函数: write(address,value)    该功能用于往内存空间写入数据
address:要写入的地址位置,取值范围为内存空间的地址0~size
val:写入的数据。
返回值: 无
注意点:写入的数据只是写入到申请的内存空间,并不是立刻写入到flash中
EEPROM其实是从外部flash中存储器最末尾开辟的4096字节空间
write只写一个字节的数据,所以数据的值应该在0~255之间,超过255的数据写入就不正确了

函数: read(address)    该功能用于读取数据操作
 address:要读取的地址位置,取值范围为内存空间的地址0~size  
返回值: 返回存储数据
注意点:读取的数据也是从begin中生成的内存空间中去获取,并不会直接操作flash  
【read只读一个字节的数据】

函数: commit()    该功能用于把内存空间的数据覆盖到flash eeprom块去  
参数: 无;
返回值: 返回bool值,表示是否覆盖成功;
注意点:这个方法才是真正的把数据从内存控件写回到flash空间;
而且,写回flash之前会把整一块sector全部擦除掉,也就意味着就算我们begin(1)最终也是会擦除4096字节空间。但是size的大小决定了内存空间的剩余量以及回写的快慢,所以根据具体情况来设置size
函数: end()    该功能用于写入flash,并且释放内存空间
参数: 无
返回值: 无
注意点:end包含了写入flash,并且回收内存空间
建议读者操作完EEPROM之后,必须调用这个方法,回收内存空间很重要 

例子-----写入数据

//功能描述:该代码向EEPROM写入100字节数据
#include <EEPROM.h>
int addr = ; //EEPROM数据地址 void setup() {
Serial.begin();
Serial.println("");
Serial.println("开始写write");
EEPROM.begin();//申请内存并读取flash中相应的数据到内存
for(addr = ; addr<; addr++){
int data = addr;
EEPROM.write(addr, data); //写数据
}
EEPROM.end(); //把数据写入flash,并释放内存
Serial.println("结束write"); }
void loop() { }

例子二:读数据

#include <EEPROM.h>
int addr = ; //EEPROM数据地址 void setup() {
Serial.begin();
Serial.println("");
Serial.println("开始读数据");
EEPROM.begin();//申请100内存空间
for(addr = ; addr<; addr++){
int data = EEPROM.read(addr); //从内存中读取一个字节数据
Serial.println(data);
delay();
}
EEPROM.end();
}
void loop() { }
 

天子骄龙

EEPROM类库的使用---断电不丢失的存储芯片的更多相关文章

  1. 利用EEPROM实现arduino的断电存储

    转载请注明:@小五义http://www.cnblogs.com/xiaowuyiQQ群:64770604 一.EEPROM简介 EEPROM (Electrically Erasable Progr ...

  2. 小老板,我学的计算机组成原理告诉我半导体存储器都是断电后丢失的,为什么U盘SSD(固态硬盘)没事呢?

    什么是闪存: 快闪存储器(英语:flash memory),是一种电子式可清除程序化只读存储器的形式,允许在操作中被多次擦或写的存储器 存储原理 要讲解闪存的存储原理,还是要从EPROM和EEPROM ...

  3. ESP8266的使用学习

     ESP8266-01  ESP8266-12F简介 让灯闪烁    ESP8266-中断   模拟输入(ADC-A0)  模拟输出(PWM)  串口通信(Serial)    EEPROM类库的使用 ...

  4. Arduino学习笔记⑦ EEPROM断电保存数据

    1.前言     EEPROM,叫做电可擦可编程可读寄存器(是不是觉得好官方,不知道是什么鬼?反正我也一脸懵逼),只需要知道这是一种断电后数据不会丢失的存储设备,可以用来应对需要做记录做保存的场合.简 ...

  5. Arduino 中 EEprom 写入读取清除

    转自:https://www.arduino.cn/thread-1157-1-1.html EEPROM (Electrically Erasable Programmable Read-Only ...

  6. EEPROM

    EEPROM (Electrically Erasable Programmable read only memory),带电可擦可编程只读存储器--一种掉电后数据不丢失的存储芯片. EEPROM 可 ...

  7. ESP8266开发之旅 基础篇④ ESP8266与EEPROM

    授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...

  8. 痞子衡嵌入式:飞思卡尔i.MX RT系列MCU启动那些事(1)- Boot简介

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是飞思卡尔i.MX RT系列MCU的BootROM功能简介. 截止目前为止i.MX RT系列已公布的芯片有三款i.MXRT105x, i. ...

  9. Flash芯片你都认识吗?

    [导读]Flash存储器,简称Flash,它结合了ROM和RAM的长处,不仅具备电子可擦除可编程的性能,还不会因断电而丢失数据,具有快速读取数据的特点;在现在琳琅满目的电子市场上,Flash总类可谓繁 ...

随机推荐

  1. [译]深入 NGINX: 为性能和扩展所做之设计

    来自:http://ifeve.com/inside-nginx-how-we-designed-for-performance-scale/ 这篇文章写了nginx的设计,写的很仔细全面, 同时里面 ...

  2. 卸载openssl后yum无法使用,ssh无法连接的解决办法

    一,安装nginx时,提示openssl版本问题,用yum update openssl 发现还是不行,于是rpm -e 卸载了openssl 此时,才发现yum不能用了,然后想上传个tar包时又出现 ...

  3. C++ 简介 基本语法 注释

    一.第一个 C++ 程序 #include <iostream> using namespace std; int main() { cout << "Hello, ...

  4. django设置mysql为数据库笔记

    1,guest/settings.py中加上 import pymysql pymysql.install_as_MySQLdb() 安装好pymysql 2,guest/settings.py的DA ...

  5. python-unittest模块中的各类断言

    unittest中断言主要有三种类型: 基本的布尔断言,即:要么正确,要么错误的验证 比较断言,如比较两个变量的值(跟上面的布尔断言区别不大,主要是通过比较两个变量的值得出布尔值) 复杂断言(一般用的 ...

  6. javase程序设计上机作业2

    package javaxgp.teacher.test; import java.util.Scanner; public class Demo3 { public static void main ...

  7. Windos下navcat连接虚拟机中的mysql

    进入mysql命令行, 使用root用户,密码:youpassword(你的root密码)连接到mysql服务器: # mysql -u root -proot  mysql>GRANT ALL ...

  8. docker 安装 gitlab 中文社区版

    docker pull twang2218/gitlab-ce-zh 创建一个docker 目录 /usr/local/docker/gitlab 创建一个 docker-compose.yml ve ...

  9. jenkins自动化部署工具

    jenkins自动化测试 & 持续集成 知识点: 1.下载地址:jenkins.io download:

  10. 深入理解java:2.3.4. 并发编程concurrent包 之容器ConcurrentLinkedQueue(非阻塞的并发队列---循环CAS)

    1.    引言 在并发编程中我们有时候需要使用线程安全的队列. 如果我们要实现一个线程安全的队列有两种实现方式:一种是使用阻塞算法,另一种是使用非阻塞算法. 使用阻塞算法的队列可以用一个锁(入队和出 ...