zoukankan      html  css  js  c++  java
  • 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[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;
    }

    参考:STM32的硬件CRC32使用

  • 相关阅读:
    二叉排序树(B-Tree)-c实现
    队列(Queue)-c实现
    栈(stack)--c实现(使用双链表)
    链表(list)--c实现
    c 和 指针读书笔记(1)
    c traps and pitfalls reading notes(2)
    js 控制
    正则表达式
    Android 笔记
    Android 布局方式学习
  • 原文地址:https://www.cnblogs.com/LittleTiger/p/8250537.html
Copyright © 2011-2022 走看看