在Linux上从ARM转换为* .hex到* .bin

时间:2014-11-16 20:38:13

标签: linux binary hex file-conversion stm32f4discovery

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

hex文件的示例(前三行,只是为了向您展示它的内容):

:020000040800F2
:100000000000022099020008A1020008A5020008D1
:10001000A9020008AD020008B102000800000000BB

我的操作系统是Ubuntu 14.04 LTS。

感谢您的帮助!

3 个答案:

答案 0 :(得分:9)

我假设你有linux并且你安装了binutils,所以你只需要:

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

答案 1 :(得分:2)

网络上记录了

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

您可以在维基百科(我在那里找到)获取有关Intel Hex格式的信息(这就是它的名称)。如果所有数据仅在一个段上并且没有指定入口点,理论上您可以将其转换为要加载的二进制数据,但这是不可能的。

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

  • 00 此值适用于一堆数据,通常为16个字节(0x10)
  • 01 文件结束。它没有数据,因此始终编码为:00000001FF
  • 02 扩展段地址,允许超过16位的地址。
  • 03 启动入口点地址,以0x86架构注册初始CS:IP地址。
  • 04 扩展线性地址,用于指定32位地址。这指定了00寄存器的高16位地址部分。
  • 05 开始输入点线性地址。这是32位线性入口点地址。

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

答案 2 :(得分:1)

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