以前知道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; }这就是修改的相关,这个是我认为改的最少的。。。。。
有问题,希望大家指出!