在 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文件是干啥的?怎么生成的?能修改吗?