您的位置 首页 IC

LPC1768 IAP晋级解析及例程共享

1、IAP介绍IAP即inapplicatinprogramming在应用编程的缩写,指MCU可以在系统中获取新代码并对自己重新编程,即改变应用程序。它与我们所熟

1、IAP介绍

IAP即“inapplicatinprogramming”在运用编程的缩写,指MCU能够在体系中获取新代码并对自己从头编程,即改动运用程序。它与咱们所了解的ISP编程不同, LPC1768 的ISP编程接口为串口1,假如运用其他的串口或其他总线则不能对其进行编程。而咱们这儿所说的IAP经过下载一段引导程序Bootloader程序,假如咱们想要从串口2或网口更新运用程序,在Bootloader中初始化相应的串口或网口,使其接纳运用程序,将接纳到的运用程序写入到Flash里边,IAP完结后跳转到运用程序进口履行运用程序。所以现在的IAP程序涉及到两个概念:Bootloader和运用程序。

Bootloader:BootLoader便是在操作体系内核运转之前运转的一段小程序。经过这段小程序,咱们能够初始化硬件设备、树立内存空间映射图,从而将体系的软硬件环境带到一个适宜状况,以便为终究调用操作体系内核预备好正确的环境。这儿咱们所说的Bootloader也是体系开机前的一段小程序,其首要使命是用来初始化串口和IAP端口(网口CAN接口等)的,经过判别状况是否需求从IAP端口进行更新运用程序,若需求更新则从端口接纳运用程序,并寄存到指定的Flash里边,更新完结后则跳入到指定的Flash里边履行运用程序。

运用程序:即咱们需求开发板完结功用的程序,其间运用程序首要分为两种:hex文件和bin文件。在咱们常常运用的KEIL中默许编译生成的可履行文件(运用程序)为hex格局的,若需求编译生成bin格局需求做如下修正,参加“D:\Keil\ARM\ARMCC\bin\fromelf.exe–bin–output./Obj/Can_Updata.bin./Obj/test.axf”,从头编译生成的Can_Updata.bin文件寄存在Obj文件夹下。


2、bin格局文件与hex格局文件的差异

bin格局文件是朴实的二进制文件,运用下载其将其下载到开发板时其内容彻底不变,所以关于IAP下载运用bin格局文件是比较便利的,如下图是bin文件的内容与写入到开发板后运用仿真器观察到Flash寄存的内容(这段程序当然是能够履行的)。

Hex格局文件:Hex全称(IntelHEX)文件是由一行行契合IntelHEX文件格局的文本所构成的ASCII文本文件。在IntelHEX文件中,每一行包括一个HEX记载。这些记载由对应机器语言码和/或常量数据的十六进制编码数字组成。如下图是hex文件的部分数据,其组成由“:CCAAAARR…ZZ”,CC=10代表长度为16字节,AAAA=0000本条记载中的数据在存储区中的开端地址,RR=00,数据区,ZZ=38为校验,这儿就不做细心阐明晰。

3、LPC1768IAP原理

LPC1768复位后开端履行Boot代码,Boot代码能够履行ISP程序或用户的运用代码。产生硬件复位后,P2.10引脚为低电平,这就被当作发动ISP指令处理器的外部硬件恳求。假定在/RESET引脚上呈现上升沿时,电源引脚呈现正确的信号,那么在采样P2.10之前有3ms的时刻决定是履行用户代码仍是ISP处理程序。假如P2.10为低电平且看门狗溢出标志置位,那么疏忽发动ISP指令处理器的外部硬件恳求。在没有ISP指令处理器的恳求(硬件复位后P2.10引脚为高电平)时,将查找有用的用户程序。若发现有用的用户程序,履行操控权就被搬运给用户程序。若没有找到有用的用户程序,就将调用主动波特率程序。这儿不评论ISP下载及指令,有爱好的朋友能够检查LPC1768技能手册第三十二章ISP指令。

在IAP晋级中,程序正常履行即用户代码(这儿的用户代码是咱们所说的IAP引导程序),如下是IAP晋级流程图,程序将预留端口(这儿供给有串口和CAN总线接口两种)接纳到的APP程序bin文件,将接纳到的数据写入到指定的Flash区域(例程APP地址为0x00010000),程序经过IAP指令将数据写入到Flash里边,LPC1768供给了一系列IAP指令对片内Flash进行擦除编写等。

4、IAP指令

LPC1768经过IAP函数对片内Flash进行操作,IAP函数是固化在0x1FFF1FF1处的一个有传入参数和回来参数的一个函数,在LPC1768技能手册第三十二章IAP指令中有有详细的阐明。首要供给有如下指令:预备下操作扇区、将RAM内容仿制到Flash、铲除扇区、扇区查空、读器材ID、读boot版别、比较、从头调用ISP等。

