首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

STM32 CRC32与对应的软件CRC32

STM32 CRC32与对应的软件CRC32

简单实现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;  
  •         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;  
  •     }  
  •     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;  
  •         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;  
  •         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;  
  • }  
返回列表