STC单片机利用IAP技术实现EEPROM设计.doc

上传人:白大夫 文档编号:3273434 上传时间:2019-08-07 格式:DOC 页数:7 大小:33KB
返回 下载 相关 举报
STC单片机利用IAP技术实现EEPROM设计.doc_第1页
第1页 / 共7页
亲,该文档总共7页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《STC单片机利用IAP技术实现EEPROM设计.doc》由会员分享,可在线阅读,更多相关《STC单片机利用IAP技术实现EEPROM设计.doc(7页珍藏版)》请在三一文库上搜索。

1、STC单片机利用IAP技术实现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 Pro

2、gramable 是指在应用编程,就是片子提供一系列的机制(硬件/软件上的)当片子在运行程序的时候可以提供一种改变flash数据的方法。通俗点讲,也就是说程序自己可以往程序存储器里写数据或修改程序。这种方式的典型应用就是用一小段代码来实现程序的下载,实际上单片机的ISP功能就是通过IAP技术来实现的,即片子在出厂前就已经有一段小的boot程序在里面,片子上电后,开始运行这段程序,当检测到上位机有下载要求时,便和上位机通信,然后下载数据到存储区。大家要注意千万不要尝试去擦除这段ISP引导程序,否则恐怕以后再也下载不了程序了。STC单片机内部有几个专门的特殊功能寄存器负责管理ISP/IAP功能的,

3、见表1。表1 ISP/IAP相关寄存器列表名称地址功能描述D7D6D5D4D3D2D1D0复位值ISP_DATAE2hFlash数据寄存器1111 1111ISP_ADDRHE3hFlash高字节地址寄存器0000 0000ISP_ADDRLE4hFlash低字节地址寄存器0000 0000ISP_CMDE5hFlash命令模式寄存器-MS2MS1MS0xxxx x000ISP_TRIGE6hFlash命令触发寄存器xxxx xxxxISP_CONTRE7hISP/IAP 控制寄存器ISPENSWBSSWRST-WT2WT1WT0000x x000ISP_DATA:ISP/IAP操作时的数据寄

4、存器。ISP/IAP从Flash读出的数据放在此处,向Flash写入的数据也需放在此处。ISP_ADDRH:ISP/IAP操作时的地址寄存器高八位。ISP_ADDRL:ISP/IAP操作时的地址寄存器低八位。ISP_CMD:ISP/IAP操作时的命令模式寄存器,须命令触发寄存器触发方可生效。命令模式如表2所示。表2 ISP_CMD寄存器模式设置D7D6D5D4D3D2D1D0模式选择保留命令选择-000待机模式,无ISP操作-001对用户的应用程序flash区及数据flash区字节读-010对用户的应用程序flash区及数据flash区字节编程-011对用户的应用程序flash区及数据flas

5、h区扇区擦除程序在系统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单片机内部可用Data Flas

6、h(EEPROM)的地址如表3所示,其它型号单片机请查阅相关资料。表3 STC89C52RC、STC89LE52RC单片机内部EEPROM地址表第一扇区第二扇区第三扇区第四扇区起始地址结束地址起始地址结束地址起始地址结束地址起始地址结束地址2000H21FFH2200H23FFH2400H25FFH2600H27FFH第五扇区第六扇区第七扇区第八扇区起始地址结束地址起始地址结束地址起始地址结束地址起始地址结束地址2800H29FFH2A00H2BFFH2C00H2DFFH2E00H2FFFH每个扇区为512字节,建议大家在写程序时,将同一次修改的数据放在同一个扇区,方便修改,因为在执行擦除命令

7、时,一次最少要擦除一个扇区的数据(需要提供扇区的首地址),每次在更新数据前都必须要擦除原数据方可重新写入新数据,不能直接在原来数据基础上更新内容。注意:上面的是数据存储区的地址,程序存储区地址是从01FFF,共8K,程序区只能是ISP编程。以下是自己写的这部分功能代码,因为风格问题,不太喜欢原著代码,感觉自己的还严谨一点。/*/* IAP驱动 */*/*/*ISP/IAP相关寄存器列表*/*名称地址功能描述D7D6D5D4D3D2D1D0复位值*/*ISP_DATAE2hFlash数据寄存器1111 1111*/*ISP_ADDRHE3hFlash高字节地址寄存器0000 0000*/*ISP

8、_ADDRLE4hFlash低字节地址寄存器0000 0000*/*ISP_CMDE5hFlash命令模式寄存器-MS2MS1MS0xxxx x000*/*ISP_TRIGE6hFlash命令触发寄存器xxxx xxxx*/*ISP_CONTRE7hISP/IAP 控制寄存器ISPENSWBSSWRST-WT2WT1WT0000x x000*/*/*/*ISP_CMD寄存器模式设置*/* D7D6D5D4D3D2D1D0模式选择*/*保留命令选择*/* -000待机模式,无ISP操作*/* -001对用户的应用程序flash区及数据flash区字节读*/* -010对用户的应用程序flash区

9、及数据flash区字节编程*/* -011对用户的应用程序flash区及数据flash区扇区擦除*/*/*在ISPEN(ISP_CONTR.7) =1时,对ISP_TRIG 先写入46h,再写入B9h,ISP/IAP命令才会生效。*/* 定义常量 */#define ERROR 0#define OK 1/* 定义Flash 操作等待时间 */#define WAIT_TIME 0x00 /mcu clock 40mhz/#define WAIT_TIME 0x01 /mcu clock 20mhz/#define WAIT_TIME 0x02 /mcu clock 10mhz#define

