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 制造商自己提供,我建议程序员观看此频道上的所有视频):
注意: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)。
我有 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 制造商自己提供,我建议程序员观看此频道上的所有视频):
注意: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)。