#include #include "CRC.h" #include "iap.h" //以下两个指针必须是xdata类型 unsigned char xdata *p_info_addr; //指向信息存储器区域 - 读写 unsigned char xdata *p_write_app_addr; //指向app区域 - 写 unsigned char code *p_read_app_addr; //指向app区域 - 读 static bit iap_flag=0; //0:正常 1:异常 unsigned char CheckBuf[20]={0}; //读取升级标记的数组 /****************************************************************************************** ** 函数名称: erasure_INFO_page ** 函数描述: 擦除信息存储器区域的一页数据 ** 输入参数: 地址 ** 输出参数: 状态:0 正常, 1 异常 *******************************************************************************************/ static bit erasure_INFO_page(unsigned int addr) { unsigned char temp_ea; if(addr < 0x800) //INFO区 5~8,用户可写 { return 1; //返回异常值 } iap_flag = 0; //iap_flag标志清零 temp_ea = EA; EA = 0; LVRCON = LVRCON|0x10; //关闭LVR p_info_addr = (unsigned char *)addr; AUX2 = AUX2&0xF9|0x06; //设置IAP超时时间 //写入0XA1和0xBA, 开启 INFO 区域擦除 IAPWE_SFR=0XA1; IAPWE_SFR=0XBA; //INFO区域不需要设置 SWCMD 寄存器 *p_info_addr = 0; //触发页擦除 if(IAPWE_SFR & IAPTO) //置位表示超时 { iap_flag = 1; //iap_flag标志置位 } AUX2 = AUX2&0xF9; //关闭IAP看门狗 IAPWE_SFR = 0x00; //禁止IAP擦除 SWCMD = 0x00; //关闭IAP权限 LVRCON = LVRCON&~0x10; //开启LVR EA = temp_ea; return iap_flag; } /****************************************************************************************** ** 函数名称: read_INFO_byte ** 函数描述: 读取信息存储器区域的数据 ** 输入参数: 地址 数组的首地址、长度 ** 输出参数: 无 *******************************************************************************************/ static void read_INFO_byte(unsigned int addr, unsigned char *buf, unsigned int len) { unsigned int i; p_info_addr =(unsigned char*)addr; for(i = 0; i