2014年2月12日星期三

CRC;Cyclic redundancy check;循环冗馀校验

由于STM32系列的单片机内嵌CRC模块,所以特意去查了一下!毕竟这是鬼佬的东西,建议大家还是去英文版的维基百科看看,那些中文的维基百科翻译者翻译的有些不靠谱,但是可以作为参考来看!

摘自英文版的维基百科中的CRC的Introduction部分:
  Specification of a CRC code requires definition of a so-called generator polynomial. This polynomial resembles the divisor in a polynomial long division, which takes the message as the dividend and in which the quotient is discarded and the remainder becomes the result, with the important distinction that the polynomial coefficients are calculated according to the carry-less arithmetic of a finite field. The length of the remainder is always less than the length of the generator polynomial, which therefore determines how long the result can be.

个人翻译(水平有限,辅助工具谷歌翻译必应翻译):
  CRC码的规范要求定义一个所谓的“生成多项式”。这“生成多项式”类似于“多项式长除法”中的除数,“消息”当作被除数,而“商”丢弃不用,其“余数”就是结果,其最大的区别是该“生成多项式”的“系数”被计算为相应的无进位算法(carry-less:无进位)的有限域。其“余数”的长度总是小于“生成多项式”的长度,因此可以判断“余数”的最大长度。
  更多详情请参阅英文版维基百科中文版的可以作为参考!
要想了解CRC的计算过程和方法,请看CRC维基百科中的Computation of CRC部分!
此图出处


!!!特别注意!!!
  寄存器CRC_INIT中的值对于你所求的值很重要,当CRC_INIT中的值不同时,你在CRC_DR中得到的值就不同,建议每次计算一个新的的数据流时使用CRC_CR寄存器中的RESET位重置一下CRC_DR再计算。
  例如,如果CRC_INIT的值为0xFFFFFFFF的话,重置CRC后(通过设置CRC_CR中的RESET位),输入0x1a2b3c4d到CRC_DR后,所得到的值是0xB88C7830;如果CRC_INIT的值为0,重置CRC后向CRC_DR写入0x1A2B3C4D会得到的值为0x7F88A54B。