单片机的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 不仅电路不同,地址空间也不同,操作方法和指令自然也不同, 不论冯诺伊曼结构还是哈佛结构都是这样。
单片机内的Flash与EEPROM作用及区别

单片机运行时的数据都存在于RAM(随机存储器)中,在掉电后RA M 中的数据是无法保留的,那么怎样使数据在掉电后不丢失呢?这就需要使用EEPR OM或F LASHR OM 等存储器来实现。
在传统的单片机系统中,一般是在片外扩展存储器,单片机与存储器之间通过IIC或SPI等接口来进行数据通信。
这样不光会增加开发成本,同时在程序开发上也要花更多的心思。
在ST C 单片机中内置了E EPROM(其实是采用IAP技术读写内部FLAS H 来实现EEPR OM),这样就节省了片外资源,使用起来也更加方便。
下面就详细介绍STC单片机内置EEP ROM 及其使用方法。
f lash是用来放程序的,可以称之为程序存储器,可以擦出写入但是基本都是整个扇区进行的.一般来说单片机里的f lash都用于存放运行代码,在运行过程中不能改;EEPR OM是用来保存用户数据,运行过程中可以改变,比如一个时钟的闹铃时间初始化设定为12:00,后来在运行中改为6:00,这是保存在EE PROM里,不怕掉电,就算重新上电也不需要重新调整到6:00下面是网上详细的说法,感觉不错:F LASH和EEPR OM的最大区别是FL ASH按扇区操作,E EPROM则按字节操作,二者寻址方法不同,存储单元的结构也不同,FLA SH的电路结构较简单,同样容量占芯片面积较小,成本自然比EE PROM低,因而适合用作程序存储器,EE PROM则更多的用作非易失的数据存储器。
当然用FL ASH做数据存储器也行,但操作比EEPR OM麻烦的多,所以更“人性化”的MCU设计会集成F LASH和EEPRO M两种非易失性存储器,而廉价型设计往往只有 FLA SH,早期可电擦写型MCU则都是EEPR M结构,现在已基本上停产了。
单片机断电短暂记忆功能

单片机断电短暂记忆功能在一些应用场景下,单片机需要断电后能够保留一些重要的信息,例如电子秤需要保存当前称量的数值,温湿度传感器需要保存当前的环境信息等。
如果没有断电短暂记忆功能,每次断电后都需要重新初始化这些信息,这不仅浪费时间和资源,还可能导致数据丢失。
一种常用的实现方法是使用EEPROM(电可擦可编程只读存储器)来存储断电前的数据。
EEPROM是一种非易失性存储器,它可以在断电时保存数据,并且在电源重新上电后还能恢复这些数据。
EEPROM主要通过电场效应将数据存储在晶体管的栅极上,因此它不需要外部电源来保持数据的存储状态。
在单片机上,可以使用I2C或SPI接口与EEPROM通信,读写数据。
另一种常见的方法是使用闪存来实现断电短暂记忆功能。
闪存是一种非易失性存储器,通常用于存储程序代码和配置信息。
与EEPROM相比,闪存具有更高的存储密度和更快的读写速度,但相应的价格也更高。
在单片机上,可以通过SPI接口与闪存通信,将断电前的数据保存在闪存中,并在上电后恢复这些数据。
除了EEPROM和闪存外,还可以使用SD卡等外部存储器来实现断电短暂记忆功能。
SD卡是一种常见的存储介质,具有较大的存储容量和较快的读写速度。
在单片机上,可以通过SPI接口与SD卡通信,将断电前的数据保存在SD卡中,并在上电后从SD卡中读取这些数据。
无论是使用EEPROM、闪存还是SD卡,都需要在软件层面做一些工作来实现断电短暂记忆功能。
首先,需要定义一个数据结构,用于保存断电前的数据。
然后,需要在断电前将这些数据存储到外部存储器中,可以使用适当的协议或API来实现数据的读写。
在上电后,需要读取外部存储器中的数据,并将其恢复到相应的变量或寄存器中。
最后,需要在程序中处理可能出现的数据错误或异常情况,以确保数据的正确性和完整性。
总之,单片机断电短暂记忆功能是一种非常有用的功能,它可以保留断电前的信息,简化系统的初始化过程,并提高系统的可靠性和稳定性。
STC系列单片机片内EEPROM的应用

