如何生成stm32代码的二进制文件?

3
我正在为一个STM32 MCU构建固件更新程序。我已经在设备上编写了引导加载程序软件,与FLASH中的主应用程序分开。
我需要做的是生成一个二进制文件,该文件将成为FLASH中主应用程序的替换代码。这意味着我可以通过UART传输文件并覆盖主应用程序。如何生成这样的文件?
该代码是使用stm32CubeIDE编程的,生成一个.elf文件。在通过UART传输之前,我会在此二进制代码中添加一个头部。
非常感谢您的帮助,
Harry

我该如何生成这样的文件?- 与生成其他任何固件的方式相同。编写源文件,进行编译和链接。 迄今为止,我已经编写了引导加载程序软件 - 是哪个软件? - KamilCuk
我想问的是,在编译和链接之后,通常会生成可执行文件。但在这种情况下,生成了一个.elf文件,因为它将要传输到MCU。那么,这个.elf文件是否相当于.exe文件,如果将二进制文件传输到MCU并加载,程序就会运行? - arry_h
2
不同的文件格式有不同的用途,例如.elf是可执行和可链接格式,.exe是Windows可执行文件,二进制文件是二进制的。你需要根据“编程引导程序软件”所期望的内容来选择文件格式。最可能需要的是hex文件,但这取决于你编写的引导程序软件以及使用的协议。你可能需要一些能够与你编写的引导程序配合工作的程序。 - KamilCuk
我想要的是一个十六进制文件,它包含完全编译的代码,这样它就有了常规向量表,然后是主应用程序。我不确定如何从生成的Elf文件创建此文件。 - arry_h
2
好的,你需要与你的链接器进行认真的交谈,说服它生成一个可以加载到闪存中的映像。是的,这很痛苦,有许多区域、段和部分,但必须完成 :( - Martin James
1
如果您使用gcc和Linux,则只需arm-none-eabi-objcopy -o ihex input.elf output.elf,即如何将elf转换为hex。通常,引导加载程序非常简单,它们公开了一个API来编程和擦除存储器区域。因此,您需要在PC上运行一个程序,该程序将理解例如hex文件格式并与您的引导加载程序通信。但是,您没有说您使用了什么“引导加载程序软件”。 - KamilCuk
3个回答

9
在CubeIDE中,转到项目设置 -> "C/C++ Build"组 -> 设置 -> "工具设置"选项卡 -> MCU后构建输出 -> "转换为Intel Hex文件"复选框Hex file option in CubeIDE
(如果您没有看到这些选项,则可能需要重新启动IDE-此类错误仍然存在)
这将使IDE将输出转换为可轻松解析的HEX文件。 您可以在维基百科上找到格式说明。 在发送到引导加载程序之前,可以对其进行解析。
或者,您可以勾选“转换为二进制文件”复选框,这将创建一个原始的二进制文件。 但是,如果您的代码不从零地址开始,则可能会出现一些问题。

1
非常感谢,这正是我正在寻找的! - arry_h

2
您需要使用IDE附带的objcopy.exe工具。以下内容适用于Atollic TrueStudio,它是STM32CubeIDE的前身。通常将此步骤添加为构建后步骤。"Original Answer"翻译成"最初的回答"。
arm-atollic-eabi-objcopy.exe -O ihex "${BuildArtifactFileBaseName}.elf" "${BuildArtifactFileBaseName}.hex"

有关objcopy的更多信息,请参阅:https://sourceware.org/binutils/docs/binutils/objcopy.html

最初的回答:


0

对于STM32CubeIDE的内部构建器,这个(作为后置构建步骤)可以正常工作:

arm-none-eabi-objcopy -O ihex ${ProjName}.elf ${ProjName}.hex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接