�体; ����Sx�S��的外部硬件恳求。假定在/RESET引脚上呈现上升沿时,电源引脚呈现正确的信号,那么在采样P2.10之前有3ms的时刻决定是履行用户代码仍是ISP处理程序。假如P2.10为低电平且看门狗溢出标志置位,那么疏忽发动ISP指令处理器的外部硬件恳求。在没有ISP指令处理器的恳求(硬件复位后P2.10引脚为高电平)时,将查找有用的用户程序。若发现有用的用户程序,履行操控权就被搬运给用户程序。若没有找到有用的用户程序,就将调用主动波特率程序。这儿不评论ISP下载及指令,有爱好的朋友能够检查LPC1768技能手册第三十二章ISP指令。

5、串口IAP晋级

本例程是依据官方供给的串口IAP更新图片进行修正而来,直接运用官方的IAP.c文件,该文件中供给了如上图IAP指令的各种函数,其详细参数能够参阅IAP指令。依据官方例程里边将bmp图片经过串口选用Xmodem1K协议发送到开发板寄存在地址0x00010000,如下图是LPC1768Flash分配地址,第16~21扇区为运用程序寄存空间。这儿咱们即将传送的bmp图片改为传输运用程序bin文件

�体;q�kr�Sx�S255,255,255); mso-shading:rgb(255,255,255); ” >扇区查空、读器材ID、读boot版别、比较、从头调用ISP等。

�体; ����Sx�S��的外部硬件恳求。假定在/RESET引脚上呈现上升沿时,电源引脚呈现正确的信号,那么在采样P2.10之前有3ms的时刻决定是履行用户代码仍是ISP处理程序。假如P2.10为低电平且看门狗溢出标志置位,那么疏忽发动ISP指令处理器的外部硬件恳求。在没有ISP指令处理器的恳求(硬件复位后P2.10引脚为高电平)时,将查找有用的用户程序。若发现有用的用户程序,履行操控权就被搬运给用户程序。若没有找到有用的用户程序,就将调用主动波特率程序。这儿不评论ISP下载及指令,有爱好的朋友能够检查LPC1768技能手册第三十二章ISP指令。

在IAP晋级中,程序正常履行即用户代码(这儿的用户代码是咱们所说的IAP引导程序),如下是IAP晋级流程图,程序将预留端口(这儿供给有串口和CAN总线接口两种)接纳到的APP程序bin文件,将接纳到的数据写入到指定的Flash区域(例程APP地址为0x00010000),程序经过IAP指令将数据写入到Flash里边,LPC1768供给了一系列IAP指令对片内Flash进行擦除编写等。在IAP晋级中,程序正常履行即用户代码(这儿的用户代码是咱们所说的IAP引导程序),如下是IAP晋级流程图,程序将预留端口(这儿供给有串口和CAN总线接口两种)接纳到的APP程序bin文件,将接纳到的数据写入到指定的Flash区域(例程APP地址为0x00010000),程序经过IAP指令将数据写入到Flash里边,LPC1768供给了一系列IAP指令对片内Flash进行擦除编写等。

5、串口IAP程序剖析

例程经过按键对开发板进行操控,INT0键擦除Flash,承认键等候串口IAP,向上键显现菜单,向下键履行运用程序,运用LCD来开发板状况,其主函数如下

intmain(void)

