使用Cortex-M4硬件支持来计算CRC32

时间:2016-04-12 21:20:08

标签: arm crc crc32

我正在研究使用ARM Cortex-M4处理器内置的硬件CRC支持来计算CRC32的代码。作为参考,这里有一个描述硬件的应用笔记:

http://www.st.com/st-web-ui/static/active/en/resource/technical/document/application_note/DM00068118.pdf

基本上,您一次将32位数据写入内存映射寄存器(CRC_DR),然后从同一地址读取生成的CRC。但是,这产生的CRC与软件CRC32库产生的标准结果完全不同。我终于找到了一个编写代码来操作Cortex结果以产生“标准”结果的人:

http://www.cnblogs.com/shangdawei/p/4603948.html

我的代码(如下所示并根据上述解决方案改编)现在产生“标准”结果,但我怀疑ReverseBits的调用次数比实际需要的多。我希望有人可以告诉我它是否可以简化。

谢谢! 丹

#define RCC_BASE    0x40023800
#define RCC_AHB1ENR *((uint32_t *) (RCC_BASE + 0x30))

#define CRC_BASE    0x40023000
#define CRC_DR      *((volatile uint32_t *) (CRC_BASE + 0x00))
#define CRC_IDR     *((volatile uint32_t *) (CRC_BASE + 0x04))
#define CRC_CR      *((volatile uint32_t *) (CRC_BASE + 0x08))

uint32_t ARMcrc32(void *data, uint32_t bytes)
{
uint32_t *p32 = data ;
uint32_t crc, crc_reg ;

RCC_AHB1ENR |= 1 << 12 ;    // Enable CRC clock

CRC_CR |= 0x00000001 ;      // Reset the CRC calculator

while (bytes >= 4)
    {
    CRC_DR = ReverseBits(*p32++) ;
    bytes -= 4 ;
    }
 crc_reg = CRC_DR ;
 crc = ReverseBits(crc_reg) ;

 if (bytes > 0)
    {
    uint32_t bits = 8 * bytes ;
    uint32_t xtra = 32 - bits ;
    uint32_t mask = (1 << bits) - 1 ;

    CRC_DR = crc_reg ;

    CRC_DR = ReverseBits((*p32 & mask) ^ crc) >> xtra ;
    crc = (crc >> bits) ^ ReverseBits(CRC_DR);
    }

return ~crc ;
}

0 个答案:

没有答案