基于IAP技术的ADuC702x固件升级方案
以下两点: 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系列微处理器设计的光通讯和其他产品中,使固件程序升级变得非常简单方便,并且该方案通过实践验证,具有非常高的可靠性。
- MSP43F149系列单片机的IAP功能设计(09-08)
- 基于IAP的STM32程序更新技术(01-23)
- 基于IAP和Keil MDK的远程升级设计(12-19)
- STM32 IAP 无法运行用户程序的解决方法(12-03)
- STC单片机 EEPROM/IAP 功能测试程序演示(12-01)
- 9G-STM32 简易BOOT及XMODEM串口IAP移植过程简介(11-29)