如何生成带有CRC的bin文件

本文介绍如何生成带有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文件。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值