CRC计算单元

CRC计算单元

CRC是Cyclic Redundancy Check,循环冗余校验的缩写. 是一种检测数据错误的技术,主要用在数据通信和数据存储的方面. 但是这种技术只能检测到传输或存储的数据是否有误,没有将错误纠正的功能.

而CRC计算单元是一个独立的具备CRC计算功能的外设. AT32 MCU片上CRC计算单元采用CRC32/MPEG-2标准. 其多项式为 X 32 + X 26 + X 23 + X 22 + X 16 + X 12 + X 11 + X 10 + X 8 + X 7 + X 5 + X 4 + X 2 + X + 1 X^{32}+X^{26}+X^{23}+X^{22}+X^{16}+X^{12}+X^{11}+X^{10}+X^{8}+X^{7}+X^{5}+X^{4}+X^{2}+X+1 X32+X26+X23+X22+X16+X12+X11+X10+X8+X7+X5+X4+X2+X+1 .

这个多项式的简记式为: 0x4C11DB7.

由于所有的CRC多项式的最高位都是1,因此我们在记录简记式的时候习惯忽略最高位.

我们将0-31位bit先置0,对应上述的多项式,如果有,则置1.

01 (多项式中1=X0)
11 (多项式中有X1)
21 (多项式中有X2)
30 (多项式中不包含X3)
41
51
60
71
81
90
101
111
121
130
140
150
161
170
180
190
200
210
221
231
240
250
261
270
280
290
300
310

将这32个bit从下往上组合起来,就是简记式:0x04C11DB7.省略第一个0.则为:0x4C11DB7.

CRC标准

虽然AT32 MCU的CRC计算单元采用的是CRC32标准,但是还有许多种CRC标准可以使用. 下面是一些常见的CRC标准:

在这里插入图片描述

其中,CRC-12码通常用来传送6-bit字符串,CRC-16码及CRC-CCITT码通常用来传送8-bit字符串, CRC-32码通常用来进行点对点的同步传输。多项式并非固定某个值或者某个标准,只要计算方及校验方合理采用一致的多项式即可.

CRC算法

CRC的计算方法采用异或运算方式.

其计算原理是将输入数据作为被除数,与作为除数的生成多项式进行模二除法,得到的余数即为CRC值.

在进行CRC计算时可能存在目标数据串位宽比多项式更短,并且计算过程希望保证到目标数据串中的每一位都有被处理到,因此通常的做法是在目标位数据串的后面加上简记式位宽W个"0",再进行异或求余.示例如下:

多项式 = 1011(宽度W=3)

目标数据串 = 11100110

Bit 流 = 目标数据串 + W个“0” = 11100110000

CRC result = 100

计算过程图示如下:

下面对AT32 CRC外设进行介绍:

AT32 CRC外设

特性:

  1. 采用CRC32标准
  2. 一次CRC计算需要4个HCLK
  3. 输入输出数据格式可逆转
  4. 数据写入及结果读出都通过同一个数据寄存器(32位CRC_DT)
  5. 配置CRC_IDT写入初始化值,在每次CRC复位后该值都会加载到CRC_DT

数据格式逆转

指对指定数据按一定的数据格式进行高低位逆转的处理方式

AT32 CRC外设支持输入数据按 字节byte,半字halfword,字word格式逆转.

输出数据按字word格式逆转的特性可配,默认情况下都不逆转.

16位数据按字节和半字的逆转图示如下,其余格式与此类似:

在这里插入图片描述

CRC功能说明

CRC运算流程:
  • 输入翻转,即数据输入后,先依据CRC_CTRL的REVID值进行输入数据翻转
  • 初始化,首次计算会与CRC_IDT设定的初始值做XOR. 若非首次计算,则初始值为上次计算的结果.
  • CRC计算,与生成多项式进行模二除法,所得余数为CRC值
  • 输出翻转,依据CRC_CTRL的REVOD决定是否将CRC值执行全字翻转后再输出
CRC-32/MPEG-2参数说明
  • 初始值:0xFFFFFFFF,目的是为避免待测数据为1字节的0x00和多字节的0x00结果相同
  • 结果异或值: 0x0000 0000,此值表示不对CRC结果再进行一次XOR计算.

CRC寄存器

CRC_DT

简称复位值类型功能
位31:0DT0xFFFF FFFFrw数据寄存器位(Data value)
写入CRC计算器的新数据时,作为输入寄存器读取时返回CRC计算结果

