CRC校驗(yàn)(循環(huán)冗余校驗(yàn)Error Correcting Code)是數(shù)據(jù)通訊中最常采用的校驗(yàn)方式之一,它是一種根據(jù)網(wǎng)絡(luò)數(shù)據(jù)包或計(jì)算機(jī)文件等數(shù)據(jù)產(chǎn)生簡短固定位數(shù)校驗(yàn)碼的一種信道編碼技術(shù),主要用來檢測或校驗(yàn)數(shù)據(jù)傳輸或者保存后可能出現(xiàn)的錯誤,它是利用除法及余數(shù)的原理來作錯誤偵測的。
MM32F0140系列MCU帶有一個硬件CRC計(jì)算單元,它采用一個固定的多項(xiàng)式發(fā)生器來計(jì)算8位、16位或者是32位數(shù)據(jù)的CRC校驗(yàn)值,對數(shù)據(jù)傳輸或數(shù)據(jù)存儲的一致性、完整性進(jìn)行驗(yàn)證。
主要特性如下所示:
● 固定計(jì)算多項(xiàng)式 0x04C11DB7:
X32 + X26 + X23 + X22 + X16 + X12 + X11 + X10 + X8 + X7 + X5 + X4 + X2 + X + 1
● 支持8、16、32位寬的數(shù)據(jù)輸入寄存器、32位寬的數(shù)據(jù)輸出寄存器
● 硬件計(jì)算時(shí)間為3個HCLK周期
● 帶有可存放中間計(jì)算過程的32位寬的數(shù)據(jù)寄存器
● 支持CRC-32和CRC-32/MPEG-2兩種算法
● 支持輸入數(shù)據(jù)和輸出數(shù)據(jù)的大小端選擇
功能框圖
硬件CRC計(jì)算操作步驟
STEP1、使能CRC模塊時(shí)鐘,并復(fù)位CRC模塊
STEP2、配置CRC_CR寄存器,選擇CRC-32或者CRC-32/MPEG-2算法,配置輸入數(shù)據(jù)位寬為8位、16位或者是32位,選擇輸入、輸出數(shù)據(jù)的大小端
STEP3、通過配置CRC控制寄存器的RST位,將CRC恢復(fù)到初始狀態(tài)
STEP4、依次將數(shù)據(jù)寫入CRC數(shù)據(jù)寄存器中,MCU自動完成CRC計(jì)算過程
STEP5、讀取CRC數(shù)據(jù)寄存器,得到CRC計(jì)算結(jié)果
硬件CRC示例程序
/* 使能CRC模塊時(shí)鐘,并復(fù)位CRC模塊 */
RCC->AHBENR |= RCC_AHBENR_CRC; RCC->AHBRSTR |= RCC_AHBENR_CRC; RCC->AHBRSTR = ~RCC_AHBENR_CRC;
/* 配置輸入輸出數(shù)據(jù)跟隨MCU小端,輸入數(shù)據(jù)選擇32位寬,使用CRC-32/MPEG-2算法 */
CRC->CR = 0;
/* 將CRC恢復(fù)到初始狀態(tài) */
CRC->CR |= CRC_CR_RESET;
/* 計(jì)算CRC */
for(uint8_t i = 0; i < length; i++) { CRC->DR = buffer[i]; }
/* 讀取CRC計(jì)算結(jié)果 */
return CRC->DR;
軟件CRC的實(shí)現(xiàn)是將硬件CRC的計(jì)算過程用軟件代碼的形式體現(xiàn)出來,通過MCU運(yùn)行功能代碼實(shí)現(xiàn)CRC的計(jì)算過程,與硬件CRC相比,需要根據(jù)多項(xiàng)式產(chǎn)生CRC表,在計(jì)算過程中還需要考慮數(shù)據(jù)的大小端選擇等參數(shù),實(shí)現(xiàn)過程相比硬件CRC要復(fù)雜很多、計(jì)算速度相比硬件CRC要慢很多。
軟件CRC示例程序
/* 根據(jù)多項(xiàng)式產(chǎn)生查表數(shù)據(jù) */
void CRC_MPEG2_GenerateCRCTable(void) { uint32_t i = 0, j = 0, Data = 0, Temp = 0; for(i = 0; i < 256; i++) { Data = 0; Temp = (i << 24); for(j = 0; j < 8; j++) { if((Data ^ Temp) 0x80000000) { Data = ( Data << 1 ) ^ 0x04C11DB7; } else { Data <<= 1; } Temp <<= 1; } CRC_MPEG2_Table[i] = Data; } }
/* 大小端處理 */
uint32_t CRC_MPEG2_SwapEndian(uint32_t data) { return (((data << 24) 0xFF000000) | ((data << 8) 0x00FF0000) | ((data >> 8) 0x0000FF00) | ((data >> 24) 0x000000FF)); }
/* 軟件CRC計(jì)算過程 */
uint32_t CRC_MPEG2_CalcCRC(uint32_t *Buffer, uint16_t Length) { uint8_t i = 0; uint32_t Temp = 0, Result = 0xFFFFFFFF; uint32_t *pData; /* Dynamic generate CRC-32/MPEG-2 table */ CRC_MPEG2_GenerateCRCTable(); while(Length--) { Temp = CRC_MPEG2_SwapEndian(*Buffer++); pData = Temp; for(i = 0; i < 4; i++) { Result = (Result << 8) ^ CRC_MPEG2_Table[((Result >> 24) ^ *((uint8_t *)pData + i)) 0xFF]; } } return Result; }
對于同一組32位114個數(shù)值數(shù)據(jù)分別進(jìn)行軟件CRC和硬件CRC計(jì)算,在不考慮軟件CRC自動生成查表數(shù)據(jù)所消耗時(shí)間的情況下,軟件CRC與硬件CRC在運(yùn)算執(zhí)行時(shí)間對比如下圖所示:
軟件CRC相比于硬件CRC在執(zhí)行速度上最少有5倍的差距,軟件CRC的代碼量以及占用SRAM的空間也比硬件CRC要多;所以在MCU帶有硬件CRC功能時(shí),通過硬件CRC的計(jì)算方式可以大大節(jié)省MCU的資源、提升CRC的運(yùn)算速度,給實(shí)際應(yīng)用帶來流暢的檢驗(yàn)。
來源:靈動MM32MCU
審核編輯:湯梓紅
-
mcu
+關(guān)注
關(guān)注
146文章
17349瀏覽量
352756 -
寄存器
+關(guān)注
關(guān)注
31文章
5368瀏覽量
121241 -
crc
+關(guān)注
關(guān)注
0文章
199瀏覽量
29588
發(fā)布評論請先 登錄
相關(guān)推薦
評論