微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > LPC1100处理器通过SD卡实现IAP功能

LPC1100处理器通过SD卡实现IAP功能

时间:11-27 来源:互联网 点击:
随着处理器的发展,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程序的入口地址

代码:

#defineIAP_ENTER_ADR 0x1FFF1FF1

2.定义参数

代码:

uint32ParamIn[8];
uint32ParamOut[8];

3.定义函数类型指针

代码:

void (*IAP_Entry)(uint32 *param_tab, uint32 *result_tab) =

(void(*)())IAP_ENTER_ADR; // 定义函数指针

4.注意事项:

①按照上面函数类型调用IAP函数即可,不过要注意函数的参数。

②由于在擦写操作期间,片上Flash存储器不可访问。IAP代码不能使用或禁止中断。

③Flash编程命令使用片上RAM顶端32字节,用户程序不能使用此空间。

IAP命令应用(代码来自周工):

IAP有多个命令,这里我们只把编程常用的几个命令函数贴出来,如果网友需要其他代码可以在网络上自行搜索。

1.准备写操作扇区

代码:

uint32 SectorPrepare(uint8 sec1, uint8 sec2)
{
ParamIn[0] = IAP_Prepare;
ParamIn[1] = sec1;
ParamIn[2] = sec2;
(*IAP_Entry)(ParamIn, ParamOut);

return (ParamOut[0]);
}

2.将RAM 内容复制到Flash

代码:

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);

return (ParamOut[0]);
}

3.擦除扇区

代码:

uint32 SectorErase(uint8 sec1, uint8 sec2)
{
ParamIn[0] = IAP_ERASESECTOR;
ParamIn[1] = sec1;
ParamIn[2] = sec2;
ParamIn[3] = IAP_FCCLK;
(*IAP_Entry)(ParamIn, ParamOut);

return (ParamOut[0]);
}

4.扇区查空


代码:

uint32 BlankChk(uint8 sec1, uint8 sec2)
{
ParamIn[0] = IAP_BLANKCHK;
ParamIn[1] = sec1;
ParamIn[2] = sec2;
(*IAP_Entry)(ParamIn, ParamOut);

return (ParamOut[0]);
}

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

代码:

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);

return (ParamOut[0]);
}

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

1.定义用户程序地址

定义用户程序的起始地址,用户可以根据自己的实际情况设定,一般都从0x0000 0000开始存放IAP代码,之后的空间才是存放用户代码的。

代码:

#define APP_CODE_START_ADDR0x00006000// 用户程序起始地址

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

从SD卡中升级程序很简单。流程是:从SD卡中打开升级文件,每次读取512字节,然后写入Flash,直到编写完成。

IAP支持256/512/1024/2048/4096等多字节编程方式,只是SD卡每扇区大小一般都是512字节,所以这里使用512字节为单位进行编程。

代码:
uint8 UCSDCardProgram(uint8 *fileName, uint8 *buf)
{
uint32 addr = 0;
FATFS fs;
FIL file;
UINTbr;
FRESULT res;

DisableIRQ();// 禁止中断
SectorPrepare(6, 6);// 选择扇区
SectorErase(6, 6);// 擦除扇区
EnableIRQ();// 使能中断


f_mount(0, &fs);


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;
}
}
}


f_close(&file);// 关闭文件,必须和f_open函数成对出现


f_mount(0, 0);

return FR_OK;
}

3.主函数:

主函数实现按键扫描,如果有按键,进行SD卡升级,如果没有按键直接跳转到应用程序。

代码一开始判断按键,所以一般都是需要按下按键后复位系统,当然也可以适当循环扫描按键的次数。等待一定的时间。。。。。。。

代码:

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程序完成了,

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

网站地图

Top