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.
位 | 值 |
---|---|
0 | 1 (多项式中1=X0) |
1 | 1 (多项式中有X1) |
2 | 1 (多项式中有X2) |
3 | 0 (多项式中不包含X3) |
4 | 1 |
5 | 1 |
6 | 0 |
7 | 1 |
8 | 1 |
9 | 0 |
10 | 1 |
11 | 1 |
12 | 1 |
13 | 0 |
14 | 0 |
15 | 0 |
16 | 1 |
17 | 0 |
18 | 0 |
19 | 0 |
20 | 0 |
21 | 0 |
22 | 1 |
23 | 1 |
24 | 0 |
25 | 0 |
26 | 1 |
27 | 0 |
28 | 0 |
29 | 0 |
30 | 0 |
31 | 0 |
将这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外设
特性:
- 采用CRC32标准
- 一次CRC计算需要4个HCLK
- 输入输出数据格式可逆转
- 数据写入及结果读出都通过同一个数据寄存器(32位CRC_DT)
- 配置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:0 | DT | 0xFFFF FFFF | rw | 数据寄存器位(Data value) 写入CRC计算器的新数据时,作为输入寄存器读取时返回CRC计算结果 |
CRC_CDT
域 | 简称 | 复位值 | 类型 | 功能 |
---|---|---|---|---|
位31:8 | 保留 | 0x0000 0000 | resd | 保持默认值 |
位7:0 | CDT | 0x00 | rw | 通用8位数据寄存器位 可用于临时存放1字节的数据.控制寄存器的RST产生的CRC复位对本寄存器没有影响 |
CRC_CTRL
域 | 简称 | 复位值 | 类型 | 功能 |
---|---|---|---|---|
位31:8 | 保留 | 0x0000 0000 | resd | 保持默认值 |
位7 | REVOD | 0x0 | resd | 输出数据翻转 由软件置起或清零.该位控制是否翻转输出数据 0: 不翻转 1: 全字翻转 |
位6:5 | REVID | 0x0 | rw | 输入数据翻转 由软件置起或清零.该位控制是否翻转输入数据 00: 不翻转 01: 字节翻转 10: 半字翻转 11: 全字翻转 |
位4:1 | 保留 | 0x0 | resd | 保持默认值 |
位0 | RST | 0x0 | rw | RESET位 由软件置起,由硬件自动清零.复位CRC计算单元,设置数据寄存器为0xFFFF FFFF 0: 无作用 1: 复位 |
CRC_IDT
域 | 简称 | 复位值 | 类型 | 功能 |
---|---|---|---|---|
位31:0 | IDT | 0xFFFF FFFF | rw | 初始化数据寄存器 当控制寄存器的RST位产生的复位时,初始化寄存器中的数值将作为数据寄存器的初始值写入. |
CRC配置流程
了解了CRC有关的寄存器,我们现在来介绍如何配置有关寄存器,从而使用CRC计算单元.
- 在CRC操作之前,开启CRC的外设时钟
- 设置初始化寄存器(CRC_IDT)值,在对数据寄存器(CRC_DT)进行软复位的时候,会将初始化寄存器里的值直接写入到CRC_DT寄存器作为初始值,如不设置,此寄存器默认值为0xFFFF FFFF
- 设置多项式宽度
- 设置多项式值
- 设置输入输出数据的逆转模式
- Reset CRC_DT 后将数据按32-bit 格式逐个写入到CRC_DT进行计算
- 读CRC_DT寄存器,检查计算结果
如果想要例程的,可以去雅特力官网上查找
雅特力科技 : 32位微控制器的创新领导者! (arterytek.com)