当前位置:文档之家› EEPROM可靠性

EEPROM可靠性

EEPROM可靠性
EEPROM可靠性

EEPROM 数据被破坏的主要原因有:

1、电源异常使EEPROM的数据彻底丢失;

2、复位不好和软件跑飞可能会使EEPROM的数据被改写。

要防止EEPROM数据被破坏,主要在以下几方面做工作:

1、选用比MCU的电源范围宽并有WP引脚的EEPROM芯片;

2、做好电源滤波,而且要等电源开机稳定后才去读写EEPROM;

3、做好复位电路;

4、做好软件跑飞的处理;

5、SDA和SCK的上拉最好用I/O口控制,既可省电,也可在一定情况下保护

EEPROM;

6、WP接MCU的RESET;如WP做软件保护,将写不进数据;接I/O,上电时

WP的状态可能不稳定。

7、EEPROM空间富余时考虑双备份或多备份数据,每份数据都有校验和。

选用比MCU的电源范围宽并有WP引脚的EEPROM芯片的原因:

1、EEPROM的芯片本身有一定的保护时序;

2、电源低于MCU工作电源高于EEPROM芯片的最低工作电源时,EEPROM

芯片会处于稳定状态,不会丢失数据。

3、当电源较长时间低于EEPROM芯片的最低工作电压时非常容易丢失全部

数据。否则MCU还能工作,但EEPROM芯片已不能工作时,EEPROM中的数据会全部丢失。

4、用I/O口线给EEPROM供电,只在读写EEPROM时才给器件供电,不仅

能提高可靠性,而且能省电。

但有两点要注意:

一是一些单片机复位时所有I/O都是高电平,会使EEPROM芯片进入工作;

二是EEPROM芯片给电后需要有大于写周期的延时才能读写。

EEPROM数据丢失的原因与对策

1、环境因素

★原因:高温、高湿、辐射、静电、强电磁场均可能使EEPROM存储单元

造成数据丢失或数据保存时间缩短。

●对策:

①不要在高温、高湿、辐射、静电、强电磁场环境中存放EEPROM器,如果法避免,应采取适当的防护措施。

②在高温环境中使用EEPROM器件,须确认存储内容的更新时间和器件使用期限

③工作环境湿度较大时可考虑线路板灌胶防潮,防水胶要选用吸水率低的

④在辐射、静电、强电磁场环境中工作要做好屏蔽。

2、设计因素

★原因:器件在读写时系统状态不定。

●对策:

①增加上电复位电路,确保在上、掉电期间系统处于确定的状态。复位门槛电压应不小于MCU最低工作电压,EEPROM器件的工作电压范围应不小于MCU。注意:某些MCU内置的POR电路在电源上升缓慢时不能保证可靠复位

②增加电源电压检测电路,确保在电源电压稳定正常后MCU才开始运而在电源状态不定时不访问EEPROM。启用MCU内的BOD电路不足以防止

EEPROM读写错误。

③利用器件的“写保护”引脚,可以减小EEPROM被意外改写的几率

★原因:器件在读写时被异常中断。

●对策:

①确认电源电压从正常值跌落至MCU复位门槛电压的时间足够保持EEPROM读写操作完成。根据需要增加电源储能电容或者使用备份电源。

②在检测到电源电压跌落时立即关闭所有无关外设,在访问EEPROM期间禁止MCU中断,或者设置EEPROM读写中断为最高优先级。

③使用“写入查询”加快写入过程。

★原因:模拟总线时序不够严格规范。

●对策:

①总线上拉电阻太大,使SDA、SCL边沿上升时间太长。对400kHz快速模式,当总线电容小于100pF时上拉电阻推荐值为2.7kΩ。

②MCU操作速度太快或延时不够,不满足总线信号的建立、保持时间查阅《I2C 总线技术精要》,按示例规范时序编程。

③总线过长,使信号边沿不能满足要求。应缩短总线长度。

④总线电容超过400pF。应减少总线上所连接的器件。

★原因:器件在读写时总线受到干扰。

●对策:

①如应用板干扰较大,应重新设计电路或改变PCB布局布线,敷铜或多层板改善EMC。如环境干扰较大,应采取相应的屏蔽措施。

②使用数据编码和校验增加数据的可信性,或写入特定标志来识别数据完整性,如有可能,在每次写入完成后立即读出校验。

★原因:地线不合理或电源噪声干扰。

●对策:

①重新布置地线,注意区分模拟地、数字地、信号地、功率地、屏蔽地,安全地

②使用带屏蔽的隔离电源;在电源线上增加LC滤波器;IC器件的电源引脚加

0.1uF瓷介退耦电容。别忘了三个基本电路元件之一的电感器,抑制电源噪声干扰,电感器通常有立竿见影的作用。必要时,加磁珠抑制高频噪声干扰。3、生产因素

★原因:焊接和装配过程中的高温、静电可能造成EEPROM器件数据丢失或保存时间缩短。

●对策:

①改进生产工艺,控制加工过程,加强防静电措施。

②如有可能,在线路板生产完成后再写入EEPROM数据。

4、器件因素

★原因:器件擦写次数已接近循环寿命。

●对策:更换器件。如果器件有剩余空间,软件通过更改每次写入的地址单元可延长

器件使用寿命。

★原因:器件质量问题。

●对策:更换不同厂家或批号的器件;控制采购过程。

