RVMCU課堂「19」: 手把手教你玩轉(zhuǎn)RVSTAR—CRC計算篇
系統(tǒng)環(huán)境
軟件平臺
硬件需求
CRC(循環(huán)冗余校驗)
循環(huán)冗余校驗(Cyclic redundancy check,CRC)是一種根據(jù)網(wǎng)上數(shù)據(jù)包或計算機文件等數(shù)據(jù)產(chǎn)生簡短固定位數(shù)校驗碼的一種散列函數(shù),主要用來檢測或校驗數(shù)據(jù)傳輸或者保存后可能出現(xiàn)的錯誤。生成的數(shù)字在傳輸或者存儲之前計算出來并且附加到數(shù)據(jù)后面,然后接收方進行檢驗確定數(shù)據(jù)是否發(fā)生變化。一般來說,循環(huán)冗余校驗的值都是32位的整數(shù)。由于本函數(shù)易于用二進制的計算機硬件使用、容易進行數(shù)學(xué)分析并且尤其善于檢測傳輸通道干擾引起的錯誤,因此獲得廣泛應(yīng)用。此方法是由W. Wesley Peterson于1961年發(fā)表,具體的計算流程在本期內(nèi)容中不作詳述,請讀者查閱相關(guān)資料或文獻進行學(xué)習(xí)。
GD32VF103的計算單元
GD32VF103的CRC計算單元使用固定多項式計算32位CRC校驗碼,其主要特征如下:
-
32位數(shù)據(jù)輸入/輸出寄存器CRC_DATA
-
固定的CRC計算多項式:0x4C11DB7,與以太網(wǎng)CRC計算多項式相同,即CRC-32/MPEG-2
-
對于32位的輸入數(shù)據(jù),從數(shù)據(jù)輸入到得出計算結(jié)果,需4個AHB時鐘周期,在此期間因32位的輸入緩存存在,AHB總線不會掛起
-
如果不通過軟件設(shè)置CRC_CTL寄存器的方式清除CRC_DATA寄存器,CRC計算單元將基于新輸入的原始數(shù)據(jù)和前一次CRC_DATA寄存器中的結(jié)果進行計算
-
提供一個與計算無關(guān)的獨立8位寄存器CRC_FDATA,可以供其他任何外設(shè)隨時使用
實驗部分
本期實驗主要讓大家了解CRC計算單元的應(yīng)用方法,而不涉及具體的通信過程,實驗思路如下:
-
選取一個特定的32位輸入數(shù)據(jù) 0x1234ABCD
-
使用在線的CRC計算工具,計算出上述輸入值的CRC值為 0x9B3CD6F8
-
編寫代碼,使用片上CRC計算單元計算輸入數(shù)據(jù)的CRC值,與在線工具計算的CRC值進行比對,使用板載的LED來表示比較結(jié)果,LED亮表示CRC值計算正確
/* CRC input value */
uint32_t val = (uint32_t)0x1234ABCD;
/* pre-calculated CRC value for input value */
uint32_t val_crc = (uint32_t)0x9B3CD6F8;
int main(void)
{
/* init the built-in green led */
gd_rvstar_led_init(LED1);
/* enable the CRC clock */
rcu_periph_clock_enable(RCU_CRC);
/* reset the CRC to clear the register */
crc_data_register_reset();
/* compare the pre-calculated CRC value with the value calculated by hardware */
if (val_crc == crc_single_data_calculate(val)) {
gd_rvstar_led_on(LED1);
} else {
gd_rvstar_led_off(LED1);
}
}