0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

MM32F0140系列MCU軟硬件CRC示例程序

靈動(dòng)MM32MCU ? 來源:靈動(dòng)MM32MCU ? 作者:靈動(dòng)MM32MCU ? 2022-08-04 17:38 ? 次閱讀

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ù),主要用來檢測(cè)或校驗(yàn)數(shù)據(jù)傳輸或者保存后可能出現(xiàn)的錯(cuò)誤,它是利用除法及余數(shù)的原理來作錯(cuò)誤偵測(cè)的。

MM32F0140系列MCU帶有一個(gè)硬件CRC計(jì)算單元,它采用一個(gè)固定的多項(xiàng)式發(fā)生器來計(jì)算8位、16位或者是32位數(shù)據(jù)的CRC校驗(yàn)值,對(duì)數(shù)據(jù)傳輸或數(shù)據(jù)存儲(chǔ)的一致性、完整性進(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個(gè)HCLK周期

帶有可存放中間計(jì)算過程的32位寬的數(shù)據(jù)寄存器

支持CRC-32和CRC-32/MPEG-2兩種算法

支持輸入數(shù)據(jù)和輸出數(shù)據(jù)的大小端選擇

功能框圖

f165370a-13d8-11ed-ba43-dac502259ad0.png

硬件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自動(dòng)完成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_ti=0;iDR=buffer[i];
}

/* 讀取CRC計(jì)算結(jié)果 */

returnCRC->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ù) */

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計(jì)算過程 */

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;
}

對(duì)于同一組32位114個(gè)數(shù)值數(shù)據(jù)分別進(jìn)行軟件CRC和硬件CRC計(jì)算,在不考慮軟件CRC自動(dòng)生成查表數(shù)據(jù)所消耗時(shí)間的情況下,軟件CRC與硬件CRC在運(yùn)算執(zhí)行時(shí)間對(duì)比如下圖所示:

f18a1228-13d8-11ed-ba43-dac502259ad0.pngf1b5df7a-13d8-11ed-ba43-dac502259ad0.png

軟件CRC相比于硬件CRC在執(zhí)行速度上最少有5倍的差距,軟件CRC的代碼量以及占用SRAM的空間也比硬件CRC要多;所以在MCU帶有硬件CRC功能時(shí),通過硬件CRC的計(jì)算方式可以大大節(jié)省MCU的資源、提升CRC的運(yùn)算速度,給實(shí)際應(yīng)用帶來流暢的檢驗(yàn)。

審核編輯:湯梓紅


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • mcu
    mcu
    +關(guān)注

    關(guān)注

    146

    文章

    16885

    瀏覽量

    349916
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5294

    瀏覽量

    119814
  • crc
    crc
    +關(guān)注

    關(guān)注

    0

    文章

    199

    瀏覽量

    29420
  • MM32
    +關(guān)注

    關(guān)注

    1

    文章

    106

    瀏覽量

    735

原文標(biāo)題:靈動(dòng)微課堂 (第225講) | MM32F0140學(xué)習(xí)筆記——CRC

