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

📄 rack_iap.h

📁 关于远程升级
💻 H
字号:
#define   Rack_IAP_Def

/* 移值IAP演示程序  刘国兵 2006-7-4 */
/*
在IAP程序中,应注意以下问题
    1. IAP服务代码是Thumb指令,所以调用时要进行处理器状态切换或使用BX指令调用,若使用C程序直接调用,请设置编译参数-apcs /interwork
    2. IAP占用片内RAM的最高端的32字节空间,如果用户要使用IAP功能,那么请保留这部分RAM 
      (此项目中我已修改"Startup.s"文件 " MSR     CPSR_c, #0xdf  
                                          LDR     SP, =StackUsr-32")"
    3. 调用IAP功能前,要关闭PLL、MAM部件及所有中断
*/

//#define IAP_ENTER_ADR   0x7FFFFFF1  // IAP入口地址定义

/* 定义IAP命令字 */
                                    //   命令           参数
#define     IAP_SELECTOR        50  // 选择扇区     【起始扇区号、结束扇区号】
#define     IAP_RAMTOFLASH      51  // 拷贝数据     【FLASH目标地址、RAM源地址、写入字节数、系统时钟频率】
#define     IAP_ERASESECTOR     52  // 擦除扇区     【起始扇区号、结束扇区号、系统时钟频率】
#define     IAP_BLANKCHK        53  // 查空扇区     【起始扇区号、结束扇区号】
#define     IAP_READPARTID      54  // 读器件ID     【无】
#define     IAP_BOOTCODEID      55  // 读Boot版本号 【无】
#define     IAP_COMPARE         56  // 比较命令     【Flash起始地址、RAM起始地址、需要比较的字节数】

/* 定义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

//IAP address define
#define     IAP_Sector_Start     7
#define     IAP_Sector_End       7
#define     IAP_RAM_Start        0x40000500
#define     IAP_Flash_Start      0x00007000
#define     IAP_Number           256

/* 定义CCLK值大小,单位为KHz */
#define  IAP_FCCLK               (Fosc/1000)

/* 定义函数指针 */
//extern void (*IAP_Entry)(uint32 param_tab[], uint32 result_tab[]);

extern uint32  paramin[8];                         // IAP入口参数缓冲区
extern uint32  paramout[8];                        // IAP出口参数缓冲区

   
/*
*******************************************************************************************************
** 函数名称:IAP_Write_SADDR()
** 函数功能:IAP函数调用,对flash进行program。
** 因LPC22xx与LPC2132扇区不同,其程序中 IAP_MARK1 与 IAP_MARK2处做适当修改
** 注:LPC2103 flash扇区分布
**      共8个扇区,每扇区4KB
**      如:
**          扇区号 0  0x0000 0000 -> 0x0000 0fff
**          扇区号 7  0x0000 7000 -> 0x0000 7fff
**     LPC22xx每扇区8KB(注:当 flash size >= 256KB 时,扇区大小不一至)
*******************************************************************************************************
*/
extern uint8 IAP_Write_SADDR(void);
    
/*
*********************************************************************************************************
** 函数名称:SelSector()
** 函数功能:IAP操作扇区选择,命令代码50。
** 入口参数:sec1        起始扇区
**           sec2        终止扇区
** 出口参数:IAP操作状态码
**           IAP返回值(paramout缓冲区)
*******************************************************************************************************
*/
extern uint32  SelSector(uint8 sec1, uint8 sec2);

/*
*******************************************************************************************************
** 函数名称:RamToFlash()
** 函数功能:复制RAM的数据到FLASH,命令代码51。
** 入口参数:dst        目标地址,即FLASH起始地址。以512字节为分界
**           src        源地址,即RAM地址。地址必须字对齐
**           no         复制字节个数,为512/1024/4096/8192
** 出口参数:IAP操作状态码
**           IAP返回值(paramout缓冲区)
*******************************************************************************************************
*/
extern uint32  RamToFlash(uint32 dst, uint32 src, uint32 no);

/*
*******************************************************************************************************
** 函数名称:EraseSector()
** 函数功能:扇区擦除,命令代码52。
** 入口参数:sec1       起始扇区
**           sec2       终止扇区
** 出口参数:IAP操作状态码
**           IAP返回值(paramout缓冲区)
*******************************************************************************************************
*/
extern uint32  EraseSector(uint8 sec1, uint8 sec2);

/*
*******************************************************************************************************
** 函数名称:BlankCHK()
** 函数功能:扇区查空,命令代码53。
** 入口参数:sec1       起始扇区
**           sec2       终止扇区
** 出口参数:IAP操作状态码
**           IAP返回值(paramout缓冲区)
*******************************************************************************************************
*/
extern uint32  BlankCHK(uint8 sec1, uint8 sec2);

/*
*******************************************************************************************************
** 函数名称:ReadParID()
** 函数功能:扇区查空,命令代码53。
** 入口参数:无
** 出口参数:IAP操作状态码
**           IAP返回值(paramout缓冲区)
*******************************************************************************************************
*/
extern uint32  ReadParID(void);

/*
*******************************************************************************************************
** 函数名称:BootCodeID()
** 函数功能:读取boot代码版本号,命令代码55。
** 入口参数:无
** 出口参数:IAP操作状态码
**           IAP返回值(paramout缓冲区)
*******************************************************************************************************
*/
extern uint32  BootCodeID(void);

/*
*******************************************************************************************************
** 函数名称:Compare()
** 函数功能:校验数据,命令代码56。
** 入口参数:dst        目标地址,即RAM/FLASH起始地址。地址必须字对齐
**           src        源地址,即FLASH/RAM地址。地址必须字对齐
**           no         复制字节个数,必须能被4整除
** 出口参数:IAP操作状态码
**           IAP返回值(paramout缓冲区)
*******************************************************************************************************
*/
extern uint32  Compare(uint32 dst, uint32 src, uint32 no);

⌨️ 快捷键说明

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