KEIL下使用BAT文件生成BIN文件

本文介绍如何使用Keil5生成BIN文件,并通过批处理(BAT)文件实现自动化流程,包括创建BIN文件、复制文件及判断文件存在性等操作。此外,还介绍了如何合并两个BIN文件。

一、运行环境
WINs:WIN10
MDK:keil528
MCU:GD32F303
创建一个项目,此项目下有两个工程GD32303C_APP和GD32303C_boot。
在这里插入图片描述

二、BAT常用指令介绍
1、创建BAT文件
这个比较简单,先创建一个txt文件,然后将后缀直接改成.bat即可,也可以使用另存为.bat文件
在这里插入图片描述
2、使用BAT文件生成bin文件
直接在创建的bat文件中添加如下的代码。

E:\keil528\ARM\ARMCC\bin\fromelf.exe这个是绝对路径,既keil安装的路径,根据情况更改即可。

.\ 这个是相对路径,表示当前目录既GD32303C_BOOT.uvprojx这个文件所在的目录,这里BootRunAfter.bat是和它所在同一个目录的。

.\output\F303Boot.bin在当前目录下的output文件夹下生成一个F303Boot.bin

.\output\F303Boot.axf使用当前目录下中output文件夹下的F303Boot.axf生成bin文件,F303Boot.axf这个文件名由keil配置决定的,如下:
在这里插入图片描述

E:\keil528\ARM\ARMCC\bin\fromelf.exe --bin -o .\output\F303Boot.bin .\output\F303Boot.axf

E:\keil528\ARM\ARMCC\bin\fromelf.exe --bin -o ./output/F303Boot.bin ./output/F303Boot.axf

在KEIL中调用BAT文件:
注意:这里BootRunAfter.bat文件和.uvprojx工程文件在同一个目录:
在这里插入图片描述
或者写的更规范写,使用当前目录:
在这里插入图片描述
编译后,会在keil的Build Output窗口打印bat文件执行过的指令,当然也可以只用@ECHO OFF指令关闭
在这里插入图片描述
关掉回显

@ECHO OFF
E:\keil528\ARM\ARMCC\bin\fromelf.exe --bin -o .\output\F303Boot.bin .\output\F303Boot.axf

在这里插入图片描述
2、copy指令
将第1步中生成的bin文件复制到当前目录的上一级目录:

@ECHO OFF
E:\keil528\ARM\ARMCC\bin\fromelf.exe --bin -o .\output\F303Boot.bin .\output\F303Boot.axf
copy .\output\F303Boot.bin .\..\

.\output\F303Boot.bin为bin文件所在的位置
…\当前目录的上一个目录,如下:
在这里插入图片描述
复制并重命名

@ECHO OFF
E:\keil528\ARM\ARMCC\bin\fromelf.exe --bin -o .\output\F303Boot.bin .\output\F303Boot.axf
copy .\output\F303Boot.bin .\F303Boot111.bin

结果如下图:在当前目录生成一个F303Boot111.bin文件
在这里插入图片描述
3、if exist判断文件是否存在
命令格式: if [not] exist [路径]文件名 待执行的命令

@ECHO OFF
E:\keil528\ARM\ARMCC\bin\fromelf.exe --bin -o .\output\F303Boot.bin .\output\F303Boot.axf
if exist .\output\F303Boot.bin (
copy .\output\F303Boot.bin .\F303Boot111.bin
)


路径加双引号

@ECHO OFF
E:\keil528\ARM\ARMCC\bin\fromelf.exe --bin -o .\output\F303Boot.bin .\output\F303Boot.axf
if exist .\output\F303Boot.bin (
copy ".\output\F303Boot.bin" ".\F303Boot111.bin"
)

4、屏蔽当前代码使用:
则@ECH0 OFF为无效指令

::@ECHO OFF
E:\keil528\ARM\ARMCC\bin\fromelf.exe --bin -o .\output\F303Boot.bin .\output\F303Boot.axf
if exist .\output\F303Boot.bin (
copy ".\output\F303Boot.bin" ".\F303Boot111.bin"
)

5、合并两个bin文件
在项目下创建一个BIN文件存放一个BIN文件夹,将BOOT和APP生成的bin文件都复制到这个文件夹下,并通过merge.exe这个工具合并。

boot程序下BAT文件

@ECHO OFF
E:\keil528\ARM\ARMCC\bin\fromelf.exe --bin -o .\output\F303Boot.bin .\output\F303Boot.axf
if exist .\output\F303Boot.bin (
copy ".\output\F303Boot.bin" ".\..\..\..\..\BIN\"
)

App程序下BAT文件

