关于stm32的硬件CRC的一些问题

本文讲述了作者在使用STM32的硬件CRC32校验进行在线升级时遇到的问题,发现与常规CRC32校验的不同之处在于大端校验和特定的校验标准。通过代码调整和解释,作者详细记录了解决方案,包括两端转换和创建MPEG-2校验方式。
摘要由CSDN通过智能技术生成

以前知道stm32存在硬件CRC32校验,但是没有使用过。我用在stm32使用CRC32校验的目的是为了在线升级,可是当今天使用的时候,发现stm32校验的值与常用的CRC检验的结果不一样,有点纳闷,心想,难道硬件CRC有问题。

排查故障,发现stm32硬件CRC校验正确的,只不过它的校验方式与常用的有区别:

1.stm32硬件校验的方式使用的是大端校验。

2.使用的CRC校验为CRC-32/MPEG-2.(与常用CRC32校验区别就是,输入和输出数据反转,同时校验后的CRC值的与0xFFFFFFFF异或)

所以根据以上的区别, 我们有几种方法:

1.在stm32上面修改stm32硬件的校验方式,大小端转换,输入和输出数据反转。

2.在电脑端修改为大端校验,除去输入和输出数据反转。

 

但是我两个都改了,为了少改代码。。。。。。

电脑端新增CRC-32/MPEG-2方式,stm32端修改校验时的大小端转换,我使用的查表法,表我就难得贴了

电脑端修改的代码:

在电脑上原来使用的:

#define CRC32_POLYNOMIAL              0x04C11DB7
#define CRC32_INITIAL_VAL             0xFFFFFFFF
#define CRC32_END_VAL                 0xFFFFFFFF
#define CRC32_WIDTH                   32

uint32_t CRC32(uint8_t *buf, uint32_t len)
{
  uint32_t crc = CRC32_INITIAL_VAL;

  for(uint32_t i = 0; i < len; i++)
  {
    crc = crc32_table[(uint8_t)(REVERSE_U8(buf[i]) ^ (crc >> (CRC32_WIDTH - 8)))] ^ (crc << 8);
  }
  crc ^= CRC32_END_VAL;
  return REVERSE_U32(crc);
}


//REVERSE_U8(uint8_t buf); //输入数据反转
//REVERSE_U32(uint32_t buf);//输出数据反转

修改后,新增的CRC-32/MPEG-2校验方式:

#define CRC32_POLYNOMIAL              0x04C11DB7
#define CRC32_INITIAL_VAL             0xFFFFFFFF
#define CRC32_END_VAL                 0xFFFFFFFF
#define CRC32_WIDTH                   32
uint32_t CRC32_MPEG2(uint8_t *buf,uint32_t len)
{
    uint32_t crc = CRC32_INITIAL_VAL;
    for(uint32_t i = 0; i < len; i++)
    {
      crc = crc32_table[(uint8_t)((buf[i]) ^ (crc >> (CRC32_WIDTH - 8)))] ^ (crc << 8);
    }
    return  crc;


}

两个相比减少了输入数据反转和输出数据反转

stm32修改的代码

使用的HAL库的代码,修改了一点,转换了下大小端。

uint32_t HAL_CRC_Calculate_Rev(CRC_HandleTypeDef *hcrc, uint32_t pBuffer[], uint32_t BufferLength)
{
    uint32_t index;      /* CRC input data buffer index */
    uint32_t temp = 0U;  /* CRC output (read from hcrc->Instance->DR register) */

    /* Change CRC peripheral state */
    hcrc->State = HAL_CRC_STATE_BUSY;

    /* Reset CRC Calculation Unit (hcrc->Instance->INIT is
    *  written in hcrc->Instance->DR) */
    __HAL_CRC_DR_RESET(hcrc);

    /* Enter 32-bit input data to the CRC calculator */
    for (index = 0U; index < BufferLength; index++)
    {
      hcrc->Instance->DR =__REV( pBuffer[index]);//这里转换了一下
    }
    temp = hcrc->Instance->DR;

    /* Change CRC peripheral state */
    hcrc->State = HAL_CRC_STATE_READY;

    /* Return the CRC computed value */
    return temp;


}

