STC单片机内部EEPROM的应用

STC单片机内部EEPROM的应用
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/IAP从Flash读出的数据放在此处,向Flash写入的数据也需放在此处。

ISP_ADDRH:ISP/IAP操作时的地址寄存器高八位。

ISP_ADDRL:ISP/IAP操作时的地址寄存器低八位。

ISP_CMD:ISP/IAP操作时的命令模式寄存器,须命令触发寄存器触发方可生效。命令模式如表2所示。

区擦除;程序在用户应用程序区时,仅可以对数据Flash区(EEPROM)进行字节读/字节编程/扇区擦除。STC89C51RC/RD+系列单片机出厂时已经固化有ISP引导码,并设置为上电复位进入ISP程序区,并且出厂时就已完全加密。

ISP_TRIG:ISP/IAP操作时的命令触发寄存器。

在ISPEN(ISP_CONTR.7) =1时,对ISP_TRIG 先写入46h,再写入B9h,ISP/IAP命令才会生效。

STC89C52RC,STC89LE52RC单片机内部可用Data Flash(EEPROM)的地址如表3所示,其它型号单片机请查阅相关资料。

表3 STC89C52RC、STC89LE52RC单片机内部EEPROM地址表

为在执行擦除命令时,一次最少要擦除一个扇区的数据,每次在更新数据前都必须要擦除原数据方可重新写入新数据,不能直接在原来数据基础上更新内容。下面来讲解STC系列单片机EEPROM的具体用法。

在TX-1C实验板上实现如下描述,操作STC单片机自带的EEPROM,存储一组按秒递增的二位数据,并且将数据实时显示在数码管上,数据每变化一次就往EEPROM中写入一次,当关闭实验板电源,再次开启电源时,从EEPROM中读取先前存储的数据,接着递增显示。新建文件part3.4.4.c,程序代码如下:

0x39,0x5e,0x79,0x71};

uchar num;

void delayms(uint xms)

{

uint i,j;

for(i=xms;i>0;i--) //i=xms即延时约xms毫秒

for(j=110;j>0;j--);

}

void display(uchar shi,uchar ge) //显示子函数

{

dula=1;

P0=table[shi]; //送十位段选数据

dula=0;

P0=0xff; //送位选数据前关闭所有显示,防止打开位选锁存时

wela=1; //原来段选数据通过位选锁存器造成混乱

P0=0xfe; //送位选数据

wela=0;

delayms(5); //延时

dula=1;

P0=table[ge]; //送个位段选数据

dula=0;

wela=1;

P0=0xfd;

wela=0;

delayms(5);

}

void ISP_IAP_enable(void) /* ================ 打开 ISP,IAP 功能 ================= */ {

EA = 0; /* 关中断 */

ISP_CONTR = ISP_CONTR & 0x18; /* 0001,1000 */

ISP_CONTR = ISP_CONTR | WaitTime; /* 写入硬件延时 */

ISP_CONTR = ISP_CONTR | 0x80; /* ISPEN=1 */

}

void ISP_IAP_disable(void) /* =============== 关闭 ISP,IAP 功能 ================== */ {

ISP_CONTR = 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_();

}

unsigned char byte_read(unsigned int byte_addr) /* ========= 字节读 ============= */ {

ISP_ADDRH = (unsigned char)(byte_addr >> 8);/* 地址赋值 */

ISP_ADDRL = (unsigned char)(byte_addr & 0x00ff);

ISP_CMD = ISP_CMD & 0xf8; /* 清除低3位 */

ISP_CMD = ISP_CMD | RdCommand; /* 写入读命令 */

ISPgoon(); /* 触发执行 */

ISP_IAP_disable(); /* 关闭ISP,IAP功能 */

return (ISP_DATA); /* 返回读到的数据 */

}

