eeprom

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

5.4.1 高级语言中使用E2PROM
在高级语言中使用E2PROM,需要参考和按照所使用语言环境的规定方法。

1. 在ICCAVR中使用E2PROM
在ICCAVR中使用EEPROM_READ(addr,dst)的简便方法是直接使用ICCAVR提供的通用函数和宏,在使用之前要包含eeprom.h头文件:

#include “eeprom.h”

在eeprom.h中,ICCAVR提供了两个通用的对E2PROM操作的函数和宏:

void EEPROMReadBytes(int addr,void *ptr,int size);
void EEPROMWriteBytes(int addr,void *ptr,int size);
#define EEPROM_READ(addr,dst) EEPROMReadBytes(addr,&dst,sizeof(dst))
#define EEPROM_WRITE(addr,dst) EEPROMWriteBytes(addr,&dst,sizeof(dst))

在程序中可以直接使用上面定义的函数读写E2PROM:

EEPROM_READ(int location,object)
EEPROM_WRITE(int location,object)

其中,location为int类型,它是要对E2PROM操作的首字节地址,object可以是任何的程序变量、数组或结构。例如:
int EEPROM_test(int i)
{
int j;
EEPROM_WRITE(0x0001,i); //将i的值写入E2PROM的0x0001和0x0002单元中
EEPROM_READ(0x0001,j); //从E2PROM的0x0001单元起读两个字节(int类型)
Return j;
}

在ICCAVR中,可以将一个全局变量定义在E2PROM中,并进行初始化。定义E2PROM中的全局变量使用“#pragma data:eeprom”伪指令,见下面的例程:
struct workFrame
{
unsigned char Status;
unsigned int Length;
unsigned char Datas[100];
};

#program data:eeprom //定义在E2PROM中的全局变量
int eeData = 0x1234;
struct workFrame eeFrame;
#program data:eeprom

void main(void)
{
int i;
struct workFrame ramFrame;
//………
EEPROM_READ((int)eeData,i); //读eeData到i,i=0x1234
EEPROM_WRITE((int)eeFrame,ramFrame); //将结构ramFrame中数据写入eeFrame中
}
源程序编译后,E2PROM中初始化数据将生成扩展名为.eep文件,该文件应当同程序代码文件.hex一起下载写入到芯片中。既.eep文件的内容是E2PROM的初始化数据。

2. 在CVAVR中使用E2PROM
在CVAVR中使用关键字“eeprom”来定义在E2PROM中的全局变量,但使用更为简洁,见下面例程:
//定义在eeprom中的全局变量
eeprom int alfa = 1;
eeprom char beta;
eeprom long array1[5];
eeprom char string[] = ”Hello”;

void main(void)
{
int i;
int eeprom *ptr_to_eeprom; //定义指向eeprom的指针ptr_to_eeprom

alfa = 0x55; //直接向eeprom中变量附值
ptr_to_eeprom = &alfa; //取eeprom变量alfa的地址
*ptr_to_eeprom = 0x55; //通过指针间接附值
i = alfa; //直接读取eeprom变量的值
i = *ptr_to_eeprom; //间接读取eeprom变量的值
}

指向E2PROM的指针为16位的int型。源程序编译后,E2PROM中初始化数据也是生成扩展名为.eep文件,用于下载作为E2PROM的初始化数据。

5.4.2 防止E2PROM数据破坏
写E2PR

OM的时间比较长,在使用1M系统时钟时,写一个字节需要8.5ms。尽管AVR采用了严格的时序对E2PROM进行操作,但在实际使用中还是会出现E2PROM数据被破坏的情况。其造成的原因主要有:
*系统电源刚上电后,系统时钟尚未稳定,程序已开始对E2PROM进行操作;
*程序正在对E2PROM操作时系统突然掉电时;
*程序正在对E2PROM操作时突然被中断打断,造成对E2PROM操作时序的破坏;
*软件跑飞。
其实有些情况将不可避免的造成对E2PROM数据的破坏,如当程序在向E2PROM中写入一个long型的数据(4个字节)时,刚刚写入1个字节系统突然断电,造成后3个字节无法写入,使得整个数据没有完整写入,便破坏了E2PROM中的数据。这种情况就是使用外挂的E2PROM芯片也是无法避免的,只能通过硬件上增加电源掉电预检测电路配合软件解决。

在一般的情况下,应该采取以下一些措施防止E2PROM数据被破坏:
*通过对熔丝位“BODLEVEL”和“BODEN”的配置,正确选择芯片的掉电检测门限电压(4.0v/2.7v),并允许BOD功能,使得当系统电压低于门限电压值使AVR不工作(上电)或立即停止工作(掉电)。
*通过对熔丝位“SUT1..0”和“CKSEL3..0”的配置,正确选择芯片的系统时钟源的工作模式,以及上电启动到开始执行程序的延时时间。使得系统电源上电并达到稳定后AVR再开始运行,因为在很多情况下,系统程序一开始是读取E2PROM中的数据。
*E2ROM中有多余的空间时,可考虑双重备份数据,写入数据增加校验字节等。
*对E2PROM进行操作时,尽量关闭中断响应。

相关文档
最新文档