【STM32】CRC(循环冗余校验)

一、CRC的背景知识

1、什么是CRC

(1)CRC(Cyclic Redundancy Check),循环冗余校验

(2)什么是校验,为什么需要校验:数据传输,数据存储过程中需要使用到的

(3)什么是冗余:表示比实际上要传输的数据还要多

(4)校验实现的关键:冗余少、运算少、识错纠错能力强(有些算法只能识别错误但是无法纠错)

2、CRC原理介绍

(1)(N,K)码:N=K(数据信息)+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

1)CRC16表示最高位应该是2的16次方

2)因为是16,所以最高位16的系数应该是1,不能是0

3)0-15位,所以最高位16的系数不计算进去

4)1*x^16(不计算进去)+1*x^15+1*x^2+1*x^0=1000 0000 0000 0101=8005

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文件中添加

cpp 复制代码
#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

cpp 复制代码
/* USER CODE BEGIN PV */
uint32_t buf[]={0x11111111,0x22222222};//要发送的数据,自己随便定义一个
//存放crc
uint32_t crcValue=0;
/* USER CODE END PV */

  while (1)
  {
		//调试
		printf("使用rcr成功");
		HAL_Delay(100);
		
		printf("CRC test\r\n");
		//使用crc算法将发送的值记录起来
		crcValue=HAL_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)数据反转不同

相关推荐
xuxg20056 分钟前
4G 模组 AT 命令解析框架课程正式发布
stm32·嵌入式·at命令解析框架
CODECOLLECT2 小时前
京元 I62D Windows PDA 技术拆解:Windows 10 IoT 兼容 + 硬解码模块,如何降低工业软件迁移成本?
stm32·单片机·嵌入式硬件
BackCatK Chen2 小时前
STM32+FreeRTOS:嵌入式开发的黄金搭档,未来十年就靠它了!
stm32·单片机·嵌入式硬件·freertos·低功耗·rtdbs·工业控制
全栈游侠5 小时前
STM32F103XX 02-电源与备份寄存器
stm32·单片机·嵌入式硬件
Lsir10110_5 小时前
【Linux】中断 —— 操作系统的运行基石
linux·运维·嵌入式硬件
深圳市九鼎创展科技7 小时前
瑞芯微 RK3399 开发板 X3399 评测:高性能 ARM 平台的多面手
linux·arm开发·人工智能·单片机·嵌入式硬件·边缘计算
辰哥单片机设计7 小时前
STM32项目分享:车辆防盗报警系统
stm32·单片机·嵌入式硬件
風清掦9 小时前
【江科大STM32学习笔记-05】EXTI外部中断11
笔记·stm32·学习
小龙报9 小时前
【51单片机】从 0 到 1 玩转 51 蜂鸣器:分清有源无源,轻松驱动它奏响新年旋律
c语言·数据结构·c++·stm32·单片机·嵌入式硬件·51单片机
范纹杉想快点毕业9 小时前
嵌入式与单片机开发核心学习指南——从思维转变到第一性原理的深度实践
单片机·嵌入式硬件