| 
 
| 简单实现STM32 CRC32使用 
 使用前记得使能STM32 CRC时钟
 
 //STM32硬件CRC32 byte数据计算,将数据移到最高位,低位补上FF
 u32 stm32_crc32_byte(u8 *pBuff, u32 len)
 {
 u32 i;
 u8 buff[4];
 u32 *p32 = (u32 *)buff;
 
 CRC->CR = 1;        //复位CRC寄存器
 buff[0] = buff[1] = buff[2] = buff[3] = 0XFF;
 for(i = 0;i < len;i ++)
 {
 buff[3] = pBuff[i];
 CRC->DR = *p32;
 }
 return CRC->DR;
 }
 
 
 //STM32硬件CRC32 u32数据计算
 u32 stm32_crc32(u32 *pBuff, u32 len)
 {
 u32 i;
 
 CRC->CR = 1;        //复位CRC寄存器
 for(i = 0;i < len;i ++)
 {
 CRC->DR = pBuff[i];
 }
 return CRC->DR;
 }
 
 //软件CRC32 u32数据计算
 u32 crc32(u32 *ptr, u32 len)
 {
 u32        xbit;
 u32        data;
 u32        CRC32 = 0xFFFFFFFF;
 u32 bits;
 const u32 dwPolynomial = 0x04c11db7;
 u32        i;
 
 for(i = 0;i < len;i ++)
 {
 xbit = 1 << 31;
 data = ptr[i];
 for (bits = 0; bits < 32; bits++)
 {
 if (CRC32 & 0x80000000) {
 CRC32 <<= 1;
 CRC32 ^= dwPolynomial;
 }
 else
 CRC32 <<= 1;
 if (data & xbit)
 CRC32 ^= dwPolynomial;
 
 xbit >>= 1;
 }
 }
 return CRC32;
 }
 
 
 //软件CRC32 byte数据计算,将数据移到最高位,低位补上FF
 u32 crc32_byte(u8 *ptr, u32 len)
 {
 u32        xbit;
 u32        data;
 u32        CRC32 = 0xFFFFFFFF;                //初值
 u32 bits;
 u32        i;
 u8 buff[4];
 u32 *p32 = (u32 *)buff;
 const u32 dwPolynomial = 0x04c11db7;
 
 buff[0] = buff[1] = buff[2] = buff[3] = 0XFF;
 for(i = 0;i < len;i ++)
 {
 xbit = 1 << 31;
 
 buff[3] = ptr[i];
 data = *p32;
 for(bits = 0; bits < 32; bits++)
 {
 if (CRC32 & 0x80000000) {
 CRC32 <<= 1;
 CRC32 ^= dwPolynomial;
 }
 else
 CRC32 <<= 1;
 if (data & xbit)
 CRC32 ^= dwPolynomial;
 
 xbit >>= 1;
 }
 }
 return CRC32;
 }
 
 
 
 | 
 |