KEIL MDK生成bin文件的两种方法

博客介绍了KEIL MDK生成bin文件的两种方法,即通过fromelf.exe实现,分为相对路径和绝对路径。以生成test_app.bin文件为例,说明了绝对路径需与.axf文件路径一致,路径变化时需重新填写;相对路径可在当前项目目录或指定目录生成。

KEIL MDK生成bin文件的两种方法

生成bin文件的设置路径:

Keil -> Option for Target -> User -> After Build/Rebuild -> Run #1(勾上) -> 输入bin文件的生成方式

bin文件的生成都是通过fromelf.exe来实现的,fromelf.exe一般在Keil的安装路径下:

例:D:\Keil\ARM\ARMCC\bin\fromelf.exe

这里又区分相对路径和绝对路径两种:

例:一个工程需要生成的文件名为 test_app,

1、Keil -> Option for Target -> Output -> Select Folder for Objects -> 选择文件生成路径 (例:output )

2、Keil -> Option for Target -> Output -> Name of Executable -> test_app(生成.hex 和 .axf文件)

1、生成方式 -> 绝对路径

D:\Keil\ARM\ARMCC\bin\fromelf.exe --bin -o ./output/test_app.bin ./output/test_app.axf"

上面这个就是根据 output 文件夹下的test_app.axf文件生成test_app.bin文件,并放在output文件夹下。

.axf文件的名称和路径需要和Name of Executable的名字和路径一样,.bin文件名可以自定义。

如果有拷贝到其他电脑上,发生路径变化就需要重新填写正确的路径。

2、生成方式 -> 相对路径

$K\ARM\ARMCC\bin\fromelf.exe --bin --output=@L.bin !L 

上面这个是在当前xxx.uvprojx项目目录下,可以看打一个bin文件

如果希望生成.bin文件输出在当前工程下的指定目录,比如Bin文件夹,可如下操作:

$K\ARM\ARMCC\bin\fromelf.exe --bin --output=Bin\@L.bin !L 
Key CodeDescription
$扩展为 指定文件的路径名
@文件名:如Output -> Name of Exectable -> 文件名(例:test_app)
!当前目录下的扩展路径!L 编译(Build)后,就是 .\obj\xx.axf文件
File CodeDescription
Kkeil develop chaintool 工具链(fromelf.exe)
LLinker output file L.bin 编译后,生成的就是最终的xx.bin文件

符号描述详见:
http://www.keil.com/support/man/docs/uv4/uv4_ut_keysequence.htm

转载:
https://blog.youkuaiyun.com/nich2009/article/details/81124691

### 生成 Keil MDK5 的 bin 文件方法 Keil MDK5 提供了多种方式来生成 `.bin` 文件,通常用于将程序烧录到嵌入式设备的 Flash 存储器中。以下是几种常见的方法: #### 使用 `fromelf` 工具生成 `.bin` 文件 Keil MDK 自带了一个名为 `fromelf` 的工具,可以将编译生成的 `.axf` 文件转换为 `.bin` 文件。 ##### 步骤: 1. **确保项目已正确编译**:在生成 `.bin` 文件之前,确保项目已经成功编译,并且生成了 `.axf` 文件。 2. **使用命令行调用 `fromelf`**:可以通过命令行或批处理脚本调用 `fromelf` 工具来生成 `.bin` 文件。 ##### 示例命令: ```bash fromelf --bin --output=your_output_file.bin your_project.axf ``` - `--bin`:指定输出格式为二进制文件。 - `--output`:指定输出文件的名称和路径。 - `your_project.axf`:这是编译生成的可执行文件。 ##### 自动化脚本示例: 以下是一个简单的批处理脚本,用于自动化生成带有版本号的 `.bin` 文件: ```batch @echo off set EXE_NAME=your_project set EXE_PATH=.\Objects set OUTPUT_PATH=.\Output set VERSION_FILE_PATH=.\version.h set SOFTWARE_VERSION=SOFTWARE_VERSION set FROMELF_PATH="C:\Keil_v5\ARM\ARMCC\bin\fromelf.exe" :: 获取软件版本号 for /f "tokens=3" %%a in ('findstr /C:%SOFTWARE_VERSION% %VERSION_FILE_PATH%') do set SW_Ver=%%a :: 去除版本号中的引号 set SW_Ver=%SW_Ver:~1,-1% :: 构建输出文件名 set BIN_FILENAME=%EXE_NAME%_v%SW_Ver%.bin set HEX_FILENAME=%EXE_NAME%_v%SW_Ver%.hex :: 转换 .axf 文件为 .bin 文件 %FROMELF_PATH% --bin --output=%OUTPUT_PATH%\%BIN_FILENAME% %EXE_PATH%\%EXE_NAME%.axf :: 显示并复制 Hex 文件(如果存在) if exist %EXE_PATH%\%EXE_NAME%.hex ( copy %EXE_PATH%\%EXE_NAME%.hex %OUTPUT_PATH%\%HEX_FILENAME% ) else ( echo Hex file not found! ) echo Conversion completed. exit ``` #### 解决生成 `.bin` 文件夹的问题 有时,在生成 `.bin` 文件时,可能会出现生成一个同名的 `.bin` 文件夹而不是 `.bin` 文件的情况。这通常是由于程序中使用了 `__attribute__((section("...")))` 等指令,将某些变量分配到了不属于应用程序 ROM 区域的地址[^4]。 ##### 解决方法: 1. **检查变量分配的地址**:确保所有通过 `__attribute__((section("...")))` 指定的变量都位于应用程序的 ROM 地址范围内。 2. **调整链接脚本**:如果需要将某些数据放置在特定的地址,确保这些地址位于应用程序的 ROM 范围内,避免跨段分配。 #### 使用 Python 将 `.bin` 文件转换为 C 数组 如果你需要将生成的 `.bin` 文件嵌入到 C 代码中,可以使用 Python 脚本将其转换为 C 语言数组格式[^2]。 ##### 示例代码: ```python def bin_to_c_array(bin_filename, c_array_filename): try: # 读取二进制文件 with open(bin_filename, "rb") as bin_file: bin_data = bin_file.read() # 将二进制数据转换为十六进制表示 hex_data = bin_data.hex() hex_bytes = [hex_data[i:i + 2] for i in range(0, len(hex_data), 2)] # 创建 C 语言数组格式的字符串 c_array = 'unsigned char binary_data[] = {\n' line_length = 16 # 每行显示的元素数量 for i, byte in enumerate(hex_bytes): if i > 0: c_array += ", " if i % line_length == 0 and i != 0: c_array += '\n' c_array += f"0x{byte}" c_array += '\n};\n' # 将 C 语言数组格式的字符串写入文本文件 with open(c_array_filename, "w") as c_file: c_file.write(c_array) print(f"转换完成 结果保存到C数组中 {c_array_filename}") except Exception as e: print(f"An error occurred: {e}") # 调用函数,替换为你的二进制文件名和目标文本文件bin_to_c_array('demo.bin', 'demo.txt') ``` #### 相关问题 1. 如何在 Keil MDK5 中配置 `fromelf` 工具? 2. 如何解决生成 `.bin` 文件时出现的错误? 3. 如何将 `.bin` 文件烧录到嵌入式设备中? 4. 如何在 Keil MDK5 中自动生成带有版本号的 `.bin` 文件? 5. 如何使用 Python 脚本将 `.bin` 文件转换为其他格式?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值