网站建设商,网站后台文章添加成功 不显示,商丘的互联网公司,不申请域名可以 做网站吗一、CRC的背景知识
1、什么是CRC (1)CRC#xff08;Cyclic Redundancy Check#xff09;#xff0c;循环冗余校验 (2)什么是校验#xff0c;为什么需要校验#xff1a;数据传输#xff0c;数据存储过程中需要使用到的 (3)什么是冗余#xff1a;表示比实际上要传输的数据…一、CRC的背景知识
1、什么是CRC (1)CRCCyclic Redundancy Check循环冗余校验 (2)什么是校验为什么需要校验数据传输数据存储过程中需要使用到的 (3)什么是冗余表示比实际上要传输的数据还要多 (4)校验实现的关键冗余少、运算少、识错纠错能力强有些算法只能识别错误但是无法纠错 2、CRC原理介绍 (1)N,K码NK数据信息R校验码K位信息码R位校验码N位总信息长度 (2)CRC多项式由K位信息码计算得到R位校验码的算法以移位左移右移和mod2取余为主的叠加 3、CRC的实现方法软件OR硬件 (1)纯软件实现靠CPU的运算能力硬算。好处纯软件坏处效率低因为占用CPU资源 (2)纯软件实现查表确定。好处纯软件效率高坏处死板且占内存在表中查找相当于在内存中进行搜索 (3)硬件实现靠SoC内置的CRC运算模块实现内部外设类似于集成显卡STM32就是使用内置的CRC (4)硬件实现靠SoC外置的运算模块实现类似于独立显卡没必要。 4、CRC使用场景 主要用于数据传输和存储过程中随机引起的错误。但是CRC只能检验错误但是无法纠错。 二、STM32使用CubeMX
1.CRC生成多项式计算 1.CRC16 1CRC16表示最高位应该是2的16次方 2因为是16所以最高位16的系数应该是1不能是0 30-15位所以最高位16的系数不计算进去 41*x^16不计算进去1*x^151*x^21*x^01000 0000 0000 01018005 2.配置
1.配置CRC 2.使用串口 3.HAL_CRC_Calculate VS HAL_CRC_Accumulate Calculate和accumulate两者不同 calculate的计算与上一次的计算结果无关 accumulate的计算结果是从上一次的计算结果来的 如果你的计算是分成多次计算来实现则调用【HAL_CRC_Accumulate】如果算法是一次性实现完成则调用【HAL_CRC_Calculate 】
4.使用串口添加串口相关的代码 在usart.c文件中添加 #ifdef __GNUC__//当前在Linux系统下#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else//在windows下#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif
/*** brief Retargets the C library printf function to the USART.* param None* retval None*/
//PUTCHAR_PROTOTYPE 宏是一个用户在使用HAL库时可以自定义的宏
//用于实现 printf 函数的输出重定向。
PUTCHAR_PROTOTYPE
//int fputc(int ch, FILE *f)
{/* Place your implementation of fputc here *//* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */HAL_UART_Transmit(huart1, (uint8_t *)ch, 1, 0xFFFF);return ch;
}
5.代码编写
1.使用HAL_CRC_Calculate
/* USER CODE BEGIN PV */
uint32_t buf[]{0x11111111,0x22222222};//要发送的数据自己随便定义一个
//存放crc
uint32_t crcValue0;
/* USER CODE END PV */while (1){//调试printf(使用rcr成功);HAL_Delay(100);printf(CRC test\r\n);//使用crc算法将发送的值记录起来crcValueHAL_CRC_Calculate(hcrc,buf,sizeof(buf)/sizeof(buf[0]));printf(crcValue%x\r\n,crcValue);/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}
2.验证传输过程是否正确
CRC在线计算 (lddgo.net) 与串口输出的数值进行比较判断是否正确----结果正确 3.注意点 0和任何值异或原值不变 不同点 1结果异或值的不同 2数据反转不同