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

#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 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)数据反转不同

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/157534.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

正版软件|Kaspersky 杀毒软件 - 全方位安全软件

卡巴斯基 全方位安全软件 一款产品满足 您的全部安全需求, 通过屡获殊荣的保护产品抵御黑客、病毒和恶意软件,获得无与伦比的安全感。此外还有支付保护和隐私保护工具,为您提供全方位保护。包含高级版功能: 免费 Kaspersky Safe …

使用Jupyter Notebook调试PySpark程序错误总结

项目场景: 在Ubuntu16.04 hadoop2.6.0 spark2.3.1环境下 简单调试一个PySpark程序,中间遇到的错误总结(发现版对应和基础配置很重要) 注意:在前提安装配置好 hadoop hive anaconda jupyternotebook spark zo…

vulnhub靶机Momentum2

下载地址:https://download.vulnhub.com/momentum/Momentum2.ova 主机发现 端口扫描 端口服务扫描 漏洞扫描 先去看看web 这里面没有什么,就顺手扫一下目录 发现一些可疑的目录 比较正常 再看一下有没有别的web 看到几个新的东西去看看 文件上传 啥都没…

8.jib-maven-plugin构建springboot项目镜像,docker部署配置

目录 1.构建、推送镜像 1.1 执行脚本 2.2 pom.xml配置 ​2.部署镜像服务 2.1 执行脚本 2.2 compose文件 3.docker stack常用命令 介绍:使用goole jib插件构建镜像,docker stack启动部署服务; 通过执行两个脚本既可以实现构建镜像、部…

实时音视频方案汇总

若有好的方案欢迎留言讨论,非常感谢,汇总了一些,从市面上了解的一些低时延的端到端的方案,仅供参照,若有问题,也欢迎留言更正! 方案 方案描述 时延 备注 1大华同轴高清电缆200米电缆&#xf…

Mysql之多表查询下篇

Mysql之多表查询下篇 满外连接的实现UNION关键字UNIONUNION ALL操作符 7种SQL JOINS的实现语法格式小结自然连接USING连接表连接的约束条件 满外连接的实现 在上篇博客中,我们可以了解到在Mysql中是不支持FULL JOIN来实现 满外连接的,那么我们在Mysql采用…

“鸿蒙之父”确认鸿蒙 PC 来了;腾讯是囤积 AI 芯片最多的中国科技公司之一丨 RTE 开发者日报 Vol.87

开发者朋友们大家好: 这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE (Real Time Engagement) 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文…

Cow Lineup S——离散化、单调队列、双指针

题目描述 思路 x、id不大于1亿,数据量太大,使用离散化将id离散化成一串从1开始连续的编号,使用map集合进行离散化使用双指针维护一段区间,这段区间满足每个编号都包含 如何使用map集合进行离散化? 维护一个变量nums…

如何将中文翻译成荷兰语?

随着中国的崛起,荷兰与中国的交流日益频繁。越来越多的企业和个人需要荷兰语翻译服务。那么,如何将中文翻译成荷兰语,北京哪家翻译公司比较专业? 专业人士指出,要提供优质的荷兰语翻译服务,不仅需要扎实的荷…

如何为初创企业选择合适的 ERP 系统?

**ERP系统**是制造、分销、供应链、金融、会计、风险管理等多个行业必不可少的企业技术解决方案。不论垂直行业、企业规模或目标受众如何,将ERP作为企业管理战略的核心部分都非常重要。 对于渴望发展的小型企业和初创企业来说,更是如此。大型企业需要对…

Maven依赖管理项目构建工具(保姆级教学)

一、Maven介绍 官网地址:Maven – Introduction Maven 是一款为 Java 项目管理构建、依赖管理的工具(软件),使用 Maven 可以自动化构建、测试、打包和发布项目,大大提高了开发效率和质量。 Maven就是一个软件&#…

mysql索引学习案例

简单的学习一下mysql普通索引 这是一个小的案例 一、创建表SQL CREATE TABLE group_order (id int(11) NOT NULL AUTO_INCREMENT,group_seq varchar(64) COLLATE utf8mb4_bin NOT NULL COMMENT 拼单号,group_status int(8) NOT NULL COMMENT 100 待提货, 200 已提货, 300 已…

2024年山东省职业院校技能大赛中职组 “网络安全”赛项竞赛试题-B卷

2024年山东省职业院校技能大赛中职组 “网络安全”赛项竞赛试题-B卷 2024年山东省职业院校技能大赛中职组 “网络安全”赛项竞赛试题-B卷A模块基础设施设置/安全加固(200分)A-1:登录安全加固(Windows, Linux)A-2&#…

vite+vue3+ts中watch和watchEffct的使用

vitevue3ts中watch和watchEffct的使用 本文目录 vitevue3ts中watch和watchEffct的使用watchrefreactivepropsimmediate组合监听 watchEffect单值多值侦听副作用停止监听 watch vue官方文档:https://cn.vuejs.org/api/reactivity-core.html#watch 可以监听基础类型&…

cookie机制 + java 案例

目录 为什么会有cookie?? cookie从哪里来的?? cookie到哪里去?? cookie有啥用?? session HttpServletRequest类中的相关方法 简单的实现cookie登录功能 实现登录页面 实现servlet逻辑 实现生成主…

牛客机考题编程题输入输出

有时空可以练练这里的题目: https://ac.nowcoder.com/acm/contest/5652 做个总结,其实就两种输入类型: 一种是下面这种,需要对输入的每行进行运算 这种就是循环读取每行的数做一个运算: import sys while True:line …

【Nuxt】Nuxt3 动态导入图片 src

nuxt3 不再支持 require 动态导入资源,因此需要我们将图片放到 public 目录下,这样我们就可以动态导入了 比如下面 👇: 感谢 Nuxt3遇见的坑(四):图片动态渲染之后打包路径问题以及打包css样式…

代码混淆的原理是什么?常见代码混淆方法介绍

​ 代码混淆的原理是什么?常见代码混淆方法介绍 本文主要想你介绍代码混淆的原理,常见代码混淆方法,欢迎查阅~ 移动应用代码安全非常重要,代码逆向会导致代码逻辑被获取,进一步导致控制流被hook,安全防线被…

SystemVerilog学习 (11)——覆盖率

目录 一、概述 二、覆盖率的种类 1、概述 2、分类 三、代码覆盖率 四、功能覆盖率 五、从功能描述到覆盖率 一、概述 “验证如果没有量化,那么就意味着没有尽头。” 伴随着复杂SoC系统的验证难度系数成倍增加,无论是定向测试还是随机测试&#xff…

reids面试题

1 redis是单线程吗? Redis是单线程 主要是指Redis的网络10和键值对读写是由一个线程来完成的,Redis在处理客户端的请求时包括获取(socket 读)、解析、执行、内容返回(socket 写) 等都由一个顺序串行的主线程处理, 但Redis的其他功能&#xff…