1、简介
CRC的软件算法用过很多次,但是切换成硬件,还是第一次使用,但是速度和可配置的简单程序都要好很多
但是软件和硬件的使用方法都是一样的,计算传入参数的结果
2、CRC寄存器
2.1、DATA:CRC Data register
其中CRC的输出结果可以设置为8位、16位、32位,所以S32K144的官方例程的寄存器定义为:
定义为联合体,其中可以根据用户自己设置使用8位、16位、32位
2.2、GPOLY:CRC Polynomial register
该寄存器控制CRC模块的配置和工作。必须在开始新的CRC计算前设置。初始化一个新的CRC计算通过断言CTRL[WAS],然后将种子写入CRC数据寄存器。
24 |
TCRC |
CRC的协议宽度 0-16bit 1-32bit |
25 |
WAS |
写入CRC数据寄存器作为种子
|
26 |
FXOR |
CRC数据寄存器的补读
|
28-29 |
TOTR |
读取时的转置类型
|
30-31 |
TOT |
写时的转置类型 0- 不转置 1- 字节的位转置,字节不转 2- 字节和字节的位都转置 3- 只有字节转置,字节的位转置 |
3、代码
#define POLY (0x04C11DB7)
uint32_t CRC_32bits_calculate(uint8_t *data, uint32_t size)
{
/*! CRC-32 Algorithm: \n
* polynomial = 0x04C11DB7 \n
* seed = 0xFFFFFFFF \n
* Bits in a byte are transposed for writes. \n
* Both bits in bytes and bytes are transposed for read. \n
* XOR on reading. \n
*/
PCC->PCCn[PCC_CRC_INDEX] |= PCC_PCCn_CGC_MASK; /* enable CRC clock */
CRC->CTRL |= CRC_CTRL_TCRC(1); /* enable 32-bit CRC protocol */
CRC->CTRL |= CRC_CTRL_TOT(1); /* Bits in a byte are transposed, while bytes are not transposed. */
CRC->CTRL |= CRC_CTRL_TOTR(2); /* Both bits in bytes and bytes are transposed. */
CRC->CTRL |= CRC_CTRL_FXOR(1); /* XOR on reading. */
CRC->GPOLY = POLY;
CRC->CTRL |= CRC_CTRL_WAS_MASK; /* Set CRC_CTRL[WAS] to program the seed value. */
CRC->DATAu.DATA = 0xFFFFFFFF; /* seed value */
CRC->CTRL &= ~CRC_CTRL_WAS_MASK; /* Clear CRC_CTRL[WAS] to start writing data values. */
for(;size--;)
CRC->DATAu.DATA = *data++; /* write data values */
return (uint32_t) CRC->DATAu.DATA;
}
int main(void)
{
uint8_t test = 0x41;
uint32_t crc = 0x00000000;
WDOG_disable(); /* Disable WDOG */
SOSC_init_8MHz(); /* Initialize system oscilator for 8 MHz xtal */
SPLL_init_160MHz(); /* Initialize SPLL to 160 MHz with 8 MHz SOSC */
NormalRUNmode_80MHz(); /* Init clocks: 80 MHz sysclk & core, 40 MHz bus, 20 MHz flash */
crc = CRC_32bits_calculate(&test, 1); /* Calculate 32-bit CRC */
while(1){
}
return 0;
}
GPOLY:CRC Polynomial register