只是单片机在掉电时,电压低过一定的值。执行程序代码出错或是程序指针跑飞。刚好执行EEPORM写入操作,才会出现所说的EEPROM数据丢失!就算是外置EEPROM在低于正常工作电压,进行写入操作,也会出现这种情况!

BOD的功能是低压复位。当电压低过一定的值,就会让单片机复位。不能继续程序代码,就没有出现所说的丢失数据!

EEPORM进行数据备份,并在每份数据后里加入校验机制(如RCR)。我是这么做的,读取

EEPROM的数据组并进行校验检测。如果通不过,这组数据就不要。继续下一组数据检测,当所有的数据组都不能通过检测时,并加载默认的设置参数!在更新数据时,刷新所有的数据组。并给每组加入校验机制!但最好不要在掉电时对EEPROM进行任务的操作!这样出错的机率很低!

单片机EEPROM的使用函数

/******************************************************************** 这是EEROM.h文件 ********************************************************************/ #ifndef _EEPROMus_h //对EEROM进行操作 #define _EEPROMus_h #include #include extern void EEw(unsigned int m,unsigned int,unsigned char w); //将第m扇区的第n个存储空间数据改成w extern void EEr(unsigned int m,unsigned int n,unsigned char *r); //将第m扇区的第n个存储空间数据读到r extern void EEe(unsigned int m); //删除第m扇区内的内容 extern void EEwa(unsigned int m,unsigned int n,unsigned char w[]); //在m扇区,从0x00写到第n个,写数组w里的数 extern void EEra(unsigned int m,unsigned int n,unsigned char r[]); //在m扇区,从0x00读到第n个,读到数组r里 #endif /******************************************************************** 这是EEPROM.c文件 ********************************************************************/ /******************************************************************** IAP_CONTR: B7: 0:禁止IAP 1:允许IAP B6和B5配合让程序从AP区和ISP监控区复位及程序的开始 B4:当IAP_TRIG触发的5a/a5失败,则为1,且由软件清零 B3:/ B2B1B0:设置CPU等待时间 IAP_TRIG: 每次发送命令后要用此寄存器发送5a,然后a5后,命令生效 IAP_CMD: 对IAP进行命令输入: 0x00:无操作 0x01:读 0x02:写

STC单片机内部EEPROM的应用

ISPEN:ISP/IAP功能允许位。0:禁止ISP/IAP编程改变Flash,1:允许编程改变Flash SWBS:软件选择从用户主程序区启动(0),还是从ISP程序区启动(1)。 SWRST:0:不操作,1:产生软件系统复位,硬件自动清零。 ISP_CONTR中的SWBS与SWRST这两个功能位,可以实现单片机的软件启动,并启动到ISP区或用户程序区,这在“STC单片机自动下载”一节,亦有所应用。 如: ISP_CONTR=0x60; 则可以实现从用户应用程序区软件复位到ISP程序区开始运行程序。 ISP_CONTR=0x20; 则可以实现从ISP程序区软件复位到用户应用程序区开始运行程序。

(以上的建议时钟是(WT2、WT1、WT0)取不同的值时的标称时钟,用户系统中的时钟不要过高,否则可能使操作不稳定。) 以下是具体的实现代码: EEPROM操作函数: #define RdCommand 0x01 #define PrgCommand 0x02 #define EraseCommand 0x03 #define Error 1 #define Ok 0 #define WaitTime 0x01

#define PerSector 512 unsigned char xdata Ttotal[512]; /* ---------------------------------------------------------------------打开 ISP,IAP 功能 ---------------------------------------------------------------------*/ void ISP_IAP_enable(void) { EA=0;/* 关中断*/ ISP_CONTR|=0x18;/*0001,1000*/ ISP_CONTR|=WaitTime;/*写入硬件延时*/ ISP_CONTR|=0x80;/*ISPEN=1*/ } /* ---------------------------------------------------------------------关闭 ISP,IAP 功能 ---------------------------------------------------------------------*/ void ISP_IAP_disable(void) { ISP_CONTR&=0x7f;/* ISPEN = 0 */ ISP_TRIG=0x00; EA=1;/* 开中断 */ } /* ----------------------------------------------------------------------公用的触发代码 ----------------------------------------------------------------------*/ void ISPgoon(void) { ISP_IAP_enable();/* 打开 ISP,IAP 功能 */ ISP_TRIG=0x46;/* 触发ISP_IAP命令字节1 */ ISP_TRIG=0xb9;/* 触发ISP_IAP命令字节2 */ _nop_(); }

51单片机内部EEPROM的应用