10、WAIT_TIME 0x03 /mcu clock 5mhzsfr ISP_DATA= 0xe2; / Flash数据寄存器sfr ISP_ADDRH= 0xe3;/ Flash高字节地址寄存器sfr ISP_ADDRL= 0xe4;/ Flash低字节地址寄存器sfr ISP_CMD= 0xe5;/ Flash命令模式寄存器sfr ISP_TRIG= 0xe6;/ Flash命令触发寄存器sfr ISP_CONTR= 0xe7;/ ISP/IAP 控制寄存器#define CMD_READ0x01/ 定义IAP的读字节操作#define CMD_PRGM0x02/ 定义IAP的写字节操作#d

11、efine CMD_ERASE0x03/ 定义IAP的擦除扇区操作/* 打开 ISP,IAP 功能 */static void ISPIAPEnable(void)/EA= 0; / 关中断ISP_CONTR= ISP_CONTR / 0001,1000ISP_CONTR= ISP_CONTR | WAIT_TIME;/ 写入硬件延时ISP_CONTR= ISP_CONTR | 0x80; / ISPEN = 1/* 关闭 ISP,IAP 功能 */static void ISPIAPDisable(void)ISP_CONTR= ISP_CONTR / ISPEN = 0ISP_TRIG=

12、0x00;/EA = 1; / 开中断/* 触发Flash操作 */static ActiveOperate(void)bit eacpy;eacpy = EA;EA = 0;ISPIAPEnable();ISP_TRIG = 0x46; / 触发ISP_IAP命令字节1ISP_TRIG = 0xb9; / 触发ISP_IAP命令字节2UINT8 i=2; while(i-);ISPIAPDisable();EA = eacpy;/* 读一字节 */static UINT8 IAPReadByte(const UINT16 uiAddr)ISP_ADDRH= (UINT8)(uiAddr 8)

13、;/ 写地址ISP_ADDRL= (UINT8)(uiAddrISP_CMD = ISP_CMD / 清低三位ISP_CMD = ISP_CMD | CMD_READ;/ 写入读命令ActiveOperate();/ 触发执行return (ISP_DATA); / 返回读到的数据/* 写一字节 */static void IAPWriteByte(const UINT16 uiAddr, const UINT8 ucData)ISP_ADDRH= (UINT8)(uiAddr 8);/ 写地址ISP_ADDRL= (UINT8)(uiAddrISP_CMD = ISP_CMD / 清低三位I

14、SP_CMD = ISP_CMD | CMD_PRGM;/ 写入写命令ISP_DATA= ucData; / 写入数据准备ActiveOperate();/ 触发执行/* 擦除一扇区 */static void IAPEarseSection(const UINT16 uiAddr)UINT16uiSecAddr;uiSecAddr= (uiAddr / 取扇区地址ISP_ADDRH= (UINT8)(uiSecAddr 8);/ 写地址ISP_ADDRL= 0x00;ISP_CMD= ISP_CMD / 清低三位ISP_CMD= ISP_CMD | CMD_ERASE;/ 写入擦除命令Act

15、iveOperate();/ 触发执行-#include/到宏晶网站下载头文件或自己在现有的头文件上加上相应的寄存器定义即可。#include#define uchar unsigned char#define uint unsigned int/*uart init*/void UART_inti(void)AUXR=0x40;/定时器1速度是普通8051的12倍,不分频TMOD=0x20;/定时器1工作在方式2,用来产生波特率SCON=0x50;/串口工作在方式1,允许接收TL1=0xF7;/波特率为38400;FB为115200TH1=0xF7;PCON=0x00;/SMOD=0TR1=1; /产生波特率void ISP_write

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1