基于Arm GNU Toolchain编译生成的.elf转hex/bin文件格式方法

基于Arm GNU Toolchain编译生成的.elf转hex/bin文件格式方法

已经弃用的版本(Version 10.3-2021.10):gcc-arm-none-eabi:https://developer.arm.com/downloads/-/gnu-rmArm 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 可以正常工作:

手动转换命令:

"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文件内容:

@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文件中添加编译后的文件转换脚本:

# 定义生成的文件路径

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/BIN文件

set(HEX_FILE ${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

🌿如果工程是基于STM32CUBEMX生成的CMake或Makefile工程,那么相关的gnu命令设置会在cmake文件夹中的gcc-arm-none-eabi.cmake文件中被定义,上面的OBJCOPY_PATH就可以直接填写CMAKE_OBJCOPY即可。

set(CMAKE_C_COMPILER_ID GNU)

set(CMAKE_CXX_COMPILER_ID GNU)

# Some default GCC settings

# arm-none-eabi- must be part of path environment

set(TOOLCHAIN_PREFIX arm-none-eabi-)

set(CMAKE_C_COMPILER ${TOOLCHAIN_PREFIX}gcc)

set(CMAKE_ASM_COMPILER ${CMAKE_C_COMPILER})

set(CMAKE_CXX_COMPILER ${TOOLCHAIN_PREFIX}g++)

set(CMAKE_LINKER ${TOOLCHAIN_PREFIX}g++)

set(CMAKE_OBJCOPY ${TOOLCHAIN_PREFIX}objcopy)

set(CMAKE_SIZE ${TOOLCHAIN_PREFIX}size)

✨更简洁的生成方法命令:

将下面的代码拷贝到Cmakelist.txt文件中。

# 添加自定义命令,在编译完成后自动生成 HEX 文件

add_custom_command(TARGET ${CMAKE_PROJECT_NAME} POST_BUILD

COMMAND ${CMAKE_OBJCOPY} -O ihex # 生成 HEX 文件

"${CMAKE_BINARY_DIR}/${PROJECT_NAME}.elf"

"${CMAKE_BINARY_DIR}/${PROJECT_NAME}.hex"

COMMENT "Generating HEX file"

VERBATIM

)

# 添加自定义命令,在编译完成后自动生成 BIN 文件

add_custom_command(TARGET ${CMAKE_PROJECT_NAME} POST_BUILD

COMMAND ${CMAKE_OBJCOPY} -O binary # 生成 BIN 文件

"${CMAKE_BINARY_DIR}/${CMAKE_PROJECT_NAME}.elf"

"${CMAKE_BINARY_DIR}/${CMAKE_PROJECT_NAME}.bin"

COMMENT "Converting ELF to BIN"

VERBATIM

)

📘MDK keil工程中hex/bin文件转换方法

方法一:使用Keil软件内置功能

1.打开Keil软件,选择菜单栏中的“File”。

2.选择“Convert HEX to BINARY”选项。

3.在弹出的窗口中选择要转换的HEX文件,并指定转换后的BIN文件的保存路径。

4.点击“Convert”按钮,完成转换后,可以在指定的保存路径找到生成的BIN文件。

方法二:使用fromelf工具

fromelf --bin -o "output_file.bin" "input_file.hex"

其中,–bin选项指示程序输出二进制格式的数据,-o后面跟随的是期望保存结果的位置和文件名,最后是待处理源文件的具体路径与名称。

自动化处理

为了在编译过程中自动生成BIN文件,可以在Keil的项目设置中进行配置:

1.进入“Options for Target”的设置界面。

2.在User标签页中勾选Run#2,并按照模板填写如下指令字符串:

fromelf.exe --bin -o ./release.bin !L

每当成功编译完成后,就会依据设定好的规则在指定位置生成对应的BIN文件。