对M4芯片的CRC模块改造来计算标准CRC32
【摘要】
最近使用的M4系列芯片中,有用于计算CRC的硬件CRC模块,这个模块计算出的校验和与我们平时使用的CRC32并不相同。下文用CRC’32指代M4的硬件CRC模块计算出的校验和,以与标准CRC32区分。虽然我们可以使用纯软件的方法来计算CRC32,不过,既然有CRC硬件,我们不妨试试对其进行加工,软件硬件配合来进行计算。一、 案例概述
这个硬件CRC模块有两个问题:其一,是其计算的CRC’32,计算过程与标准的CRC32算法并不一致;其二,是传给CRC模块的数据,必须以32位进行分组。若分组后剩余1~3字节,不足32位的情况,是无法计算的,必须补齐32位才行。但补齐之后,CRC值自然也就改变了。二、 问题原因分析
标准CRC32的模型如下:POLY = 0x04C11DB7, INIT_REM = 0xFFFFFFFF, FIN_XOR = 0xFFFFFFFF, REF_IN = TRUE, REF_REM = TRUE。
那么算法不一致,就一定是上述几项有不同。根据Data Sheet的描述:
Uses CRC-32 (Ethernet) polynomial: 0x4C11DB7.
The CRC calculator can be reset to 0xFFFF FFFF with the RESET control bit in the CRC_CR register.
从这两点可以确定的是POLY和INIT_REM的值,剩下的三个虽然不确定,但是取值有限,可以轻易穷举得出。
FIN_XOR的值虽然是32位的,有着丰富的可能性,但是常见取值只有两个,那就是0x00000000和0xFFFFFFFF。REF_IN和REF_REM都是布尔值,取值也只有TRUE和FALSE。这样组合之后,只有8种可能。依次测试对照,便可以确定,其CRC’32模型如下: