- /**
- * [url=home.php?mod=space&uid=2666770]@Brief[/url] CRC32校验函数。
- * [url=home.php?mod=space&uid=2215779]@Details[/url] 校验结果和PC端一致。适用于不能4字节对齐的数据长度。
- * [url=home.php?mod=space&uid=3142012]@param[/url] hcrc 句柄,为hcrc应用封装的结构体变量。
- * @param pBuffer 指针,指向被校验数据。
- * @param Length 长度,被校验数据的字节数。
- * @retval CRC32校验结果,与PC端常用结果一致。
- */
- uint32_t my_CRC(CRC_HandleTypeDef *hcrc,uint8_t *pBuffer,uint32_t Length)
- {
- uint32_t index;
- uint32_t temp = 0U;
- hcrc->State = HAL_CRC_STATE_BUSY;
- __HAL_CRC_DR_RESET(hcrc);
- //-可以4字节对齐的部分,使用硬件CRC计算-begin-
- index = Length>>2;
- while(index--)
- {
- hcrc->Instance->DR = __rbit(*(uint32_t *)pBuffer);
- pBuffer+=4;
- }
- temp = __rbit(hcrc->Instance->DR);
- //-4字节对齐后多余的字节,最后用软件加入计算-begin-
- index = Length & 0x03;
- while(index--)
- {
- temp ^= (uint32_t)*pBuffer;
- for(uint8_t i = 0;i < 8;i++)
- {
- if (temp & 0x01)
- temp = (temp>>1)^0xedb88320;//0xedb88320是多项式0x04c11db7按位反转后的值
- else
- temp >>= 1;
- }
- pBuffer++;
- }
- hcrc->State = HAL_CRC_STATE_READY;
- return temp^=0xffffffff;
- }
复制代码
函数__rbit()是MDK端用汇编的按位反转指令封装的按位反转函数,效率上比用户自定义的按位反转函数高很多。
|