什么是CRC?
CRC即循环冗余校验,是一种根据网络数据包或计算机文件等数据产生简短固定位数校验码的一种信道编码技术。
CRC的主要作用是什么?
CRC技术主要应用于核实数据传输或者数据存储的正确性和完整性。
笔者以前开发的项目中用到的CRC都是软件CRC,从来没有用过硬件CRC。今天闲来无事,研究一下STM32的硬件CRC。
STM32硬件CRC的多项式:0x4C11DB7 。注意,硬件CRC的多项式是固定的,用户不能设置。
STM32的CRC计算时间:4个AHB时钟周期(HCLK)。这一点很重要,我们使用硬件CRC无非就是想让计算速度更快。
STM32的CRC外设很简单,一共就三个寄存器,CRC_DR(数据寄存器),CRC_IDR(独立数据寄存器),CRC_CR(控制寄存器)
CRC_DR:写入CRC计算器的新数据时,作为输入寄存器。读取时返回CRC计算的结果。其实很好理解,写入的时候看做输入寄存器。当我们想要获取CRC计算结果的时候看做输出寄存器。
CRC_CR:复位CRC计算单元,设置数据寄存器为0xFFFF FFFF。我们开始新的一轮CRC计算之前一定要将CRC_CR寄存器bit0置1,目的是复位CRC数据寄存器,如果不复位CRC数据寄存器还保存的是上一轮的计算结果,那么最终计算出来的结果必将是错误的。
CRC_IDR:独立数据寄存器,低8位有效。可用于临时存放1字节的数据。寄存器CRC_CR的RESET位产生的CRC复位对本寄存器没有影响。数据手册上也数了,此寄存器不参与CRC计算,可以存放任何数据。那意思就是除了能存放8位的数据,和CRC计算没有任何关系。为什么要设计这个寄存器呢?是不是高手在使用CRC的时候有妙用?
STM32的CRC外设使用很简单。
#define BUFFER_SIZE 4
static uint32_t DataBuffer[BUFFER_SIZE] =
{
0x00001021, 0x20423063, 0x408450a5, 0x60c670e7
};
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_CRC,ENABLE);
crc_value = CRC_CalcBlockCRC(DataBuffer,BUFFER_SIZE);
1.国际惯例,使能时钟。
2.函数CRC_CalcBlockCRC
的第一个参数是待校验缓存的起始地址,第二个参数是校验个数。返回值是校验结果。
经过测试发现STM32的CRC计算结果和PC上计算出的结果一致。注意PC上一定要选对多项式。
上图。
到此STM32的CRC外设就介绍完了。