文章出處:【微信號(hào):MindMotion-MMCU,微信公眾號(hào):靈動(dòng)MM32MCU】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    靈動(dòng)微電子發(fā)布全新超值型MM32F0140系列MCU

    MM32F0140 系列 MCU 適用于各類汽車,工業(yè)和消費(fèi)市場(chǎng),其典型應(yīng)用包括電池管理、電梯外呼板、斷路器、消防、車載診斷儀、照明等。
    發(fā)表于 11-16 09:24 ?1886次閱讀
    靈動(dòng)微電子發(fā)布全新超值型<b class='flag-5'>MM32F0140</b><b class='flag-5'>系列</b><b class='flag-5'>MCU</b>

    基于MM32F0140系列MCU實(shí)現(xiàn)UDS Bootloader的設(shè)計(jì)

    1、使用MM32F0140系列MCU實(shí)現(xiàn)UDS Bootloader  MM32F0140 使用高性能的 Arm?Cortex-M0 內(nèi)核的 32 位微控制器,最高工作頻率可達(dá) 72M
    發(fā)表于 09-15 16:35

    AN0052從MM32F0130移植到MM32F0140(英文版)

    AN0052 從MM32F0130移植到MM32F0140(英文版)
    發(fā)表于 02-22 18:43 ?0次下載
    AN0052從<b class='flag-5'>MM32F</b>0130移植到<b class='flag-5'>MM32F0140</b>(英文版)

    MM32F0140 產(chǎn)品手冊(cè)(中文版)

    MM32F0140 產(chǎn)品手冊(cè)(中文版)
    發(fā)表于 02-22 18:45 ?0次下載
    <b class='flag-5'>MM32F0140</b> 產(chǎn)品手冊(cè)(中文版)

    MM32F0140 產(chǎn)品手冊(cè)(英文版)

    MM32F0140 產(chǎn)品手冊(cè)(英文版)
    發(fā)表于 02-22 18:45 ?0次下載
    <b class='flag-5'>MM32F0140</b> 產(chǎn)品手冊(cè)(英文版)

    MM32F0140 用戶手冊(cè)(中文版)

    MM32F0140 用戶手冊(cè)(中文版)
    發(fā)表于 02-22 18:46 ?0次下載
    <b class='flag-5'>MM32F0140</b> 用戶手冊(cè)(中文版)

    MM32F0140 用戶手冊(cè)(英文版)

    MM32F0140 用戶手冊(cè)(英文版)
    發(fā)表于 02-22 18:46 ?0次下載
    <b class='flag-5'>MM32F0140</b> 用戶手冊(cè)(英文版)

    MM32F0140 勘誤表(中文版)

    MM32F0140 勘誤表(中文版)
    發(fā)表于 02-22 18:47 ?0次下載
    <b class='flag-5'>MM32F0140</b> 勘誤表(中文版)

    MM32F0140 勘誤表(英文版)

    MM32F0140 勘誤表(英文版)
    發(fā)表于 02-22 18:48 ?0次下載
    <b class='flag-5'>MM32F0140</b> 勘誤表(英文版)

    基于MM32F0140的UDS Bootloader學(xué)習(xí)筆記

    基于MM32F0140的UDS Bootloader學(xué)習(xí)筆記
    的頭像 發(fā)表于 10-30 17:11 ?682次閱讀
    基于<b class='flag-5'>MM32F0140</b>的UDS Bootloader學(xué)習(xí)筆記

    MM32F0140學(xué)習(xí)筆記——CRC

    MM32F0140學(xué)習(xí)筆記——CRC
    的頭像 發(fā)表于 11-10 18:27 ?558次閱讀
    <b class='flag-5'>MM32F0140</b>學(xué)習(xí)筆記——<b class='flag-5'>CRC</b>

    MM32F0140 SPI學(xué)習(xí)筆記

    MM32F0140 SPI學(xué)習(xí)筆記
    的頭像 發(fā)表于 09-26 16:51 ?559次閱讀
    <b class='flag-5'>MM32F0140</b> SPI學(xué)習(xí)筆記

    MM32F0140 DMA學(xué)習(xí)筆記

    MM32F0140 DMA 學(xué)習(xí)筆記
    的頭像 發(fā)表于 09-18 16:57 ?669次閱讀
    <b class='flag-5'>MM32F0140</b> DMA學(xué)習(xí)筆記

    MM32F0140 UART學(xué)習(xí)筆記

    MM32F0140 UART學(xué)習(xí)筆記
    的頭像 發(fā)表于 09-26 16:45 ?725次閱讀
    <b class='flag-5'>MM32F0140</b> UART學(xué)習(xí)筆記

    MM32F0140 GPIO學(xué)習(xí)筆記

    MM32F0140 GPIO學(xué)習(xí)筆記
    的頭像 發(fā)表于 09-26 16:42 ?518次閱讀
    <b class='flag-5'>MM32F0140</b> GPIO學(xué)習(xí)筆記