部分程序:<br />/******************************************************************/<br />/* H */<br />#ifndef _IAP_H<br />#define _IAP_H<br /><br />/* 定义IAP命令字 */<br />#define IAP_SELSECTOR 50<br />#define IAP_RAMTOFLASH 51<br />#define IAP_ERASESECTOR 52<br />#define IAP_BLANKCHK 53<br />#define IAP_READPARTID 54<br />#define IAP_BOOTCODEID 55<br />#define IAP_COMPARE 56<br /><br />/* 定义IAP返回状态字 */<br />#define CMD_SUCCESS 0<br />#define INVALID_COMMAND 1<br />#define SRC_ADDR_ERROR 2<br />#define DST_ADDR_ERROR 3<br />#define SRC_ADDR_NOT_MAPPED 4<br />#define DST_ADDR_NOT_MAPPED 5<br />#define COUNT_ERROR 6<br />#define INVALID_SECTOR 7<br />#define SECTOR_NOT_BLANK 8<br />#define SECTOR_NOT_PREPARED_FOR_WRITE_OPERATION 9<br />#define COMPARE_ERROR 10<br />#define BUSY 11<br />#define PARAM_ERROR 12 /* Insufficient number of parameters */<br />#define ADDR_ERROR 13 /* Address not on word boundary */<br />#define ADDR_NOT_MAPPED 14<br />#define CMD_LOCKED 15 /* Command is locked */<br />#define INVALID_CODE 16 /* Unlock code is invalid */<br />#define INVALID_BAUD_RATE 17<br />#define INVALID_STOP_BIT 18<br /><br />void SelSector(unsigned char sec1, unsigned char sec2);<br />void RamToFlash(unsigned int dst, unsigned int src, unsigned int no);<br />void EraseSector(unsigned char sec1, unsigned char sec2);<br />void BlankCHK(unsigned char sec1, unsigned char sec2);<br />void ReadParID(void);<br />void BootCodeID(void);<br />void Compare(unsigned int dst, unsigned int src, unsigned int no);<br /><br /><br />#endif<br /><br />/*******************************************************************/<br />/* C */<br />#define iap_entry(a, b) ((void (*)())(0x7ffffff1))(a, b)<br /><br />unsigned int paramin[8]; /* IAP入口参数缓冲区 */<br />unsigned int paramout[8]; /* IAP出口参数缓冲区 */<br /><br />/****************************************************************************<br />* 名称:SelSector()<br />* 功能:IAP操作扇区选择,命令代码50。<br />* 入口参数:sec1 起始扇区<br />* sec2 终止扇区<br />* 出口参数:IAP返回值(paramout缓冲区)<br />****************************************************************************/<br />void SelSector(unsigned char sec1, unsigned char sec2)<br />{<br /> paramin[0] = IAP_SELSECTOR; // 设置命令字<br /> paramin[1] = sec1; // 设置参数<br /> paramin[2] = sec2;<br /> iap_entry(paramin, paramout); // 调用IAP服务程序<br />}<br /><br />/****************************************************************************<br />* 名称:RamToFlash()<br />* 功能:复制RAM的数据到FLASH,命令代码51。<br />* 入口参数:dst 目标地址,即FLASH起始地址。以512字节为分界<br />* src 源地址,即RAM地址。地址必须字对齐<br />* no 复制字节个数,为512/1024/4096/8192<br />* 出口参数:IAP返回值(paramout缓冲区)<br />****************************************************************************/<br />void RamToFlash(unsigned int dst, unsigned int src, unsigned int no)<br />{<br /> paramin[0] = IAP_RAMTOFLASH; // 设置命令字<br /> paramin[1] = dst; // 设置参数<br /> paramin[2] = src;<br /> paramin[3] = no;<br /> paramin[4] = 44236; // 当不使用PLL功能时,Fcclk=Fosc<br /> iap_entry(paramin, paramout); // 调用IAP服务程序<br />}<br /><br />/****************************************************************************<br />* 名称:EraseSector()<br />* 功能:扇区擦除,命令代码52。<br />* 入口参数:sec1 起始扇区<br />* sec2 终止扇区<br />* 出口参数:IAP返回值(paramout缓冲区)<br />****************************************************************************/<br />void EraseSector(unsigned char sec1, unsigned char sec2)<br />{<br /> paramin[0] = IAP_ERASESECTOR; // 设置命令字<br /> paramin[1] = sec1; // 设置参数<br /> paramin[2] = sec2;<br /> paramin[3] = 44236; // 当不使用PLL功能时,Fcclk=Fosc<br /> iap_entry(paramin, paramout); // 调用IAP服务程序<br />}<br /><br />/****************************************************************************<br />* 名称:BlankCHK()<br />* 功能:扇区查空,命令代码53。<br />* 入口参数:sec1 起始扇区<br />* sec2 终止扇区<br />* 出口参数:IAP返回值(paramout缓冲区)<br />****************************************************************************/<br />void BlankCHK(unsigned char sec1, unsigned char sec2)<br />{<br /> paramin[0] = IAP_BLANKCHK; // 设置命令字<br /> paramin[1] = sec1; // 设置参数<br /> paramin[2] = sec2;<br /> iap_entry(paramin, paramout); // 调用IAP服务程序<br />}<br /><br />/****************************************************************************<br />* 名称:ReadParID()<br />* 功能:扇区查空,命令代码53。<br />* 入口参数:无<br />* 出口参数:IAP返回值(paramout缓冲区)<br />****************************************************************************/<br />void ReadParID(void)<br />{<br /> paramin[0] = IAP_READPARTID; // 设置命令字<br /> iap_entry(paramin, paramout); // 调用IAP服务程序<br />}<br /><br />/****************************************************************************<br />* 名称:BootCodeID()<br />* 功能:读取boot代码版本号,命令代码55。<br />* 入口参数:无<br />* 出口参数:IAP返回值(paramout缓冲区)<br />****************************************************************************/<br />void BootCodeID(void)<br />{<br /> paramin[0] = IAP_BOOTCODEID; // 设置命令字<br /> iap_entry(paramin, paramout); // 调用IAP服务程序<br />}<br /><br />/****************************************************************************<br />* 名称:Compare()<br />* 功能:校验数据,命令代码56。<br />* 入口参数:dst 目标地址,即RAM/FLASH起始地址。地址必须字对齐<br />* src 源地址,即FLASH/RAM地址。地址必须字对齐<br />* no 复制字节个数,必须能被4整除<br />* 出口参数:IAP返回值(paramout缓冲区)<br />****************************************************************************/<br />void Compare(unsigned int dst, unsigned int src, unsigned int no)<br />{<br /> paramin[0] = IAP_COMPARE; // 设置命令字<br /> paramin[1] = dst; // 设置参数<br /> paramin[2] = src;<br /> paramin[3] = no;<br /> iap_entry(paramin, paramout); // 调用IAP服务程序<br />}<br />
|