Keil自动生成Bin文件(2)
情况:之前写过一篇Keil在编译的时候自动生成Bin文件。但是后来在发固件的时候发现了一些小问题。固件需要版本号和时间,生成的固件名每次都需要自己手动修改,增加了很多繁琐的工作量。因此研究写出一个Batch脚本来解决这个问题。
首先提取一下今天的日期
@REM 提取日期
set datevar=%date:~0,4%.%date:~5,2%.%date:~8,2%
根据自己的文件名,文件路径,存放软件版本号的文件和变量名
@REM 可执行文件(exe)文件名 (要改)
set EXE_NAME=SoftWare
@REM 可执行文件(exe)文件路径 (根据自己看需不需要改)
set EXE_PATH=.\Objects
@REM Bin文件输出路径 (根据自己看需不需要改)
set OUTPUT_PATH=..\Output
@REM 软件版本文件路径 (根据自己看需不需要改)
set VERSION_FILE_PATH=..\User\user_sys.h
@REM 软件版本字符串的格式 (要改)
set SOFTWARE_VERSION="SOFTWARE_VERSION"
@REM fromelf文件路径 (查看一下keil软件放在什么目录,根据目录来)
Set FROMELF_PATH=C:\Keil_v5\ARM\ARMCLANG\bin\fromelf.exe
之后就是获取版本软件号,然后转化为自己需要的格式
打个比方:软件版本号为0x1011,第一位为大版本号1,第二位为中版本号0,第三位-第四位为小版本号11,因为是16进制,所以要转换成10进制数,转换后为 1.0.17
@REM 获取软件版本号
for /f "tokens=3 delims= " %%i in ('type "%VERSION_FILE_PATH%" ^| findstr "%SOFTWARE_VERSION%"') do set SW_Ver=%%i
@REM 显示原始版本号
echo Original version in hex: %SW_Ver%
@REM 提取大版本号
set "major=!SW_Ver:~2,1!"
@REM 提取中间版本号
set "middle=!SW_Ver:~3,1!"
@REM 提取小版本号
set "minor=!SW_Ver:~4,2!"
@REM 将小版本号从16进制转换为10进制
set /a "minor_dec=(!minor:~0,1!*16)+!minor:~1,1!"
@REM 整合软甲版本号
set Version=%major%.%middle%.%minor_dec%
:: 显示转换后的版本号
echo %Version%
最后,将版本名和时间拼接,并且转换成bin文件。这样就可以在输出文件夹得到我们想要的bin文件。
@REM 定制Hex文件名
set output_file_name=%EXE_NAME%_V!Version!_%datevar%
@REM 转换并定制Bin文件名
%FROMELF_PATH% --bin "%EXE_PATH%\%EXE_NAME%.axf" --output "%OUTPUT_PATH%\%output_file_name%.bin"
最后附上完整的代码
@echo off
setlocal EnableDelayedExpansion
@REM 提取日期
set datevar=%date:~0,4%.%date:~5,2%.%date:~8,2%
@REM 可执行文件(exe)文件名 (要改)
set EXE_NAME=SolarFlow
@REM 可执行文件(exe)文件路径 (根据自己看需不需要改)
set EXE_PATH=.\Objects
@REM Bin文件输出路径 (根据自己看需不需要改)
set OUTPUT_PATH=..\Output
@REM 软件版本文件路径 (根据自己看需不需要改)
set VERSION_FILE_PATH=..\User\user_sys.h
@REM 软件版本字符串的格式 (要改)
set SOFTWARE_VERSION="SBV_SOFTWARE_VERSION"
@REM fromelf文件路径 (查看一下keil软件放在什么目录,根据目录来)
Set FROMELF_PATH=C:\Keil_v5\ARM\ARMCLANG\bin\fromelf.exe
@REM 获取软件版本号
for /f "tokens=3 delims= " %%i in ('type "%VERSION_FILE_PATH%" ^| findstr "%SOFTWARE_VERSION%"') do set SW_Ver=%%i
@REM 显示原始版本号
echo Original version in hex: %SW_Ver%
@REM 提取大版本号
set "major=!SW_Ver:~2,1!"
@REM 提取中间版本号
set "middle=!SW_Ver:~3,1!"
@REM 提取小版本号
set "minor=!SW_Ver:~4,2!"
@REM 将小版本号从16进制转换为10进制
set /a "minor_dec=(!minor:~0,1!*16)+!minor:~1,1!"
@REM 整合软甲版本号
set Version=%major%.%middle%.%minor_dec%
:: 显示转换后的版本号
echo %Version%
@REM 定制Hex文件名
set output_file_name=%EXE_NAME%_V!Version!_%datevar%
@REM 转换并定制Bin文件名
%FROMELF_PATH% --bin "%EXE_PATH%\%EXE_NAME%.axf" --output "%OUTPUT_PATH%\%output_file_name%.bin"
@REM 显示输出的文件
echo "Output bin file: %OUTPUT_PATH%\%output_file_name%.bin"
endlocal
::pause
exit