"); //-->
功能
你是否存在这样的需求?
将 HEX 转化为 BIN文件?
将 BIN 文件转化为 HEX 文件?
将两个 HEX 文件合并成一个 HEX 文件?
将两个 BIN 文件合并成一个 BIN 文件?
将一个 HEX 拆分成多个 HEX文件?
计算某段空间数据的 CRC 校验数据,用于 ROM 完整性检查?
比较两个 HEX 或 BIN 文件的差异?
如果你有这些需求,但是你还需要自制工具或使用多个工具才能完成以上功能,那你就 out 了,是时候用上这个开源工具了:SRecord
该工具可以在 LINUX 和 window 平台工作,满足你的开发需求。
官方只提供源码(C++),并没有exe格式的文件直接供你使用,但有前辈开路,不用担心,所以你可以在该链接下直接下载该工具,复制到你的 Windows 电脑上即可用命令行的形式使用了:
https://sourceforge.net/projects/srecord/files/srecord-win32/
(右滑查看)
如果不方便下载,鱼鹰在后台也提供了该软件包(不需要安装,解压缩即可),回复 hex工具 即可领取工具。
为了方便说明,首先我们使用同一个工程生成两个 HEX 文件,一个默认偏移地址 0x08000000(代表 BOOTLOADER)input0.hex,另一个偏移地址 0x0800A000(代表 APP)intput1.hex。
因为初始地址不一样,所以我们可以使用它进行合并(如果两个 HEX文件地址有重合,将产生错误或警告,合并失败,当然如果确实有需求,也是有办法的)。
然后将两个文件拷贝到工具目录下,这一步可以不做,仅仅是为了方便书写命令而已,事实上,一般我们在命令中明确给出路径即可(相对路径或绝对路径)。
/c/SREC/srec_cat.exe src/input.hex -intel -offset -0x0800A000 -o src/output.bin -binary
将HEX文件转化为 BIN文件(BASH环境下命令,CMD类似)
./srec_cat.exe input1.hex -intel -offset -0x0800A000 -o output1.bin -binary
需要注意的是鱼鹰标记的 -,如果没有这个,程序可以正常执行,不报错,但是会生成一个很大文件(从地址 0 开始转化):
-intel 代表使用 HEX格式来解析 input1.hex 文件,它并不是靠后缀名确定格式的
-binary 代表输出 BIN格式文件
-offset -0x0800A000 代表从 0x0800A000 地址转化,否则将从 0 地址开始转化。
如果输入的Intel HEX文件的记录未按升序地址顺序排序,将发出警告,可使用 Disable_Sequence_Warnings 选项禁用。KEIL 51生成的 HEX 就是这种情况,ARM的并不需要该选项。
将 BIN文件转化为 HEX文件?
./srec_cat.exe output1.bin -binary -offset -0x0800A000 -o cmp.hex -intel
因为鱼鹰不确定该命令是否正确,所以又将生成的 cmp.hex 文件转化为 bin文件进行对比:
./srec_cat.exe cmp.hex -intel -offset 0x0800A000 -o cmp.bin -binary
事实上,上述命令确实可以将 bin文件转化为 hex文件。
将两个 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,当然也可以修改成 0x00 或其他值,建议该值和 FLASH擦除后的值保持一致。
并且该 参数应该放在 input0.hex -intel 之后,放在 input1.hex -intel 后面会出错,应该是该参数值对前面的文件有效,并且地址范围包含在前面文件中。
./srec_cat.exe input0.hex -intel -fill 0xff 0x08000000 0x0800A000 input1.hex -intel -offset -0x08000000 -o output_ff.bin -binary
鱼鹰曾尝试使用上面的参数直接生成 bin文件,但发现最终生成的 bin文件从地址 0 开始,-offset 并没起作用,只能先转化为 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 并没有指定偏移,将以默认地址 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,网上一篇参考文章加了该参数,实际发现生成的 hex 文件从 0x0 开始。
0x08100000 这个值只要包含你的 HEX 文件的最大地址即可。
关于加入 CRC校验、比较文件的差异功能,我们下期再见了。
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。