@ECHO OFF
E:\keil528\ARM\ARMCC\bin\fromelf.exe --bin -o .\output\F303App.bin .\output\F303App.axf
if exist .\output\F303App.bin (
copy ".\output\F303App.bin" ".\..\..\..\..\BIN\"
)
if exist .\..\..\..\..\BIN\F303Boot.bin (
if exist .\..\..\..\..\BIN\F303App.bin (
.\..\..\..\..\BIN\merge.exe .\F303Boot.bin  .\F303App.bin .\boot_app.bin 0x2000
) 
)

merge.exe命令格式
merge.exe [boot路径]\文件名.bin [app路径]\文件名.bin [生成路径]生成文件名.bin 偏移地址(16进制10进制均可)
工程下载链接

<think>我们已知用户需求:使用Keil的.bat文件将hex文件转换为空白处填充0xff的bin文件。 根据之前的讨论,我们知道可以使用srec_cat工具来实现这个转换,并且可以指定填充值。 步骤: 1. 首先,确保安装了srec_cat工具(通常包含在Keil安装包中,位于C:\Keil_v5\ARM\ARMCC\bin\srec_cat.exe,或需要单独安装) 2. 编写一个批处理文件(.bat)来执行转换命令 命令格式: srec_cat <input.hex> -Intel -Output <output.bin> -Binary -fill <fill_value> <start_address> <end_address> 注意:我们需要填充空白区域为0xFF,因此fill_value为0xFF。但是,我们需要知道要填充的地址范围。通常,这个地址范围由链接脚本决定,我们可以从hex文件中获取最小和最大地址,但更常见的做法是明确指定整个需要填充的存储空间(例如从0x00000000到0x0003FFFF)。 然而,用户可能并不想指定固定的地址范围,而是希望自动根据hex文件中的地址范围进行填充。但这样只能填充最小地址到最大地址之间的空洞,而不能扩展到这个范围之外。 如果用户希望将整个地址范围(比如从0x0000到0xFFFF)都填充,那么可以这样写: srec_cat input.hex -Intel -Output output.bin -Binary -fill 0xFF 0x0000 0xFFFF 但是,如果hex文件中的地址超出了0xFFFF,那么这个命令会报错。因此,我们需要根据实际情况确定地址范围。 更通用的做法是:先获取hex文件中的地址范围,然后填充这个范围内的空洞。但是srec_cat的-fill参数要求指定一个地址范围,所以我们必须知道目标存储器的地址范围。 因此,我们需要用户提供地址范围。如果用户不知道,我们可以建议用户使用hex文件的最小地址和最大地址,然后填充这个区间内的空洞(但这样不会扩展地址范围)。但是,如果hex文件中有多个不相邻的段,则填充只能填充每个段内的空洞,而段之间的空洞不会被填充(因为地址范围不连续)。 然而,用户要求的是在空白处填充0xFF,通常指的是整个连续的地址空间(从起始地址到结束地址)。所以,我们必须明确这个地址范围。 假设用户希望填充整个Flash区域(例如0x08000000到0x0803FFFF),那么命令如下: srec_cat input.hex -Intel -Output output.bin -Binary -fill 0xFF 0x08000000 0x0803FFFF 这样,在0x08000000到0x0803FFFF范围内,没有数据的地方都会被填充0xFF。 在批处理文件中,我们可以这样写: 创建convert.bat文件,内容如下: @echo off set SRECCAT="C:\Keil_v5\ARM\ARMCC\bin\srec_cat.exe" set INPUT=your_input.hex set OUTPUT=output.bin set START_ADDR=0x08000000 set END_ADDR=0x0803FFFF %SRECCAT% %INPUT% -Intel -Output %OUTPUT% -Binary -fill 0xFF %START_ADDR% %END_ADDR% 但是,用户可能需要灵活指定输入输出文件名和地址范围。我们可以让批处理文件接受参数。 更灵活的版本(带参数): @echo off rem 用法: convert.bat input.hex output.bin start_addr end_addr set SRECCAT="C:\Keil_v5\ARM\ARMCC\bin\srec_cat.exe" set INPUT=%1 set OUTPUT=%2 set START_ADDR=%3 set END_ADDR=%4 %SRECCAT% %INPUT% -Intel -Output %OUTPUT% -Binary -fill 0xFF %START_ADDR% %END_ADDR% 然后调用方式: convert.bat test.hex test.bin 0x08000000 0x0803FFFF 注意:如果地址范围是十六进制,需要用0x前缀。 如果用户不想每次输入地址范围,也可以固定地址范围在批处理文件中。 但是,如果hex文件中的地址超出了指定的地址范围,则srec_cat会报错。 另一种方法是:如果用户不知道确切的地址范围,但希望填充整个hex文件所覆盖的地址范围(最小地址到最大地址)内的空洞,那么可以这样: srec_cat input.hex -Intel -Output output.bin -Binary -fill 0xFF 注意:这种方法不会扩展地址范围,只会填充在hex文件中出现的最小地址和最大地址之间的空洞,而不会填充这个范围之外的地址。 因此,我们需要根据用户的具体需求来选择。 由于用户明确要求“在空白地方填充0xff”,通常是指整个存储空间的空白区域,所以建议使用指定地址范围的方法。 另外,我们也可以从hex文件中提取地址范围,但这样批处理会复杂一些。我们可以使用srec_cat先获取hex文件的信息,然后解析出最小和最大地址,再用这个地址范围。但是,批处理脚本处理字符串比较麻烦,所以不推荐。 因此,我们提供两种方式: 1. 固定地址范围(在批处理文件中设置) 2. 通过参数传递地址范围 下面我们给出一个示例批处理文件(固定地址范围)和一个示例批处理文件(带参数)。 注意:请根据实际安装路径修改srec_cat的路径。 示例1:固定地址范围(适用于固定大小的Flash) @echo off set SRECCAT="C:\Keil_v5\ARM\ARMCC\bin\srec_cat.exe" set INPUT=test.hex set OUTPUT=test.bin set START_ADDR=0x08000000 set END_ADDR=0x0803FFFF %SRECCAT% %INPUT% -Intel -Output %OUTPUT% -Binary -fill 0xFF %START_ADDR% %END_ADDR% echo Conversion done. 示例2:使用参数(更灵活) @echo off if "%1"=="" goto usage if "%2"=="" goto usage if "%3"=="" goto usage if "%4"=="" goto usage set SRECCAT="C:\Keil_v5\ARM\ARMCC\bin\srec_cat.exe" %SRECCAT% %1 -Intel -Output %2 -Binary -fill 0xFF %3 %4 echo Conversion done. goto :eof :usage echo Usage: %0 input.hex output.bin start_addr end_addr echo Example: %0 test.hex test.bin 0x08000000 0x0803FFFF 注意:如果地址范围是十六进制,必须加上0x前缀。 如果用户希望自动获取hex文件的地址范围并填充最小地址到最大地址之间的空洞(不包括范围之外的地址),那么可以这样: srec_cat input.hex -Intel -Output output.bin -Binary -fill 0xFF 但是这样不会填充用户指定范围(比如整个Flash)的空白,而只会填充hex文件数据之间的空白。 所以,我们通常推荐用户指定整个存储器的地址范围。 总结:根据用户需求,我们推荐使用指定地址范围的方法。 另外,如果用户没有安装srec_cat,可以在http://srecord.sourceforge.net/下载。 在Keil中,我们也可以不通过批处理,而是直接在User Command中调用srec_cat,但用户要求使用.bat文件,所以我们提供批处理脚本。 最后,我们提供一个通用的带参数版本,并添加错误处理。 完善版本(检查文件是否存在): @echo off setlocal if "%~1"=="" goto usage if "%~2"=="" goto usage if "%~3"=="" goto usage if "%~4"=="" goto usage set SRECCAT="C:\Keil_v5\ARM\ARMCC\bin\srec_cat.exe" if not exist %SRECCAT% ( echo srec_cat not found at %SRECCAT% goto :eof ) if not exist "%~1" ( echo Input file %~1 not found. goto :eof ) %SRECCAT% "%~1" -Intel -Output "%~2" -Binary -fill 0xFF %~3 %~4 if %errorlevel% neq 0 ( echo Conversion failed. exit /b %errorlevel% ) echo Successfully converted %~1 to %~2, filled with 0xFF from %~3 to %~4. goto :eof :usage echo Usage: %~n0 input.hex output.bin start_addr end_addr echo Example: %~n0 test.hex test.bin 0x08000000 0x0803FFFF 注意:这个脚本要求输入四个参数:输入文件、输出文件、起始地址(十六进制)、结束地址(十六进制)。 用户可以将这个批处理文件放在工程目录下,然后在Keil的Post-build步骤中调用,或者手动运行。 在Keil的Post-build步骤中调用的方法: Project -> Options for Target -> Output -> Build Steps 在Post-build command line中填入: convert.bat "#L.hex" "output_dir\#L.bin" 0x08000000 0x0803FFFF 其中,#L表示目标名称,output_dir为输出目录。 注意:路径中如果包含空格,需要用引号括起来。 这样,每次编译后,Keil会自动执行这个批处理文件,将生成的hex文件转换为bin文件,并填充空白区域为0xFF。 如果用户希望更灵活地指定地址范围,可以将地址范围定义为工程选项,然后通过环境变量传递,但这样比较复杂,这里不展开。 最后,我们给出一个简单的示例,假设用户工程名称是test,Flash地址范围是0x08000000到0x0803FFFF,那么批处理命令在Keil中的设置如下: "$K\ARM\ARMCC\bin\srec_cat.exe" "#L.hex" -Intel -Output "#L.bin" -Binary -fill 0xFF 0x08000000 0x0803FFFF 注意:这里直接使用Keil的环境变量$K(Keil的安装目录)和#L(目标名称)。这样就不需要额外的批处理文件了。 但是,用户要求使用.bat文件,所以我们还是提供批处理的方式。 总结:我们提供了两种方法: 1. 使用独立的批处理文件,并通过参数传递输入输出文件和地址范围。 2. 在Keil的Post-build中直接调用srec_cat命令(无需批处理文件)。 根据用户要求,我们重点给出批处理文件的方法。 我们推荐使用独立批处理文件(带参数)的方式,因为它更灵活,可以重复使用。 因此,我们给出一个完整的批处理文件示例(convert_hex_to_bin.bat): </think> 以下是如何使用Keil的批处理文件(.bat)将HEX文件转换为BIN文件,并在空白地址填充0xFF的详细方法: ### 一、创建批处理文件(.bat)的步骤 1. **安装必需工具** 需要安装`SRecord`工具包(包含`srec_cat.exe`),Keil自带该工具(路径:`C:\Keil_v5\ARM\ARMCC\bin\srec_cat.exe`)。若未安装,请从[官方下载](http://srecord.sourceforge.net/)。 2. **编写批处理脚本** 创建`hex2bin.bat`文件,内容如下: ```batch @echo off set SRC_FILE=%~1 set DEST_FILE=%~dpn1.bin set START_ADDR=0x08000000 :: 替换为你的芯片起始地址 set END_ADDR=0x0803FFFF :: 替换为你的芯片结束地址 "C:\Keil_v5\ARM\ARMCC\bin\srec_cat.exe" ^ %SRC_FILE% -Intel ^ -fill 0xFF %START_ADDR% %END_ADDR% ^ -Output %DEST_FILE% -Binary echo 转换完成: %DEST_FILE% pause ``` 3. **关键参数说明** - `-fill 0xFF`:指定空白区域填充值为0xFF - `START_ADDR/END_ADDR`:芯片的Flash地址范围(需根据实际芯片修改) - `-Intel`:指定输入为Intel HEX格式 - `-Binary`:指定输出二进制格式 ### 二、使用方法 1. **直接拖放操作** - 将HEX文件拖放到`hex2bin.bat`图标上 - 自动生成同名BIN文件(如`firmware.hex` → `firmware.bin`) 2. **命令行调用** ```batch hex2bin.bat "C:\project\firmware.hex" ``` ### 三、地址范围确定方法 1. **查找芯片Flash范围** - 查看芯片手册(如STM32F103:0x08000000-0x0803FFFF) - 在Keil的`Options for Target → Target`选项卡查看IROM设置 2. **自动计算HEX文件范围** 修改脚本自动获取地址范围: ```batch for /f "tokens=1,2" %%a in ('srec_cat "%SRC_FILE%" -Intel -o - -headers') do ( set MIN_ADDR=%%a set MAX_ADDR=%%b ) srec_cat %SRC_FILE% -Intel -fill 0xFF %MIN_ADDR% %MAX_ADDR% -Output %DEST_FILE% -Binary ``` ### 四、技术原理 1. **填充算法** 设地址空间为 $[A_{\text{start}}, A_{\text{end}}]$,HEX文件包含数据点集 $D = \{(a_i, d_i)\}$,则BIN文件内容为: $$ B[a] = \begin{cases} d_i & \exists (a_i,d_i) \in D \text{ 且 } a_i = a \\ 0xFF & \text{其他情况} \end{cases} \quad \forall a \in [A_{\text{start}}, A_{\text{end}}] $$ 2. **文件格式对比** | 特性 | HEX文件 | BIN文件 | |------------|----------------|---------------| | 地址信息 | 包含绝对地址 | 无地址偏移 | | 空白处理 | 自动跳过 | 需显式填充 | | 文件大小 | 约大2-3倍[^3] | 紧凑二进制 | | 烧录方式 | 需解析 | 直接写入Flash | ### 五、验证结果 1. **检查文件大小** ```batch :: 应等于 (END_ADDR - START_ADDR + 1) dir /b firmware.bin ``` 2. **查看填充区域** ```batch :: 检查未使用区域是否为0xFF hexdump -C firmware.bin | grep -v "ff" ``` > **提示**:对于STM32系列,填充值0xFF可确保空白存储区处于擦除状态,符合Flash编程规范[^1]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值