CRC_CDT

简称复位值类型功能
位31:8保留0x0000 0000resd保持默认值
位7:0CDT0x00rw通用8位数据寄存器位
可用于临时存放1字节的数据.控制寄存器的RST产生的CRC复位对本寄存器没有影响

CRC_CTRL

简称复位值类型功能
位31:8保留0x0000 0000resd保持默认值
位7REVOD0x0resd输出数据翻转
由软件置起或清零.该位控制是否翻转输出数据
0: 不翻转
1: 全字翻转
位6:5REVID0x0rw输入数据翻转
由软件置起或清零.该位控制是否翻转输入数据
00: 不翻转
01: 字节翻转
10: 半字翻转
11: 全字翻转
位4:1保留0x0resd保持默认值
位0RST0x0rwRESET位
由软件置起,由硬件自动清零.复位CRC计算单元,设置数据寄存器为0xFFFF FFFF
0: 无作用
1: 复位

CRC_IDT

简称复位值类型功能
位31:0IDT0xFFFF FFFFrw初始化数据寄存器
当控制寄存器的RST位产生的复位时,初始化寄存器中的数值将作为数据寄存器的初始值写入.

CRC配置流程

了解了CRC有关的寄存器,我们现在来介绍如何配置有关寄存器,从而使用CRC计算单元.

  1. 在CRC操作之前,开启CRC的外设时钟
  2. 设置初始化寄存器(CRC_IDT)值,在对数据寄存器(CRC_DT)进行软复位的时候,会将初始化寄存器里的值直接写入到CRC_DT寄存器作为初始值,如不设置,此寄存器默认值为0xFFFF FFFF
  3. 设置多项式宽度
  4. 设置多项式值
  5. 设置输入输出数据的逆转模式
  6. Reset CRC_DT 后将数据按32-bit 格式逐个写入到CRC_DT进行计算
  7. 读CRC_DT寄存器,检查计算结果

如果想要例程的,可以去雅特力官网上查找

雅特力科技 : 32位微控制器的创新领导者! (arterytek.com)

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

禁渔期水域监管:EasyCVR视频智能监控方案

一、背景与需求分析 根据农业部印发的《中国渔政亮剑2024系列专项执法行动方案》,我国将持续推进长江十年禁渔、海洋伏季休渔、黄河等内陆重点水域禁渔等专项行动。根据四川省相关规定,每年3月1日至6月30日为禁渔期,在此期间,四川…

构建汛期智慧水利新生态:EasyCVR视频汇聚监控综合管理方案解析

一、项目背景与目标 随着我国水利事业的不断发展,水利设施的管理与维护工作愈发重要。随着夏季汛期的到来,水利管理工作面临着巨大的挑战。为确保水利设施的安全运行,及时应对可能出现的汛情,建设一套高效、智能的视频监控可视化…

后继者00

题目链接 后继者 题目描述 注意点 题目中的树是二叉搜索树节点p在二叉搜索树中一定存在 解答思路 本题关键是找到值大于节点p的值的第一个节点,因为本题中的树是二叉搜索树,所以左子树的值始终小于根节点,右子树的值始终大于根节点访问到…

31、shell循环

一、循环 循环:循环是一种重复执行一段代码的结构。只要满足循环的条件,会一直执行这个代码。 循环条件:在一定范围之内,按照指定的次数来执行循环。 循环体:在指定的次数内,执行的命令序列。只要条件满…

力扣42 接雨水

听说字节每人都会接雨水,我也要会哈哈哈 数据结构:数组 算法:核心是计算这一列接到多少雨水,它取决于它左边的最大值和右边的最大值,如下图第三根柱子能接到的雨水应该是第一根柱子高度和第五根柱子高度的最小值减去第…

DDei在线设计器-属性编辑器

DDei-Core-属性编辑器 DDei-Core-属性编辑器插件包含了文本、大文本、数值、下拉、单选、勾选以及颜色等属性编辑。 图形和属性共同构成一个完整的定义,属性编辑器就是编辑属性值的控件。当选中图形实例时,属性面板就会展现当前实例的所有属性以及属性编…

qt仿制qq登录界面

#include "mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent) {// 设置窗口大小this->resize(window_width, window_heigth);// 固定窗口大小this->setFixedSize(window_width, window_heigth);// 设置窗口图标this->se…

怎么学习汇川Codesys PLC教程?

