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

问题描述 投票:6回答:3

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

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

:020000040800F2
:100000000000022099020008A1020008A5020008D1
:10001000A9020008AD020008B102000800000000BB

我的操作系统是Ubuntu 14.04 LTS。

感谢帮助!

linux binary hex file-conversion stm32f4discovery
3个回答
9
投票

我假设你有linux,你已经安装了binutils,所以你只需:

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

2
投票

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

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

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

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

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


1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.