功能描述
16 Aug 2024
Read time: 2 minute(s)
CRC 校验
CRC 校验算法以 byte 为单位,按相应多项式计算生成 CRC 校验码。为存入存储空间的数据或其他所需校验数据段提供 CRC 校验码,以便校验数据是否正确。
-
采用标准 CRC -32 多项式:0x4C11DB7。
-
可通过 CRC _INIT 寄存器配置 CRC 初始值。
-
可通过 CRC _XOROUT 寄存器配置 CRC 结果异或值,输出结果前会与该值进行异或。
-
硬件取数以 Word 为单位进行取数,当尾端数据长度不足一个 Word 时,硬件会自动补零。
- 输入数据可通过配置寄存器是否反转,输入数据反转有三种反转可选:
-
Byte In Word 每个 Word 里的 Byte 进行逆序处理。由于硬件以 Word 为单位取数,高位在前低位在后。所以使用需要注意,如需以 Byte 从低到高顺序运算,需要配置该反转。
-
Bit In Word 每个 Word 里的 Bit 进行逆序处理。
-
Bit In Byte 每个 Byte 里的 Bit 进行逆序处理,
三种反转的优先级为 Byte In Word > Bit In Word > Bit In Byte
-
- 输出数据可通过配置寄存器是否反转,输出数据反转只有一种可选:
-
Bit In Word 每个 Word 里的 Bit 进行逆序处理。
-
-
三种反转有所不同,以下图进行说明:
CRC 使用流程如下图所示:
CRC 算法描述:
- 输入数据按照配置进行输入反转或不反转。
- 设置 CRC 初始值为当前值,当前值长度固定为 32 bit。
- 将输入数据的第 n 个 Byte 与当前值进行异或,从第一个 Byte 开始。
- 检查当前值最低 bit 是否为 1,并将该值向右移一位,末位丢弃,高位补零。
- 如果最低 bit 为 0,重复 2.d 步;否则,将当前值与 0xEDB88320 进行异或。
- 重复 2.d - 2.e 步,直到总共完成了 8 次移位。至此,输入数据的第一个 Byte 处理完毕。
- 重复 2.c - 2.f,对输入数据的下一个 Byte 进行相同的处理,直至所有数据全部处理完毕。
- 所有数据处理完毕后,当前值按照配置进行输出反转或不反转。
- 将经过上面所有步骤处理后的当前值与结果异或值进行异或运算得出的即为最终的 CRC 校验码。
图示如下:
SUM 校验
SUM 校验指的是把所需校验的数据段以 32 bits 为单位进行累加运算,并将累加结果保留低 32 位输出。尾端数据如不足 32 bits 则进行高位补零。
SUM 算法描述:
- 以 32 bits 为单位按顺序依次对数据进行累加和。
- 如第 32 bits 遇到需要进位的情况时,该次累加结束后丢弃进位得来的第 33 bits,下次加法运算依旧以 32 bits 进行。
- 最终运算结果即为保留低 32 位的累加结果。