基于Arm GNU Toolchain编译生成的.elf转hex/bin文件格式方法
- 已经弃用的版本(Version 10.3-2021.10):gcc-arm-none-eabi:
https://developer.arm.com/downloads/-/gnu-rm
- Arm GNU Toolchain当前版本:
https://developer.arm.com/downloads/-/arm-gnu-toolchain-downloads
✨如果是基于MDK Keil ARMCC编译器,可以借助自带的
fromelf.exe
进行转换,如果使用arm GNU Toolchain工具链编译所生成的.elf文件,不要使用fromelf.exe
进行转换,两者不要混用。否则转换后的文件烧录后可能不能正常运行。
📗通过arm GNU Toolchain编译后手动生成的.elf格式文件转换
在命令行中手动运行以下命令,确保 arm-none-eabi-objcopy.exe 可以正常工作:
- 手动转换命令:
c
"D:\arm-gnu-toolchain\bin\arm-none-eabi-objcopy.exe" -O ihex "D:\STM32\HAL\STM32F405VG_DEMO\build\STM32F405VG_DEMO.elf" "D:\STM32\HAL\STM32F405VG_DEMO\build\STM32F405VG_DEMO.hex"

- 为了实现快速转换,可以制作一个
.bat
批处理文件,双击批处理文件,实现方便快捷转换。
convert_elf_to_hex_bin.bat
文件内容:
c
@echo off
echo Converting .elf to .hex and .bin...
REM 定义工具路径和输入输出文件路径
set OBJCOPY="D:\arm-gnu-toolchain\bin\arm-none-eabi-objcopy.exe"
set ELF_FILE="D:\STM32\HAL\STM32F405VG_DEMO\build\STM32F405VG_DEMO.elf"
set HEX_FILE="D:\STM32\HAL\STM32F405VG_DEMO\build\STM32F405VG_DEMO.hex"
set BIN_FILE="D:\STM32\HAL\STM32F405VG_DEMO\build\STM32F405VG_DEMO.bin"
REM 转换为 .hex 文件
%OBJCOPY% -O ihex %ELF_FILE% %HEX_FILE%
if %errorlevel% equ 0 (
echo .hex file created successfully.
) else (
echo Failed to create .hex file.
exit /b 1
)
REM 转换为 .bin 文件
%OBJCOPY% -O binary %ELF_FILE% %BIN_FILE%
if %errorlevel% equ 0 (
echo .bin file created successfully.
) else (
echo Failed to create .bin file.
exit /b 1
)
echo Conversion completed.
pause

📗通过arm GNU Toolchain编译后自动生成的.elf格式文件转换
- 在Windows平台下,通过cmakelist.txt文件,使用cmake构建文件,通过make/ninja生成的.elf格式文件,.elf格式文件本身是可以支持DAP-LINK、jlink配合相对应的配置文件是可以在线烧录的。有些时候需要其他方式烧录,例如串口、做IAP升级使用时,则需要hex或者bin文件。
- 需要提前在
CMakeLists.txt
文件中添加编译后的文件转换脚本:
c
# 定义生成的文件路径
set(ELF_FILE ${TARGET_NAME}.elf)
set(HEX_FILE ${TARGET_NAME}.hex)
# 定义生成的 ELF 文件路径
set(ELF_FILE ${CMAKE_BINARY_DIR}/${TARGET_NAME}.elf)
# 定义生成的 HEX 文件路径
set(HEX_FILE ${CMAKE_BINARY_DIR}/${TARGET_NAME}.hex)
# 定义 objcopy.exe 路径
set(OBJCOPY_PATH "D:/arm-gnu-toolchain/bin/arm-none-eabi-objcopy.exe")
# 定义生成的 ELF 文件路径
set(ELF_FILE ${CMAKE_BINARY_DIR}/${TARGET_NAME}.elf)
# 定义生成的 HEX 文件路径
set(HEX_FILE ${CMAKE_BINARY_DIR}/${TARGET_NAME}.hex)
set(BIN_FILE ${TARGET_NAME}.bin)
# 添加自定义命令,在编译完成后自动生成 HEX 文件
add_custom_command(TARGET ${TARGET_NAME} POST_BUILD
COMMAND ${OBJCOPY_PATH} -O ihex ${ELF_FILE} ${HEX_FILE}
COMMENT "Converting ELF to HEX"
VERBATIM
)
# 添加自定义命令,在编译完成后自动生成 BIN 文件
add_custom_command(TARGET ${TARGET_NAME} POST_BUILD
COMMAND ${OBJCOPY_PATH} -O binary ${ELF_FILE} ${BIN_FILE}
COMMENT "Converting ELF to BIN"
VERBATIM
)
- 其中
arm-none-eabi-objcopy.exe
文件在arm-gnu-toolchain\bin\arm-none-eabi-objcopy.exe
📘MDK keil工程中hex/bin文件转换方法
方法一:使用Keil软件内置功能
1.打开Keil软件,选择菜单栏中的"File"。
2.选择"Convert HEX to BINARY
"选项。
3.在弹出的窗口中选择要转换的HEX文件,并指定转换后的BIN文件的保存路径。
4.点击"Convert"按钮,完成转换后,可以在指定的保存路径找到生成的BIN文件。
方法二:使用fromelf工具
c
fromelf --bin -o "output_file.bin" "input_file.hex"
其中,--bin选项指示程序输出二进制格式的数据,-o后面跟随的是期望保存结果的位置和文件名,最后是待处理源文件的具体路径与名称。
自动化处理
为了在编译过程中自动生成BIN文件,可以在Keil的项目设置中进行配置:
1.进入"Options for Target
"的设置界面。
2.在User标签页中勾选Run#2,并按照模板填写如下指令字符串:
c
fromelf.exe --bin -o ./release.bin !L
每当成功编译完成后,就会依据设定好的规则在指定位置生成对应的BIN文件。