如何在MDK中生成HEX文件,并转换成bin文件最后计算整个固件的CRC校验值
1.为什么要校验?
我们在进行升级时,首先要考虑一个问题,就是怎么保证我的固件是完整的,有没有可能我的固件输出过程中有数据丢失的情况??列几个例子,你使用串口做升级时,突然PC或者下位机异常或断电,你如果不做校验很可能固件升级到一半,导致产品出现意想不到的情况。所以验证固件是否完整在实际项目过程中是非常有必要的。即使固件校验失败,那么我们也有办法恢复原来的程序。
MDK如何做校验?
工欲善其事必先利其器,首先先找工具。
Keil平台,是没有像IAR平台那样,自身带有一个工具可以为bin文件生成CRC校验值。所以,要在Keil环境中添加CRC校验码,就需要借助第三方的工具。
下面我 srecord 这个工具生成 CRC 校验码,然后再使用 hex2bin 工具把具有CRC校验码的 hex 文件转换为bin文件。
srecord 工具官网:
https://srecord.sourceforge.net/
hex2bin 工具下载:
https://sourceforge.net/projects/hex2bin/
首先我们先找到项目工程所在位置:
添加这三个文件 srec_cat_exe、hex2bin.exe、最后是copyhex_flash.bat
我们来看看.bat的内容
copy Obj\output.hex .\output.hex
hex2bin output.hex
for /f %%i in ('dir /b output.bin') do (
set indexdx=%%~zi
)
ECHO %indexdx%
srec_cat.exe output.bin -Binary -crop 0 %indexdx% -STM32_Little_Endian %indexdx% -o app.bin -Binary
来看看AI是如何解读这段脚本内容的:
这段代码是一个简单的批处理脚本,它执行了一系列的操作来处理二进制文件。下面是对每一行命令的解释:
copy Obj\output.hex .\output.hex
- 这条命令将
Obj
目录下的output.hex
文件复制到当前目录下,文件名保持不变。
hex2bin output.hex
- 这里调用了一个名为
hex2bin
的程序,它通常用于将十六进制文件(.hex
)转换为二进制文件(.bin
)。这意味着output.hex
文件被转换成了output.bin
。
for /f %%i in ('dir /b output.bin') do (
- 这是一个循环,使用
for
命令来遍历output.bin
文件的大小(以字节为单位)。/b
选项告诉dir
命令只返回文件大小,不包括其他文件信息。%%i
是循环变量,代表当前遍历到的文件大小。
set indexdx=%%~zi
- 在循环内部,这条命令将
%%i
(文件大小)赋值给变量indexdx
。~z
是for
命令的一个修饰符,用于获取%%i
的原始值(即不带任何引号的值)。
ECHO %indexdx%
- 打印变量
indexdx
的值,即output.bin
文件的大小。
srec_cat.exe output.bin -Binary -crop 0 %indexdx% -STM32_Little_Endian %indexdx% -o app.bin -Binary
- 这条命令调用
srec_cat
工具,它是一个用于处理二进制文件的实用程序,可以转换文件格式,如S-Record、Motorola S-Record、Intel Hex等。-Binary
选项指定输入文件output.bin
是二进制格式。-crop 0
选项用于裁剪文件,这里的0
表示不裁剪任何字节。-STM32_Little_Endian
选项指定输出文件的地址和数据应该按照STM32微控制器的Little-Endian格式排列。%indexdx%
在这里作为裁剪后的文件大小,但由于-crop
已经设置为0
,这部分实际上没有效果。-o app.bin
指定输出文件名为app.bin
。- 最后的
-Binary
选项指定输出文件app.bin
也是二进制格式。总的来说,这个批处理脚本的作用是将一个十六进制文件转换为二进制文件,然后使用
srec_cat
工具将其转换为适合STM32微控制器的二进制文件,同时输出文件的大小被打印出来。
还有一个点别忘记了:
记得添加脚本文件链接。
程序编译后,我们可以看到程序大小为
打开我们的app.bin文件看看
可以看到最后四个字节就是CRC校验的结果
补:自己给自己留了个大坑,忘记改hex文件名称,导致系统找不到output文件,大家多留意一下自己的hex文件,一定要仔细再仔细