|
void ISP_IAP_enable(void) /* ================ 打开 ISP,IAP 功能 ================= */
{
EA = 0; /* 关中断 */
ISP_CONTR = ISP_CONTR & 0x18; /* (0001,1000) **ISP/IAP 控制寄存器复位*/
ISP_CONTR = ISP_CONTR | WaitTime; /* 写入硬件延时 */
ISP_CONTR = ISP_CONTR | 0x80; /*(10000000) ISPEN=1 在ISPEN(ISP_CONTR.7) =1时,
(解释当ISPCONTR的最高位=1时有效,)
对ISP_TRIG (命令触发寄存器)先写入46h,再写入B9h,ISP/IAP命令才会生效。*/
}
void ISP_IAP_disable(void) /* =============== 关闭 ISP,IAP 功能 ================== */
{
ISP_CONTR = ISP_CONTR & 0x7f; /* ISPEN = 0 */
ISP_TRIG = 0x00;
EA = 1; /* 开中断 */
}
void ISPgoon(void) /* ================ 公用的触发代码 ==================== */
{
ISP_IAP_enable(); /* 打开 ISP,IAP 功能 第47行有定义*/
ISP_TRIG = 0x46; /* 触发ISP_IAP命令字节1,(解释)在ISPEN(ISP_CONTR.7) =1时,
(解释当ISPCONTR的最高位=1时有效,)
对ISP_TRIG (命令触发寄存器)先写入46h,再写入B9h,ISP/IAP命令才会生效。 */
ISP_TRIG = 0xb9; /* 触发ISP_IAP命令字节2 */
_nop_();
}
unsigned char byte_read(unsigned int byte_addr) /* ========= 字节读 ============= */
{
ISP_ADDRH = (unsigned char)(byte_addr >> 8);/* 读出byte_addr的高八位;
如果byte_addr是16位的,就是把byte_addr的高八位
赋值给一个unsigned char类型的变量:ISP_ADDRH*/
ISP_ADDRL = (unsigned char)(byte_addr & 0x00ff); /* 读出byte_addr的低八位;*/
ISP_CMD = ISP_CMD & 0xf8; /* (11111000)清除低3位 */
ISP_CMD = ISP_CMD | RdCommand; /* 写入读命令 */
ISPgoon(); /* 触发执行 */
ISP_IAP_disable(); /* 关闭ISP,IAP功能 */
return (ISP_DATA); /* 返回读到的数据 */
}
void SectorErase(unsigned int sector_addr) /* =========== 扇区擦除 ============ */
{
unsigned int iSectorAddr;
iSectorAddr = (sector_addr & 0xfe00); /* 取扇区地址 */
ISP_ADDRH = (unsigned char)(iSectorAddr >> 8);
ISP_ADDRL = 0x00;
ISP_CMD = ISP_CMD & 0xf8; /* 清空低3位 (注释)清楚后待机模式,无ISP操作 */
ISP_CMD = ISP_CMD | EraseCommand; /* 擦除命令3 前面定义过#define EraseCommand 0x03
(00000011)对用户的应用程序flash区及数据flash区扇区擦除*/
ISPgoon(); /* 触发执行 */
ISP_IAP_disable(); /* 关闭ISP,IAP功能 */
}
void byte_write(unsigned int byte_addr, unsigned char original_data) /* ==== 字节写 ==== */
{
ISP_ADDRH = (unsigned char)(byte_addr >> 8); /* 取出高八位 */
ISP_ADDRL = (unsigned char)(byte_addr & 0x00ff); /*取出低八位*/
ISP_CMD = ISP_CMD & 0xf8; /* 清低3位 意思就是将第三位全部清0再在下边的prgcommand(00000010)进行或运算得(*****010)*/
ISP_CMD = ISP_CMD | PrgCommand; /* 写命令2 (注释)(*****010)对用户的应用程序flash区及数据flash区字节编程*/
ISP_DATA = original_data; /* 写入数据准备 注释:DATA为数据寄存器*/
ISPgoon(); /* 触发执行 */
ISP_IAP_disable(); /* 关闭IAP功能 */
}
|
|