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

📄 iaptest.c

📁 iap test for arm lpc2104
💻 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 + -