前言 各位好,我在B站和抖音上都有发布视频的,搜索我的名称“阿凡工控分享”即可。在CSDN上发表文章也是想把我的一点见解和经验分享出来,进一步的方便大家进行学习。 我是正文 本文主要也是为了方便大家学习汇川的Codesys PLC而制作的&…

登录/注册- 滑动拼图验证码(IOS/Swift)

本章介绍如何使用ios开发出滑动拼图验证码,分别OC代码和swift代码调用 1.导入项目model文件OC代码(下载完整Demo) 2.放入你需要显示的图片 一:OC调用 #import "ViewController.h" #import "CodeView.h"…

讯飞有一个可以根据描述文本自动生成PPT的AI接口,有趣

文档:https://www.xfyun.cn/doc/spark/PPTGeneration.html 价格方面提供了免费1000点的额度,生成一次是10点,正好100次,如果要购买的话最低要购买1344元的,没有按量付费的模式,个人小开发者可买不起。 让我…

【简单介绍下Sass,什么是Sass?】

🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出…

波拉西亚战记加速器 台服波拉西亚战记免费加速器

波拉西亚战记是一款新上线的MMORPG游戏,游戏内我们有多个角色职业可以选择,可以体验不同的战斗流派玩法,开放式的地图设计,玩家可以自由的进行探索冒险,寻找各种物资。各种随机事件可以触发,让玩家的冒险过…

LabVIEW缝缺陷图像标注库

LabVIEW缝缺陷图像标注库 开发了一个基于LabVIEW平台构建的船舶焊缝缺陷图像标注库。该库旨在通过高效和简洁的方式处理和标注船舶焊缝缺陷图像,提高缺陷识别的准确性和效率,进而保障船舶的结构安全。 项目背景 在船舶制造过程中,焊接质量…

MFC实现子控件focus焦点上下移动父控件ListView和Gridview也跟着向上下移动

项目中要实现mfc功能,然后子控件焦点下移,LIstView和Gridview父控件不会下移,所以就有这个文章。废话不多说直接上代码。 MFCGridView.java import android.content.Context; import android.util.AttributeSet; import android.view.View;…

精益生产VS六西格玛:一场管理领域的精彩较量

精益生产与六西格玛,犹如管理学的双璧,各具魅力又相得益彰。精益生产,如同一位巧夺天工的工匠,专注于消除生产中的浪费,以极简为美。它旨在通过减少库存、缩短生产周期、提升产品质量等手段,使生产过程更加…

Centos离线安装Python3

目录 1.准备工作 2.解压python压缩包 3.编译 4.安装、更改环境变量 5.建立pip连接 使用的是Centos7服务器,Py版本是py3.9.0 1.准备工作 首先确保服务器中存在相关的编译器,例如GCC;这里不做过多叙述,需要者前往&#xff1a…

(几何:六边形面积)编写程序,提示用户输入六边形的边长,然后显示它的面积。

(几何:六边形面积)编写程序,提示用户输入六边形的边长,然后显示它的面积。计 算六边形面积的公式是: 这里的s就是边长。下面是一个运行示例 package myjava; import java.math.*; import java.util.Scanner; public class cy {public static void main(S…

python的a[:2]、a[:] 和a [::] 的区别

一、a[:2] 数据准备 import numpy as np X np.array([[0,1],[2,3],[4,5],[6,7],[8,9],[10,11],[12,13],[14,15],[16,17],[18,19]]) print(X)形成矩阵 print (“X[: 2]:”, X[: 2]) ### :表示索引 0至1行; 二、a[:]和a [::] 在 Python 中,[:] 和 [::…

【QT5】<总览五> QT多线程、TCP/UDP

文章目录 前言 一、QThread多线程 二、QT中的TCP编程 1. TCP简介 2. 服务端程序编写 3. 客户端程序编写 4. 服务端与客户端测试 三、QT中的UDP编程 1. UDP简介 2. UDP单播与广播程序 前言 承接【QT5】<总览四> QT常见绘图、图表及动画。若存在…

高速直线导轨驱动与控制,精准稳定的运动核心元件

直线导轨在工业生产中,精度和稳定性是至关重要的。而在各种机械设备中,高精度直线导轨是提高设备运动控制精度和平稳性的核心部件,当我们考虑高速运动时,直线导轨的精度和稳定性是非常重要的因素。 直线导轨系统中如何确保高速运动…