博客專欄

EEPW首頁 > 博客 > 功能強大的 HEX 開源轉(zhuǎn)換工具,你值得擁有

功能強大的 HEX 開源轉(zhuǎn)換工具,你值得擁有

發(fā)布人:魚鷹談單片機(jī) 時間:2021-05-12 來源:工程師 發(fā)布文章

功能

你是否存在這樣的需求?

將 HEX 轉(zhuǎn)化為 BIN文件?

將 BIN 文件轉(zhuǎn)化為 HEX 文件?

將兩個 HEX 文件合并成一個 HEX 文件?

將兩個 BIN 文件合并成一個 BIN 文件?

將一個 HEX 拆分成多個 HEX文件?

計算某段空間數(shù)據(jù)的 CRC 校驗數(shù)據(jù),用于 ROM 完整性檢查?

比較兩個 HEX 或 BIN 文件的差異?

如果你有這些需求,但是你還需要自制工具或使用多個工具才能完成以上功能,那你就 out 了,是時候用上這個開源工具了:SRecord

該工具可以在 LINUX 和 window 平臺工作,滿足你的開發(fā)需求。

官方只提供源碼(C++),并沒有exe格式的文件直接供你使用,但有前輩開路,不用擔(dān)心,所以你可以在該鏈接下直接下載該工具,復(fù)制到你的 Windows 電腦上即可用命令行的形式使用了:

https://sourceforge.net/projects/srecord/files/srecord-win32/

(右滑查看)

如果不方便下載,魚鷹在后臺也提供了該軟件包(不需要安裝,解壓縮即可),回復(fù) hex工具 即可領(lǐng)取工具。

為了方便說明,首先我們使用同一個工程生成兩個 HEX 文件,一個默認(rèn)偏移地址 0x08000000(代表 BOOTLOADER)input0.hex,另一個偏移地址 0x0800A000(代表 APP)intput1.hex。

1.png

因為初始地址不一樣,所以我們可以使用它進(jìn)行合并(如果兩個 HEX文件地址有重合,將產(chǎn)生錯誤或警告,合并失敗,當(dāng)然如果確實有需求,也是有辦法的)。

然后將兩個文件拷貝到工具目錄下,這一步可以不做,僅僅是為了方便書寫命令而已,事實上,一般我們在命令中明確給出路徑即可(相對路徑或絕對路徑)。

/c/SREC/srec_cat.exe src/input.hex -intel -offset -0x0800A000 -o src/output.bin -binary

2.png

將HEX文件轉(zhuǎn)化為 BIN文件(BASH環(huán)境下命令,CMD類似)

./srec_cat.exe input1.hex -intel -offset -0x0800A000 -o output1.bin -binary

需要注意的是魚鷹標(biāo)記的 -,如果沒有這個,程序可以正常執(zhí)行,不報錯,但是會生成一個很大文件(從地址 0 開始轉(zhuǎn)化):

3.png

-intel 代表使用 HEX格式來解析 input1.hex 文件,它并不是靠后綴名確定格式的

-binary 代表輸出 BIN格式文件

-offset -0x0800A000 代表從 0x0800A000 地址轉(zhuǎn)化,否則將從 0 地址開始轉(zhuǎn)化。

如果輸入的Intel HEX文件的記錄未按升序地址順序排序,將發(fā)出警告,可使用 Disable_Sequence_Warnings 選項禁用。KEIL 51生成的 HEX 就是這種情況,ARM的并不需要該選項。

將 BIN文件轉(zhuǎn)化為 HEX文件?

./srec_cat.exe output1.bin -binary -offset -0x0800A000 -o cmp.hex -intel

因為魚鷹不確定該命令是否正確,所以又將生成的 cmp.hex 文件轉(zhuǎn)化為 bin文件進(jìn)行對比:

./srec_cat.exe cmp.hex -intel -offset 0x0800A000 -o cmp.bin -binary

事實上,上述命令確實可以將 bin文件轉(zhuǎn)化為 hex文件。

4.png

將兩個 HEX文件合并成一個 HEX文件

./srec_cat.exe input0.hex -intel input1.hex -intel -o output.hex -intel

此時兩個文件文件的中間空白部分填充 0xff。

如果你想固定中間部分的填充值,可以使用如下命令:

./srec_cat.exe input0.hex -intel -fill 0xff 0x08000000 0x0800A000  input1.hex -intel  -o output_ff.hex -intel

-fill 0xff 0x08000000 0x0800A000 代表如果 0x08000000~0x0800A000 地址有空白,將填充0xff,當(dāng)然也可以修改成 0x00 或其他值,建議該值和 FLASH擦除后的值保持一致。

5.png

并且該 參數(shù)應(yīng)該放在 input0.hex -intel 之后,放在 input1.hex -intel 后面會出錯,應(yīng)該是該參數(shù)值對前面的文件有效,并且地址范圍包含在前面文件中。

./srec_cat.exe input0.hex -intel -fill 0xff 0x08000000 0x0800A000  input1.hex -intel -offset -0x08000000 -o output_ff.bin -binary

魚鷹曾嘗試使用上面的參數(shù)直接生成 bin文件,但發(fā)現(xiàn)最終生成的 bin文件從地址 0 開始,-offset 并沒起作用,只能先轉(zhuǎn)化為 hex文件了。

將兩個 BIN文件合并成一個 BIN文件

./srec_cat.exe -output "merge.bin" -binary output0.bin -binary -fill 0xff 0x00000000 0x0000A000 output1.bin -binary -offset 0x0000A000

特別注意的是,這條命令和之前的命令有很大不同,首先指定輸出文件,并且有雙引號,而第二個文件指定(偏移)地址時, -offset 0x0000A000地址前沒有 -。

并且因為bin文件不存在絕對地址信息,只有相對偏移,所以你會看到第一個輸入文件 output0.bin 并沒有指定偏移,將以默認(rèn)地址 0 處理,并且填充命令也是按照偏移 0x00000000 0x0000A000來處理。

將一個 HEX拆分成多個 HEX文件

./srec_cat.exe output_ff.hex -intel -crop 0x08000000 0x08009FFF -o merge_part1.hex -intel

分割第一個文件

./srec_cat.exe output_ff.hex -intel -crop 0x0800A000 0x08100000 -o merge_part2.hex -intel

分割第二個文件,注意不要加 -offset -0x0800A000,網(wǎng)上一篇參考文章加了該參數(shù),實際發(fā)現(xiàn)生成的 hex 文件從 0x0 開始。

0x08100000 這個值只要包含你的 HEX 文件的最大地址即可。

關(guān)于加入 CRC校驗、比較文件的差異功能,我們下期再見了。

*博客內(nèi)容為網(wǎng)友個人發(fā)布,僅代表博主個人觀點,如有侵權(quán)請聯(lián)系工作人員刪除。



關(guān)鍵詞: 開源轉(zhuǎn)換

技術(shù)專區(qū)

關(guān)閉