51单片机内部EEPROM的读写解析及例程[转载]
(2017-09-07 13:57:52)
标签:
单片机eeprom |
分类: C |
原文地址:http://blog.csdn.net/li_wen_biao/article/details/24691547
--------------------------------------------------------------------------------------
51单片机内部EEPROM的应用
STC89C51、52内部都自带有2K字节的EEPROM,54、55和58都自带有16K字节的EEPROM,STC单片机是利用IAP技术实现的EEPROM,内部Flash擦写次数可达100,000
次以上,先来介绍下ISP与IAP的区别和特点。
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)进行字节读/字节编程/扇区擦除。STC89C51RC/RD+系列单片机出厂时已经固化有ISP引导码,并设置为上电复位进入ISP程序区,并且出厂时就已完全加密。
ISP_TRIG:ISP/IAP操作时的命令触发寄存器。
在ISPEN(ISP_CONTR.7)=1时,对ISP_TRIG 先写入46h,再写入B9h,ISP/IAP命令才会生效。
STC89C52RC,STC89LE52RC单片机内部可用DataFlash(EEPROM)的地址如表3所示,其它型号单片机请查阅相关资料。
表3STC89C52RC、STC89LE52RC单片机内部EEPROM地址表
|
第一扇区 |
第二扇区 |
第三扇区 |
第四扇区 |
||||
|
起始地址 |
结束地址 |
起始地址 |
结束地址 |
起始地址 |
结束地址 |
起始地址 |
结束地址 |
|
2000H |
21FFH |
2200H |
23FFH |
2400H |
25FFH |
2600H |
27FFH |
|
第五扇区 |
第六扇区 |
第七扇区 |
第八扇区 |
||||
|
起始地址 |
结束地址 |
起始地址 |
结束地址 |
起始地址 |
结束地址 |
起始地址 |
结束地址 |
|
2800H |
29FFH |
2A00H |
2BFFH |
2C00H |
2DFFH |
2E00H |
2FFFH |
每个扇区为512字节,建议大家在写程序时,将同一次修改的数据放在同一个扇区,方便修改,因为在执行擦除命令时,一次最少要擦除一个扇区的数据,每次在更新数据前都必须要擦除原数据方可重新写入新数据,不能直接在原来数据基础上更新内容。
下面通过一个例子来讲解STC系列单片机EEPROM的具体用法。
【例】:在实验板上实现如下描述,操作STC单片机自带的EEPROM,存储一组按秒递增的二位数据,并且将数据实时显示在数码管上,数据每变化一次就往EEPROM中写入一次,当关闭实验板电源,再次开启电源时,从EEPROM中读取先前存储的数据,接着递增显示。
#include
#include
#define uchar unsigned char
#define uint unsigned int
#define RdCommand 0x01 //定义ISP的操作命令
#define PrgCommand 0x02
#define EraseCommand 0x03
#define Error 1
#define Ok 0
#define WaitTime 0x01 //定义CPU的等待时间
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 dula=P2^6;
sbit wela=P2^7;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
uchar num;
void delayms(uint
xms)
{
}
void display(uchar shi,uchar ge)
{
}
void ISP_IAP_enable(void)
{
}
void ISP_IAP_disable(void)
{
}
void ISPgoon(void)
{
}
unsigned char byte_read(unsigned int byte_addr)
{
}
void SectorErase(unsigned int sector_addr)
{
}
void byte_write(unsigned int byte_addr, unsigned charoriginal_data)
{
}
void main()
{
}
void timer0() interrupt 1
{
}

加载中…