| 本帖最后由 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、代码测试
 
 4、结果验证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
}
   
 5、第三方验证工具
 经常使用的一个工具,支持各种校验,通过这个计算出来的与单片机计算出来的一致。
 
   
 
 
 |