第22课 EEPROM 读写、清零与串口数据流

我是潘,曾经是个工程师。这是为 Ardui.Co 制作的 “Arduino 公开课” 系列的入门教程。本课将介绍EEPROM读写与获取串口数据流。有任何疑问请在评论区提出,我会逐一回答。

EEPROM (Electrically Erasable Programmable Read-Only Memory),电可擦可编程只读存储器 — 一种掉电后数据不丢失的存储器。最初的ROM 是不能编程的,出厂什么内容就永远什么内容。后来出现了PROM,可以写入一次,但要是写错了,只能换一片,自认倒霉。

人类文明不断进步,终于出现了可多次擦除写入的EPROM。不过,每次擦除要把芯片拿到紫外线上照一下。试想一下,你往单片机上写入一个程序后,发现有个小地方要改,为此你要把单片机放紫外灯下照半小时,然后才能再下一次,这么折腾一天也改不了几次。

最终,可以随意修改的 EEPROM 出现了,拯救了一大批程序员。很多人将它与FLASH闪存相比较,实际上 FLASH 也是 EEPROM 一种。为了区分,我们指EEPROM 都是狭义的 EEPROM,与 FLASH 的区别如下:

1、 FLASH 按扇区操作,EEPROM则按字节操作
2、 FLASH 写入时间长,EEPROM写入时间短
3、 FLASH 擦写次数少(TLC 200次 ~ SLC 10000次),EEPROM次数多(1000000次)
4、 FLASH 电路结构简单,成本低,EEPROM工艺复杂,成本高
5、运行时,EEPROM 可以修改,FLASH则不行。因此EEPROM可以存储一些参数,FLASH 存储程序代码和不需修改的数据。

Arduino 上既有FLASH,也有EEPROM。存放程序的区域就是FLASH,Uno 的空间大小为32KB,而存储一些需要随时修改,但又能掉电保存的数据,比如:数字收音机的频率、智能家居各模块的开关状态等,则放在EEPROM,空间大小为1KB。

EEPROM 的操作,官方已经提供了8个示例,我们先看看最基本的三个 Write、Read、Clear示例。

程序略微修改了一下:

EEPROM.write(addr, val) 是根据地址来写入数据的:
addr:写入字节的地址,整数变量;
val:写入的字节,范围0 ~ 255。

现在要把这些数据从EEPROM读出来:

打开串口监视器,可以看到刚才写进入的随机数据:

EEPROM一般用于存储设置参数等数据,如果我们想把设备RESET,很简单设置一个Clear程序即可:

现在,我们是让Arduino不停地从0号地址位开始的读取EEPROM,把读取到的数值输出到串口监视器上。如果,向串口监视器输入数字,更新从0号地址位开始的EEPROM信息。并间接的更新了输出到监视器上的数值。

由于官方EEPROM 每次只能写入或读取一个地址位,因此我们设置了两个函数 EEPROM_write 与 EEPROM_read,形参跟官方一样,但可以连续读取或写入:

串口命令 Serial.parseInt() 的作用是查找传入的串行数据流中的下一个有效整数。Serial.read()只能每次读取一个字节,Serial.parseInt() 一次能读取一个数据流。

byte *pp=(byte*)&p 的意思是:定义了一个字节型数组指针pp,将它指向了变量 p 。(byte*) 是为了将&p 强制转换为字节型指针,以便赋值给*pp 。

 

One thought on “第22课 EEPROM 读写、清零与串口数据流

Leave a Reply

Your email address will not be published. Required fields are marked *