(2)向STC12C5A60S2单片机片内EEPROM中某单元写入数据 (假设系统时钟频率为20MHz):
MOV IAP_DATA,#DATA;先将要写入旳数据送至IAP_DATA寄 存器
MOV IAP_ADDRH,#BYTE_ADDRH;送单元地址旳高8位 MOV IAP_ADDRL,#BYTE_ADDRL;送单元地址旳低8位 MOV IAP_CONTR,#10000010B;设置等待时间且允许对
MS1 MS0 • 操作任务旳选择
0
0
待机模式,不操作
0
1
对EEPROM进行读操作
1
0
对EEPROM进行写操作
1
1 对EEPROM进行擦除操作
2.控制寄存器IAP_CONTR
WT2 WT1 WT0 读(2个 时钟)
1 1 1 2个时钟
写(55us) 55个时钟
扇区擦除( 21ms) 21012个时钟
MOV IAP_ADDRH,DPH;送地址旳高8位
MOV IAP_TRIG,#5AH;开启写操作
MOV IAP_TRIG ,#0A5H
LCALL DELAY_55μs ;延时等待
RET
BYTE_READ:
;读
MOV IAP_CONTR,#82H
MOV IAP_CMD,#01H ;读EEPROM命令
• EEPROM分为若干个扇区,每个扇区旳大小为512B,数据 存储器旳擦除操作是按扇区进行旳,能够擦写旳次数在10 万次以上。
• 使用时,同一次修改旳数据应该存储于同一种扇区,不是 同一次修改旳数据最佳存储在不同旳扇区,不一定要存满 。内部EEPROM旳扇区地址如表10-1所示。
起始地址 结束地址 起始地址 结束地址
AVR单片机内部EEPROM应用方法

