⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 iaptest.c

📁 LPC2104的IAP编程示例代码
💻 C
字号:
/****************************************************************************  
* File:IAPTEST.C  
* 功能:LPC210x的IAP功能测试。  
* 说明:调用IAP服务程序,完成FLASH编程操作。  
****************************************************************************/   
#include  "config.h"    
   
#define IAP_ENTER_ADR   0x7FFFFFF1          /* IAP入口地址定义 */    
   
/* 定义IAP命令字 */   
#define  IAP_SELSECTOR        50    
#define  IAP_RAMTOFLASH       51    
#define  IAP_ERASESECTOR      52    
#define  IAP_BLANKCHK         53    
#define  IAP_READPARTID       54    
#define  IAP_BOOTCODEID       55    
#define  IAP_COMPARE          56    
   
/* 定义IAP返回状态字 */   
#define  CMD_SUCCESS          0    
#define  INVALID_COMMAND      1    
#define  SRC_ADDR_ERROR       2     
#define  DST_ADDR_ERROR       3    
#define  SRC_ADDR_NOT_MAPPED  4    
#define  DST_ADDR_NOT_MAPPED  5    
#define  COUNT_ERROR          6    
#define  INVALID_SECTOR       7    
#define  SECTOR_NOT_BLANK     8    
#define  SECTOR_NOT_PREPARED_FOR_WRITE_OPERATION 9    
#define  COMPARE_ERROR        10    
#define  BUSY                 11    
#define  PARAM_ERROR          12 /* Insufficient number of parameters */    
#define  ADDR_ERROR           13 /* Address not on word boundary */    
#define  ADDR_NOT_MAPPED      14    
#define  CMD_LOCKED           15 /* Command is locked */    
#define  INVALID_CODE         16 /* Unlock code is invalid */    
#define  INVALID_BAUD_RATE    17    
#define  INVALID_STOP_BIT     18    
   
/* 定义CCLK值大小,单位为KHz */   
#define  IAP_FCCLK            11059    
   
   
/* 定义函数指针 */   
void (*IAP_Entry)(uint32 param_tab[], uint32 result_tab[]);   
   
uint32  paramin[8];                         // IAP入口参数缓冲区    
uint32  paramout[8];                        // IAP出口参数缓冲区    
   
   
/****************************************************************************  
* 名称:SelSector()  
* 功能:IAP操作扇区选择,命令代码50。  
* 入口参数:sec1        起始扇区  
*          sec2        终止扇区  
* 出口参数:IAP返回值(paramout缓冲区)  
****************************************************************************/   
void  SelSector(uint8 sec1, uint8 sec2)   
{  paramin[0] = IAP_SELSECTOR;              // 设置命令字    
   paramin[1] = sec1;                       // 设置参数    
   paramin[2] = sec2;   
   (*IAP_Entry)(paramin, paramout);         // 调用IAP服务程序    
}   
   
   
/****************************************************************************  
* 名称:RamToFlash()  
* 功能:复制RAM的数据到FLASH,命令代码51。  
* 入口参数:dst        目标地址,即FLASH起始地址。以512字节为分界  
*          src        源地址,即RAM地址。地址必须字对齐  
*          no         复制字节个数,为512/1024/4096/8192  
* 出口参数:IAP返回值(paramout缓冲区)  
****************************************************************************/   
void  RamToFlash(uint32 dst, uint32 src, uint32 no)   
{  paramin[0] = IAP_RAMTOFLASH;             // 设置命令字    
   paramin[1] = dst;                        // 设置参数    
   paramin[2] = src;   
   paramin[3] = no;   
   paramin[4] = IAP_FCCLK;   
   (*IAP_Entry)(paramin, paramout);         // 调用IAP服务程序    
}   
   
   
/****************************************************************************  
* 名称:EraseSector()  
* 功能:扇区擦除,命令代码52。  
* 入口参数:sec1       起始扇区  
*          sec2       终止扇区  
* 出口参数:IAP返回值(paramout缓冲区)  
****************************************************************************/   
void  EraseSector(uint8 sec1, uint8 sec2)   
{  paramin[0] = IAP_ERASESECTOR;            // 设置命令字    
   paramin[1] = sec1;                       // 设置参数    
   paramin[2] = sec2;   
   paramin[3] = IAP_FCCLK;   
   (*IAP_Entry)(paramin, paramout);         // 调用IAP服务程序    
}   
   
/****************************************************************************  
* 名称:BlankCHK()  
* 功能:扇区查空,命令代码53。  
* 入口参数:sec1       起始扇区  
*          sec2       终止扇区  
* 出口参数:IAP返回值(paramout缓冲区)  
****************************************************************************/   
void  BlankCHK(uint8 sec1, uint8 sec2)   
{  paramin[0] = IAP_BLANKCHK;               // 设置命令字    
   paramin[1] = sec1;                       // 设置参数    
   paramin[2] = sec2;   
   (*IAP_Entry)(paramin, paramout);         // 调用IAP服务程序    
}   
   
   
/****************************************************************************  
* 名称:ReadParID()  
* 功能:扇区查空,命令代码53。  
* 入口参数:无  
* 出口参数:IAP返回值(paramout缓冲区)  
****************************************************************************/   
void  ReadParID(void)   
{  paramin[0] = IAP_READPARTID;             // 设置命令字    
   (*IAP_Entry)(paramin, paramout);         // 调用IAP服务程序    
}   
   
   
/****************************************************************************  
* 名称:BootCodeID()  
* 功能:读取boot代码版本号,命令代码55。  
* 入口参数:无  
* 出口参数:IAP返回值(paramout缓冲区)  
****************************************************************************/   
void  BootCodeID(void)   
{  paramin[0] = IAP_BOOTCODEID;             // 设置命令字    
   (*IAP_Entry)(paramin, paramout);         // 调用IAP服务程序    
}   
   
   
/****************************************************************************  
* 名称:Compare()  
* 功能:校验数据,命令代码56。  
* 入口参数:dst        目标地址,即RAM/FLASH起始地址。地址必须字对齐  
*          src        源地址,即FLASH/RAM地址。地址必须字对齐  
*          no         复制字节个数,必须能被4整除  
* 出口参数:IAP返回值(paramout缓冲区)  
****************************************************************************/   
void  Compare(uint32 dst, uint32 src, uint32 no)   
{  paramin[0] = IAP_COMPARE;                // 设置命令字    
   paramin[1] = dst;                        // 设置参数    
   paramin[2] = src;   
   paramin[3] = no;   
   (*IAP_Entry)(paramin, paramout);         // 调用IAP服务程序    
}   
   
   
   
/****************************************************************************  
* 名称:main()  
* 功能:IAP函数调用,测试。(没有进行出错处理)  
****************************************************************************/   
int  main(void)   
{  IAP_Entry = (void(*)())IAP_ENTER_ADR;    // 初始化函数指针IAP_Entry    
      
   ReadParID();   
   BootCodeID();   
      
   SelSector(1,1);                          // 选择扇区1    
   EraseSector(1,1);                        // 擦除扇区1    
   BlankCHK(1,1) ;                          // 查空扇区1    
      
   SelSector(1,1);    
   RamToFlash(0x00002000, 0x40000000, 512); // 写数据到扇区1     
   BlankCHK(1,1) ;   
   Compare(0x00002000, 0x40000000, 512);    // 比较数据    
      
   while(1);   
   return(0);   
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -