基于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 可以正常工作:
- 手動轉換命令:
"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 文件路徑
set(HEX_FILE ${CMAKE_BINARY_DIR}/${TARGET_NAME}.hex)
set(BIN_FILE ${TARGET_NAME}.bin)# 添加自定義命令,在編譯完成后自動生成 HEX 文件
add_custom_command(TARGET ${TARGET_NAME} POST_BUILDCOMMAND ${OBJCOPY_PATH} -O ihex ${ELF_FILE} ${HEX_FILE}COMMENT "Converting ELF to HEX"VERBATIM
)# 添加自定義命令,在編譯完成后自動生成 BIN 文件
add_custom_command(TARGET ${TARGET_NAME} POST_BUILDCOMMAND ${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工具
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文件。