用51hei-5板子学习单片机内部EEPROM的应用 STC89C51、52内部都自带有2K字节的EEPROM,54、55和58都自带有16K字节的EEPRO M,STC单片机是利用IAP技术实现的EEPROM,内部Flash擦写次数可达100,000 次以上,先来介绍下ISP与IAP的区别和特点。 ISP:In System Programable 是指在系统编程,通俗的讲,就是片子已经焊板子上,不用取下,就可以简单而方便地对其进行编程。比如我们通过电脑给STC单片机下载程序,或给AT89S51单片机下载程序,这就是利用了ISP技术。 IAP:In Application Programable 是指在应用编程,就是片子提供一系列的机制(硬件/软件上的)当片子在运行程序的时候可以提供一种改变flash数据的方法。通俗点讲,也就是说程序自己可以往程序存储器里写数据或修改程序。这种方式的典型应用就是用一小段代码来实现程序的下载,实际上单片机的ISP功能就是通过IAP技术来实现的,即片子在出厂前就已经有一段小的boot程序在里面,片子上电后,开始运行这段程序,当检测到上位机有下载要求时,便和上位机通信,然后下载数据到存储区。大家要注意千万不要尝试去擦除这段ISP引导程序,否则恐怕以后再也下载不了程序了。STC单片机内部有几个专门的特殊功能寄存器负责管理ISP/IAP 功能的,见表1。 表1 ISP/IAP相关寄存器列表 名称地址功能描述D7D6D5D4D3D2D1D0复位值ISP_DATA E2h Flash数据寄存器1111 1111 ISP_ADDRH E3h Flash高字节地址寄 存器0000 0000 ISP_ADDRL E4h Flash低字节地址寄 存器0000 0000 ISP_CMD E5h Flash命令模式寄存 器 ----------MS2MS1MS0xxxx x000 ISP_TRIG E6h Flash命令触发寄存 器 xxxx xxxx ISP_CONTR E7h ISP/IAP 控制寄存器ISPEN SWBS SWRST----WT2WT1WT0000x x000 ISP_DATA:ISP/IAP操作时的数据寄存器。

51单片机内部EEPROM的应用

STC89C51、52内部都自带有2K字节的EEPROM,54、55和58都自带有16K字节的EEPROM,STC单片机是利用IAP技术实现的EEPROM,内部Flash擦写次数可达100,000 次以上,先来介绍下ISP与IAP的区别和特点。 知识点:ISP与IAP介绍 ISP:In System Programable 是指在系统编程,通俗的讲,就是片子已经焊板子上,不用取下,就可以简单而方便地对其进行编程。比如我们通过电脑给STC单片机下载程序,或给AT89S51单片机下载程序,这就是利用了ISP技术。 IAP:In Application Programable 是指在应用编程,就是片子提供一系列的机制(硬件/软件上的)当片子在运行程序的时候可以提供一种改变flash数据的方法。通俗点讲,也就是说程序自己可以往程序存储器里写数据或修改程序。这种方式的典型应用就是用一小段代码来实现程序的下载,实际上单片机的ISP功能就是通过IAP技术来实现的,即片子在出厂前就已经有一段小的boot程序在里面,片子上电后,开始运行这段程序,当检测到上位机有下载要求时,便和上位机通信,然后下载数据到存储区。大家要注意千万不要尝试去擦除这段ISP引导程序,否则恐怕以后再也下载不了程序了。 STC单片机内部有几个专门的特殊功能寄存器负责管理ISP/IAP功能的,见表1。 表1 ISP/IAP相关寄存器列表 名称地址功能描述D7 D6 D5 D4 D3 D2 D1 D0 复位值 ISP_DATA E2h Flash数据寄存 器1111 1111 ISP_ADDRH E3h Flash高字节地址寄存 器0000 0000 ISP_ADDRL E4h Flash低字节地址寄存 器0000 0000 ISP_CMD E5h Flash命令模式寄存器-- -- -- -- -- MS2 MS1 MS0 xxxx x000 ISP_TRIG E6h Flash命令触发寄存 器xxxx xxxx ISP_CONTR E7h ISP/IAP 控制寄存器ISPEN SWBS SWRST -- -- WT2 WT1 WT0 000x x000 ISP_DATA:ISP/IAP操作时的数据寄存器。ISP/IAP从Flash读出的数据放在此处,向Flash写入的数据也需放在此处。 ISP_ADDRH:ISP/IAP操作时的地址寄存器高八位。 ISP_ADDRL:ISP/IAP操作时的地址寄存器低八位。 ISP_CMD:ISP/IAP操作时的命令模式寄存器,须命令触发寄存器触发方可生效。命令模式如表2所示。 表2 ISP_CMD寄存器模式设置 D7 D6 D5 D4 D3 D2 D1 D0 模式选择 保留命令选择 -- -- -- -- -- 0 0 0 待机模式,无ISP操作 -- -- -- -- -- 0 0 1 对用户的应用程序flash区及数据flash区字节读 -- -- -- -- -- 0 1 0 对用户的应用程序flash区及数据flash区字节编程 -- -- -- -- -- 0 1 1 对用户的应用程序flash区及数据flash区扇区擦除 程序在系统ISP程序区时可以对用户应用程序区/数据Flash区(EEPROM)进行字节读/字节

单片机内的Flash与EEPROM作用及区别(精)

