微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > LPC1100处理器SD卡升级应用程序

LPC1100处理器SD卡升级应用程序

时间:11-10 来源:互联网 点击:
随着处理器的发展,IAP升级方式越来越受到欢迎。而IAP升级的方式也由很多,如:通过串口升级、GPRS远程升级、SD卡升级等等。这里详细介绍怎样使用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服务程序 */

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top