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

CRC(Cyclic Redundancy Check)校验是一种常用的数据校验方法,用于检测数据传输或存储过程中是否出现错误,特别是在二进制(bin文件的校验中广泛应用。 CRC校验的原理是通过对数据进行一系列的计算,生成一个校验值。发送方在发送数据之前,将数据划分为多个块,并为每个块生成一个对应的校验值。接收方在接收数据后,也对每个块进行计算,并生成校验值。接收方将接收到的数据根据同样的规则进行划分和计算,得到一个新的校验值。将接收到的校验值与计算得到的新校验值进行比较,如果两者相等,则说明数据传输过程中没有发生错误。 在对bin文件进行CRC校验时,首先需要确定使用哪种CRC算法,通常有多种不同的算法可供选择,如CRC-8、CRC-16、CRC-32等。然后,将bin文件划分为合适大小的块(一般每个块的大小为几个字节至几十个字节),并为每个块生成对应的校验值。 生成CRC校验值的过程需要利用二进制的位运算来进行计算,具体计算方式因不同的CRC算法而有所差异。计算过程包括将每个字节与之前的校验值进行异或运算,并按位移动,最终生成一个校验值。发送方将这些校验值附加在对应数据块的末尾,一同传输给接收方。 接收方在接收到数据后,按照与发送方相同的规则进行划分和计算,得到一个新的校验值。然后将接收到的校验值与计算得到的新校验值进行比较,如果两者相等,则说明数据传输过程中没有发生错误;如果不相等,则说明数据可能在传输过程中发生了错误,需要进行重传或者纠错处理。 综上所述,通过CRC校验,可以在bin文件传输过程中可靠地检测和纠正错误,提高数据传输的准确性和可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值