CRC校驗(循環(huán)冗余校驗Error Correcting Code)是數(shù)據(jù)通訊中最常采用的校驗方式之一,它是一種根據(jù)網(wǎng)絡(luò)數(shù)據(jù)包或計算機文件等數(shù)據(jù)產(chǎn)生簡短固定位數(shù)校驗碼的一種信道編碼技術(shù),主要用來檢測或校驗數(shù)據(jù)傳輸或者保存后可能出現(xiàn)的錯誤,它是利用除法及余數(shù)的原理來作錯誤偵測的。
MM32F0140系列MCU帶有一個硬件CRC計算單元,它采用一個固定的多項式發(fā)生器來計算8位、16位或者是32位數(shù)據(jù)的CRC校驗值,對數(shù)據(jù)傳輸或數(shù)據(jù)存儲的一致性、完整性進行驗證。
主要特性如下所示:
固定計算多項式 0x04C11DB7:
X32 + X26 + X23 + X22 + X16 + X12 + X11 + X10 + X8 + X7 + X5 + X4 + X2 + X + 1
支持8、16、32位寬的數(shù)據(jù)輸入寄存器、32位寬的數(shù)據(jù)輸出寄存器
硬件計算時間為3個HCLK周期
帶有可存放中間計算過程的32位寬的數(shù)據(jù)寄存器
支持CRC-32和CRC-32/MPEG-2兩種算法
支持輸入數(shù)據(jù)和輸出數(shù)據(jù)的大小端選擇
功能框圖
![f165370a-13d8-11ed-ba43-dac502259ad0.png](https://file1.elecfans.com//web2/M00/95/F2/wKgZomTnE0GAXt-eAAEn72HmVwI965.png)
硬件CRC計算操作步驟
STEP1
使能CRC模塊時鐘,并復(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計算過程
STEP5
讀取CRC數(shù)據(jù)寄存器,得到CRC計算結(jié)果
硬件CRC示例程序
/* 使能CRC模塊時鐘,并復(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;
/* 計算CRC */
for(uint8_ti=0;iDR=buffer[i];
}
/* 讀取CRC計算結(jié)果 */
returnCRC->DR;
軟件CRC的實現(xiàn)是將硬件CRC的計算過程用軟件代碼的形式體現(xiàn)出來,通過MCU運行功能代碼實現(xiàn)CRC的計算過程,與硬件CRC相比,需要根據(jù)多項式產(chǎn)生CRC表,在計算過程中還需要考慮數(shù)據(jù)的大小端選擇等參數(shù),實現(xiàn)過程相比硬件CRC要復(fù)雜很多、計算速度相比硬件CRC要慢很多。
軟件CRC示例程序
/* 根據(jù)多項式產(chǎn)生查表數(shù)據(jù) */
voidCRC_MPEG2_GenerateCRCTable(void)
{
uint32_ti=0,j=0,Data=0,Temp=0;
for(i=0;i256;i++)
{
Data=0;
Temp=(i<24);
for(j=0;j8;j++)
{
if((Data^Temp)&0x80000000)
{
Data=(Data<1)^0x04C11DB7;
}
else
{
Data<<=?1;
}
Temp<<=?1;
}
CRC_MPEG2_Table[i]=Data;
}
}
/* 大小端處理 */
uint32_tCRC_MPEG2_SwapEndian(uint32_tdata)
{
return(((data<24)&0xFF000000)|
((data<?8)&0x00FF0000)|
((data>>8)&0x0000FF00)|
((data>>24)&0x000000FF));
}
/* 軟件CRC計算過程 */
uint32_tCRC_MPEG2_CalcCRC(uint32_t*Buffer,uint16_tLength)
{
uint8_ti=0;
uint32_tTemp=0,Result=0xFFFFFFFF;
uint32_t*pData;
/*DynamicgenerateCRC-32/MPEG-2table*/
CRC_MPEG2_GenerateCRCTable();
while(Length--)
{
Temp=CRC_MPEG2_SwapEndian(*Buffer++);
pData=&Temp;
for(i=0;i4;i++)
{
Result=(Result<8)^CRC_MPEG2_Table[((Result>>24)^*((uint8_t*)pData+i))&0xFF];
}
}
returnResult;
}
對于同一組32位114個數(shù)值數(shù)據(jù)分別進行軟件CRC和硬件CRC計算,在不考慮軟件CRC自動生成查表數(shù)據(jù)所消耗時間的情況下,軟件CRC與硬件CRC在運算執(zhí)行時間對比如下圖所示:
![f18a1228-13d8-11ed-ba43-dac502259ad0.png](https://file1.elecfans.com//web2/M00/95/F2/wKgZomTnE0GAAgs1AAJmH3SJpTs367.png)
![f1b5df7a-13d8-11ed-ba43-dac502259ad0.png](https://file1.elecfans.com//web2/M00/95/F2/wKgZomTnE0GAXwrKAAE548VaYWo389.png)
軟件CRC相比于硬件CRC在執(zhí)行速度上最少有5倍的差距,軟件CRC的代碼量以及占用SRAM的空間也比硬件CRC要多;所以在MCU帶有硬件CRC功能時,通過硬件CRC的計算方式可以大大節(jié)省MCU的資源、提升CRC的運算速度,給實際應(yīng)用帶來流暢的檢驗。
審核編輯:湯梓紅
-
mcu
+關(guān)注
關(guān)注
146文章
17349瀏覽量
352759 -
寄存器
+關(guān)注
關(guān)注
31文章
5368瀏覽量
121245 -
crc
+關(guān)注
關(guān)注
0文章
199瀏覽量
29588 -
MM32
+關(guān)注
關(guān)注
1文章
106瀏覽量
815
原文標(biāo)題:靈動微課堂 (第225講) | MM32F0140學(xué)習(xí)筆記——CRC
文章出處:【微信號:MindMotion-MMCU,微信公眾號:靈動MM32MCU】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
靈動微電子發(fā)布全新超值型MM32F0140系列MCU
![靈動微電子發(fā)布全新超值型<b class='flag-5'>MM32F0140</b><b class='flag-5'>系列</b><b class='flag-5'>MCU</b>](https://file.elecfans.com/web2/M00/1D/A2/poYBAGGTCmqAWVydAAGEBJfOkzY942.png)
評論