www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁(yè) > 公眾號(hào)精選 > 硅農(nóng)亞歷山大
[導(dǎo)讀]在之前的內(nèi)容里,我們介紹了很多通信協(xié)議,不過(guò)僅講解了數(shù)據(jù)的收發(fā)方法,而在實(shí)際的通信系統(tǒng)中,除了要實(shí)現(xiàn)收發(fā)外,還要盡量保證數(shù)據(jù)盡量不出差錯(cuò)。為盡量提高接收方收到數(shù)據(jù)的正確率,在接收數(shù)據(jù)時(shí)要對(duì)數(shù)據(jù)進(jìn)行差錯(cuò)檢測(cè),檢測(cè)的方式有很多種,常見(jiàn)的有奇偶校驗(yàn)、海明校驗(yàn)和CRC(循環(huán)冗余校驗(yàn))。其...

在之前的內(nèi)容里,我們介紹了很多通信協(xié)議,不過(guò)僅講解了數(shù)據(jù)的收發(fā)方法,而在實(shí)際的通信系統(tǒng)中,除了要實(shí)現(xiàn)收發(fā)外,還要盡量保證數(shù)據(jù)盡量不出差錯(cuò)。為盡量提高接收方收到數(shù)據(jù)的正確率,在接收數(shù)據(jù)時(shí)要對(duì)數(shù)據(jù)進(jìn)行差錯(cuò)檢測(cè),檢測(cè)的方式有很多種,常見(jiàn)的有奇偶校驗(yàn)、海明校驗(yàn)和CRC(循環(huán)冗余校驗(yàn))。其中CRC的檢錯(cuò)正確率、速度和成本等方面都具有優(yōu)勢(shì),也被廣泛應(yīng)用于計(jì)算機(jī)網(wǎng)絡(luò)通信中,本期內(nèi)容我們就通過(guò)一個(gè)小實(shí)驗(yàn),帶領(lǐng)大家了解GD32VF103片內(nèi)CRC單元的應(yīng)用方法。
系統(tǒng)環(huán)境


Windows 10-64bit
軟件平臺(tái)


NucleiStudio IDE 202102版或 PlatformIO IDE
硬件需求


RV-STAR開(kāi)發(fā)板




CRC(循環(huán)冗余校驗(yàn))



循環(huán)冗余校驗(yàn)(Cyclic redundancy check,CRC)是一種根據(jù)網(wǎng)上數(shù)據(jù)包或計(jì)算機(jī)文件等數(shù)據(jù)產(chǎn)生簡(jiǎn)短固定位數(shù)校驗(yàn)碼的一種散列函數(shù),主要用來(lái)檢測(cè)或校驗(yàn)數(shù)據(jù)傳輸或者保存后可能出現(xiàn)的錯(cuò)誤。生成的數(shù)字在傳輸或者存儲(chǔ)之前計(jì)算出來(lái)并且附加到數(shù)據(jù)后面,然后接收方進(jìn)行檢驗(yàn)確定數(shù)據(jù)是否發(fā)生變化。一般來(lái)說(shuō),循環(huán)冗余校驗(yàn)的值都是32位的整數(shù)。由于本函數(shù)易于用二進(jìn)制的計(jì)算機(jī)硬件使用、容易進(jìn)行數(shù)學(xué)分析并且尤其善于檢測(cè)傳輸通道干擾引起的錯(cuò)誤,因此獲得廣泛應(yīng)用。此方法是由W. Wesley Peterson于1961年發(fā)表,具體的計(jì)算流程在本期內(nèi)容中不作詳述,請(qǐng)讀者查閱相關(guān)資料或文獻(xiàn)進(jìn)行學(xué)習(xí)。


GD32VF103的計(jì)算單元




GD32VF103的CRC計(jì)算單元使用固定多項(xiàng)式計(jì)算32位CRC校驗(yàn)碼,其主要特征如下:
  • 32位數(shù)據(jù)輸入/輸出寄存器CRC_DATA


  • 固定的CRC計(jì)算多項(xiàng)式:0x4C11DB7,與以太網(wǎng)CRC計(jì)算多項(xiàng)式相同,即CRC-32/MPEG-2


  • 對(duì)于32位的輸入數(shù)據(jù),從數(shù)據(jù)輸入到得出計(jì)算結(jié)果,需4個(gè)AHB時(shí)鐘周期,在此期間因32位的輸入緩存存在,AHB總線不會(huì)掛起


  • 如果不通過(guò)軟件設(shè)置CRC_CTL寄存器的方式清除CRC_DATA寄存器,CRC計(jì)算單元將基于新輸入的原始數(shù)據(jù)和前一次CRC_DATA寄存器中的結(jié)果進(jìn)行計(jì)算


  • 提供一個(gè)與計(jì)算無(wú)關(guān)的獨(dú)立8位寄存器CRC_FDATA,可以供其他任何外設(shè)隨時(shí)使用





實(shí)驗(yàn)部分



本期實(shí)驗(yàn)主要讓大家了解CRC計(jì)算單元的應(yīng)用方法,而不涉及具體的通信過(guò)程,實(shí)驗(yàn)思路如下:



  • 選取一個(gè)特定的32位輸入數(shù)據(jù) 0x1234ABCD


  • 使用在線的CRC計(jì)算工具,計(jì)算出上述輸入值的CRC值為 0x9B3CD6F8


  • 編寫代碼,使用片上CRC計(jì)算單元計(jì)算輸入數(shù)據(jù)的CRC值,與在線工具計(jì)算的CRC值進(jìn)行比對(duì),使用板載的LED來(lái)表示比較結(jié)果,LED亮表示CRC值計(jì)算正確


例程如下:#include "nuclei_sdk_hal.h"

/* 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);
}
}



創(chuàng)建工程,添加以上例程到main.c文件中,然后編譯上傳到開(kāi)發(fā)板中,觀察到RV-STAR的板載綠色LED點(diǎn)亮,說(shuō)明硬件的CRC單元計(jì)算出了正確的CRC值。


本期內(nèi)容到此結(jié)束,歡迎讀者們?cè)谏鐓^(qū)中進(jìn)行交流。




“RVMCU課堂”專欄已在社區(qū)開(kāi)通如需獲取實(shí)驗(yàn)源碼或有實(shí)驗(yàn)相關(guān)問(wèn)題掃碼進(jìn)入即可






本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀
關(guān)閉