新闻  |   论坛  |   博客  |   在线研讨会
功能强大的 HEX 开源转换工具,你值得拥有
鱼鹰谈单片机 | 2021-05-12 09:42:38    阅读:4890   发布文章

功能

你是否存在这样的需求?

将 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。

1.png

因为初始地址不一样,所以我们可以使用它进行合并(如果两个 HEX文件地址有重合,将产生错误或警告,合并失败,当然如果确实有需求,也是有办法的)。

然后将两个文件拷贝到工具目录下,这一步可以不做,仅仅是为了方便书写命令而已,事实上,一般我们在命令中明确给出路径即可(相对路径或绝对路径)。

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

2.png

将HEX文件转化为 BIN文件(BASH环境下命令,CMD类似)

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

需要注意的是鱼鹰标记的 -,如果没有这个,程序可以正常执行,不报错,但是会生成一个很大文件(从地址 0 开始转化):

3.png

-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文件。

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,当然也可以修改成 0x00 或其他值,建议该值和 FLASH擦除后的值保持一致。

5.png

并且该 参数应该放在 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校验、比较文件的差异功能,我们下期再见了。

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客