標(biāo)題:
Hex文件格式與合并
[打印本頁(yè)]
作者:
川頁(yè)人生
時(shí)間:
2022-6-10 11:38
標(biāo)題:
Hex文件格式與合并
什么是hex文件
hex文件格式是可以燒寫到單片機(jī)中,被單片機(jī)執(zhí)行的一種文件格式,生成Hex文件的方式有很多種,可以通過(guò)不同的編譯器將C程序或者匯編程序編譯生成hex。
Hex文件格式:
先來(lái)看一下hex文件,主要截取了三部分,開頭1行
中間數(shù)據(jù),這里只截取了一部分作為表示
結(jié)尾2行
數(shù)據(jù)少不了數(shù)據(jù)格式(協(xié)議),先來(lái)看一看hex文件的數(shù)據(jù)格式,以第一行數(shù)據(jù)(020000040002f8)為例,看一看hex文件的每一字段數(shù)據(jù)是什么意思:
020000040002f8可以分解為:
0x02 0x00 0x00 0x04 0x02 0x02 0xf8,前面4個(gè)字節(jié)和最后一個(gè)字節(jié)是有特殊含義的,中間為數(shù)據(jù),每個(gè)字段的具體含義如下:
第一字節(jié)0x02:數(shù)據(jù)長(zhǎng)度,即該行有多少個(gè)數(shù)據(jù);
第二、三字節(jié)0x00、0x00:表示本行數(shù)據(jù)的起始地址位;
第四個(gè)字節(jié)有0x00 0x01 0x02 0x03 0x04 0x05,分別有以下含義:
'00’Data Rrecord:用來(lái)記錄數(shù)據(jù),HEX文件的大部分記錄都是數(shù)據(jù)記錄
'01’文件結(jié)束記錄:用來(lái)標(biāo)識(shí)文件結(jié)束,放在文件的最后,標(biāo)識(shí)HEX文件的結(jié)尾
'02’擴(kuò)展段地址記錄:用來(lái)標(biāo)識(shí)擴(kuò)展段地址的記錄
'03’開始段地址記錄:開始段地址記錄
'04’擴(kuò)展線性地址記錄:用來(lái)標(biāo)識(shí)擴(kuò)展線性地址的記錄
'05’開始線性地址記錄:開始線性地址記錄
最后一個(gè)字節(jié)0xf8為校驗(yàn)和:校驗(yàn)和= 0x100 - 累加和
單純看上面的介紹,好像也看不出和MCU的FLASH地址如何聯(lián)系起來(lái),接下來(lái)看看是如何跟FLASH地址對(duì)應(yīng)的
第一字節(jié)表示該行的數(shù)據(jù)字節(jié)數(shù);如第1行只有 0x08 0x00 兩個(gè)字節(jié)的數(shù)據(jù),類型是 04 ,即該行記錄的是一個(gè)拓展地址(0x08 0x00 是地址信息,用法是將該地址(0x0800<<16) 后作為基地址。并且表示在下一個(gè)04類型行出現(xiàn)之前都要使用該地址。
例如第2行的地址信息是 0x0000,則表示該行數(shù)據(jù)從0x08000000( (0x0800<<16) | 0x0000 )開始記錄。
第3行則從 0x08000010 ( (0x0800<<16) | 0x0010 )開始記錄。
另外最后一個(gè)字節(jié)的校驗(yàn)和 0xD2 = 0xff & ( 0x100- (0x10+4*(0x00)+0x38+0x05+…+0x00+0x08) ) = 0xff & (0x100-0x2E);
然后再看結(jié)尾部分: 類型是05,有4字節(jié)數(shù)據(jù),從上面的介紹可以知道,05是指“開始線性地址記錄”,什么意思呢?
其實(shí)就是函數(shù)入口地址,從編譯產(chǎn)生的.map文件中,可以看到Image Entry point后面跟的就是這個(gè)值
例如第2行的地址信息是 0x0000,則表示該行數(shù)據(jù)從0x08000000( (0x0800<<16) | 0x0000 )開始記錄。
第3行則從 0x08000010 ( (0x0800<<16) | 0x0010 )開始記錄。
另外最后一個(gè)字節(jié)的校驗(yàn)和 0xD2 = 0xff & ( 0x100- (0x10+4*(0x00)+0x38+0x05+…+0x00+0x08) ) = 0xff & (0x100-0x2E);
然后再看結(jié)尾部分: 類型是05,有4字節(jié)數(shù)據(jù),從上面的介紹可以知道,05是指“開始線性地址記錄”,什么意思呢?
其實(shí)就是函數(shù)入口地址,從編譯產(chǎn)生的.map文件中,可以看到Image Entry point后面跟的就是這個(gè)值
最后的一行,01代表文件結(jié)束,以上就是關(guān)于hex文件的簡(jiǎn)單介紹。
合并hex文件的幾種方法
1、傳統(tǒng)而不優(yōu)雅的直接合并法
打開我們的hex文件,就以BOOT和APP代碼為例,用記事本或者其他的軟件(notepad++等)打開
從上面的介紹我們可以知道,hex文件最后一行是代表文件的結(jié)束,那么我們只需要?jiǎng)h除boot文件的最后一行代碼,然后把APP的代碼直接拷貝過(guò)來(lái)
這樣我們就得到了最終的hex文件,直接燒錄進(jìn)去MCU即可
2、jflash燒錄
jlink說(shuō)我們必不可少的燒錄調(diào)試工具之一,一起來(lái)看看怎么使用jlink自帶的jflash工具合并
打開jflash,首先選擇我們的第一個(gè)文件,file->open data file即可
打開之后,可以看到地址是從8000000開始的,也即是我們的MCU flash的基地址
然后再點(diǎn)擊file->merge data file
選擇我們的第二個(gè)文件,選擇打開之后,第二個(gè)hex文件就拼接到了BOOT文件之后了,保存文件即可,建議另存為我們需要的文件名,否則的話,會(huì)默認(rèn)為我們打開的第一個(gè)文件名
3、開源小工具
這個(gè)方法和上面jflash的方法類似,網(wǎng)上有很多熱心網(wǎng)友開發(fā)的小工具,也可以自己做一個(gè),小飛哥就找一個(gè)自己測(cè)試過(guò)得給大伙用吧
軟件源碼開源,非本人所編寫,github地址為:
https://github.com/SmartElec/STM32-IAP-HEX-Merge
,源碼為C#所編寫。
下載下來(lái)有源碼,感興趣的就看看,不感興趣的就直接用即可,在realese文件夾內(nèi)
直接選擇我們的hex文件,注意順序
還可以同時(shí)生成bin文件,點(diǎn)擊合并即可
文件夾內(nèi)已經(jīng)生成了目標(biāo)hex合并文件
接下來(lái)就可以把所有文件合并之后,只燒錄一個(gè)hex文件啦
————————————————
版權(quán)聲明:本文為CSDN博主「Mr_Wyf」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。
原文鏈接:
https://blog.csdn.net/qq_16519885/article/details/123744104
作者:
Similarv
時(shí)間:
2022-6-13 08:45
感謝轉(zhuǎn)載,雖然已經(jīng)知道怎么合并兩個(gè)hex文件,但對(duì)其原理還是有所疑惑,這篇文章很好的解決了我的問題。
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1