16位模式下CRC计算函数
- uint32_t CRC_Cal16(uint32_t seed, uint8_t *msg, uint32_t sizeBytes)
- {
- uint32_t ctrl_reg,data_out,data_in;
- uint8_t *pCRCBytes;
- uint32_t sizeWords;
- uint32_t i,j;
-
- /* 设置WaS=1,写入种子值 */
- ctrl_reg = CRC0->CTRL;
- CRC0->CTRL = ctrl_reg | CRC_CTRL_WAS_MASK;
- CRC0->ACCESS16BIT.DATAL = seed;
-
- /* Set WaS=0,准备写入数据*/
- CRC0->CTRL = ctrl_reg & 0xFD000000;
- /*等待计算完成*/
- sizeWords = sizeBytes>>1;
- j = 0;
- for(i=0;i<sizeWords;i++){
- data_in = (msg[j] << 8) | (msg[j+1]); /*将数据写入CRC数据寄存器,以16位方式写入*/
- j += 2;
- CRC0->ACCESS16BIT.DATAL =data_in;
- }
- if (j<sizeBytes)
- {
- pCRCBytes = (uint8_t*)&CRC0->ACCESS8BIT.DATALL; /*以8位的方式写入剩余的数据*/
- *pCRCBytes++ = msg[j];
- }
- if ((CRC0->CTRL& CRC_CTRL_TOTR_MASK)>1) //Modify
- {
- data_out=CRC0->ACCESS16BIT.DATAH; //读出字节转置后16位计算结果
- }
- else
- {
- data_out=CRC0->ACCESS16BIT.DATAL; //读出16位计算结果
- }
-
- return(data_out);
- }
复制代码
|