void SectorErase(unsigned int sector_addr) /* =========== 扇区擦除 ============ */ {

unsigned int iSectorAddr;

iSectorAddr = (sector_addr & 0xfe00); /* 取扇区地址 */

ISP_ADDRH = (unsigned char)(iSectorAddr >> 8);

ISP_ADDRL = 0x00;

ISP_CMD = ISP_CMD & 0xf8; /* 清空低3位 */

ISP_CMD = ISP_CMD | EraseCommand; /* 擦除命令3 */

ISPgoon(); /* 触发执行 */

ISP_IAP_disable(); /* 关闭ISP,IAP功能 */

void byte_write(unsigned int byte_addr, unsigned char original_data) /* ==== 字节写 ==== */ {

ISP_ADDRH = (unsigned char)(byte_addr >> 8); /* 取地址 */

ISP_ADDRL = (unsigned char)(byte_addr & 0x00ff);

ISP_CMD = ISP_CMD & 0xf8; /* 清低3位 */

ISP_CMD = ISP_CMD | PrgCommand; /* 写命令2 */

ISP_DATA = original_data; /* 写入数据准备 */

ISPgoon(); /* 触发执行 */

ISP_IAP_disable(); /* 关闭IAP功能 */

}

void main()

{

uchar a,b,num1;

TMOD=0x01; //设置定时器0为工作方式1(0000 0001)

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

EA=1;

ET0=1;

TR0=1;

num1=byte_read(0x2000);//程序开始时读取EEPROM中数据

if(num1>=60) //防止首次上电时读取出错

num1=0;

while(1)

{

if(num>=20)

{

num=0;

num1++;

SectorErase(0x2000);//擦除扇区

byte_write(0x2000,num1);//重新写入数据

if(num1==60)

{

num1=0;

}

a=num1/10;

b=num1%10;

}

display(a,b);

}

}

void timer0() interrupt 1

{

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

num++;

单片机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操作时的数据寄存器。

单片机内的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

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)进行字节读/字节

单片机STC89C52RC 内部EEPROM

单片机STC89C52RC 内部EEPROM 2011-09-06 12:15 单片机运行时的数据都存在于R A M(随机存储器)中,在掉电后R A M 中的数据是 无法保留的,那么怎 样使数据在掉电后不丢失呢?这就需要使用EEP R O M 或FL A S HR O M 等存储器来实现。在传统的单片机系统中,一般是在片外扩展存储器,单片机与存储器之间通过I I C或S P I等接口来进行数据通信 这样不光会增加开发成本,同时在程序开发上也要花更多的心思。在S T C单片机中内置了E E P R O M(其实是采用I S P/I A P技术读写内部F L A S H来实现E E P R O M),这样就节省了片外资源,使用起来也更加方便。下面 就详细介绍S T C单片机内置E E P R O M及其使用方法 S T C各型号单片机内置的E E P R O M的容量最小有2K,最大有16K,基本上很好地满足项目的需要,更 方便之处就是节省了周边的E E P R O M器件,达到节省成本的目的,而且内部E E P R O M的速度比外部的 E E P R O M的速度快很多。 S T C各型号单片机内置的E E P R O M是以512字节为一个扇区,E E P R O M的起始地址=F A L S H容量值+1, 那么S T C89C52R C的起始地址为0x2000,第一扇区的起始地址和结束地址0x2000~0x21F F,第二扇区 的起始地址和结束地址0x2200~0x23F F,其他扇区如此类推。 深入重点: ?传统的E E P R O M是电可擦可编程只读存储一种掉电后数据不丢失的存储芯片。 ?S T C89C52R C的E E P R O M是通过I S P/I A P技术读写内部F L A S H来实现E E P R O M。 ?S T C89C52R C的E E P R O M起始地址为0x2000,以512字节为一个扇区,E E R P O M的大小为2K字节STC89C52RC 与EEPORM 实现的寄存器有6 个,分别是ISP_D AT A、

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程序区,并

Proteus仿真EEPROM数据的写入

今天做的是一个往EEPROM写入数据的项目。项目没有什么实际意义,主要是练习一下学习的关于写EEPROM的知识。 项目的构思如下,向单片机的EEPROM中写入数据,00单元写入数据00,01单元写入数据01,FF单元写入数据FF,即任意一个EEPROM 单元都根据其地址来写入相应的数据。 项目源程序十分简单,但需要注意EEPROM写入数据的操作步骤。源程序如下: 在MPLAB中编辑好源程序以后,编译生成相应的源代码,然后我们在Proteus中绘制本例的电路图。本例电路图更为简单,因为我们使用的都是单片机内部资源,所以只需将一片PIC16F877放入电路图中就可以了。电路图如下所示: 绘制好电路图以后,我们就可以将前面生成的源代码装入单片机来进行仿真了。此例其他方面都比较简单,最关键的在于仿真时的操作。可以看到,当你点击仿真按钮的时候,系统并没有任何反映,我们根本看不到仿真效果。这时你可以点击主菜单中的Debug菜单下的“PIC CPU EPROM Memory - U1”,如下图: 此时系统将弹出相应的“EEPROM”窗口,在这个窗口中,你就可以看到EEPROM中的内容,看看仿真是否成功,其中的数据是否已经按照我们的要求变成了相应的内容。如下图所示: 当然,你也可以在仿真中使用Proteus的单步功能,你一步一步地点击单步按钮,可以看到,EEPROM中的内容一步一步地在变动。如下图的两个图形所示:

而且,从上图你还能看到,每点击一次单步按钮,EEPROM大约写入5个数据。当然,如果你修改一下相应的时钟频率,每次写入的数据量可能会有改变。 本项目的内容简单,但需要掌握以下几个方面的内容: 1.EEPROM数据写入的步骤。 2.Proteus中仿真单片机内部的RAM、EEPROM、FLASH等的操作。

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) {

相关文档
最新文档