8

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

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

:020000040800F2
:100000000000022099020008A1020008A5020008D1
:10001000A9020008AD020008B102000800000000BB

我的操作系统是 Ubuntu 14.04 LTS。

感谢帮助!

4

3 回答 3

13

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

objcopy --input-target=ihex --output-target=binary code00.hex code00.bin
于 2016-05-14T12:09:04.023 回答
2

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

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

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

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

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

于 2014-11-18T12:21:50.857 回答
2

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

于 2014-11-16T22:29:11.473 回答