STM32硬件CRC的使用

STM32硬件CRC的使用

STM32硬件的CRC不占用MCU的计算资源,和软件查表计算消耗的存储空间。但其结果与平常使用的CRC不一样,导致很多人还是在用软件计算CRC。
其实结果的差别,只是由于计算方式导致的,调整计算方式以后也可以输出普通计算的结果。

异同

与普通计算方式相同,以CRC32举例,其默认多项式也是
X32 + X26 + X23 + X22 + X16 + X12 + X11 + X10 +X8 + X7 + X5 + X4 + X2+ X +1,但也可以自定义。
计算的初值不同:STM32为0,普通CRC计算为0xffffffff
计算的顺序不同:STM32从最低位开始计算,普通CRC从最高位开始计算
输出结果:最高位到最低位,与普通CRC刚好相反,而且普通CRC的输出结果为计算结果与0xffffffff异或后输出,STM32就少了这个异或。

处理

知道了不同之处,接下来的处理就很简单了。在CRC的设置中按下图
在这里插入图片描述

编程

u8 crc_buf[6] = {0xBE, 0xEF, 0x55, 0xaa, 0xcc, 0xdd};

u32 calculate_crc32(u8 *pdata, u16 len)
{
  u32 crc=0;
 
  //因为主流CRC计算是结果与0xffffffff异或后再输出,而STM32并没有,所以这里要加上异或
  crc = HAL_CRC_Calculate(&hcrc, (u32 *)pdata, len)^0xffffffff;
  return crc;
}

验证

硬件crc的结果为0x8c9792a5

打开 http://www.ip33.com/crc.html,进行结果验证
在这里插入图片描述
结果相符。

CRC16的计算方法又有区别

对于CRC16有些不同,要计算CRC16时,第1个参数选Disable,然后多项式可以自定义
而且计算方法也和CRC32不同,注意看区别
在这里插入图片描述
设置或更改的内容如下:
默认的多项式是不对的,常规应该是0x8005,按位设置好就是X15+X2+X0
默认的初值置0
输入反转,输出不反。
计算结果不异或。

  crc = HAL_CRC_Calculate(&hcrc, (u32 *)pdata, len);

结果验证:

对于0x07, 0x02, 0x00, 0x10, 0x00,硬件CRC计算结果为0x9D1D
在这里插入图片描述
结果相符

MODBUS

MODBUS一般是8个字节,其中CRC16占用最后的2个字节,正文共6个字节,在这里也示例一下
在这里插入图片描述
代码如下:

crc16 = HAL_CRC_Calculate(&hcrc, (u32*)uart2_receive_buf, 6);

在这里插入图片描述

在这里插入图片描述

当然有很多种计算CRC的参数模型,按照上面的方法套一下即可。

CubeMX使用入门教程

从私信和留言发现,很多朋友对CubeMX的使用并不熟悉,找不到CRC或相关功能,为此我专门做了一个教程,点开这里可以看:嵌入式开发–CubeMX使用入门教程,里面有使用方法。

  • 14
    点赞
  • 108
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
### 回答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模块。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值