YTM32的循环冗余校验CRC外设模块详解

YTM32的循环冗余校验CRC外设模块详解

文章目录

  • YTM32的循环冗余校验CRC外设模块详解
    • 引言
    • 原理与机制
      • CRC算法简介
      • 从CRC算法到CRC硬件外设
    • 应用要点(软件)
      • CRC16 用例
      • CRC32 用例
    • 总结
    • 参考文献

引言

在串行通信帧中,为了保证数据在传输过程中的完整性,通常采用一种指定的算法对原始数据进行计算,得出的一个校验值。接收方接收到数据时,采用同样的校验算法对原始数据进行计算,若计算结果和接收到的校验值一致,说明数据校验正确,该帧数据可用,若不一致,说明传输过程中出现了差错,丢弃该帧数据,请求重发。常用的校验算法有奇偶校验、校验和、CRC,还有LRC、BCC等不常用的校验算法。

在诸多检错手段中,CRC是最著名的一种。CRC的全称是循环冗余校验,其特点是:检错能力强,开销小,易于用编码器及检测电路实现。从其检错能力来看,它所不能发现的错误的几率仅为0.0047%以下。从性能上和开销上考虑,均远远优于奇偶校验及算术和校验等方式。因而,在数据存储和数据通讯领域,CRC无处不在:著名的通讯协议X.25的FCS(帧检错序列)采用的是CRC-CCITT,WinRAR、NERO、ARJ、LHA等压缩工具软件采用的是CRC32,磁盘驱动器的读写采用了CRC16,通用的图像存储格式GIF、TIFF等也都用CRC作为检错手段。

YTM32B1ME微控制器中提供了硬件的CRC计算引擎,用以加速和简化用户程序中的CRC运算。值得注意的是,YTM32B1ME微控制器中还集成了SENT通信外设,SENT通信协议中也用到了CRC校验。可以想见,在具体应用中,CRC外设可以配合SENT外设,或者其他在协议中使用CRC校验算法的通信过程提供硬件计算引擎的支持。

YTM32的硬件CRC外设模块,用户通过AHB总线向CRC外设送数参与计算,然后通过AHB总线送出实时的计算结果。CRC外设内部实现了CRC4(CRC-ITU)、CRC16(CRC-CCITT)、CRC32(CRC-ethernet)等多项算式的计算引擎,并可配置输出和输出数据的位交换,通过8b、16b、32b等带宽方式,向CRC计算引擎送数。如图x所示。

在这里插入图片描述

图x CRC外设系统框图

原理与机制

CRC算法简介

CRC的全称是循环冗余校验(Cyclic Redundancy Check),其目的是保证数据的完整性,具体应用方法,是在发送数据的后面再补充若干位的数据,使得接收方使用同样的CRC计算方法,检查接收到的数据的CRC计算结果是否为0,从而判定接收数据的完整性。

CRC的核心算法,就是通过一串“发送数据”,来计算“需要补充的若干数据”。CRC的计算过程是用除法求余数。不同于十进制的除法运算,CRC用的是2进制的除法运算,2进制的除法运算,属于模2运算,模2运算的特点是:没有进位

  • 模2加法:0+0=0,0+1=1,1+0=1,1+1=0。
  • 模2减法:0-0=0,0-1=1,1-0=1,1-1=0。模2加减法实际上就是异或操作,这也是CRC很容易在实际中应用的数学基础。
  • 模2乘法:0x0=0,0x1=0,1x0=0,1x1=1。
  • 模2除法:是模2乘法的逆运算,参见下图示例。

在这里插入图片描述

图x 模2除法

通过除法算式可以形象地想见,当将一串输入数据,再在右侧补入N个空位,作为被除数,除以CRC多项式所表示的N位除数时,若不能除尽,则在除法竖式的最后一个环节,在最右边产生一个同补入空位同位宽的余数,那这个余数就是CRC的计算结果。此处用一个例子说明CRC的计算过程。如图x所示。
在这里插入图片描述

