我正在研究使用ARM Cortex-M4处理器内置的硬件CRC支持来计算CRC32的代码。作为参考,这里有一个描述硬件的应用笔记:
基本上,您一次将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 ;
}