载入中...





站长个人入口

载入中...


公告
载入中...


我的分类(专题)
载入中...


日志更新
载入中...


最新评论
载入中...


留言板
载入中...


链接

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


阅读全文 | 回复(2) | 引用通告 | 编辑
 


回复:STC单片机内部FLASH读写程序
ly(游客)发表评论于2006-8-2 14:19:00
ly(游客)

有没有数据串读写的汇编程序啊


个人主页 | 引用 | 返回 | 删除 | 回复
 


发表评论:
载入中...