{

uint32_tints[4];

SystemClockUpdate();

LCD_BSP_Init(); //LCD初始化

LCD_Clear(Black);

LCD_SetBackColor(Black);

LCD_SetTextColor(White);

cmd=MENU; //指令状况初始化,显现菜单

while(1)

{

switch(cmd)

{

caseREADY:

if (!(LPC_GPIO2->FIOPIN&(1<<10)))

{

Screen_Fresh(“ErasingImages…”);

cmd=ERASE_FLASH;

}

elseif(!(LPC_GPIO1->FIOPIN&(1<<29)))

{

cmd=MENU;

}

elseif(!(LPC_GPIO1->FIOPIN&(1<<25)))

{

Screen_Fresh(“WaitingforXMODEMXfer…”);

cmd=FLASH_IMG;

}

elseif(!(LPC_GPIO1->FIOPIN&(1<<26)))

{

Screen_Fresh(“Executeprogram”);

cmd=SHOW;

}

break;

caseMENU:

if(u32IAP_ReadBootVersion(&ints[0],&ints[1])==IAP_STA_CMD_SUCCESS)

{

snprintf((char*)string[0],MAX_STRING_SIZE,“BootCodeversion%d.%d”,ints[0],ints[1]);

}

if(u32IAP_ReadPartID(&ints[0])==IAP_STA_CMD_SUCCESS)

{

snprintf((char*)string[1],MAX_STRING_SIZE,“PartID:%d(%#x)”,ints[0],ints[0]);

}

u32IAP_ReadSerialNumber(&ints[0],&ints[1],&ints[2],&ints[3]);

snprintf((char*)string[2],MAX_STRING_SIZE,“Serial#:X:X:X:X”,ints[0],ints[1],ints[2],ints[3]);

Screen_Fresh(“Menu”);

cmd=READY;

break;

caseERASE_FLASH:

if((u32IAP_PrepareSectors(16,20)==IAP_STA_CMD_SUCCESS)&&

(u32IAP_EraseSectors(16,20)==IAP_STA_CMD_SUCCESS))

Screen_Fresh(“EraseDone”);

else

Screen_Fresh(“EraseFAIL”);

cmd=READY;

break;

caseFLASH_IMG:

received_data=0;

vXmodem1k_Client(&load_image);

Screen_Fresh(“UpdataComplete”);

cmd=READY;

break;

caseSHOW:

Boot();

cmd=READY;

break;

}

}

}

当串口接纳到数据后将数据写入到Flash,其写入过程是:发送预备写扇区指令,履行RAM内容仿制到Flash最终比较仿制内容,其代码如下:

staticuint32_tload_image(uint8_t*data,uint16_tlength)

{

if(length>0){

if(u32IAP_PrepareSectors(16,20)==IAP_STA_CMD_SUCCESS)

{

if(u32IAP_CopyRAMToFlash(IMG_START_SECTOR+received_data,(uint32_t)data,length)==IAP_STA_CMD_SUCCESS)

{

if(u32IAP_Compare(IMG_START_SECTOR+received_data,(uint32_t)data,length,0)==IAP_STA_CMD_SUCCESS)

{

received_data+=length;

return1;

}

}

}

Screen_Fresh(“FAIL(RESET&ERASEIMAGE)”);

return0;

}

else

return0;

}

当程序悉数写入到Flash后,按下向下按键,跳转到运用程序,首要修正中断向量表然后进入运用程序

voidBoot(void)

{

SCB->VTOR=IMG_START_SECTOR&0x1FFFFF80; //修正中断向量表

JMP_Boot(IMG_START_SECTOR);

}

仓库地址更新,PC地址更新

__asmvoidJMP_Boot(uint32_taddress){

LDRSP,[R0] ;仓库地址更新

LDRPC,[R0,#4] ;进入运用程序

}

7、操作过程及试验现象

1、下载“宝马开发板串口IAP晋级”例程,插上USB转串口线,翻开超级终端,复位开发板。

2、按下按键INT0按键–擦除扇区

3、按下方向键承认键–等候从串口接纳程序

4、串口打印‘C’字符等候接纳数据

5、串口发送文件,挑选“1K Xmodem”协议,挑选要下载的运用程序bin文件,这儿运用DAC例程作为测验。

6、发送文件

7、按下方向键向下键开端履行运用程序,能够用示波器测验P0.26输出正弦波信号

bin文件生成办法及设置:

翻开要更新运用程序工程,这儿运用“IAP晋级DAC转化”程序,设置ROM空间地址(程序下载到Flash的地址),这儿也是咱们运用程序的进口地址0x10000

翻开User选项,运用Keil自带的fromelf.exe生成bin文件,bin文件保存在Obj文件夹中,如下图增加“D:\Keil\ARM\ARMCC\bin\fromelf.exe–bin–output./Obj/app.bin./Obj/app.axf”,输入文件为app.axf,所以工程编译生成输出文件名设置为app,指令履行生成app.bin文件

翻开Asm选项,界说“NO_CRP”,咱们能够翻开发动文件,当界说了“NO_CRP”后,那么咱们后边的代码也就不起作用了,所以在需求加密的时分前面就必定不能再界说了代码读维护,也便是加密的关键字,经过加密后芯片再也无法擦除,因为咱们这儿程序需求运用到IAP晋级,因而增加此界说

8、CAN总线

CAN是ControllerAreaNetwork的缩写(以下称为CAN),是ISO世界标准化的串行通讯协议。在轿车工业中,出于对安全性、舒适性、便利性、低公害、低成本的要求,各式各样的电子操控体系被开发了出来。CAN归于现场总线的领域,它是一种有用支撑分布式操控或实时操控的串行通讯网络。较之许多RS-485根据R线构建的分布式操控体系而言,根据CAN总线的分布式操控体系在以下方面具有显着的优越性:

1)网络各节点之间的数据通讯实时性强

2)缩短了开发周期

3)已构成世界标准的现场总线

4)最有出路的现场总线之一

9、CANIAP晋级

关于LPC1768CAN总线介绍能够参阅“宝马开发板根底例程文档”第十九章“CAN总线”,这儿就不在赘述了,CANIAP例程运用两块宝马开发板进行试验,分为“CANIAP编程板”与“CANIAP接纳板”,将编程板(ID=0x01)与接纳板(ID=0x02)的CAN1进行衔接(CAN1L对CAN1L,CAN1H对CAN1H),波特率为500K,编程板经过读取板上SD卡内的app.bin文件然后传输给接纳板,每次传送1024字节,然后等候接纳板发送“CONTINUE”信号持续发送下一个1K数据,直到发送完结,发送“UPDATAOK”告诉接纳板发送完结。其操作过程与串口IAP相似,仅仅将通讯方法有串口改为CAN总线,有爱好的朋友能够修正成其他方法进行IAP下载。

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

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

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

微信扫一扫关注我们

返回顶部