本帖最后由 freeelectron 于 2022-7-27 09:28 编辑
1、关于CRC
循环冗余校验(CRC)主要应用于核实数据传输或数据存储的正确性和完整性。
通常都是采用软件来实现CRC,本文体验一下硬件CRC。
2、CW32F030的CRC
CW32F030内部集成CRC计算单元,支持采用多种 CRC 算法对输入数据进行 CRC 计算。
• 3 种输入数据位宽:8bit、16bit、32bit
• 3 种多项式
CRC-16 多项式 1:x 16 + x 15 + x 2 + 1
CRC-16 多项式 2:x 16 + x 12 + x 5 + 1
CRC-32 多项式:x 32 + x 26 + x 23 + x 22 + x 16 + x 12 + x 11 + x 10 + x 8 + x 7 + x 5 + x 4 + x 2 + x + 1
• 10 种常用的算法
基于多项式,初始值,结果异或值,输入 / 输出反转的组合
3、代码测试
uint8_t Raw08[8] = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77 };
void CrcTest(void)
{
RCC_AHBPeriphClk_Enable(RCC_AHB_PERIPH_CRC, ENABLE);
uint32_t res;
res = CRC16_Calc_8bit( CRC16_IBM, Raw08, 8 );
printf("\r\nCRC16_IBM:0x%04X\r\n",res); //E16C
res = CRC16_Calc_8bit( CRC16_MAXIM, Raw08, 8 );
printf("\r\nCRC16_MAXIM:0x%04X\r\n",res); //1E93
res = CRC16_Calc_8bit( CRC16_USB, Raw08, 8 );
printf("\r\nCRC16_USB:0x%04X\r\n",res); //15D3
res = CRC16_Calc_8bit( CRC16_MODBUS, Raw08, 8 );
printf("\r\nCRC16_MODBUS:0x%04X\r\n",res); //EA2C
res = CRC16_Calc_8bit( CRC16_CCITT, Raw08, 8 );
printf("\r\nCRC16_CCITT:0x%04X\r\n",res); //868F
res = CRC16_Calc_8bit( CRC16_CCITTFALSE, Raw08, 8 );
printf("\r\nCRC16_CCITTFALSE:0x%04X\r\n",res); //5CFF
res = CRC16_Calc_8bit( CRC16_X25, Raw08, 8 );
printf("\r\nCRC16_X25:0x%04X\r\n",res); //05FC
res = CRC16_Calc_8bit( CRC16_XMODEM, Raw08, 8 );
printf("\r\nCRC16_XMODEM:0x%04X\r\n",res); //6DC1
res = CRC32_Calc_8bit( CRC32_DEFAULT, Raw08, 8 );
printf("\r\nCRC32_DEFAULT:0x%08X\r\n",res); //8BA925F7
res = CRC32_Calc_8bit( CRC32_MPEG2, Raw08, 8 );
printf("\r\nCRC32_MPEG2:0x%08X\r\n",res); //7FAE93CC
}
4、结果验证
5、第三方验证工具
经常使用的一个工具,支持各种校验,通过这个计算出来的与单片机计算出来的一致。
|