在 Linux 上为 ARM 将 *.hex 转换为 *.bin

Posted

技术标签:

【中文标题】在 Linux 上为 ARM 将 *.hex 转换为 *.bin【英文标题】:Converting from *.hex to *.bin for ARM on Linux 【发布时间】:2015-01-13 17:19:22 【问题描述】:

我想使用st-flash 命令将程序上传到我的STM32F4 Discovery 板上。 问题是当我尝试上传 *.hex 或 *.elf 文件时它不起作用。 我尝试了很多从 *.elf 或 *.hex 转换为 *.bin 的方法(比如使用 xxd ),但是当我上传它时它仍然无法正常工作。是的,我尝试从其他 Windows 计算机上传 hex 文件,它可以工作。

十六进制文件的示例(前三行,只是为了向您展示它的内部外观):

:020000040800F2
:100000000000022099020008A1020008A5020008D1
:10001000A9020008AD020008B102000800000000BB

我的操作系统是 Ubuntu 14.04 LTS。

感谢您的帮助!

【问题讨论】:

【参考方案1】:

我假设你有 linux 并且你已经安装了binutils,所以你只需这样做:

objcopy --input-target=ihex --output-target=binary code00.hex code00.bin

【讨论】:

当心:这会使加载基址出现乱码。但适用于 OP 情况,因为 ihex 数据字节从 0000 开始。此外,任何工具链都适用于此操作,不一定是 ARM。 @ulidtko:1.问题是针对ARM的,因此答案是针对ARM的; 2. bin 文件不包含加载基地址,您声称会出现乱码。您在加载 .bin 时指定地址 如何更改起始段地址?例如,我不希望它以 0x00000000 为基础,而是以 0x80000000 为基础。 这会复制到原始(裸机)二进制文件,而不是 ELF。【参考方案2】:

您是否考虑过使用 arm-none-linux-gnueabi-objcopy(或类似的)代替 xxd? 这可以在任何 ARM 工具链中找到。

【讨论】:

是的,我有,但有可能我做错了。现在我离开了我的电脑。 (用我的手机发布)我想我用了arm-none-eabi-objcopy myhex.hex -O binary mybin.bin 之类的东西,但我现在不确定。我回家后会告诉你的。 好的,我现在可以访问我的电脑了。所以我尝试了这两种选择:arm-none-eabi-objcopy "F4 Discovery test.elf" -Obinary "out.bin"arm-none-eabi-objcopy "F4 Discovery test.elf" -Oihex "newout.bin" - 它们不起作用,至少对我而言。我实际上是在尝试理解 OpenOCD,并且我已经上传了我的 *.hex 并且它可以工作...... 也许你得把它命名为以.hex结尾【参考方案3】:

.hex 文件格式记录在网络上。您需要一个能够理解它的加载程序,因为它有几种寄存器来控制加载过程。一些寄存器控制入口点地址。其他是要加载到某个固定地址的数据。

您可以在***(我在那里找到)获取英特尔十六进制格式的信息(这就是它的名称)。如果所有数据都在一个段上,并且没有指定入口点,理论上你可以将其转换为二进制数据来加载,但这是不可能的。

它是一个文本文件,由以 ':' 字符开头的行组成,然后是一个两字段的十六进制数字,表示该记录具有的数据字节数,然后是该数据要加载的地址,然后是类型文件,它可以是以下之一:

00这个值是一堆数据,一般是16字节(0x10) 01 文件结束。它没有数据,所以总是编码为:00000001FF 02 扩展段地址,允许超过 16 位的地址。 03 起始入口点地址,在0x86架构中注册初始CS:IP地址。 04 扩展线性地址,指定32位地址。这指定了 00 寄存器的高 16 位地址部分。 05 起始入口点线性地址。这是 32 位线性入口点地址。

然后是要加载的数据(十六进制编码)的 n 个字节(n 是第一个字段的值),最后是一个校验和字节(从冒号开始的所有记录字节的二进制补码的总和)。

【讨论】:

那么你对我有什么建议?我正在使用st-flash write bingotfromhex.bin 0x8000000。我实际上是在学习 openOCD 小步骤,所以我可以上传 *.elf 文件。感谢您解释十六进制文件的工作原理! 我不知道。 Intel hex 格式是一种通用的、非常扩展的格式。我不使用 ARM。我不能给你更多的帮助。对不起。也许您必须使用 st-flash 的选项才能解析十六进制文件...您是否尝试过 st-flash --help ??? 没关系。 c: 不管怎样,你给我的知识会很有用。感谢您的帮助! 我正在搜索 st-flash 实用程序文档,但还没有结果。 tjakubowski.wordpress.com/2012/12/04/… (它似乎适用于.hex 文件)

以上是关于在 Linux 上为 ARM 将 *.hex 转换为 *.bin的主要内容,如果未能解决你的问题,请参考以下文章

无法刷写 ARM 设备 - “英特尔 Hex 文件不以 ':' 开头”

将 ARM 代码从 rvds 转换为 linux gcc 源

如何使用 LLVM 在 Windows 上为 ARM 编译 C++ 程序?

在keil for arm 编译环境中,axf文件是干啥的?怎么生成的?能修改吗?

linux下hex文件到bin文件的格式转化,bin文件转换为hex文件操作步骤解析

在 Gitlab Runners 上为 ARM 构建 Docker Image OpenJDK16+