STM32的硬件CRC

简介

基于STM32F107VCT6介绍STM32的硬件CRC和使用方法,并记录软件检验实现。

STM32的CRC介绍


手册中说明STM32的CRC硬件校验使用的是32位CRC校验,多项式为0x04C11DB7;CRC计算时一次性运算32bits,不是按照字节运算;CRC_DR寄存器的复位值为0xFFFFFFFF,即CRC计算的初始值。

STM32的CRC使用

  • STM32的CRC_DR寄存器既作为输入寄存器又作为输出寄存器
  • 作为输入寄存器时直接写入要进行CRC计算的数据
  • 作为输出寄存器时,通过读操作返回上次CRC计算结果
  • 每一次写入数据寄存器的计算结果是前一次计算结果和新计算结果的组合;在新的数据块进行CRC计算之前,需要复位CRC_DR寄存器

以STM32F107的标准库为例,介绍CRC计算的步骤

uint32_t buff[4] = {0x01,0x02,0x03,0x04};
CRC_ResetDR();
CRC_CalcBlockCRC(buff,4);
delay(5);
ret = CRC_GetCRC();

STM32的CRC软件实现

STM32硬件CRC计算出来的结果与常用的CRC32计算出的CRC值不一样,如果通信中用到了STM32的硬件CRC计算值,需要外部实现与硬件CRC一致的计算结果,详细代码如下,提供参考链接

uint32_t crc32_st(uint32_t *pbuf, uint32_t size)
{
	const uint32_t st_const_value = 0x04c11db7;
	uint32_t	crc_value = 0xffffffff;
	uint32_t	xbit;
	uint32_t 	bits;
	uint32_t	i;

	for (i = 0; i < size; i++)
	{
		xbit = 0x80000000;
		for (bits = 0; bits < 32; bits++)
		{
			if (crc_value & 0x80000000)
			{
				crc_value <<= 1;
				crc_value ^= st_const_value;
			}
			else
			{
				crc_value <<= 1;
			}
			if (pbuf[i] & xbit)
			{
				crc_value ^= st_const_value;
			}
			xbit >>= 1;
		}
	}
	return crc_value;
}

总结

其它平台与STM32通信时,如果用到CRC值,可以通过这种软件计算与STM32的CRC保持一致。

猜你喜欢

转载自www.cnblogs.com/niu-li/p/12585813.html