LPC1100处理器SD卡升级应用程序
下面先介绍LPC1100处理器IAP的基础知识:
1. LPC1100处理器(LPC1114)Flash分配:LPC1114一共有32K Flash,共分为8个扇区,每个扇区的大小为4K,具体如下:

2.NXP的IAP命令都一样,一共有9条:

3.IAP命令是通过寄存器R0和R1进行参数传递的,R0传递参数,R1传递返回值:

IAP功能应用:
1.定义IAP程序的入口地址
代码:
#define IAP_ENTER_ADR 0x1FFF1FF1 /* IAP入口地址定义 */
2.定义参数
代码:
uint32 ParamIn[8]; /* IAP入口参数缓冲区 */
uint32 ParamOut[8];/* IAP出口参数缓冲区 */
3.定义函数类型指针
代码:
void (*IAP_Entry)(uint32 *param_tab, uint32 *result_tab) =
(void(*)())IAP_ENTER_ADR; // 定义函数指针
4.注意事项:
①按照上面函数类型调用IAP函数即可,不过要注意函数的参数。
②由于在擦写操作期间,片上Flash存储器不可访问。IAP代码不能使用或禁止中断。
③Flash编程命令使用片上RAM顶端32字节,用户程序不能使用此空间。
IAP命令应用(代码来自周工):
1.准备写操作扇区

代码:
/*****************************************************************************
** Function name: SectorPrepare
** Descriptions: IAP操作扇区选择,命令代码50
** input parameters: sec1: 起始扇区
** sec2: 终止扇区
** output parameters: ParamOut[0]: IAP操作状态码,IAP返回值
** Returned value: ParamOut[0]: IAP操作状态码,IAP返回值
*******************************************************************************/
uint32 SectorPrepare(uint8 sec1, uint8 sec2)
{
ParamIn[0] = IAP_Prepare;/* 设置命令字 */
ParamIn[1] = sec1; /* 设置参数*/
ParamIn[2] = sec2;
(*IAP_Entry)(ParamIn, ParamOut);/* 调用IAP服务程序 */
return (ParamOut[0]); /* 返回状态码*/
}
2.将RAM 内容复制到Flash

代码:
/*******************************************************************************
** Function name: RamToFlash
** Descriptions: 复制RAM的数据到FLASH,命令代码51
** input parameters: dst: 目标地址,即FLASH起始地址。以512字节为分界
** src: 源地址,即RAM地址。地址必须字对齐
** no: 复制字节个数,为512/1024/4096/8192
** output parameters: ParamOut[0]: IAP操作状态码,IAP返回值
** Returned value: ParamOut[0]: IAP操作状态码,IAP返回值
********************************************************************************/
uint32 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服务程序*/
return (ParamOut[0]); /* 返回状态码*/
}
3.擦除扇区

代码:
/*******************************************************************************
** Function name: SectorErase
** Descriptions: 扇区擦除,命令代码52
** input parameters: sec1 起始扇区
** sec2 终止扇区92
** output parameters: ParamOut[0]: IAP操作状态码,IAP返回值
** Returned value: ParamOut[0]: IAP操作状态码,IAP返回值
********************************************************************************/
uint32 SectorErase(uint8 sec1, uint8 sec2)
{
ParamIn[0] = IAP_ERASESECTOR; /* 设置命令字 */
ParamIn[1] = sec1; /* 设置参数 */
ParamIn[2] = sec2;
ParamIn[3] = IAP_FCCLK;
(*IAP_Entry)(ParamIn, ParamOut);/* 调用IAP服务程序 */
return (ParamOut[0]); /* 返回状态码 */
}
4.扇区查空

代码:
/**********************************************************************************
** Function name: BlankChk
** Descriptions: 扇区查空,命令代码53
** input parameters: sec1: 起始扇区
** sec2: 终止扇区92
** output parameters: ParamOut[0]: IAP操作状态码,IAP返回值
** Returned value: ParamOut[0]: IAP操作状态码,IAP返回值
**********************************************************************************/
uint32 BlankChk(uint8 sec1, uint8 sec2)
{
ParamIn[0] = IAP_BLANKCHK; /* 设置命令字 */
ParamIn[1] = sec1;/* 设置参数 */
ParamIn[2] = sec2;
(*IAP_Entry)(ParamIn, ParamOut);/* 调用IAP服务程序 */
LPC1100处理器SD卡升 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)
