基于IAP技術(shù)的ADuC702x固件升級(jí)方案
IAP更新固件應(yīng)用程序流程
本文引用地址:http://butianyuan.cn/article/119691.htmIAP更新固件應(yīng)用程序均指在程序運(yùn)行于Bootloader區(qū)完成。若第一次只有Bootloader程序,而沒(méi)有用戶(hù)程序時(shí),程序自動(dòng)停留在Bootloader區(qū)。若程序正運(yùn)行于用戶(hù)區(qū)情況時(shí),要求通過(guò)串口發(fā)送某條命令給MCU(微控制器),MCU收到指令后,更新Flash/EE存儲(chǔ)器中進(jìn)入Bootloader標(biāo)志部分?jǐn)?shù)據(jù),使之有效,然后通過(guò)軟件復(fù)位(通常稱(chēng)之為“熱啟動(dòng)”)使程序從0x00000000位置啟動(dòng),按上一節(jié)“程序啟動(dòng)過(guò)程描述”,則此時(shí)啟動(dòng)后,程序必定留在Bootloader區(qū)。
在Bootloader區(qū)時(shí),可以通過(guò)發(fā)送“IAP”(“IAP”命令字符由Bootloader代碼決定)命令來(lái)更新程序,當(dāng)MCU接收到“IAP”命令后,修改用戶(hù)程序是否有效標(biāo)志值為無(wú)效,返回“OK”字符,然后程序以查詢(xún)方式接收一個(gè)數(shù)據(jù)包(標(biāo)志該數(shù)據(jù)包為數(shù)據(jù)包0),該數(shù)據(jù)為接下來(lái)將接收到的程序數(shù)據(jù)包長(zhǎng)度信息,并同時(shí)包含校驗(yàn)信息,數(shù)據(jù)包0結(jié)構(gòu)如圖6所示,如果正確接收數(shù)據(jù),返回兩個(gè)字節(jié)(0xED,0xFA);否則返回(0x12,0x34),并結(jié)束IAP命令,回到Bootloader命令狀態(tài)。
接下來(lái)根據(jù)固件程序數(shù)據(jù)包長(zhǎng)度依次接收各個(gè)數(shù)據(jù)包(標(biāo)識(shí)這些數(shù)據(jù)包為數(shù)據(jù)包1、數(shù)據(jù)包2,??,數(shù)據(jù)包n,其中n等于上一個(gè)數(shù)據(jù)包接收到的固件程序數(shù)據(jù)包長(zhǎng)度(length)),這里每個(gè)數(shù)據(jù)包結(jié)構(gòu)均一樣,結(jié)構(gòu)如圖7所示,數(shù)據(jù)包由兩部分組成,256B的固件程序數(shù)據(jù)和兩個(gè)字節(jié)的CRC16校驗(yàn)碼,一個(gè)數(shù)據(jù)包總長(zhǎng)度為258B,在對(duì)固件程序打包時(shí),若包數(shù)據(jù)不滿(mǎn)256B,那么在包后面添加0xFF,直至256B。
程序中每接收數(shù)據(jù)包1~數(shù)據(jù)包n中任何一個(gè)數(shù)據(jù)包時(shí),若接收正確,則返回(0xED,0xFA),同時(shí)將數(shù)據(jù)寫(xiě)入對(duì)應(yīng)Flash存儲(chǔ)單元;否則返回(0x12,0x34),并結(jié)束IAP命令,回到Bootloader區(qū)等待IAP命令狀態(tài)。若所有數(shù)據(jù)包接收正確,而且寫(xiě)入Flash正確,則修改用戶(hù)程序有效標(biāo)志,并返回(0xED,0xFA),否則返回(0x12,0x34),并結(jié)束IAP命令,回到Bootloader區(qū)等待IAP命令狀態(tài)。
待所有數(shù)據(jù)包接收完畢,并寫(xiě)Flash結(jié)束后,再給MCU發(fā)送“REBOOT”熱啟動(dòng)命令即可完成固件重新運(yùn)行。
IAP更新固件應(yīng)用程序流程如圖8所示。
下面描述如何更新User Application固件應(yīng)用程序。以下所有提到的發(fā)送和返回的命令及數(shù)據(jù)均指十六進(jìn)制格式,除非特殊說(shuō)明。
?、盡CU正常工作,使用如下命令使MCU回到了Bootloader區(qū)
發(fā)送:(自定義命令)
返回:(自定義返回)
?、舶l(fā)送:0x49 0x41 0x50 0x0D
返回:0x49 0x41 0x50 0x0D 0x0A 0x4F 0x4B 0x0D 0x0A 0x5C 0x3E
圖9 固件程序數(shù)據(jù)包
?、嘲l(fā)送數(shù)據(jù)包0,數(shù)據(jù)包0結(jié)構(gòu)如圖6所示。
返回(兩個(gè)字節(jié)):
(1)0xED 0xFA(正確接收),跳到步驟4;
(2)0x12 0x34,錯(cuò)誤,跳到步驟2。
?、锤鶕?jù)數(shù)據(jù)包0中所包含的固件應(yīng)用程序數(shù)據(jù)包長(zhǎng)度信息,發(fā)送固件應(yīng)用程序數(shù)據(jù)包1~n,固件應(yīng)用程序按圖9方式打包,若包不滿(mǎn)256B,則在后面依次填充0xFF。
評(píng)論