99精品伊人亚洲|最近国产中文炮友|九草在线视频支援|AV网站大全最新|美女黄片免费观看|国产精品资源视频|精彩无码视频一区|91大神在线后入|伊人终合在线播放|久草综合久久中文

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

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

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

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

jf_pJlTbmA9 ? 來源:靈動MM32MCU ? 作者:靈動MM32MCU ? 2023-11-10 18:27 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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ù)的大小端選擇

功能框圖

wKgaomUD4JKAFVSQAAEn72HmVwI508.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_t i = 0; i < length; i++)
{
    CRC->DR = buffer[i];
}

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

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

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計算過程 */

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ù)分別進行軟件CRC和硬件CRC計算,在不考慮軟件CRC自動生成查表數(shù)據(jù)所消耗時間的情況下,軟件CRC與硬件CRC在運算執(zhí)行時間對比如下圖所示:

wKgZomUD4JeAG8iyAAJmH3SJpTs854.png
wKgZomUD4JmAL7NUAAE548VaYWo659.png

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

來源:靈動MM32MCU

審核編輯:湯梓紅

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

    關(guān)注

    146

    文章

    17985

    瀏覽量

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

    關(guān)注

    31

    文章

    5435

    瀏覽量

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

    關(guān)注

    0

    文章

    204

    瀏覽量

    30137
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    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)品手冊(中文版)

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

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

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

    MM32F0140 用戶手冊(中文版)

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

    MM32F0140 用戶手冊(英文版)

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

    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> 勘誤表(英文版)

    AN0051 從MM32F031移植到MM32F0140(英文版)

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

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

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

    MM32F0140學(xué)習(xí)筆記——窗口看門狗(WWDG)

    MM32F0140學(xué)習(xí)筆記——窗口看門狗(WWDG)
    的頭像 發(fā)表于 10-27 09:45 ?1015次閱讀
    <b class='flag-5'>MM32F0140</b><b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b>——窗口看門狗(WWDG)

    MM32F0140學(xué)習(xí)筆記——FlexCAN 控制器局域網(wǎng)

    MM32F0140學(xué)習(xí)筆記——FlexCAN 控制器局域網(wǎng)
    的頭像 發(fā)表于 10-27 09:25 ?1833次閱讀
    <b class='flag-5'>MM32F0140</b><b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b>——FlexCAN 控制器局域網(wǎng)

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

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

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

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

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

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

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

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