//# include <reg52.h>
#include "STC89C52RC.h" //删除STC89C52RC中8个扇区的数据
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
//#define IAP_ADDRESS 0x08000 //STC89C58 EEPROM 起始地址
#define IAP_ADDRESS 0x02000 //STC89C52 EEPROM 起始地址
#define CMD_IDLE 0x00 //Stand-By 等待
#define CMD_READ 0x01 //Byte-Read 读取字节
#define CMD_PROGRAM 0x02 //Byte-Program 字节编程
#define CMD_ERASE 0x03 //Sector-Erase
//#define ENABLE_IAP 0X80 //if SYSCLK<40mhz
#define ENABLE_IAP 0X81 //if SYSCLK<20mhz
//#define ENABLE_IAP 0X82 //if SYSCLK<10mhz
//#define ENABLE_IAP 0X83 //if SYSCLK< 5mhz
bit aa=0;
void Delay(uchar n);
void IapIdle();
uchar IapReadByte(uint addr);
void IapProgramByte(uint addr,uchar dat);
void IapEraseSector(uint addr);
void Delay(uchar n){ uint x; while(n--){ x=0;while(++x);}}
/*************************************/
//禁止操作ISP/IAP/EEPROM 可使MCU出于安全状态
void IapIdle()
{
IAP_CONTR=0; //关闭IAP编程功能
IAP_CMD=0; //清理命令保持待机
IAP_TRIG=0; //清除触发寄存器
IAP_ADDRH=0x80; //数据指针指向非EEPROM的地区
IAP_ADDRL=0x00; //清除IAP地址,防止滥用
}
//读取一个字节从ISP/IAP/EEPROM区域 输入:地址 输出:数据
uchar IapReadByte(uint addr)
{
uchar dat; //数据暂存
IAP_CONTR=ENABLE_IAP; //开启IAP功能 设置等待时间
IAP_CMD=CMD_READ; //设置ISP/IAP命令寄存器为读
IAP_ADDRL=addr; //设置操作数据地址低8位
IAP_ADDRH=addr>>8; //设置操作数据地址高8位
IAP_TRIG=0x46; //发送触发命令0x46
IAP_TRIG=0xb9; //发送完0x46和0xb9ISP/IAP命令生效
_nop_();_nop_();_nop_();_nop_(); //MCU将会“挂起”直到ISP/IAP/EEPROM 操作完成
dat=IAP_DATA; //读取数据寄存器到数据暂存
IapIdle();
return dat;
}
//编写一字节数据到ISP/IAP/EEPROM区域 输入:地址和数据
void IapProgramByte(uint addr,uchar dat)
{
IAP_CONTR=ENABLE_IAP; //开启IAP功能 设置等待时间
IAP_CMD=CMD_PROGRAM; //设置ISP/IAP命令寄存器为字节编程(从用户的应用程序区对“Data Flash/EEPROM区”进行字节编程)
IAP_ADDRL=addr; //设置操作数据地址低8位
IAP_ADDRH=addr>>8; //设置操作数据地址高8位
IAP_DATA=dat; //写入数据到数据寄存器
IAP_TRIG=0x46; //发送触发命令0x46
IAP_TRIG=0xb9; //发送完0x46和0xb9ISP/IAP命令生效
_nop_(); //MCU将会“挂起”直到ISP/IAP/EEPROM 操作完成
IapIdle();
}
//擦出1扇区 输入:扇区首地址
void IapEraseSector(uint addr)
{
IAP_CONTR=ENABLE_IAP; //开启IAP功能 设置等待时间
IAP_CMD=CMD_ERASE; //设置ISP/IAP命令寄存器为擦写
IAP_ADDRL=addr; //设置操作数据地址低8位
IAP_ADDRH=addr>>8; //设置操作数据地址高8位
IAP_TRIG=0x46; //发送触发命令0x46
IAP_TRIG=0xb9; //发送完0x46和0xb9ISP/IAP命令生效
_nop_(); //MCU将会“挂起”直到ISP/IAP/EEPROM 操作完成
IapIdle();
}
void display();
void main()
{
uchar i;
while(1)
{
if(aa==0)
{
for(i=0;i<8;i++)
{
IapEraseSector(IAP_ADDRESS+i); //擦除扇区
}
aa=1;
}
}
}
评论0