单片机内的 Flash 与 EEPROM 作用及区别 单片机运行时的数据都存在于 RAM (随机存储器中, 在掉电后 RAM 中的数据是无 法保留的,那么怎样使数据在掉电后不丢失呢?这就需要使用 EEPROM 或FLASHROM 等 存储器来实现。在传统的单片机系统中, 一般是在片外扩展存储器, 单片机与存储器之间通 过 IIC 或 SPI 等接口来进行数据通信。这样不光会增加开发成本,同时在程序开发上也要花 更多的心思。在 STC 单片机中内置了 EEPROM (其实是采用 IAP 技术读写内部 FLASH 来 实现 EEPROM ,这样就节省了片外资源,使用起来也更加方便。下面就详细介绍 STC 单 片机内置 EEPROM 及其使用方法。 flash 是用来放程序的,可以称之为程序存储器,可以擦出写入但是基本都是整个扇区进行的 . 一般来说单片机里的 flash 都用于存放运行代码,在运行过程中不能改; EEPROM 是用来保存用户数据,运行过程中可以改变,比如一个时钟的闹铃时 间初始化设定为 12:00,后来在运行中改为 6:00,这是保存在 EEPROM 里, 不怕掉电,就算重新上电也不需要重新调整到 6:00 下面是网上详细的说法,感觉不错:

FLASH 和 EEPROM 的最大区别是 FLASH 按扇区操作, EEPROM 则按字节操作, 二者寻址方法不同,存储单元的结构也不同, FLASH 的电路结构较简单,同样容量占芯片面积较小,成本自然比 EEPROM 低,因而适合用作程序存储器, EEPROM 则更多的用作非易失的数据存储器。当然用 FLASH 做数据存储器也行, 但操作比EEPROM 麻烦的多,所以更“人性化”的 MCU 设计会集成 FLASH 和 EEPROM 两种非易失性存储器,而廉价型设计往往只有 FLASH ,早期可电擦写型 MCU 则都是EEPRM 结构,现在已基本上停产了。 在芯片的内电路中, FLASH 和 EEPROM 不仅电路不同,地址空间也不同,操作方法和指令自然也不同, 不论冯诺伊曼结构还是哈佛结构都是这样。技术上, 程序存储器和非易失数据存储器都可以只用 FALSH 结构或 EEPROM 结构, 甚至可以用“变通”的技术手段在程序存储区模拟“数据存储区” ,但就算如此,概念上二者依然不同,这是基本常识问题。 EEPROM :电可擦除可编程只读存储器, Flash 的操作特性完全符合 EEPROM 的定义,属 EEPROM 无疑,首款 Flash 推出时其数据手册上也清楚的标明是EEPROM ,现在的多数 Flash 手册上也是这么标明的,二者的关系是“白马”和 “马” 。至于为什么业界要区分二者, 主要的原因是 Flash EEPROM 的操作方法和传统 EEPROM 截然不同,次要的原因是为了语言的简练,非正式文件和口语中Flash EEPROM 就简称为 Flash , 这里要强调的是白马的“白” 属性而非其“马” 属性以区别 Flash 和传统 EEPROM 。 Flash 的特点是结构简单, 同样工艺和同样晶元面积下可以得到更高容量且大数据量 下的操作速度更快,但缺点是操作过程麻烦,特别是在小数据量反复重写时, 所以在 MCU 中 Flash 结构适于不需频繁改写的程序存储器。 很多应用中,需要频繁的改写某些小量数据且需掉电非易失,传统结构的EEPROM 在此非常适合, 所以很多 MCU 内部设计了两种 EEPROM 结构, FLASH

52单片机内部EEPROM

#include #include #define uchar unsigned char #define uint unsigned int sbit en=P2^7; sbit rs=P2^6; sbit rw=P2^5; void delay(unsigned char z) { unsigned char j,i; for (i=0;i> 8); //送地址高字节

TI--M4内部EEPROM详解

M4里面的EEPROM并不是编址在内存空间中的,而是直接通过操作寄存器(Register)进行读写的。所以EEPROM中间的某个地址就是只属于EEPROM的地址,并不和内存地址有冲突。 要想方便的使用EEPROM,最好的办法就是使用TI的StellarisWare驱动库程序: #include "inc/hw_memmap.h" #include "inc/hw_types.h" #include "inc/hw_timer.h" #include "inc/hw_ints.h" #include "inc/hw_gpio.h" #include "driverlib/sysctl.h" #include "driverlib/eeprom.h" unsigned long pulRead[2]; void main() { unsigned long pulData[2]; // 系统工作在50MHZ SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN |SYSCTL_XTAL_16MHZ); // 使能EEPROM SysCtlPeripheralEnable(SYSCTL_PERIPH_EEPROM0); // 初始化EEPROM EEPROMInit(); pulData[0] = 0x12345678; pulData[1] = 0x56789abc; // 向EEPROM里面0x400地址写入数据 EEPROMProgram(pulData, 0x400, sizeof(pulData)); // 读回来 EEPROMRead(pulRead, 0x400, sizeof(pulRead)); while(1) { }

STC单片机EEPROM的应用和程序

STC单片机EEPROM的应用和程序 (2009-04-22 21:58:34) 转载▼ 标签: 杂谈 分类:Program 最近,由于工作的需要,用STC89C52来开发新产品,要用天STC的Eeprom的功能,上网也找了一点资料,得到很大帮助,真的非常感谢。程序是我在网上摘录的,调试通过了,不过我产品在用动态扫描显示的,由于在Eeprom擦除时要用几十毫秒,会有一闪烁的。不过这是正常的。 单片机运行时的数据都存在于RAM(随机存储器)中,在掉电后RAM 中的数据是无 法保留的,那么怎样使数据在掉电后不丢失呢?这就需要使用EEPROM 或FLASHROM 等存储器来实现。在传统的单片机系统中,一般是在片外扩展存储器,单片机与存储器之间通过IIC 或SPI 等接口来进行数据通信。这样不光会增加开发成本,同时在程序开发上也要花更多的心思。在STC 单片机中内置了EEPROM(其实是采用IAP 技术读写内部FLASH 来 实现EEPROM),这样就节省了片外资源,使用起来也更加方便。下面就详细介绍STC 单片机内置EEPROM 及其使用方法。 STC 各型号单片机内置的EEPROM 的容量各有不同,见下表: (内部EEPROM 可以擦写100000 次以上) 上面提到了IAP,它的意思是"在应用编程",即在程序运行时程序存储器可由程序自 身进行擦写。正是是因为有了IAP,从而可以使单片机可以将数据写入到程序存储器中,使得数据如同烧入的程序一样,掉电不丢失。当然写入数据的区域与程序存储区要分开来,以使程序不会遭到破坏。 要使用IAP 功能,与以下几个特殊功能寄存器相关: ISP_DATA:ISP/IAP 操作时的数据寄存器。 ISP/IAP 从Flash 读出的数据放在此处,向Flash 写的数据也需放在此处 ISP_ADDRH:ISP/IAP 操作时的地址寄存器高八位。 ISP_ADDRL:ISP/IAP 操作时的地址寄存器低八位。 ISP_CMD:ISP/IAP 操作时的命令模式寄存器,须命令触发寄存器触发方可生效。 ISP_TRIG:ISP/IAP 操作时的命令触发寄存器。 当ISPEN(ISP_CONTR.7)=1 时,对ISP_TRIG 先写入0x46,再写入0xb9,ISP/IAP 命令才会生效。 单片机芯片型号起始地址内置EEPROM 容量(每扇区512 字节) STC89C51RC,STC89LE51RC 0x2000 共八个扇区 STC89C52RC,STC89LE52RC 0x2000 共八个扇区 STC89C54RD+,STC89LE54RD+ 0x8000 共五十八个扇区 STC89C55RD+,STC89LE55RD+ 0x8000 共五十八个扇区 STC89C58RD+,STC89LE58RD+ 0x8000 共五十八个扇区 寄存器标识地址名称7 6 5 4 3 2 1 0 初始值 ISP_DATA 0xE2 ISP/IAP闪存数据寄存器11111111 ISP_ADDRH 0xE3 ISP/IAP 闪存地址高位00000000

EEPROM.

常用串行EEPROM的编程应用 EEPROM是"Electrically Erasable Programmable Read-only"(电可擦写可编程只读存储器)的缩写,EEPROM在正常情况下和EPROM一样,可以在掉电的情况下保存数据,所不同的是它可以在特定引脚上施加特定电压或使用特定的总线擦写命令就可以在在线的情况下方便完成数据的擦除和写入,这使EEPROM被用于广阔的的消费者范围,如:汽车、电信、医疗、工业和个人计算机相关的市场,主要用于存储个人数据和配置/调整数据。EEPROM又分并行EEPROM和串行EEPROM,并行EEPROM器件虽然有很快的读写的速度,但要使用很多的电路引脚。串行EEPROM器件功能上和并行EEPROM基本相同,提供更少的引脚数、更小的封装、更低的电压和更低的功耗,是现在使用的非易失性存储器中灵活性最高的类型。串行EEPROM按总线分,常用的有I2C,SPI,Microwire总线。本文将介绍这三种总线连接单片机的编程方法。 I2C总线 I2C总线(Inter Integrated Circuit内部集成电路总线)是两线式串行总线,仅需要时钟和数据两根线就可以进行数据传输,仅需要占用微处理器的2 个IO引脚,使用时十分方便。I2C总线还可以在同一总线上挂多个器件,每个器件可以有自己的器件地址,读写操作时需要先发送器件地址,该地址的器件得到确认后便执行相应的操作,而在同一总线上的其它器件不做响应,称之为器件寻址,这个原理就像我们打电话的原理相当。I2C总线产生80年代,由PHLIPS 公司开发,早期多用于音频和视频设备,如今I2C总线的器件和设备已多不胜数。最常见的采用I2C总线的EEPROM也已被广泛使用于各种家电、工业及通信设备中,主要用于保存设备所需要的配置数据、采集数据及程序等。生产I2C总线EEPROM的厂商很多,如ATMEL、Microchip公司,它们都是以24来开头命名芯片型号,最常用就是24C系列。24C系列从24C01到24C512,C后面的数字代表该型号的芯片有多少K的存储位。如ATMEL的24C64,存储位是64K位,也就是说可以存储8K(8192)字节,它支持1.8V到5V电源,可以擦写1百万次,数据可以保持100年,使用5V电源时时钟可以达到400KHz,并且有多种封装可供选择。我们可以很容易的在身边的电器设备中发现它们的身影,如电视中用于保存频道信息,电脑内存条中保存内存大小等相关信息,汽车里用于保存里程信息等等。图一就是ATMEL24C64芯片的PID封装和用于内存条SPD(Serial Presence Detect)上的24芯片。

STC单片机EEPROM读写程序

/* STC89C54RD+的flash空间从0x4000~0xf3ff 共90个扇区,每扇区512字节*/ // #define BaseAddr 0x1000 /* 51rc */ // #define EndSectoraddr 0x3d00 /* 51rc */ // #define EndAddr 0x3fff /* 51rc 12K eeprom */ #define BaseAddr 0x4000 #define EndSectoraddr 0xf200 #define EndAddr 0xf3ff #define UseAddr 0x1000 /* ------------- 定义扇区大小------------- */ #define PerSector 512 /* 用户程序需要记忆的数组, 用户实际使用了n-1个数据,数组长度规整到 2 4 8 16 32 64 上*/ uchar Ttotal[16] = { 0x55, /* 作为判别引导头使用,用户程序请不要修改它*/ /* 用户保存记忆的数据*/ 0x01, /* 用途说明....*/ 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, }; uint timerForDelay, /* 专供延时用的变量*/ i, /* 循环变量*/ EepromPtr; /* eeprom读写指针*/ /* --------------- 命令定义--------------- */ #define RdCommand 0x01 /* 字节读*/ #define PrgCommand 0x02 /* 字节写*/

STC单片机内部EEPROM的应用

TX-1C开发板学习单片机内部EEPROM的应用 STC89C51、52内部都自带有2K字节的EEPROM,54、55和58都自带有16K字节的EEPROM,STC单片机是利用IAP技术实现的EEPROM,内部Flash擦写次数可达100,000 次以上,先来介绍下ISP与IAP的区别和特点。 知识点:ISP与IAP介绍 ISP:In System Programable 是指在系统编程,通俗的讲,就是片子已经焊板子上,不用取下,就可以简单而方便地对其进行编程。比如我们通过电脑给STC单片机下载程序,或给AT89S51单片机下载程序,这就是利用了ISP技术。 IAP:In Application Programable 是指在应用编程,就是片子提供一系列的机制(硬件/软件上的)当片子在运行程序的时候可以提供一种改变flash数据的方法。通俗点讲,也就是说程序自己可以往程序存储器里写数据或修改程序。这种方式的典型应用就是用一小段代码来实现程序的下载,实际上单片机的ISP功能就是通过IAP技术来实现的,即片子在出厂前就已经有一段小的boot程序在里面,片子上电后,开始运行这段程序,当检测到上位机有下载要求时,便和上位机通信,然后下载数据到存储区。大家要注意千万不要尝试去擦除这段ISP引导程序,否则恐怕以后再也下载不了程序了。 STC单片机内部有几个专门的特殊功能寄存器负责管理ISP/IAP功能的,见表1。 表1 ISP/IAP相关寄存器列表

ISP_DATA:ISP/IAP操作时的数据寄存器。 ISP/IAP从Flash读出的数据放在此处,向Flash写入的数据也需放在此处。 ISP_ADDRH:ISP/IAP操作时的地址寄存器高八位。 ISP_ADDRL:ISP/IAP操作时的地址寄存器低八位。 ISP_CMD:ISP/IAP操作时的命令模式寄存器,须命令触发寄存器触发方可生效。命令模式如表2所示。表2 ISP_CMD寄存器模式设置 程序在系统ISP程序区时可以对用户应用程序区/数据Flash区(EEPROM)进行字节读/字节编程/扇区擦除;程序在用户应用程序区时,仅可以对数据Flash区(EEPROM)进行字节读/字节编程/扇区擦除。STC89C51RC/RD+系列单片机出厂时已经固化有ISP引导码,并设置为上电复位进入ISP程序区,并

Stc单片机eeprom使用心得

Stc单片机eeprom使用心得 STC单片机利用IAP技术实现了EEPROM功能,相比外置存储芯片而言,在操作上比较方便。涉及STC单片机EEPROM操作的特殊功能寄存器有6个,地址分别是E2H、E3H、E4H、E5H、E6H和E7H。在STC单片机使用手册中,作者分别将它们定义为: 一、IAP_DATA(E2H) 二、IAP_ADDRH(E3H) 三、IAP_ADDRL(E4H) 四、IAP_CMD(E5H) 五、IAP_TRIG(E6H) 六、IAP_CONTR(E7H) 本人认为,手册中给每个地址单元定义的英文词组太长,而且有点哆嗦,占的篇幅又大,感觉对正常阅读和理解产生了一定的干扰,反倒不好了解作者的意图了,还不如让使用者自己定义为好。我自己对这些单元分别定义为DA T ADDRH ADDRL CMD TRIG CONTR。 一、DAT(E2H)从EEPROM中读取到的数据首先进入这里。要把数据写入EEPROM中,也要把数据放到这个单元中。也就是说,这个单元起到了中转站的作用,写入和读出都要通过这个单元。 二、ADDRH、ADDRL分别是EEPROM地址单元高8位和低8位。如要把数据存储到1000H 单元中,那么在程序中,ADDRH的数值为10H,ADDRL的数值为00H。 三、CMD表示操作类型。数值为1是读,数值为2是写,数值为3是擦除。简单点说,就是“1读2写3擦除”。 四、CONTR寄存器,说明书上作了好多功能表述,但对于一般使用者来说,寄存器的前5位可以不作过多了解,只要掌握后3位意义就可以了。一般理解为,选择好后3位的数值,为的是确保在不同数值晶振下正确读写擦除EEPROM。考虑到TRIG这个寄存器的要求,一般使用时,可将前5位设置为10000,后3位根据不同晶振频率来确定(这个见使用手册)。 五、TRIG这个寄存器,看了好长时间手册才了解它的一般使用,对这个寄存器理解应当放到最后。说明书是这样写的:为isp/iap操作时的命令模式寄存器。在ispen(isp_contr.7)=1时,对isp_trig先写入46h,再写入b9h,isp/iap命令才会生效。 其实也可以这样理解,当选择好EEPROM地址单元,选择好操作类型,以及在写入状态时准备好写入数据后,先向该寄存器送入46H数据,之后再向该寄存器送入B9H数值。EEPROM的读、写、擦除就完成了。 以上是本人对STC单片机的EEPROM使用的一些心得,若有不当或错误之处,请高手多多批评指正。 本人常用的STC_EEPROM基本操作程序 dat equ 0e2h drh equ 0e3h drl equ 0e4h cmd equ 0e5h trig equ 0e6h contr equ 0e7h

51单片机EEPROM的读写

STC单片机的内部EEPROM是用DATAFLASH模拟出来的,不是真正的EEPROM存储器,不能用普通的方法来操作 下面是一些注意点: 1.字节写之前要先将这个字节所在扇区的其它有效数据读取到RAM暂存(这步不是必须的) 2.暂存完之后再对整个扇区(512字节)进行擦除操作,擦拭完后,整个扇区每个地址中数据都变成0xFF 3.将欲写入的N个字节数据,用字节写函数写入EEPROM 4.将暂存到RAM的其它有用的EEPROM值再用字节写函数写回EEPROM 5.STC用FLASH模拟出来的EEPROM的字节写功能只能将1变成0,而不能将0变成1,只有扇区擦除后数据才是全1, 例如:在地址0x21f0处第1次写11010110,第2次写111010,读出结果是这2个值的相与10010 所以如果一个地址处的值不是0xff时写入新的数据是不对的,要先执行扇区擦除,变为0xff, 对于单个字节的写入,我们可以先检查该地址处的数据是否为0xff,是的话就不用擦除扇区了 ---------------------------------------------------------------------- STC89C52单片机内部EEPROM 的读写过程 1 配置ISP_CONTR寄存器,使能第7位ISPEN,让ISP_IAP功能生效,并配置低3位的等待时间 2 写指令: 读/写/擦除扇区这3个命令 3 赋值: ISP_ADDRH和ISP_ADDRL的地址值 4 关闭总中断EA,因为下面要写的2个触发指令必须是连续操作的,不能被中断 5 执行公用的ISP_IAP 触发指令,触发后读写操作才能进行 6 打开中断EA, 关闭ISP_IAP功能:清相关寄存器

51单片机读写内部EEPROM详解

此文档共包含三个程序。 第一个程序最简单易懂,看懂了基本就会读写51单片机内部EEPROM了。 第二个程序和第一个读写EEPROM原理差不多,包含有LCD1602操作方法,有写字符串的方法。 第三个程序在原有基础上增加了外部中断功能,细心的人会发现,操作内部EEPROM过程会将总中断关闭,实际上程序要用到中断时只需在原有的EEPROM操作后加上开总中断即可。 验证第二、第三个程序时需按程序内主程序中的操作说明进行烧录单片机,以验证是否成功操作单片机内部EEPROM。 程序1: /*************************************************************** 作品:EEPROM实验,开机还原关电前LED的亮灭状况 单片机:STC89C52RC 晶振:12M 编译环境:Keil uVision4 V9.00 ***************************************************************/ //#include #include #include #define uchar unsigned char #define uint unsigned int /****************特殊功能寄存器声明****************/ sfr ISP_DATA = 0xe2; sfr ISP_ADDRH = 0xe3; sfr ISP_ADDRL = 0xe4; sfr ISP_CMD = 0xe5; sfr ISP_TRIG = 0xe6; sfr ISP_CONTR = 0xe7; sbit LED1 = P2^0; sbit LED2 = P2^1; sbit K1 = P3^2; //按钮1 sbit K2 = P3^3; //按钮2

51单片机的EEPROM程序

名称:STC12单片机的EEPROM功能 作者:一片云 QQ:2279536733 上传日期:2014年1月9号 说明:共有两个文件,自己到时候整理下。 第一个文件:“STC_EEPROM.C” 源码如下(自己建立’.c’文件并拷贝到里面): /** * 作者:一片云 * 日期:2013.11.23 * 名称:STC单片机的EEPROM的操作 * * 说明:1.只存50个字节数据(可自行修改). * 2.存储地址从0开始. * 3.低压不要操作. * 4.上电约200ms之后可操作. */ #include "STC_EEPROM.h" /**-*-*-*-*-*-*-*-*-*-*-*-*-*-* STC_EEPROM向上应用层*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**/ /** * 向EEPROM中写一个字节 */ void STC_Write_EEPROM(u16 Addr, u8 Value) { u8 i; u8 temp_data[50]; for(i=0; i<50; i++) temp_data[i] = IapReadByte(STC_IAP_SecAddr+i); IapEraseSector(STC_IAP_SecAddr); temp_data[Addr] = V alue; for(i=0; i<50; i++) IapProgramByte(STC_IAP_SecAddr+i, temp_data[i]); }

/** * 从EEPROM中读一个字节 */ u8 STC_Read_EEPROM(u16 Addr) { return IapReadByte(Addr); } /**-*-*-*-*-*-*-*-*-*--*-*-*-*-*- STC_EEPROM工作层-*-*-*-*-*-*--*-*-*-*-*-*-*-*-*-**/ /*---------------------------- 1.Erase one sector area 2.Input: addr (ISP/IAP/EEPROM address) 3.Output: -----------------------------*/ void IapEraseSector(u16 Sec_Addr) { IAP_CONTR = STC_ENABLE_IAP; //Open IAP function, and set wait time IAP_MOD = STC_CMD_ERASE; //Set ISP/IAP/EEPROM ERASE command IAP_ADDRL = Sec_Addr; //Set ISP/IAP/EEPROM address low IAP_ADDRH = Sec_Addr >> 8; //Set ISP/IAP/EEPROM address high IAP_TRIG = 0x5A; //Send trigger command1 (0x5a) IAP_TRIG = 0xA5; //Send trigger command2 (0xa5) NOP( ); //MCU will hold here until ISP/IAP/EEPROM /* operation complete */ IapIdle(); } /*---------------------------- 1.Program one byte to ISP/IAP/EEPROM area 2.Input: addr (ISP/IAP/EEPROM address) 3.dat (ISP/IAP/EEPROM data) 4.Output: -----------------------------*/ void IapProgramByte(u16 Addr, u8 Value) {

AVR单片机内部EEPROM方法

AVR单片机内部EEPROM方法 /************************************************ ************** ;eeprom.c 在AVR单片机中可以用在ATMEGA16和ATMEGA8中都可以用,在GCC下 ;编译通过。09年11月1号! 陈永飞已测试过! ;读/写atmega8515内部EEPROM的例子 ;将数据0....9写入eeprom中,再读出用数码管显示出 来 ************************************************* **************/ #include ; #include ; #define uchar unsigned char #define uint unsigned int #define Hidden 16 uchar DispTab[17]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0 xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xFF}; uchar BitTab[6]={0x7F,0xBF,0xDF,0xEF,0xF7,0xFB};

uchar DispBuf[6]; //显示缓冲区 unsigned char Counter=0; void io_init(void) { // PortA PORTA = 0xff; DDRA = 0xff; // PortB PORTB = 0x0; DDRB = 0x0; // PortC PORTC = 0xfc; DDRC = 0xfc; // PortD PORTD = 0x0; DDRD = 0x0; } void mDelay(uint DelayTim) { uint i; for(;DelayTim>;0;DelayTim--) {

EEPROM可靠性

其实论坛上讨论A VR 内部EEPROM 可靠性,以及如何合理使用内部EEPROM 的帖子已经很多了,写这个帖子之前,还特意搜索了一下,EEPROM相关的主题贴一共有6页之多,酷贴达5个之多,没有看完,只选择性的看了一些,然后主要把注意力放在了两个与可靠性相关的,“穿着裤子”的贴上,又仔细的读了一遍,在这些的基础上,我做一个总结吧,希望能终结内部EEPROM 可靠性问题的讨论。当然该贴只是针对其 可靠性问题,掉电存EEPROM 的问题,以及存EEPROM 速度的问题,不在该文的讨论范围之列。 针对A VR EEPROM 的可靠性问题,以前使用Mega88 做过专门的测试,测试数据结果直接发_论坛上了,没有做文档,这个测试结果好像找不到了,应该是回复在下面这两个帖子其中之一的后面,网站被黑,可能回复没有恢复全。这两个帖子也是我主要参考得两个帖子。 讨论:eeprom的可靠性研究 myppfish https://www.doczj.com/doc/bb10246677.html,/bbs/bbs_content.jsp?bbs_sn=672954&bbs_page_no=1&search_mode=1&search_text=EEPROM&bbs_id=1000 原创]治标治本,彻底解决A VR单片机EEPROM数据丢失问题my_avr https://www.doczj.com/doc/bb10246677.html,/bbs/bbs_content.jsp?bbs_sn=1440595&bbs_page_no=1&search_mode=1&search_text=EEPROM&bbs_id=1000 测试的结论是A VR 内部EEPROM 是可靠的,如果有问题,也是所有EEPROM 的通病。当然由于测试手段有限,该结论可能存在片面性,如果哪位愿意继续深入测试,并且否定了这个结论,还请不吝赐教,谢谢。A VR 内部EEPROM 可靠归可靠,但是如果使用不当,确也很容易出错,所以搞得少数人以为A VR 内部EEPROM 不稳定。 首先,总结一下引起A VR 内部EEPROM 数据丢失的原因: 1. 程序问题; 2. 程序跑飞; 3. EEPROM相关寄存器因强磁场、高压静电等外部干扰出错所产生的写入动作; 4. 系统有很大的感性负载,在断电的时候会产生一个反向高压,EEPROM有可能会自擦除。 ……(还有什么原因,欢迎大家继续列举,以便完善及想办法解决) 针对问题1,程序问题不再该文讨论范围内。 针对问题2,程序跑飞,这个因该是引起EEPROM 数据丢失的主要原因。但是引起程序跑飞的原因却是多方面的。 第一. 电压不正常,工作不稳定,程序跑飞。针对这个问题,可以开启内部BOD、或者外加复位芯片解决,在低功耗场合,外部复位是有必 要的,毕竟BOD功耗太高。 第二,晶体振荡受干扰,频率不稳定,程序跑飞。针对这个问题,建议晶体使用全幅振荡,并且走线的时候尽量短,并且使用地线隔离。 第三系统受外界环境干扰,修改了PC等寄存器,程序跑飞。针对这个干扰问题,这个引起程序跑飞的可能性应该不大,如果环境实在恶劣

相关主题
文本预览
相关文档 最新文档