Objcopy elf 到 bin 文件

Objcopy elf to bin file

我有 STM32F404 板,我正在尝试刷写它。我正在关注这个 tutorial.

项目中Makefile

$(PROJ_NAME).elf: $(SRCS)
    $(CC) $(CFLAGS) $^ -o $@ 
    $(OBJCOPY) -O ihex $(PROJ_NAME).elf $(PROJ_NAME).hex
    $(OBJCOPY) -O binary $(PROJ_NAME).elf $(PROJ_NAME).bin

burn: proj
    $(STLINK)/st-flash write $(PROJ_NAME).bin 0x8000000

使用OBJCOPY生成bin文件,然后使用Make目标burn

刷入

我的问题:

问题 1:在这种情况下 OBJCOPY=arm-none-eabi-objcopy 是什么意思。我打开了那个人,但我没有完全理解任何人都可以简单地解释一下吗?

问题 2:闪烁 bin 文件给出了预期的结果(LED 闪烁)但是通过闪烁 elf 文件 LED 不闪烁 $(STLINK)/st-flash write $(PROJ_NAME).elf 0x8000000 所以为什么?

Question 1: What does OBJCOPY=arm-none-eabi-objcopy in this case. I opened the man but I didn't fully undrestand can anyone explain it simply ?

它将值arm-none-eabi-objcopy赋值给make变量OBJCOPY

make执行这条命令时:

$(OBJCOPY) -O binary $(PROJ_NAME).elf $(PROJ_NAME).bin

运行的实际命令是

arm-none-eabi-objcopy -O binary tim_time_base.elf tim_time_base.bin

Question 2: Flashing the bin file gives the expected result (Leds blinking) However the leds are not blinking by flashing the elf file $(STLINK)/st-flash write $(PROJ_NAME).elf 0x8000000 so why?

tim_time_base.elf 是一个 ELF 文件 -- 它具有与之关联的元数据。 运行 arm-none-eabi-readelf -h tim_time_base.elf 查看其中一些元数据是什么。

但是当您的处理器在重置后跳转到位置 0x8000000 时,它期望找到可执行指令, 而不是 元数据。当它发现 "garbage" 它不理解时,它可能只是停止了。它肯定找不到使灯闪烁的指令。

如果有人想使用 DFU(“执行固件升级”)功能,本教程将教授如何使用二进制文件通过 USB 加载,当 STM32 使用 USB 主机(或者可能是 OTG)运行时):

STM32 USB training - 11.3 USB MSC DFU host labs

本教程是强烈推荐程序员观看的系列视频的一部分,以更好地了解 STM32 USB 端口的工作和使用方式(视频由 STM32 制造商自己提供,我建议程序员观看此频道上的所有视频):

MOOC - STM32 USB training

注意:STM32 教程中的示例代码可在视频本身的说明中找到。

二进制文件(*.bin)可以借助上面同事解释的命令(Employed Russian)得到,它(command)也可以适配生成一个包含比较值的文件CRC 用法,可以在以下 posts:

中看到一些细节

Hands-on: CRC Checksum Generation

Srec_cat could be used to generate CRC checksum and put it into HEX file. To simplify the process, please put srec_cat.exe into the root of project folder.

Some tips and solutions about this CRC usage (Windows/Linux)

可惜代码量太大,直接post这里,我把其他答案相关的代码留在下面:

arm-none-eabi-objcopy -O ihex "${BuildArtifactFileBaseName}.elf" "${BuildArtifactFileBaseName}.hex" && ..\checksum.bat ${BuildArtifactFileBaseName}.hex

checksum.bat 文件的内容:

#!/bin/bash

# Windows [Dos comment: REM]:
#..\srec_cat.exe %1 -Intel -fill 0xFF 0x08000000 0x080FFFFC -STM32 0x080FFFFC -o ROM.hex -Intel

# Linux [Linux comment: #]:
srec_cat  -Intel -fill 0xFF 0x08000000 0x080FFFFC -STM32 0x080FFFFC -o ROM.hex -Intel

注意:在这种情况下,要写入的文件是ROM.hex(您需要配置STM32CubeIDE才能执行此操作,IDE使用*.elf 文件,请参阅上面的提示中的操作方法)

其他教程介绍如何使用扩展名为 *.DFU 的文件: DFU - DfuSe

The key benefits of the DFU Boatloader are: No specific tools such us JTAG, ST-LINK or USB-to-UART cable are needed. The ability to program an "empty" STM32 device in a newly-assembled board via USB. And easy upgrade the STM32 firmware during development or pre-production.

这个需要用到一个HEX文件方便执行ROM.hex文件生成CRC值的操作,实际上是一个连续性:

You must generate a .DFU file from an .HEX or .S19 file, for do this use the DFU File Manager.

但似乎使用 *.DFU 文件不像使用 *.BIN 文件那样独立,所以我找到了将 HEX 文件(使用 CRC 生成)转换为 *.BIN 文件的其他代码,根据本答案开头引用的教程(11.3 USB MSC DFU 主机),它可以与 USB 记忆棒一起使用:

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

Source

听起来有点混乱,但我们有以下步骤:

1- The STM32CubeIDE generates the *.elf file.

2- After compilation, the *.elf file is converted to *.hex.

3- CRC value is added in *.hex file via srec_cat application.

4- Now the *.hex file is converted to *.bin.

5- The BIN file is then stored on a USB flash drive.

6- STM32 updates firmware using USB flash drive file.

要使用*.BIN 文件,必须对STM32 进行编程以加载BIN 文件。如果它没有编程(STM32 是空的,未使用的或程序没有加载 BIN 文件),则需要使用 St-Link 或其他编程器,或者可能使用中描述的 DFU 方法上面的教程 (DFU - DfuSe)。