功能強(qiáng)大的 HEX 開源轉(zhuǎn)換工具,你值得擁有
功能
你是否存在這樣的需求?
將 HEX 轉(zhuǎn)化為 BIN文件?
將 BIN 文件轉(zhuǎn)化為 HEX 文件?
將兩個(gè) HEX 文件合并成一個(gè) HEX 文件?
將兩個(gè) BIN 文件合并成一個(gè) BIN 文件?
將一個(gè) HEX 拆分成多個(gè) HEX文件?
計(jì)算某段空間數(shù)據(jù)的 CRC 校驗(yàn)數(shù)據(jù),用于 ROM 完整性檢查?
比較兩個(gè) HEX 或 BIN 文件的差異?
如果你有這些需求,但是你還需要自制工具或使用多個(gè)工具才能完成以上功能,那你就 out 了,是時(shí)候用上這個(gè)開源工具了:SRecord
該工具可以在 LINUX 和 window 平臺工作,滿足你的開發(fā)需求。
官方只提供源碼(C++),并沒有exe格式的文件直接供你使用,但有前輩開路,不用擔(dān)心,所以你可以在該鏈接下直接下載該工具,復(fù)制到你的 Windows 電腦上即可用命令行的形式使用了:
https://sourceforge.net/projects/srecord/files/srecord-win32/
(右滑查看)
如果不方便下載,魚鷹在后臺也提供了該軟件包(不需要安裝,解壓縮即可),回復(fù) hex工具 即可領(lǐng)取工具。
為了方便說明,首先我們使用同一個(gè)工程生成兩個(gè) HEX 文件,一個(gè)默認(rèn)偏移地址 0x08000000(代表 BOOTLOADER)input0.hex,另一個(gè)偏移地址 0x0800A000(代表 APP)intput1.hex。
因?yàn)槌跏嫉刂凡灰粯樱晕覀兛梢允褂盟M(jìn)行合并(如果兩個(gè) HEX文件地址有重合,將產(chǎn)生錯(cuò)誤或警告,合并失敗,當(dāng)然如果確實(shí)有需求,也是有辦法的)。
然后將兩個(gè)文件拷貝到工具目錄下,這一步可以不做,僅僅是為了方便書寫命令而已,事實(shí)上,一般我們在命令中明確給出路徑即可(相對路徑或絕對路徑)。
/c/SREC/srec_cat.exe src/input.hex -intel -offset -0x0800A000 -o src/output.bin -binary
將HEX文件轉(zhuǎn)化為 BIN文件(BASH環(huán)境下命令,CMD類似)
./srec_cat.exe input1.hex -intel -offset -0x0800A000 -o output1.bin -binary
需要注意的是魚鷹標(biāo)記的 -,如果沒有這個(gè),程序可以正常執(zhí)行,不報(bào)錯(cuò),但是會生成一個(gè)很大文件(從地址 0 開始轉(zhuǎn)化):
-intel 代表使用 HEX格式來解析 input1.hex 文件,它并不是靠后綴名確定格式的
-binary 代表輸出 BIN格式文件
-offset -0x0800A000 代表從 0x0800A000 地址轉(zhuǎn)化,否則將從 0 地址開始轉(zhuǎn)化。
如果輸入的Intel HEX文件的記錄未按升序地址順序排序,將發(fā)出警告,可使用 Disable_Sequence_Warnings 選項(xiàng)禁用。KEIL 51生成的 HEX 就是這種情況,ARM的并不需要該選項(xiàng)。
將 BIN文件轉(zhuǎn)化為 HEX文件?
./srec_cat.exe output1.bin -binary -offset -0x0800A000 -o cmp.hex -intel
因?yàn)轸~鷹不確定該命令是否正確,所以又將生成的 cmp.hex 文件轉(zhuǎn)化為 bin文件進(jìn)行對比:
./srec_cat.exe cmp.hex -intel -offset 0x0800A000 -o cmp.bin -binary
事實(shí)上,上述命令確實(shí)可以將 bin文件轉(zhuǎn)化為 hex文件。
將兩個(gè) HEX文件合并成一個(gè) HEX文件
./srec_cat.exe input0.hex -intel input1.hex -intel -o output.hex -intel
此時(shí)兩個(gè)文件文件的中間空白部分填充 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擦除后的值保持一致。
并且該 參數(shù)應(yīng)該放在 input0.hex -intel 之后,放在 input1.hex -intel 后面會出錯(cuò),應(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文件了。
將兩個(gè) BIN文件合并成一個(gè) BIN文件
./srec_cat.exe -output "merge.bin" -binary output0.bin -binary -fill 0xff 0x00000000 0x0000A000 output1.bin -binary -offset 0x0000A000
特別注意的是,這條命令和之前的命令有很大不同,首先指定輸出文件,并且有雙引號,而第二個(gè)文件指定(偏移)地址時(shí), -offset 0x0000A000地址前沒有 -。
并且因?yàn)閎in文件不存在絕對地址信息,只有相對偏移,所以你會看到第一個(gè)輸入文件 output0.bin 并沒有指定偏移,將以默認(rèn)地址 0 處理,并且填充命令也是按照偏移 0x00000000 0x0000A000來處理。
將一個(gè) HEX拆分成多個(gè) HEX文件
./srec_cat.exe output_ff.hex -intel -crop 0x08000000 0x08009FFF -o merge_part1.hex -intel
分割第一個(gè)文件
./srec_cat.exe output_ff.hex -intel -crop 0x0800A000 0x08100000 -o merge_part2.hex -intel
分割第二個(gè)文件,注意不要加 -offset -0x0800A000,網(wǎng)上一篇參考文章加了該參數(shù),實(shí)際發(fā)現(xiàn)生成的 hex 文件從 0x0 開始。
0x08100000 這個(gè)值只要包含你的 HEX 文件的最大地址即可。
關(guān)于加入 CRC校驗(yàn)、比較文件的差異功能,我們下期再見了。
*博客內(nèi)容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀點(diǎn),如有侵權(quán)請聯(lián)系工作人員刪除。