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
在这里插入图片描述
结果相符

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

版权声明:本文为CSDN博主「老李的森林」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/13011803189/article/details/122366072

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
在这里插入图片描述
结果相符

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

版权声明:本文为CSDN博主「老李的森林」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/13011803189/article/details/122366072

生成海报
点赞 0

老李的森林

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

电脑不识别STM32的USB虚拟串口

电脑不识别STM32的USB虚拟串口 现象 板子和电脑联调的时候发现,USB线插入板子以后电脑不识别虚拟串口,通过禁用设备再启用,可以正常工作。也可以按一下复位键才能识别。 以前似乎没有这个问题&#

从os-cli看串口操作

cli,主要是实现输出命令行,控制设备。再就是查询设备状态的作用。实现过程分析 实现串口初始化 这块是由cube自动生成的。 cli任务初始化 在cli_task.c中执行module_init("cli", cli_ta

串口通信小试牛刀

串口通信小试牛刀 目录 串口通信小试牛刀一、串口通信协议:RS-232 1.串口通信协议2. RS-2323.RS232电平与TTL电平的区别4.USB/TTL转232模块(以CH340芯片模块为例&#xff09

STM32F103寄存器方式点亮LED流水灯

STM32F103寄存器方式点亮LED流水灯 1、学习和理解STM32F103系列芯片的地址映射和寄存器映射原理;了解GPIO端口的初始化设置三步骤(时钟配置、输入输出模式设置、最大速率设置)。 2、