微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 基于IAP技术的ADuC702x固件升级方案

基于IAP技术的ADuC702x固件升级方案

时间:05-22 来源:电子产品世界 点击:

以下两点:

1. 用户应用程序大小不能超过41.5kB;

2. 用户应用程序初始化时,需要将中断向量表拷贝到SRAM,然后将其映射到SM,代码如下:

#dene SM_Start_Addr 0x00010000

unsigned long load_addr = SM_Start_Addr ;

unsigned char i ;

unsigned int VVVTEMP ;

for(i=0 ;i<32 ;i++)

{

VVVTEMP = load(0x85000+i*2) ;

*((unsigned char *)load_addr++) = (unsigned char)(VVVTEMP>>0) ;

*((unsigned char *)load_addr++) = (unsigned char)(VVVTEMP>>8) ;

}

REMAP = 0x01 ;//将REMAP寄存器最低位置1

  IAP更新固件应用程序流程

IAP更新固件应用程序均指在程序运行于Bootloader区完成。若第一次只有Bootloader程序,而没有用户程序时,程序自动停留在Bootloader区。若程序正运行于用户区情况时,要求通过串口发送某条命令给MCU(微控制器),MCU收到指令后,更新Flash/EE存储器中进入Bootloader标志部分数据,使之有效,然后通过软件复位(通常称之为“热启动”)使程序从0x00000000位置启动,按上一节“程序启动过程描述”,则此时启动后,程序必定留在Bootloader区。

在Bootloader区时,可以通过发送“IAP”(“IAP”命令字符由Bootloader代码决定)命令来更新程序,当MCU接收到“IAP”命令后,修改用户程序是否有效标志值为无效,返回“OK”字符,然后程序以查询方式接收一个数据包(标志该数据包为数据包0),该数据为接下来将接收到的程序数据包长度信息,并同时包含校验信息,数据包0结构如图6所示,如果正确接收数据,返回两个字节(0xED,0xFA);否则返回(0x12,0x34),并结束IAP命令,回到Bootloader命令状态。

接下来根据固件程序数据包长度依次接收各个数据包(标识这些数据包为数据包1、数据包2,??,数据包n,其中n等于上一个数据包接收到的固件程序数据包长度(length)),这里每个数据包结构均一样,结构如图7所示,数据包由两部分组成,256B的固件程序数据和两个字节的CRC16校验码,一个数据包总长度为258B,在对固件程序打包时,若包数据不满256B,那么在包后面添加0xFF,直至256B。

程序中每接收数据包1~数据包n中任何一个数据包时,若接收正确,则返回(0xED,0xFA),同时将数据写入对应Flash存储单元;否则返回(0x12,0x34),并结束IAP命令,回到Bootloader区等待IAP命令状态。若所有数据包接收正确,而且写入Flash正确,则修改用户程序有效标志,并返回(0xED,0xFA),否则返回(0x12,0x34),并结束IAP命令,回到Bootloader区等待IAP命令状态。

待所有数据包接收完毕,并写Flash结束后,再给MCU发送“REBOOT”热启动命令即可完成固件重新运行。

IAP更新固件应用程序流程如图8所示。

下面描述如何更新User Application固件应用程序。以下所有提到的发送和返回的命令及数据均指十六进制格式,除非特殊说明。

⒈MCU正常工作,使用如下命令使MCU回到了Bootloader区

发送:(自定义命令)

返回:(自定义返回)

⒉发送:0x49 0x41 0x50 0x0D

返回:0x49 0x41 0x50 0x0D 0x0A 0x4F 0x4B 0x0D 0x0A 0x5C 0x3E

图9 固件程序数据包

⒊发送数据包0,数据包0结构如图6所示。

返回(两个字节):

(1)0xED 0xFA(正确接收),跳到步骤4;

(2)0x12 0x34,错误,跳到步骤2。

⒋根据数据包0中所包含的固件应用程序数据包长度信息,发送固件应用程序数据包1~n,固件应用程序按图9方式打包,若包不满256B,则在后面依次填充0xFF。

  其中Data为固件应用程序二进制代码,每个数据包最后是CRC16校验码,其高位在前。

发送:一个数据包

返回(两个字节):

(1)0xED 0xFA(正确接收),跳到步骤5;

(2)0x12 0x34,错误,跳到步骤2。

⒌按步骤4正确发送完所有数据包,等待修改标志位,即等待返回(两个字节):

(1)0x4F 0x4B(修改标志位正确),跳到步骤6;

(2)0x58 0x58,错误,跳到步骤2。

⒍重新热启动。

发送:REBOOT(ASCII字符)

返回:(无返回内容)

⒎固件应用程序更新完毕。

  结语

该在应用更新固件程序方案已广泛应用于以ADuC702x系列微处理器设计的光通讯和其他产品中,使固件程序升级变得非常简单方便,并且该方案通过实践验证,具有非常高的可靠性。

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

网站地图

Top