📄 rack_iap.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 + -