您的位置 首页 5G

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

随着处理器的发展,IAP升级方式越来越受到欢迎。而IAP升级的方式也由很多,如:通过串口升级、GPRS远程升级、SD卡升级等等。这里详细介绍怎…

跟着处理器的开展,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服务程序 */

return (ParamOut[0]);/* 回来状况码*/
}

5.比较<地址1><地址2><字节数>

代码:

/*******************************************************************************
** Function name: DataCompare
** Descriptions: 校验数据,指令代码56
** input parameters: dst: 方针地址,即RAM/FLASH开始地址。地址有必要字对齐
** src: 源地址,即FLASH/RAM地址。地址有必要字对齐
** no: 仿制字节个数,有必要能被4整除
** output parameters: ParamOut[0]: IAP操作状况码,IAP回来值
** Returned value: ParamOut[0]: IAP操作状况码,IAP回来值
********************************************************************************/
uint32 DataCompare(uint32 dst, uint32 src, uint32 no)
{
ParamIn[0] = IAP_COMPARE; /* 设置指令字 */
ParamIn[1] = dst; /* 设置参数 */
ParamIn[2] = src;
ParamIn[3] = no;
(*IAP_Entry)(ParamIn, ParamOut); /* 调用IAP服务程序 */

return (ParamOut[0]); /* 回来状况码 */
}

有上面的几个函数后,下面就可以根据需求编写SD卡晋级函数了:

1.界说用户程序地址

代码:

#define APP_CODE_START_ADDR 0x00006000 // 用户程序开始地址

2.从SD卡中读写bin文件更新晋级

从SD卡中晋级程序很简单,从SD卡中翻开晋级文件,每次读取512自己,然后写入Flash,直到编写完结。

代码:

/**********************************************************************************
* FunctionName : UCSDCardProgram()
* Description : 从SD卡编程
* EntryParameter : fileName – 运用程序在SD卡中的姓名, buf – 缓冲
* ReturnValue : None
*********************************************************************************/
uint8 UCSDCardProgram(uint8 *fileName, uint8 *buf)
{
uint32 addr = 0;
FATFS fs; /*Work area (file system object) for logical drive*/
FIL file; /*file objects*/
UINT br; /*File R/W count*/
FRESULT res;

DisableIRQ();// 制止中止
SectorPrepare(6, 6); // 挑选扇区
SectorErase(6, 6); // 擦除扇区
EnableIRQ(); // 使能中止

/*Register a work area for logical drive 0*/
f_mount(0, &fs);

/*Create file*/
res = f_open(&file, (const TCHAR *)fileName, FA_OPEN_EXISTING|FA_READ);

if(res != FR_OK)
{
return res;
}
else
{
while (1)
{
res = f_read(&file, buf, 512, &br); // 读取数据

DisableIRQ();
SectorPrepare(6, 6);
RamToFlash(APP_CODE_START_ADDR + addr, (uint32)buf, 512); // 写数据到FLASH
EnableIRQ();
addr += 512;

if ((res != FR_OK) || (br < 512))
{
break;
}
}
}

/*Close all files*/
f_close(&file); // 封闭文件,有必要和f_open函数成对呈现

/*Unregister a work area before discard it*/
f_mount(0, 0);

return FR_OK;
}

3.主函数:

主函数完成按键扫描,假如有按键,进行SD卡晋级,假如没有按键直接跳转到运用程序

代码:

/**********************************************************************************
* FunctionName : main()
* Description : 主函数
* EntryParameter : None
* ReturnValue : None
*********************************************************************************/
int main(void)
{
void (*userProgram)() = (void (*)())OSInit; // 函数指针

OSInit(); // 初始化体系

while (1)
{
if (KeyGetValue())
{
UCSDCardProgram(\”LPC1114.bin\”, SDBuf);
}

userProgram = (void (*)())(APP_CODE_START_ADDR + 1);
(*userProgram)(); // 发动程序
}
}

到此IAP程序完结了,下面便是编写运用程序了。。。。。。。。。。。。。。。。。。。。。。

运用程序编写:

运用程序编写没有什么特别的,仅仅需求留意几个当地的设置

1.设置编译地址:

2.编译设置

3.生计bin文件

4.编写运用程序,并把bin文件寄存SD卡中,运转IAP晋级程序。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/yingyong/5g/276061.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部