AVR单片机内部EEPROM应用方法

转载 2013年12月02日 22:38:52
AVR单片机内部集成了EEPROM,但是在GCC写编写EEPROM应用程序的时候,经常会出现读写EEPROM时程序出错,或重启等不正常现象。在软件仿真时也许结果是正确的,但是在片上运行的时候就不正常。困扰很久,终于发现原因在于编译器,已经我们对EEPROM操作说明的理解不正确或不仔细。
      操作EEPROM对时序的要求较高。更加Datasheet里的写操作范例程序:
  while(EECR & (1<<EEWE));    //等待上一次写操作结束
  EEAR = address;             //设置地址和数据寄存器
  EEDR = data;
  EECR |= (1<EMWE);         //置位EEMWE 
  EECR |= (1<<EEWE);          //置位EEWE 以启动写操作
以上代码在GCC中的编译结果,发现  EECR |= (1<<EEMWE);EECR |= (1<<EEWE); 这两句之间的代码间隔超过4条,即超过要求的4个时钟周期,因此该方法写数据会出错。用库函数里面的汇编语句可能会在个别型号上造成系统重启,原因还不清楚。因此我们采用嵌入汇编语句的方式来编写写操作函数,代码如下:
while(EECR & (1<<EEWE));    //等待上一次写操作结束
EEAR = address;             //设置地址和数据寄存器
EEDR = data;
asm volatile("SBI 0x1C,2 \n\t");
asm volatile("SBI 0x1C,1 \n\t"); 
对于读操作,发现采用Datasheet范例程序:
  while(EECR & (1<<EEWE));   //等待上一次写操作结束 
  EEAR = address;            //设置地址寄存器
  EECR |= (1<<EERE);         //设置EERE 以启动读操作
  return EEDR;               //自数据寄存器返回数据 
进行单次操作似乎正常,但是连续操作可能导致程序个别运行不正常,现象象重启,但通过逻辑分析仪跟踪设置启动时序情况看来,又不太象,不知什么原因。采用一下程序段则可以正常运行:
while(EECR & (1<<EEWE));         //等待上一次写操作结束 
EEAR = address;               //设置地址寄存器
asm volatile("SBI 0x1C,0 \n\t"); //设置EERE 以启动读操作
data = EEDR;                     //自数据寄存器返回数据
asm volatile("nop \n\t");
asm volatile("nop \n\t");
asm volatile("nop \n\t");
asm volatile("nop \n\t");
注意,读操作后要空4个系统周期后才可执行下个语句(Datasheet有说明)。

治标治本,彻底解决AVR单片机EEPROM数据丢失问题

在项目中复制出来的程序,使用时可能有些地方需要修改。  编译环境:WinAVR-20060421 + AVR Studio 4.12.498  Service Pack 4  基本思路:每...
  • niepangu
  • niepangu
  • 2015年09月06日 09:04
  • 904

AVR单片机EEPROM学习

生活中我们经常会犯眼高手低的毛病,很多东西看着别人弄很容易,但轮到自己的时候就会发现其实没有想象中的简单。学完51单片机时,我以为小小的单片机无非就是进行一些IO口的控制罢了,但今天在进行AVR系列单...
  • baiyang139
  • baiyang139
  • 2016年05月26日 21:06
  • 425

51单片机内部EEPROM的应用

51单片机内部EEPROM的应用 STC89C51、52内部都自带有2K字节的EEPROM,54、55和58都自带有16K字节的EEPROM,STC单片机是利用IAP技术实现的EEPROM,内部Fl...
  • li_wen_biao
  • li_wen_biao
  • 2014年04月29日 09:17
  • 2013

STC内部EEPROM表

/*-----EEPROM 读写测试通过 2014 4 18   06:12---L271 CODE 474--------------*/ //芯片的工作频率修改为11.0592MHz波特率...
  • czhaii
  • czhaii
  • 2014年11月25日 02:12
  • 599

STM32单片机内部EEPROM的读写

STM32L系列单片机内部提供了EEPROM存储区域,但实质上,其FLASH也是EEPROM类型,只不过有一块区域被开放出来专门用作EEPROM操作而已。STM32L的EEPROM使用寿命设计为100...
  • sunyiming537
  • sunyiming537
  • 2015年07月23日 15:33
  • 1314

单片机内部EEPROM的应用

STC89C51、52内部都自带有2K字节的EEPROM,54、55和58都自带有16K字节的EEPROM,STC单片机是利用IAP技术实现的EEPROM,内部Flash擦写次数可达100,000 次...
  • emtribe
  • emtribe
  • 2013年04月19日 09:58
  • 508

飞思卡尔单片机DZ60---EEPROM读写

//向EEPROM中写入数据,然后读出数据,赋值给PORTD,点亮相应的LED灯 #include /* for EnableInterrupts macro */ #include "de...
  • crazyvoice
  • crazyvoice
  • 2013年07月24日 16:40
  • 2901

STC单片机内部EEPROM的应用

http://bbs.ednchina.com/BLOG_ARTICLE_158452.HTM  ***说明:相关内容来自网上,整理而成。转贴在此主要供参考学习用 单片机运...
  • cuhkljt
  • cuhkljt
  • 2013年03月30日 16:10
  • 425

STC89C52单片机内部eeprom的应用

/****说明:结合我手上的板子,显示部分代码没有规律。上班时间没事用了俩小时看芯片资料带改,下班后一试直接成功。用手机看的PDF sheet,可把我累死了!测试功能:0-60循环计数,断电保护存储最...
  • shaozhanyu
  • shaozhanyu
  • 2013年10月23日 16:36
  • 908

PIC内部EEPROM读写操作

EPROM操作: 如果要读取一个字节, 用户首先必须向EEADRL寄存器写入地址,然后清除EEPGD控制位,以及EECON1的CFGS位, 然后再将RD位置高。需要的数据经过一次指令周期...
  • dexinzheng
  • dexinzheng
  • 2015年04月17日 17:44
  • 2207
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:AVR单片机内部EEPROM应用方法
举报原因:
原因补充:

(最多只允许输入30个字)