图x CRC8计算用例

在这个算例中:

  • CRC8的多项式是x8+x2+x+1,对应的除数就是二进制数100000111
  • 被除数是0x1C,转化成二进制就是00011100
  • CRC8为8位,被除数后面补8个0,也同时对应CRC计算的结果也是8位
  • 最后的计算结果是0x54

在CRC解算时,若将CRC计算的结果换入补充的空位,在进行CRC计算,相当于是将之前CRC计算的余数同自己相加,根据CRC计算的加法中0+0=11+1=0的规则,刚好可以得到0的计算结果,从而验证数据在传输过程的完整性。

使用在线的计算器(http://www.ip33.com/crc.html),也能算得同样的结果。如图x所示。

在这里插入图片描述

图x 使用在线CRC计算器

细心的读者可能看到了,这里面还有初始值结果异或值输入数据反转输出数据反转,这些名词都是指什么呢?

  • 初始值,是给CRC计算前提供一个初始值(Offset,预计算值),大部分情况下设定为0,也可以根据选定的特定算法指定其他值,有时也被称为CRC计算的种子(Seed)。结果异或值,是把计算结果再异或某一个值。使用初始值和结果异或值,的目的是防止在某个计算环节中,算得全0的中间结果,导致后续的CRC余数一直为0。
  • 输入数据反转,是指输入数据以字节为单位按位逆序处理;输出数据反转,是指CRC计算结果整体按位逆序处理;这么做的目的(一个合理的解释)是右移比左移更容易计算,效率高,它跟大小端无关。

特别注意,最基本的计算过程大多不需要额外设定这些参数(配置成false或者0即可),但有些面向典型应用的场景,会对应一些特别配置组合(典型配置),产生了不同的算法。如图x所示。

在这里插入图片描述

图x 多种不同的CRC计算配置

从CRC算法到CRC硬件外设

示例CRC计算的过程中,使用的是1个8位的数作为被除数,但实际计算数据帧的数据大多是一个数组,这个扩展过程,可以理解为将整个数据帧的一串数据并排放在一起,当成一个大数进行计算。实际上,CRC的除法计算,也是一个串行移位的计算过程,可以从左边算到右边。在使用CRC硬件外设进行计算时,对应可以逐个向CRC_DATA寄存器中送数,CRC会使用上次计算结果和新送入的数据位,得到本次计算的结果,并继续参与后续的计算。CRC硬件外设的CRC_DATA寄存器,支持用户已8位、16位、32位的位宽向CRC计算引擎送数。

YTM32的硬件CRC支持三种算式:

在这里插入图片描述

CRC硬件外设可以配置初始值(种子,寄存器CRC_INIT),支持输入和数据的位序反转,不支结果持异或计算,但支持结果位翻转。通过结果寄存器CRC_RESULT可以读取实时计算的结果。

需要注意的是,YTM32手册上列写的支持CRC多项式的名字,主要还是描述算子,硬件还是使用基本算法执行计算。若需要使用某些具体算法配套特定的位序反转、初始值等,还是需要用户自行配置CRC硬件外设。

应用要点(软件)

arm-mcu-sdk软件仓库中,为ytm_crc_0驱动设计的样例工程crc_basic中,设计了计算CRC-16和CRC-32的演示用例。

CRC16 用例

crc16_test用例中,实现计算数列{0x1234, 0x5678, 0x5A5A, 0xA5A5}的CRC16值,有源码如下 :

CRC_Init_Type crc16_ccitt = 
{
    .EnableOutputBitInv = false,
    .EnableOutputBitSwap = false,
    .EnableInputBitSwap = false,
    .CalcMode = CRC_CalcMode_Crc16,
    .InitData = 0x0000
};

#define CRC_DATA_LEN  4u
const uint16_t crc16_data_arr[CRC_DATA_LEN] = {0x1234, 0x5678, 0x5A5A, 0xA5A5};
#define CRC16_RESULT 0x4BDCu  /* The result CRC calculator with CCITT 32 bits standard. */

void crc16_test(void)
{
    /* setup the crc calculator. */
	CRC_Init(BOARD_CRC_PORT, &crc16_ccitt);
	
	for (uint32_t i = 0u; i < CRC_DATA_LEN; i++)
	{
	    CRC_SetData16b(BOARD_CRC_PORT, crc16_data_arr[i]);
	}
	
	printf("crc16_test ... ");
	if (CRC16_RESULT == CRC_GetResult(BOARD_CRC_PORT))
	{
		printf("succ.");
	}
	else
	{
		printf("fail.");
	}
	printf("\r\n");
}

使用在线的CRC计算器计算,可以得到相同的计算结果。如图x所示。

在这里插入图片描述

图x CRC在线计算器计算CRC16

这里要注意,CRC在线计算器中定义的CRC-16/CCITT是输入数据反转和输出数据反转的,而样例代码中指定的crc16_ccitt配置参数,实际对应CRC在线计算器的CRC-16/XMODEM计算配置。如果在样例代码中,设定配置参数.EnableOutputBitSwap = true.EnableInputBitSwap = true,也可以得到同CRC在线计算器定义的CRC-16/CCITT算式相同的计算结果。

这里显然对算式的名字存在了误解。开发者如果不确定各名字预设的配置,也可以使用“自定义”的参数模型,此时可人为指定各参数。如图x所示。

在这里插入图片描述

图x 配置CRC在线计算式使用自定义的参数模型

CRC32 用例

crc32_test用例中,实现计算数列{0x12345678, 0x56781234, 0x55AA55AA, 0xA5A5A5A5}的CRC32值,有源码如下 :

CRC_Init_Type crc32_enet  =
{
    .EnableOutputBitInv = false,
    .EnableOutputBitSwap = false,
    .EnableInputBitSwap = false,
    .CalcMode = CRC_CalcMode_Crc32,
    .InitData = 0xffffffff
};

#define CRC_DATA_LEN  4u
const uint32_t crc32_data_arr[CRC_DATA_LEN] = {0x12345678, 0x56781234, 0x55AA55AA, 0xA5A5A5A5};
#define CRC32_RESULT   (0x57738169U) /* The result CRC calculator with CRC-32 standard. */

void crc32_test(void)
{
    /* setup the crc calculator. */
	CRC_Init(BOARD_CRC_PORT, &crc32_enet);
	
	for (uint32_t i = 0u; i < CRC_DATA_LEN; i++)
	{
	    CRC_SetData(BOARD_CRC_PORT, crc32_data_arr[i]);
	}
	
	printf("crc32_test ... ");
	if (CRC32_RESULT == CRC_GetResult(BOARD_CRC_PORT))
	{
		printf("succ.");
	}
	else
	{
		printf("fail.");
	}
	printf("\r\n");
}

使用在线的CRC计算器计算,可以得到相同的计算结果。如图x所示。

在这里插入图片描述

图x CRC在线计算器计算CRC16

总结

YTM32的CRC硬件外设模块能够执行CRC计算,同在线CRC计算器的结果能够对应上。

YTM32的手册中描述的CRC16-CCITTCRC32-ENET等对CRC计算典型配置的别称,实际可不必参考。CRC硬件外设的中CRC计算引擎还是执行基本CRC计算,典型配置实际可通过配置相关计算寄存器位的实现,最终可以支持各种各样的CRC典型算式。

参考文献

  • YTM32B1MEx.pdf
  • 史上解释CRC最清楚的文章
    https://zhuanlan.zhihu.com/p/396165368
  • CRC校验原理及实现
    https://zhuanlan.zhihu.com/p/256487370
  • 关于校验和:此CRC实现对具有种子值意味着什么?
    https://www.codenong.com/30654238/
  • arm-mcu-sdk,一个基于众多arm核MCU的驱动软件仓库,勇哥的SDK设计与开发的试验场
    https://gitee.com/suyong_yq/arm-mcu-sdk

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

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

相关文章

基于Python优化图片亮度与噪点

支持添加噪点类型包括&#xff1a;添加高斯噪点、添加椒盐噪点、添加波动噪点、添加泊松噪点、添加周期性噪点、添加斑点噪点、添加相位噪点&#xff0c;还提供清除噪点的功能。 我们先看一下实测效果&#xff1a;&#xff08;test.jpg为原图&#xff0c;new.jpg为添加后的图片…

自动化测试的成本高效果差,那么自动化测试的意义在哪呢?

一、自动化测试的成本高效果差&#xff0c;那么自动化测试的意义在哪呢&#xff1f; 我觉得这个问题带有很强的误导性&#xff0c;是典型的逻辑陷阱之一。“自动化测试的成本高效果差”是真的吗&#xff1f;当然不是。而且我始终相信&#xff0c;回答问题的最好方式是把问题本身…

达索系统3DEXPERIENCE WORKS 2024流体仿真功能增强

设计工作中&#xff0c;网格划分和设计验证十分重要&#xff0c;它可以方便我们把复杂组件简单化处理&#xff0c;从而提升工作效率。 轻松应对&#xff0c;精准划分 在优化设计以获得更好的空气动力学性能时&#xff0c;需要了解空气在其周围产生的流动方式。达索系统3DEXPE…

(论文阅读29/100 人体姿态估计)

29.文献阅读笔记 简介 题目 DeepCut: Joint Subset Partition and Labeling for Multi Person Pose Estimation 作者 Leonid Pishchulin, Eldar Insafutdinov, Siyu Tang, Bjoern Andres, Mykhaylo Andriluka, Peter Gehler, and Bernt Schiele, CVPR, 2016. 原文链接 h…

STM32 X-CUBE-AI:Pytorch模型部署全流程

文章目录 概要版本&#xff1a;参考资料STM32CUBEAI安装CUBEAI模型支持LSTM模型转换注意事项模型转换模型应用1 错误类型及代码2 模型创建和初始化3 获取输入输出数据变量4 获取模型前馈输出模型应用小结 小结 概要 STM32 CUBE MX扩展包&#xff1a;X-CUBE-AI部署流程&#xf…

Accelerate 0.24.0文档 一:两万字极速入门

文章目录 一、概述1.1 PyTorch DDP1.2 Accelerate 分布式训练简介1.2.1 实例化Accelerator类1.2.2 将所有训练相关 PyTorch 对象传递给 prepare()方法1.2.3 启用 accelerator.backward(loss) 1.3 Accelerate 分布式评估1.4 accelerate launch1.4.1 使用accelerate launch启动训…

k8s集群搭建(ubuntu 20.04 + k8s 1.28.3 + calico + containerd1.7.8)

环境&需求 服务器&#xff1a; 10.235.165.21 k8s-master 10.235.165.22 k8s-slave1 10.235.165.23 k8s-slave2OS版本&#xff1a; rootvms131:~# lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 20.04.5 LTS Release: …

Java自学第11课:电商项目(4)重新建立项目

经过前几节的学习&#xff0c;我们已经找到之前碰到的问题的原因了。那么下面接着做项目学习。 1 新建dynamic web project 建立时把web.xml也生成下&#xff0c;省的右面再添加。 会询问是否改为java ee环境&#xff1f;no就行&#xff0c;其实改过来也是可以的。这个不重要。…

css3 初步了解

1、css3的含义及简介 简而言之&#xff0c;css3 就是 css的最新标准&#xff0c;使用css3都要遵循这个标准&#xff0c;CSS3 已完全向后兼容&#xff0c;所以你就不必改变现有的设计&#xff0c; 2、一些比较重要的css3 模块 选择器 1、标签选择器&#xff0c;也称为元素选择…

滚珠螺杆在注塑机械手中起什么作用?

注塑机械手的配件中滚珠螺杆是重要的一环&#xff0c;在注塑机械手中起着重要的作用。注塑机械手是一种自动化设备&#xff0c;可以在注塑生产中实现自动化操作&#xff0c;而滚珠螺杆则是实现这一操作的关键部件之一。 滚珠螺杆是一种将旋转运动转化为直线运动的精密传动部件&…

在Linux系统下微调Llama2(MetaAI)大模型教程—Qlora

Llama2是Meta最新开源的语言大模型&#xff0c;训练数据集2万亿token&#xff0c;上下文长度是由Llama的2048扩展到4096&#xff0c;可以理解和生成更长的文本&#xff0c;包括7B、13B和70B三个模型&#xff0c;在各种基准集的测试上表现突出&#xff0c;最重要的是&#xff0c…

【Linux网络】本地DNS服务器搭建

目录 一、什么是DNS&#xff0c;相关介绍 1、dns是什么&#xff1a; 2、域名的分类&#xff1a; 3、服务器的类型 二、DNS解析的过程 三、DNS的相关配置文件学习 1、本地主机有关的DNS文件学习 2、本地的DNS缓存服务器的文件 3、bind软件的相关配置文件&#xff1a; 4…

Jmeter执行接口自动化测试-如何初始化清空旧数据

需求分析&#xff1a; 每次执行完自动化测试&#xff0c;我们不会执行删除接口把数据删除&#xff0c;而需要留着手工测试&#xff0c;此时会导致下次执行测试有旧数据我们手工可能也会新增数据&#xff0c;导致下次执行自动化测试有旧数据 下面介绍两种清空数据的方法 一、通…

nginx代理docker容器服务

场景描述 避免暴力服务端口&#xff0c;使用nginx代理 一个前端&#xff0c;一个后端&#xff0c;docker方式部署到服务器&#xff0c;使用docker创建的nginx代理端口请求到前端端口 过程 1 docker 安装nginx 1.1 安装一个指定版本的nginx docker pull nginx#启动一个ngi…

vuejs - - - - - 移动端设备兼容(pxtorem)

pxtorem的使用 1. 依赖安装2. vue.config.js配置3. 动态设置html的font-size大小4. 效果如图&#xff1a; 1. 依赖安装 yarn add postcss-pxtorem -D 2. vue.config.js配置 module.exports {...css: {loaderOptions: {postcss: {plugins: [require("postcss-pxtorem&quo…

22.能被7整除,并且求和。

#include<stdio.h>int main(){int i ,sum0;printf("1-1000能被7整除的数字有&#xff1a;\n");for(i1;i<1000;i){if(i%70){printf("%d ",i);sumsumi;} }printf("\n");printf("能被7整除的数字的和是&#xff1a;%d ",sum);re…

这样书写Python代码的方式,实在是太优雅了~

文章目录 前言一、在Python中配合pipe灵活使用链式写法二 、pipe中常用的管道操作函数1.使用traverse()展平嵌套数组2.使用dedup()进行顺序去重3.使用filter()进行值过滤4.使用groupby()进行分组运算5.使用select()对上一步结果进行自定义遍历运算6.使用sort()进行排序 总结关于…

线性表->栈

文章目录 前言概述栈的初始化销毁压栈出栈判断栈为不为空栈的有效个数 前言 栈相对于链表&#xff0c;稍微简单一点&#xff0c;但是栈的难点在于通过栈去理解递归算法。 概述 **栈&#xff1a;**一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。…

Redis解决缓存问题

目录 一、引言二、缓存三、Redis缓存四、缓存一致性1.缓存更新策略2.主动更新 五、缓存穿透六、缓存雪崩七、缓存击穿1.基于互斥锁解决具体业务2.基于逻辑过期解决具体业务 一、引言 在一些大型的网站中会有十分庞大的用户访问流量&#xff0c;而过多的用户访问对我们的MySQL数…