1.CRC的背景知识

详情查看
https://www.cnblogs.com/liushui-sky/p/9962123.html

1.1、什么是CRC

(1)CRC(Cyclic Redundancy Check),循环冗余校验
(2)什么是校验,为什么需要校验
校验是否正确
(3)什么是冗余
需要1213
发送12137 发送冗余(比如前面相加等)
(4)校验实现的关键:
实现算法需求:冗余少、运算少、识错纠错能力强

1.2、CRC原理介绍

(1)(N,K)码:N=K+R,K位信息码,R位校验码,N位总信息长度
(2)CRC多项式:由K位信息码计算得到R位校验码的算法,以移位和mod2为主的叠加

1.3、CRC的实现方法

(1)纯软件实现,靠CPU的运算能力硬算。好处纯软件,坏处效率低
(2)纯软件实现,查表确定。好处纯软件效率高,坏处死板且占内存
(3)硬件实现,靠SoC内置的CRC运算模块实现,类似于集成显卡,本课程讲的就是这种 这个就够了
(4)硬件实现,靠SoC外置的运算模块实现,类似于独立显卡,没必要。

1x16 + 1x15 + 0x14 + 0x13 + + 1x2 + 1x0
0-15,刚好16位,每一位是1或者0,所以就是16位二进制,转成16进制就是数值式
1000 0000 0000 0101 = 8005
image.png

  • STM32的CRC_DR寄存器既作为输入寄存器又作为输出寄存器
  • 作为输入寄存器时直接写入要进行CRC计算的数据
  • 作为输出寄存器时,通过读操作返回上次CRC计算结果
  • 每一次写入数据寄存器的计算结果是前一次计算结果和新计算结果的组合;在新的数据块进行CRC计算之前,需要复位CRC_DR寄存器

    1.4 图形化配置和代码

    时钟和串口都配置好
    image.png ```c //待传输的位 uint32_t buf[] = {0x11111111, 0x22222222}; //CRC32的值 uint32_t crcValue = 0;

//while循环 printf(“CRCTESTSTART”); crcValue = HAL_CRC_Calculate(&hcrc, buf, sizeof(buf)/sizeof(buf[0])); printf(“crcValue = %x\r\n”, crcValue); HAL_Delay(1000); ``` 输出结果:
image.png
image.png
对比一致
成功!!