这就是修改的相关,这个是我认为改的最少的。。。。。

有问题,希望大家指出!

### 回答1: 通用的CRC32校验程序可以用于检验数据的完整性,它可以完美匹配STM32硬件CRC算法。 CRC32是一种循环冗余校验算法,它使用32位的多项式来生成校验值。通用的CRC32校验程序可以按照CRC32算法进行计算,以确保数据的准确性。 在STM32芯片中的硬件CRC算法也是基于CRC32标准的,但它是通过硬件指令进行加速计算的。使用通用的CRC32校验程序可以实现与STM32硬件CRC算法相同的计算结果。 使用通用的CRC32校验程序,首先需要确定待校验数据的多项式以及初始值。以CRC32标准为例,多项式为0x04C11DB7,初始值为0xFFFFFFFF。 接下来,将待校验的数据逐位进行异或和移位操作,并与多项式进行多次异或操作,直到数据处理完毕。最后,取最终的校验值进行比较。 通用的CRC32校验程序与STM32硬件CRC算法相比,虽然执行效率会稍低一些,但其结果可以完全匹配。因此,在没有硬件CRC加速指令可用的情况下,使用通用的CRC32校验程序可以有效地实现数据的校验。 总之,通用的CRC32校验程序能够完美匹配STM32硬件CRC算法,通过按照CRC32标准进行计算,并与多项式和初始值进行异或和移位操作,最终得到校验值。虽然执行效率稍低,但可以保证数据的完整性。 ### 回答2: 通用CRC32校验程序是一种用于数据校验的算法,可以完美匹配STM32硬件CRC算法。CRC32(Cyclic Redundancy Check)是一种循环冗余校验算法,用于检测和校验数据传输中的错误。 通用CRC32校验程序的实现方式如下: 1. 创建一个CRC32表,用于加快CRC计算的速度。这个表的大小为256个32位无符号整数。 2. 初始化CRC寄存器的值为0xFFFFFFFF。 3. 对待校验的数据进行逐字节的计算。 4. 将当前CRC寄存器的值与当前数据字节进行异或运算。 5. 取CRC寄存器当前值的低8位,作为索引查表,得到一个新的32位无符号整数。 6. 将CRC寄存器的值右移8位。 7. 将查表得到的32位无符号整数与CRC寄存器的值进行异或运算。 8. 重复步骤5到步骤7,直到处理完所有的数据字节。 9. 对最终得到的CRC寄存器的值进行取反操作,得到最终的CRC32校验值。 通用CRC32校验程序能够完美匹配STM32硬件CRC算法的原因是它采用了相同的计算方法和相同的CRC32表。因此,通过使用这个通用的校验程序可以在软件层面上实现与STM32硬件CRC算法相同的校验结果,从而保证数据传输的可靠性。 ### 回答3: 通用的CRC32校验程序可以完美匹配STM32硬件CRC算法。CRC32(循环冗余校验)是一种常用的数据校验方法,能够有效检测数据传输或存储中的错误。STM32是一系列32位微控制器,其中的硬件CRC模块可以直接进行CRC32计算,使得校验过程更加高效。 通用的CRC32校验程序基本思路是利用位移和异或操作,在数据上逐位计算并更新CRC校验值。为了完美匹配STM32硬件CRC算法,首先需要确定CRC的生成多项式和初始值。在STM32中,多项式是0x04C11DB7,初始值是0xFFFFFFFF。 在编写通用的CRC32校验程序时,我们可以先定义一个数组,包含了从0到255的所有可能的8位二进制数。然后,通过一个循环,将每个字节与CRC校验值进行异或操作,并根据某种规则进行位移处理。最后,返回CRC校验值即可。 为了与STM32硬件CRC算法完美匹配,我们需要在校验前对输入数据进行字节反转操作,以保证数据的高字节在前,低字节在后。这是因为STM32硬件CRC模块对输入数据是按字节反转的。 总的来说,通用的CRC32校验程序可以与STM32硬件CRC算法完美匹配,但在使用时需要注意数据的字节顺序。这样,我们就可以使用通用的CRC32校验程序来进行数据的校验,而无需依赖STM32硬件CRC模块。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值