本文介绍如何生成带有CRC的bin文件。
MCU在上电运行时,通常需要校验程序是否正确(有无篡改或烧录文件出错),一般的做法是在烧录文件(通常是bin文件)末尾追加CRC(CRC-8,CRC-16,CRC-32),程序运行时首先校验CRC是否正确,再进行下一步运行。本文以Windows环境下,生成带有CRC-32的bin文件为例,对此作简要介绍。
1.工具下载与安装
这里用到srecord工具,其官网地址:
https://srecord.sourceforge.net/
我的电脑为Windows 10,这里下载的是“srecord-1.65.0-win64.exe",可根据实际情况进行下载,安装过程比较简单,这里就不再详细介绍。安装完成后会自动设置环境变量,可通过下面的指令测试是否安装成功。在Windows命令行下,输入:
srec_cat -version
安装正常情况下会输出版本信息。
2.批处理文件编写
Windows环境下,编写如下批处理文件(post-build.bat)。
@echo OFF
set START_ADDRESS=0x08000000
set CRC_ADDRESS=0x0807FFFC
set SRC_HEX_FILE=test.hex
set CRC_HEX_FILE=test-crc.hex
set CRC_BIN_FILE=test-crc.bin
echo ----------------------------------
echo Generating Checksum...
@echo ON
srec_cat %SRC_HEX_FILE% -intel -crop %START_ADDRESS% %CRC_ADDRESS% -fill 0xFF %START_ADDRESS% %CRC_ADDRESS% -CRC32_Little_Endian %CRC_ADDRESS% -CCITT -o %CRC_HEX_FILE% -intel
srec_cat %CRC_HEX_FILE% -intel -offset -%START_ADDRESS% -o %CRC_BIN_FILE% -binary
del -s %CRC_HEX_FILE%
@echo OFF
echo Generate Checksum: OK
其中,
1)START_ADDRESS:程序运行的存储器起始地址,这里设置的是0x08000000
2)CRC_ADDRESS:添加CRC的存储器地址,通常在存储器地址的末尾,这里是512K的地址空间,采用CRC-32校验,因此,地址设置的是0x0807FFFC
3)SRC_HEX_FILE:想要转换的hex文件
4)CRC_HEX_FILE:添加CRC后的hex文件,此文件为临时文件
5)CRC_BIN_FILE:最终添加CRC后的bin文件
注意:
1)以上值都需要根据实际情况进行设定
2)CRC校验选择的是CCITT的校验方式,可根据实际情况设定,具体请查阅srecord的reference
3.开发工具设置
以STM32CubeIDE为例,将上述“post-build.bat”拷贝到“Release”文件夹中,并设置好参数,主要是地址及文件名。打开工程属性,在“Post build steps”中添加“post-build.bat”,设置如下图。
重新编译即可生成所要的带CRC的bin文件。
4.程序校验
本例中程序中的CRC校验可参考如下代码。在程序启动时,可读取存储空间程序并对其进行校验。
uint32_t CalcCRC32(uint8_t *pData, uint32_t nCount)
{
uint32_t index = 0;
uint32_t crc = 0xffffffff; //initial value
uint8_t i = 0;
for (index = 0; index < nCount; index++)
{
crc = (uint32_t)(crc ^ pData[index]);
for (i = 8; i > 0; i--)
{
if (crc & 0x01)
{
crc = (uint32_t)((crc >> 1) ^ 0xEDB88320); /* XOR with polynomic,inversion bit sequence of 0x04C11DB7 */
}
else
{
crc = (uint32_t)(crc >> 1);
}
}
}
crc = crc ^ 0xffffffff;
return crc;
}
总结,本文介绍了如何生成带有CRC的bin文件。