單片機Bootloader與App的Hex文件手動合併方法

前言

對帶有IAP的嵌入式軟件,生產大批量加工時,研發需要提供Boot和App的合併Hex文件,這樣才能加快生產進度。

Hex文件的簡單說明

編譯器編譯出的HEX文件一般格式如下:
:020000040800F2 //燒錄起始地址
:10000000C8BD0620D10100085D3B0008DD350008B1 //數據
:10001000593B0008C9040008CD6900080000000031 //數據
:100020000000000000000000000000000D49000872 //數據
… //數據
:0488D00000000000A4 //數據
:04000005080001BD31 //線性地址記錄
:00000001FF //結束

Boot和App的Hex合併說明

把Boot的最後一行去掉,再把App的所有文件複製到Boot後即可。具體如下:
:020000040800F2 //boot起始地址
:10000000C8BD0620D10100085D3B0008DD350008B1 //Boot數據
:10001000593B0008C9040008CD6900080000000031 //Boot數據
:100020000000000000000000000000000D49000872 //Boot數據
…//Boot數據
:0488D00000000000A4 //Boot數據
:04000005080001BD31 //線性地址記錄Boot
:020000040801F1//App起始地址
:1000000040BB0220A5EA0208E59301087F8A0308A5//APP數據
:10001000E7930108EB930108EF930108000000004B//APP數據
:10002000000000000000000000000000F3//APP數據
…//APP數據
:0C3B4000581698C821AC2D530800000056//APP數據
:04000005080101BD30//APP線性地址記錄
:00000001FF//結束

多個app合併方法:

如果有兩個APP,把Boot的最後一行去掉,去掉App1的Hex文件最後一行,再把App1文件複製到Boot後,然後把App2所有文件複製到剛剛合併的文件中。

boot+app+固定參數的合併方法

有時候需要在出廠程序固定地方寫入特定的數據,這個時候除了boot和app的合併,需要加入固定參數區。比如,boot起始地址0x08000000,app起始地址0x08010000,特定參數1起始地址0x08073000,長度16字節,特定參數2起始地址0x08074000,特定數據長度128字節,則合併如下:
:020000040800F2 //boot起始地址
:10000000C8BD0620D10100085D3B0008DD350008B1 //Boot數據
:10001000593B0008C9040008CD6900080000000031 //Boot數據
:100020000000000000000000000000000D49000872 //Boot數據
…//Boot數據
:0488D00000000000A4 //Boot數據
:04000005080001BD31 //線性地址記錄Boot
:020000040801F1//App起始地址
:1000000040BB0220A5EA0208E59301087F8A0308A5//APP數據
:10001000E7930108EB930108EF930108000000004B//APP數據
:10002000000000000000000000000000F3//APP數據
…//APP數據
:0C3B4000581698C821AC2D530800000056//APP數據
:04000005080101BD30//APP線性地址記錄
:020000040807EB //地址0x08070000
:083000005627bd656c9f03001b//0x08073000地址區16字節特定數據
:10400000A4EF74000000FFFF504453535F54455326//0x08074000地址區特定數據
:10401000540000000000000000000000000000004C//0x08074000地址區特定數據
:104020000000000000000000434D4E455400000019//0x08074000地址區特定數據
:104030000000000000000000000000000000000080//0x08074000地址區特定數據
:104040000000000000000000736569626572747210//0x08074000地址區特定數據
:104050006F6E2E756269736F722E636F6D00000054//0x08074000地址區特定數據
:104060000000000000000000BB260000020001006C//0x08074000地址區特定數據
:10407000BBAAFFFF0000FFFFFFFFFFFFFFFFFFFFE7//0x08074000地址區特定數
:00000001FF//結束

Hex格式詳解參考

第一個字節 表示本行數據的長度;

第二、三字節表示本行數據的起始地址;

第四字節表示數據類型,數據類型有:0x00、0x01、0x02、0x03、0x04、0x05。

‘00’ Data Rrecord:用來記錄數據,HEX文件的大部分記錄都是數據記錄

‘01’ End of File Record:用來標識文件結束,放在文件的最後,標識HEX文件的結尾

‘02’ Extended Segment Address Record:用來標識擴展段地址的記錄

‘03’ Start Segment Address Record:開始段地址記錄

‘04’ Extended Linear Address Record:用來標識擴展線性地址的記錄

‘05’ Start Linear Address Record:開始線性地址記錄

然後是數據,最後一個字節 爲校驗和。

校驗和的算法爲:計算校驗和前所有16進制碼的累加和(不計進位),檢驗和 = 0x100 - 累加和

注意事項

1.合併文件時不要留有空格
2.注意Boot和App的起始地址
3.在hex文件裏面添加參數域,要注意,比如寫入0x080730000開始的16byte數據,寫法如下:
:020000040807EB
:083000005627bd656c9f03001b
而不是
:023000040807XX
:080000005627bd656c9f0300XX

擴展知識

1.hex和bin文件只是格式不同,文件的有效data是完全一樣的,因此網上有很多工具可以對兩種文件進行自動轉換。hex文件一般用於出廠設備生產批量燒錄,出廠燒錄時一般會把bootloader和app的hex合併後燒錄,bin文件一般用於設備現場維護升級使用,升級使用只有app,因爲bootloader一旦出廠幾乎不能更改。

ST_LINK讀取特定地址的數據:

打開軟件:
1
顯示如下:
1 連接電路板後,點擊「1」,則界面3中會出現flash中的數據,在「2」中輸入起始地址,大小和數據顯示格式,界面「3」會從固定地址,特定格式顯示flash內容,根據需要可以進行拷貝。 st_link跟電路板接線參考:https://blog.csdn.net/wxbluesun/article/details/94738272?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-4.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-4.nonecase