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

news/2025/3/28 19:43:47/

基于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文件。


http://www.ppmy.cn/news/1583079.html

相关文章

[特殊字符] 力扣热题 394:字符串解码(详细解析)(Go语言版)

🚀 力扣热题 394:字符串解码(详细解析) 📌 题目描述 力扣 394. 字符串解码 给定一个经过编码的字符串,返回它解码后的字符串。 编码规则为:k[encoded_string],表示其中方括号内部的…

【web3】

检测钱包是否安装 方法一 // npm install metamask/detect-provider import detectEthereumProvider from metamask/detect-provider// 检测钱包是否安装 const isProvider await detectEthereumProvider() if(!isProvider) {proxy.$modal.msgError("请安装钱包")…

datawhale组队学习--大语言模型—task4:Transformer架构及详细配置

第五章 模型架构 在前述章节中已经对预训练数据的准备流程(第 4 章)进行了介绍。本章主 要讨论大语言模型的模型架构选择,主要围绕 Transformer 模型(第 5.1 节)、详细 配置(第 5.2 节)、主流架…

Idea中使用Git插件_合并当前分支到master分支_冲突解决_很简单---Git工作笔记005

由于之前用svn习惯了,用的git少,其实在idea中使用git,解决冲突,合并分支,非常的简单,一起来看一下吧. 一定要注意操作之前,一定要确保自己的分支代码,都已经commit提交了,并且push到远程了. 不要丢东西. 可以看到首先,在idea的左下角有个 git,点开以后 可以看到有显示的分支…

大型语言模型(LLM)推理框架的全面分析与选型指南(2025年版)

原创 AI安全工坊 AI安全工坊 2025年02月27日 16:22 江苏 1. 引言 大型语言模型(LLM)已成为驱动智能客服、内容创作、代码生成等领域变革的核心力量。推理框架作为LLM高效部署的关键组件,直接关系到应用的性能、成本和开发效率。为帮助读者…

DeepSeek高校教程大合集(清华,北大,浙大,夏大,天大,湖大,天大,北师大),持续更新

大家好,我是吾鳴。 自从DeepSeek爆火之后,吾鳴就一直在收集和整理关于DeepSeek的教程报告等资料,也收集了有一个多月了。但是有粉丝朋友反馈说,有点凌乱,细找比较麻烦。于是乎吾鳴基于金山文档建设了一个比较简陋的资源…

Python网络编程入门

一.Socket 简称套接字,是进程之间通信的一个工具,好比现实生活中的插座,所有的家用电器要想工作都是基于插座进行,进程之间要想进行网络通信需要Socket,Socket好比数据的搬运工~ 2个进程之间通过Socket进行相互通讯&a…

常见框架漏洞--Spring

Spring Data Rest 远程命令执⾏命令(CVE-2017-8046) 环境搭建 漏洞利用 1. 访问 http://your-ip:8080/customers/1 2.然后抓取数据包,使⽤PATCH请求来修改 [{ "op": "replace" , "path": "T(java.lang.Runtime).getRuntime().…