3-11、12 arduino内存及EEPROM(智能应用篇)
3-11 arduino内存-1
Arduino最核心的就是ATmega328微控制器
1,上传程序到此微控制器
2,微控制器内部有存储单元
学习微控制器的存储单元的结构及基本工作原理,一方面以后编写程序在开发版上运行更高效稳定,另一方面使用arduino实现以前没实现的新的功能
微控制器里面存储单元由几种不同介质组成的
FLASH闪存
价格低读写慢
U盘就是这种存储介质(flash闪存)
SRAM静态随机存储器
除了flash,微控制器存储单元还有一种介质SRAM
价格高,读写快,对于一些时间,运行速度要求高的功能,这里是必须的
Flash和SRAM对比
静态信息:arduino运行过程中不发生改变的信息
动态信息:arduino运行过程中经常改变的信息
Arduino程序就是静态信息,当将arduino程序编写好并上传给arduino后,arduino只会一条一条的执行程序,不会对程序做任何修改,对arduino来说,程序就是静态信息
Arduino运行过程中,程序变量是经常发生变化的,程序变量就是动态信息,就是有SRAM处理的
Flash闪存用于存储静态信息,SRAM静态随机存储器用于存储动态信息
注意在断电后,存储内容是不一样的,flash存储的arduino程序静态信息不会因断电而消失,SRAM会因为没电而丢失其中的arduino程序变量的动态信息内容
注意:有时开发一些小项目,我们希望断电后一些变量能被arduino记住,希望程序变量被留住而不被清空
如智能灯,用户设置自己的喜欢颜色,当我们将电源关闭了,下次打开又会回到初始颜色,这样太麻烦,还得重新设置喜欢的颜色。
那么如何在断电后能记住我们之前设置好的颜色变量,
此时就要用到微控制器中的新的存储介质EEPROM
EEPROM(电可擦除可编程只读存储器)
存储器:存储信息的器
只读存储器
我们可以通过向其施加电流的方式将存储器固化到其中去,但这种存储器的特点只能写一次,若程序写错了,此存储器只能报废了
可编程只读存储器只能写一次不实用,于是就出现了可擦写可编程只读存储器
可以将其内容擦写掉(使用紫外线擦写的,在芯片上方有个圆形孔洞,使用紫外线照射就能擦掉程序,避免信息丢失使用黑色挡光的胶挡住)
还是有些麻烦,就有了电可擦写可编程只读存储器
能否使用EEPROM代替SRAM?
不能,关键原因是EEPROM读写速度太低,比不上SRAM
总结
微控制器中的三种存储介质介绍完毕
Flash:存储arduino程序的
SRAM:存储程序变量的
EEPROM:存储需要断电还要保持的程序变量的
下节课讲如何用arduino读和写EEPROM,以及利用flash闪存存储程序内容中不需要更改的静态信息从而达到arduino工作中内存更加优化的方式工作
3-12 arduino内存-2 EEPROM
微控制器中有三种存储介质,各有不同功能
Flash及SRAM在arduino运行中发挥的功能远远不止这些,展开设计的知识比较复杂了
此时
EEPROM存储结构
如何向EEPROM写数据及读取数据
结构类似信报箱,每个格子有编号,编号就是地址
每个地址可以存储一个字节的信息
在arduino的EEPROM有1024个字节即1KB的大小
注意第一个地址的值是0,最后一个地址值是1023
每个字节是8位,能存放的十进制大小是0~255之间
Arduino的EEPROM能存放1024个0~255十进制数字
若一个数值超过0~255范围,如整数9999,小数1.23是如何存放在EEPROM中的?
示例程序(向EEPROM写入数据)
可以通过arduino的示例程序进行
也可以使用太极创客网站程序,已经翻译好了
/*
* EEPROM Write 示例程序
*
* 储存于EEPROM的数值即使在断开Arduino开发板电源后仍会保存
* 在EEPROM中。当我们将新程序上传Arduino开发板后,这些储存
* 于EEPROM中的数值仍然可以被新的程序调用或者修改。
*
* 本实例程序注释中文翻译:太极创客(WWW.TAICHI-MAKER.COM )
* 如需要获得EEPROM的使用中文说明以及Arduino开发板开发的更多资料和
* 视频教程,请参见太极创客网站:
*
* 2017-11-22
*
*/
#include <EEPROM.h>
/** 被写入数据的EEPROM地址编号 (即.即哪一个存储地址将要被写入数据) **/
int addr = 0;
void setup() {
/** setup内无内容 **/
}
void loop() {
/***
如使用EEPROM存储模拟输入引脚所读取到的数值(即使用analogRead函数
读取Arduino开发板的模拟输入引脚并且将读取到的数值存储于EEPROM),
则需要将该数值除以4。原因是用analogRead函数所读取到的数值为0-1023
而EEPROM只能储存0-255的数值。(EEPROM每一个存储地址可以储存一个字节,
因此只能存储0-255的数值。)
***/
int val = 123; // 将要存储于EEPROM的整数数值
/***
将数值写入相应EEPROM地址。该数值即使在断开
Arduino开发板电源后,仍将保持在开发板的EEPROM中不变。
***/
EEPROM.write(addr, val);
/***
转入下一存储地址。当存储地址序列号达到EEPROM的存储空间结尾,
返回到EEPROM开始地址。
不同型号Arduino开发板具有不同大小的EEPROM存储空间,即:
- Arduno Duemilanove: 512b EEPROM 存储空间.
- Arduino Uno: 1kb EEPROM 存储空间 (允许使用的EEPROM地址序列号为 0-1023 ).
- Arduino Mega: 4kb EEPROM 存储空间.
***/
addr = addr + 1;
if (addr == EEPROM.length()) {
addr = 0;
}
delay(10);
}