以前知道stm32存在硬件CRC32校验,但是没有使用过。我用在stm32使用CRC32校验的目的是为了在线升级,可是当今天使用的时候,发现stm32校验的值与常用的CRC检验的结果不一样,有点纳闷,心想,难道硬件CRC有问题。
排查故障,发现stm32硬件CRC校验正确的,只不过它的校验方式与常用的有区别:
1.stm32硬件校验的方式使用的是大端校验。
2.使用的CRC校验为CRC-32/MPEG-2.(与常用CRC32校验区别就是,输入和输出数据反转,同时校验后的CRC值的与0xFFFFFFFF异或)
所以根据以上的区别, 我们有几种方法:
1.在stm32上面修改stm32硬件的校验方式,大小端转换,输入和输出数据反转。
2.在电脑端修改为大端校验,除去输入和输出数据反转。
但是我两个都改了,为了少改代码。。。。。。
电脑端新增CRC-32/MPEG-2方式,stm32端修改校验时的大小端转换,我使用的查表法,表我就难得贴了
电脑端修改的代码:
在电脑上原来使用的:
#define CRC32_POLYNOMIAL 0x04C11DB7
#define CRC32_INITIAL_VAL 0xFFFFFFFF
#define CRC32_END_VAL 0xFFFFFFFF
#define CRC32_WIDTH 32
uint32_t CRC32(uint8_t *buf, uint32_t len)
{
uint32_t crc = CRC32_INITIAL_VAL;
for(uint32_t i = 0; i < len; i++)
{
crc = crc32_table[(uint8_t)(REVERSE_U8(buf[i]) ^ (crc >> (CRC32_WIDTH - 8)))] ^ (crc << 8);
}
crc ^= CRC32_END_VAL;
return REVERSE_U32(crc);
}
//REVERSE_U8(uint8_t buf); //输入数据反转
//REVERSE_U32(uint32_t buf);//输出数据反转
修改后,新增的CRC-32/MPEG-2校验方式:
#define CRC32_POLYNOMIAL 0x04C11DB7
#define CRC32_INITIAL_VAL 0xFFFFFFFF
#define CRC32_END_VAL 0xFFFFFFFF
#define CRC32_WIDTH 32
uint32_t CRC32_MPEG2(uint8_t *buf,uint32_t len)
{
uint32_t crc = CRC32_INITIAL_VAL;
for(uint32_t i = 0; i < len; i++)
{
crc = crc32_table[(uint8_t)((buf[i]) ^ (crc >> (CRC32_WIDTH - 8)))] ^ (crc << 8);
}
return crc;
}
两个相比减少了输入数据反转和输出数据反转
stm32修改的代码
使用的HAL库的代码,修改了一点,转换了下大小端。
uint32_t HAL_CRC_Calculate_Rev(CRC_HandleTypeDef *hcrc, uint32_t pBuffer[], uint32_t BufferLength)
{
uint32_t index; /* CRC input data buffer index */
uint32_t temp = 0U; /* CRC output (read from hcrc->Instance->DR register) */
/* Change CRC peripheral state */
hcrc->State = HAL_CRC_STATE_BUSY;
/* Reset CRC Calculation Unit (hcrc->Instance->INIT is
* written in hcrc->Instance->DR) */
__HAL_CRC_DR_RESET(hcrc);
/* Enter 32-bit input data to the CRC calculator */
for (index = 0U; index < BufferLength; index++)
{
hcrc->Instance->DR =__REV( pBuffer[index]);//这里转换了一下
}
temp = hcrc->Instance->DR;
/* Change CRC peripheral state */
hcrc->State = HAL_CRC_STATE_READY;
/* Return the CRC computed value */
return temp;
}
这就是修改的相关,这个是我认为改的最少的。。。。。
有问题,希望大家指出!