AVR 单片机内部EEPROM 应用方法
AVR 单片机内部集成了EEPROM,但是在GCC 写编写EEPROM 应用
程序的时候,经常会出现读写EEPROM 时程序出错,或重启等不正常现象。
在软件仿真时也许结果是正确的,但是在片上运行的时候就不正常。
困扰很
久,终于发现原因在于编译器,已经我们对EEPROM 操作说明的理解不正确
或不仔细。
操作EEPROM 对时序的要求较高。
更加Datasheet 里的写操作范例程序:while(EECR & (1EEAR = address; //设置地址和数据寄存器
EEDR = data;
EECR |= (1
EECR |= (1 以上代码在GCC 中的编译结果,发现EECR |= (1while(EECR & (1EEAR = address; //设置地址和数据寄存器
EEDR = data;
asm volatile(SBI 0x1C,2 \n\t);
asm volatile(SBI 0x1C,1 \n\t);。
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操作时的命令模式寄存器。
STC单片机EEPROM读写程序

STC单片机EEPROM读写程序在单片机中,EEPROM(Electrically Erasable Programmable Read-Only Memory)是一种非易失性存储器,可以用于存储数据,即使在断电情况下,数据也会被保留。
因此,掌握STC单片机的EEPROM读写程序对于开发嵌入式系统非常重要。
一、EEPROM简介EEPROM是一种可重复擦写的存储器,可用于存储小量数据。
与Flash存储器相比,EEPROM具有更快的写入和擦除速度。
在STC单片机中,EEPROM的存储容量通常较小,一般在几个字节到几千字节之间。
二、EEPROM读操作在STC单片机中,进行EEPROM读操作需要按照以下步骤进行:1. 初始化I2C总线:STC单片机使用I2C总线进行EEPROM读写操作,因此需要先初始化I2C总线。
通过设置相关寄存器,设置I2C 总线的速度和地址。
2. 发送设备地址:确定要读取的EEPROM设备的地址,并发送到I2C总线。
3. 发送寄存器地址:确定要读取的EEPROM寄存器地址,并将其发送到I2C总线。
4. 发送读命令:向EEPROM发送读命令,以启动读操作。
5. 读取数据:从EEPROM中读取数据,并保存到变量中。
6. 结束读操作:完成读操作后,关闭I2C总线。
三、EEPROM写操作类似于读操作,进行EEPROM写操作也需要按照一定的步骤进行:1. 初始化I2C总线:同样地,首先需要初始化I2C总线。
2. 发送设备地址:确定要写入的EEPROM设备的地址,并发送到I2C总线。
3. 发送寄存器地址:确定要写入的EEPROM寄存器地址,并将其发送到I2C总线。
4. 发送写命令:向EEPROM发送写命令,以启动写操作。
5. 写入数据:将要写入EEPROM的数据发送到I2C总线。
6. 结束写操作:完成写操作后,关闭I2C总线。
四、注意事项在进行EEPROM读写操作时,需要注意以下几点:1. 确保正确的设备地址:要与EEPROM的地址匹配,否则无法进行有效的读写操作。
stc89c52中EEPROM使用方法

单片机STC89C52RC 内部EEPROM单片机运行时的数据都存在于RAM(随机存储器)中,在掉电后RAM 中的数据是无法保留的,那么怎样使数据在掉电后不丢失呢?这就需要使用EEPROM 或FLASHROM 等存储器来实现。
在传统的单片机系统中,一般是在片外扩展存储器,单片机与存储器之间通过IIC 或SPI 等接口来进行数据通信。
这样不光会增加开发成本,同时在程序开发上也要花更多的心思。
在STC 单片机中内置了EEPROM(其实是采用ISP/IAP 技术读写内部FLASH 来实现EEPROM),这样就节省了片外资源,使用起来也更加方便。
下面就详细介绍STC 单片机内置EEPROM 及其使用方法STC 各型号单片机内置的EEPROM 的容量最小有2K,最大有16K,基本上很好地满足项目的需要,更方便之处就是节省了周边的EEPROM 器件,达到节省成本的目的,而且内部EEPROM 的速度比外部的EEPROM 的速度快很多。
STC 各型号单片机内置的EEPROM 是以512 字节为一个扇区,EEPROM 的起始地址=FALSH 容量值+1,那么STC89C52RC 的起始地址为0x2000,第一扇区的起始地址和结束地址0x2000~0x21FF,第二扇区的起始地址和结束地址0x2200~0x23FF,其他扇区如此类推。
深入重点:�传统的EEPROM 是电可擦可编程只读存储一种掉电后数据不丢失的存储芯片。
�STC89C52RC 的EEPROM 是通过ISP/IAP 技术读写内部FLASH 来实现EEPROM。
�STC89C52RC 的EEPROM 起始地址为0x2000,以512 字节为一个扇区,EERPOM 的大小为2K 字节。
STC89C52RC 与EEPORM 实现的寄存器有6 个,分别是ISP_DATA、ISP_ADDRH、ISP_ADDRLISP_TRIG、ISP_CMD、ISP_CONTR。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
IAP_CONTR = STC_ENABLE_IAP; IAP_MOD = STC_CMD_ERASE; IAP_ADDRL = Sec_Addr; IAP_ADDRH = Sec_Addr >> 8; IAP_TRIG = 0x5A; IAP_TRIG = 0xA5; NOP( );
/**-*-*-*-*-*-*-*-*-*--*-*-*-*-*- STC_EEPROM 工作层 -*-*-*-*-*-*--*-*-*-*-*-*-*-*-*-**/
void IapEraseSector(u16 Sec_Addr); void IapProgramByte(u16 Addr, u8 Value); u8 IapReadByte(u16 Addr);
//Open IAP function, and set wait time //Set ISP/IAP/EEPROM READ
//Set ISP/IAP/EEPROM address //Send trigger command1 (0x5a) //Send trigger command2 (0xa5) //MCU will hold here until ISP/IAP/EEPROM
//Clear IAP address to prevent misuse
}
第二个文件:“STC_EEPROM.H”
源码如下(自己建立’.H’文件 并拷贝到里面):
/**
* 作者:一片云
* 日期:2013.11.23
* 名称:STC 单片机的 EEPROM 的操作
*
* 说明:1.只存 50 个字节数据(可自行修改).
/**-*-*-*-*-*-*-*-*-*--*-*-*-*- * STC_EEPROM 工作子层 *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**/ void IapIdle(void);
#endif
* 名称:STC 单片机的 EEPROM 的操作
*
* 说明:1.只存 50 个字节数据(可自行修改).
*
2.存储地址从 0 开始.
*
3.低压不要操作.
*
4.上电约 200ms 之后可操作.
*/
#include "STC_EEPROM.h"
/**-*-*-*-*-*-*-*-*-*-*-*-*-*-* STC_EEPROM 向上应用层 *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**/ /**
#define #define #define #define #define
STC_CMD_IDLE
0
STC_CMD_READ
1
STC_CMD_PROGRAM 2
STC_CMD_ERASE
3
STC_ENABLE_IAP 0x83
//Stand-By //Byte-Read
//Byte-Program //Sector-Erase //SYSCLK<=12MHz
* 向 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] = Value; for(i=0; i<50; i++)
IapProgramByte(STC_IAP_SecAddr+i, temp_data[i]);
}
/** * 从 EEPROM 中读一个字节 */
-----------------------------*/ void IapProgramByte(u16 Addr, u8 Value) {
IAP_CONTR = STC_ENABLE_IAP;
//Open IAP function, and set wait time
IAP_MOD = STC_CMD_PROGRAM;
----------------------------*/ u8 IapReadByte(u16 Addr) {
u8 Value;
IAP_CONTR = STC_ENABLE_IAP; IAP_MOD = STC_CMD_READ; command IAP_ADDRL = Addr; IAP_ADDRH = Addr >> 8; IAP_TRIG = 0x5A; IAP_TRIG = 0xA5; NOP( );
*
2.存储地址从 0 开始.
*
3.低压不要操作.
*
4.上电约 200ms 之后可操作.
*/
#ifndef __STC_EEPROM_H #define __STC_EEPROM_H
#include "STC12.h"
/**-*-*-*-*-*-*-*-*-*-*-*-*-*-* STC_EEPROM 操作定义 - *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**/
//Write ISP/IAP/EEPROM data
IAP_TRIG = 0x5A;
//Send trigger command1 (0x5a)
IAP_TRIG = 0xA5;
//Send trigger command2 (0xa5)
NOP( );
//MCU will hold here until ISP/IAP/EEPROM
//Open IAP function, and set wait time //Set ISP/IAP/EEPROM ERASE command
//Set ISP/IAP/EEPROM address low //Set ISP/IAP/EEPROM address high //Send trigger command1 (0x5a) //Send trigger command2 (0xa5) //MCU will hold here until ISP/IAP/EEPROM
//Set ISP/IAP/EEPROM PROGRAM
command
IAP_ADDRL = Addr;
//Set ISP/IAP/EEPROM address low
IAP_ADDRH = Addr >> 8;
//Set ISP/IAP/EEPROM address high
IAP_DATA = Value;
/* operation complete */ IapIdle( );
}
/*---------------------------1.Read one byte from ISP/IAP/EEPROM area 2.Input: addr (ISP/IAP/EEPROM address) 3.Output:Flash data
#define STC_IAP_SecAddr 0x0000
//Sector Start address
/**-*-*-*-*-*-*-*-*-*-*-*-*-*-* STC_EEPROM 向上应用层 *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**/
void STC_Write_EEPROM(u16 Addr, u8 Value); u8 STC_Read_EEPROM(u16 Addr);
/*----------------------------
1.Disable ISP/IAP/EEPROM function
2.Make MCU in a safe state
----------------------------*/
void IapIdle(void)
{
IAP_CONTR = 0;
/* 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:
名称:STC12 单片机的 EEPROM 功能 作者:一片云 QQ: 2279536733
上传日期:2014 年 1 月 9 号
说明:共有两个文件,自己到时候整理下。
第一个文件:“STC_EEPROM.C”
源码如下(自己建立’.c’文件 并拷贝到里面):
/**
* 作者:一片云
* 日期:2013.11.23
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:
/* operation complete */ Value = IAP_DATA; IapIdle();
//Read ISP/IAP/EEPROM data //Close ISP/IAP/EEPROM function