|
STC单片机内部FLASH读写程序
电子伙伴 发表于 2006-4-11 16:26:00
/********************************************************************
//模 块 名:STC单片机内部FLASH读写程序
//创 建 者:电子伙伴 日期:2006-4-11 16:13
//修 改 者: 日期:
//功能描述:
//其他说明:参考宏晶提供的C源代码再减肥一下
//芯片型号: STC89C58RD 50MHz晶振,双倍数振荡频率 单指令周期为0.12us
//配 置:
//版 本:V1.0
本程序功能调试通过
注: 本程序只供学习使用,未经作者允许,不能用于其它任何用途
********************************************************************/
//#i nclude "STC89C51.h"
//#i nclude
/* 定义常量 */
#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;
}
|
|