|
/******************************************************************** //模 块 名:STC单片机内部FLASH读写程序 //创 建 者:电子伙伴 日期:2006-4-11 16:13 //修 改 者: 日期: //功能描述: //其他说明:参考宏晶提供的C源代码再减肥一下 //芯片型号: STC89C58RD 50MHz晶振,双倍数振荡频率 单指令周期为0.12us //配 置: //版 本:V1.0
本程序功能调试通过 注: 本程序只供学习使用,未经作者允许,不能用于其它任何用途 ********************************************************************/ //#i nclude "STC89C51.h" //#i nclude <intrins.h>
/* 定义常量 */ #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 WAIT_TIME 0x03 //mcu clock 5mhz
/* 定义几个数据存储的位置 *//* MCU: STC89C58RD */ #define HOUR 0x8000 #define MINUTE 0x8001
/* 打开 ISP,IAP 功能 */ void ISP_EN(void) { EA = 0; // 关中断 ISP_CONTR = ISP_CONTR & 0x18; // 0001,1000 ISP_CONTR = ISP_CONTR | WAIT_TIME; ISP_CONTR = ISP_CONTR | 0x80; // 1000,0000 }
/* 关闭 ISP,IAP 功能 */ void ISP_DI(void) { ISP_CONTR = ISP_CONTR & 0x7f; // 0111,1111 ISP_TRIG = 0x00; EA = 1; // 开中断 }
/* 字节读 *//* 程序执行时间15us,指令周期为0.12us */ 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; // 1111,1000 ISP_CMD = ISP_CMD | 0x01; // 0000,0001 字节读数据存储区
ISP_EN();
ISP_TRIG = 0x46; ISP_TRIG = 0xb9; _nop_();
ISP_DI(); return (ISP_DATA); }
/* 扇区擦除 *//* 程序执行时间10ms,指令周期为0.12us */ void Sector_erase(unsigned int Sector_addr) { unsigned char addre; addre = (unsigned char)(Sector_addr >> 8); // 1111,1110,0000,0000; 取扇区地址 ISP_ADDRH = addre&0xfe; ISP_ADDRL = 0x00; ISP_CMD = ISP_CMD & 0xf8; // 1111,1000 ISP_CMD = ISP_CMD | 0x03; // 0000,0011 扇区擦除数据存储区 ISP_EN(); ISP_TRIG = 0x46; // 触发ISP_IAP命令 ISP_TRIG = 0xb9; // 触发ISP_IAP命令 _nop_();
ISP_DI(); }
/* 字节编程 *//* 程序执行时间64us,指令周期为0.12us */ void Byte_program(unsigned int byte_addr, unsigned char DataBuf) { ISP_ADDRH = (unsigned char)(byte_addr >> 8); ISP_ADDRL = (unsigned char)(byte_addr & 0x00ff);
ISP_CMD = ISP_CMD & 0xf8; // 1111,1000 ISP_CMD = ISP_CMD | 0x02; // 0000,0010 字节编程数据存储区 ISP_DATA = DataBuf;
ISP_EN(); ISP_TRIG = 0x46; // 触发ISP_IAP命令 ISP_TRIG = 0xb9; // 触发ISP_IAP命令 _nop_();
ISP_DI(); }
/* 字节编程并校验 */ unsigned char ByteProgramVerify(unsigned int byte_addr, unsigned char DataBuf) { ISP_ADDRH = (unsigned char)(byte_addr >> 8); ISP_ADDRL = (unsigned char)(byte_addr & 0x00ff);
ISP_CMD = ISP_CMD & 0xf8; // 1111,1000 ISP_CMD = ISP_CMD | 0x02; // 0000,0010 字节编程数据存储区 ISP_DATA = DataBuf;
ISP_EN();
ISP_TRIG = 0x46; ISP_TRIG = 0xb9; _nop_();
ISP_DATA = 0x00;
ISP_CMD = ISP_CMD & 0xf8; // 1111,1000 ISP_CMD = ISP_CMD | 0x01; // 0000,0001
ISP_TRIG = 0x46; // 触发ISP_IAP命令 ISP_TRIG = 0xb9; // 触发ISP_IAP命令 _nop_();
ISP_DI();
if(ISP_DATA==DataBuf) return OK; else return ERROR; }
STCISP.rar
|