macpherson 发表于 2024-11-17 18:32

CRC校验

一、注意事项

    HC32L072的CRC校验为CRC-16-X25(非CCITT),初始值和结果异或值均为0xffff,输入输出数据均需要反转。

二、硬件CRC相关函数

1、开启CRC外设

Sysctrl_SetPeripheralGate(SysctrlPeripheralCrc, TRUE);      ///< 开启CRC外设时钟模块

2、CRC16编码生成

uint16_t CRC16_Get8(uint8_t* pu8Data, uint32_t u32Len)

param pu8Data          待编码数据指针(字节方式输入)

param u32Len         待编码数据长度(字节数)

retval CRC16               CRC16编码值.      

3、CRC16值校验

en_result_t CRC16_Check8(uint8_t* pu8Data, uint32_t u32Len, uint16_t u16CRC)

param pu8Data          待校验数据指针(字节方式输入)

param u32Len         待校验数据长度(字节数)

param u16CRC         待校验CRC16值

retval Ok                  CRC校验正确

retval Error               CRC校验错误   

三、C语音CRC校验函数

/**

*****************************************************************************

** \brief CRC16 编码(字节填充方式)

**

** 该函数主要用于生成CRC16编码.

**

** \param pu8Data          待编码数据指针(字节方式输入)

** \param u32Len         待编码数据长度(字节数)

**

** \retval CRC16               CRC16编码值.

*****************************************************************************/

uint16_t CRC16_Get8(uint8_t* pu8Data, uint32_t u32Len)

{

    uint16_t crc_poly = 0x8408; //Bit sequence inversion of 0x1021

    uint16_t crc_resault = 0xFFFF; //CRC register

    for(uint32_t i = 0; i < u32Len; i++)

    {

      crc_resault ^= pu8Data; //8-bit data



      for (uint8_t j = 0; j < 8; j++)

      {

            if (crc_resault & 0x0001)

                crc_resault = (crc_resault >> 1) ^ crc_poly;

            else

                crc_resault >>= 1;

      }

    }

    return crc_resault ^ 0xFFFF;

}
四、校验数据

1、输入数据

uint8_tau8CrcTestData = {0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0};

2、结果

0x5234

页: [1]
查看完整版本: CRC校验