在單片機(jī)驅(qū)動的電子系統(tǒng)中,從智能傳感器、家電控制模塊到工業(yè)可編程邏輯控制器(PLC)、汽車電子控制單元(ECU),數(shù)據(jù)傳輸與存儲的完整性直接決定系統(tǒng)可靠性——單字節(jié)數(shù)據(jù)錯誤可能引發(fā)傳感器信號誤判、執(zhí)行器動作異常甚至整個控制系統(tǒng)宕機(jī)。循環(huán)冗余校驗(CRC)作為一種高效的錯誤檢測技術(shù),如同數(shù)據(jù)傳輸與存儲過程中的"安全校驗屏障",持續(xù)保障MCU與外部設(shè)備交互數(shù)據(jù)的準(zhǔn)確性。本文將系統(tǒng)闡述國科安芯推出的AS32系列MCU芯片中的CRC計算單元的基本功能、實現(xiàn)方式及其典型應(yīng)用場景。

一、CRC計算單元的基本****功能
CRC的核心是一種基于多項式運算的 錯誤檢測算法 ,其基本原理為:將待校驗數(shù)據(jù)序列視為二進(jìn)制多項式D(x),選取一個預(yù)先定義的生成多項式G(x)(通常由協(xié)議標(biāo)準(zhǔn)規(guī)定),通過模2除法運算計算D(x)×x^k與G(x)的余數(shù)R(x),該余數(shù)即為CRC校驗碼(k為生成多項式的最高次冪)。數(shù)據(jù)發(fā)送端將原始數(shù)據(jù)與CRC校驗碼一同傳輸,接收端采用相同的生成多項式對接收數(shù)據(jù)進(jìn)行運算,若運算結(jié)果與接收的CRC校驗碼一致,則判定數(shù)據(jù)傳輸無誤;若不一致,則表明數(shù)據(jù)存在干擾或篡改,需啟動重傳或錯誤處理機(jī)制。
AS32系列MCU芯片的CRC計算模塊是保障數(shù)據(jù)完整性的核心外設(shè),其設(shè)計遵循主流MCU 的CRC 架構(gòu),典型功能包括:
①支持CRC-7/CRC-8/CRC-16/CRC-32 多種標(biāo)準(zhǔn)校驗?zāi)J剑?/p>
②可編程生成多項式(如CRC-32 支持0x04C11DB7 標(biāo)準(zhǔn)多項式,CRC-16 支持 0x8005/0x3D65等);
③支持輸入/ 輸出數(shù)據(jù)反轉(zhuǎn)(RefIn/RefOut)、異或值(XOROut)配置;
④輸入緩沖器可避免計算期間發(fā)生總線阻塞;

在MCU應(yīng)用場景中,常用的CRC校驗規(guī)格包括 CRC8(8位校驗碼)、CRC16(16位校驗碼)及CRC32(32位校驗碼) 。校驗碼位數(shù)與錯誤檢測能力正相關(guān)——位數(shù)越多,對隨機(jī)錯誤和突發(fā)錯誤的檢測率越高,但相應(yīng)的硬件資源占用開銷也隨之增加。
二、AS32系列MCU芯片****中CRC校驗的實現(xiàn)方式
1. 內(nèi)置的“校驗加速器”
這是一個獨立的數(shù)字邏輯電路,專門負(fù)責(zé)CRC運算,不需要CPU干預(yù)。開發(fā)者只需通過寄存器配置多項式、初始值等參數(shù),再把數(shù)據(jù)地址傳給模塊,硬件就會自動計算并輸出結(jié)果。
優(yōu)點 :速度極快(4 個 APB 時鐘周期完成32位CRC計算)、輸入緩沖器中可立即寫入第二個數(shù)據(jù),無需因之前的CRC 計算而等待任何等待狀態(tài);
缺點 :依賴MCU硬件,參數(shù)配置需嚴(yán)格遵循芯片手冊。
適合場景:高速通信(CAN、USB、以太網(wǎng))、大數(shù)據(jù)存儲(Flash、SD卡)、實時控制系統(tǒng)(工業(yè)電機(jī)、汽車電子)等對性能要求高的場景。
2.CRC****單元的使用方法
2.1 軟件配置
關(guān)鍵術(shù)語說明:
CRC_Size:指參與 CRC 計算的數(shù)據(jù)長度,單位通常為字節(jié)(需根據(jù)實際硬件配置確認(rèn));CRC_OXOR: 用于對最終 CRC 結(jié)果進(jìn)行異或操作;OReverse(Output Reverse):輸出數(shù)據(jù)反轉(zhuǎn)(如將 32 位結(jié)果的 bit31 與 bit0 交換);IReverse(Input Reverse):輸入數(shù)據(jù)反轉(zhuǎn)(包括位反轉(zhuǎn)、半字反轉(zhuǎn)、全字反轉(zhuǎn));POLYSIZE:多項式寬度類型,常見值(CRC-7/CRC-8/CRC-16/CRC-32);CRC_INIT:CRC 計算的初始值;CRC_Poly:CRC 多項式系數(shù);CRC_XOR:異或值。
/* Initializes the CRC */
void CRC_Config(uint32_t SIZE,uint32_t OXOR_State,uint32_t OREVERSE_State,uint32_t IReverse_State,uint32_t PolySize, uint32_t INIT,uint32_t Poly,uint32_t XOR)**
{
CRC_Reset();
CRC_StructInit(&CRC_InitStructure);
CRC_InitStructure.CRC_Size = SIZE;
CRC_InitStructure.CRC_OXOR = OXOR_State;
CRC_InitStructure.CRC_OReverse = OREVERSE_State;
CRC_InitStructure.CRC_IReverse = IReverse_State;
CRC_InitStructure.CRC_PolySize = PolySize;
CRC_InitStructure.CRC_INIT = INIT;
CRC_InitStructure.CRC_Poly = Poly;
CRC_InitStructure.CRC_XOR = XOR;
CRC_Init(&CRC_InitStructure);
}
2.2功能調(diào)用
針對于不同數(shù)據(jù)寬度的數(shù)據(jù)塊,可選擇對應(yīng)的函數(shù)進(jìn)行CRC計算。
/*
* Function: CRC_CalcCRC
* Description: Computes the 32-bit CRC of a given data word.
* Param: Data: data word to compute its CRC.
* Return: 32-bit CRC.
*/
uint32_t CRC_CalcCRC(uint32_t Data)
{
/* Write the data to the CRC Data register */
CRC- >DR = Data;
/* Return the CRC value */
****return**** CRC- >DR;
}
/*
* Function: CRC_CalcWordBlockCRC
* Description: Computes the 32-bit CRC of a given buffer of data word(32-bit).
* Param: pBuffer: pointer to the buffer containing the data to be computed.
* BufferLength: length of the buffer to be computed.
* Return: 32-bit CRC.
*/
uint32_t CRC_CalcWordBlockCRC(uint32_t *pBuffer, uint32_t BufferLength)
{
uint32_t index = 0;
****for**** (index = 0; index < BufferLength; index++)
{
CRC- >DR = pBuffer[index];
}
****return**** (CRC- >DR);
}
/*
* Function: CRC_CalcHalfBlockCRC
* Description: Computes the 16-bit CRC of a given buffer of data halfword(16-bit).
* Param: pBuffer: pointer to the buffer containing the data to be computed.
* BufferLength: length of the buffer to be computed.
* Return: 32-bit CRC.
*/
uint32_t CRC_CalcHalfBlockCRC(uint16_t *pBuffer, uint32_t BufferLength)
{
uint32_t index = 0;
****for**** (index = 0; index < BufferLength; index++)
{
CRC- >DR = pBuffer[index];
}
****return**** (CRC- >DR);
}
/*
* Function: CRC_CalcByteBlockCRC
* Description: Computes the 8-bit CRC of a given buffer of data byte(8-bit).
* Param: pBuffer: pointer to the buffer containing the data to be computed.
* BufferLength: length of the buffer to be computed.
* Return: 32-bit CRC.
*/
uint32_t CRC_CalcByteBlockCRC(uint8_t *pBuffer, uint32_t BufferLength)
{
uint32_t index = 0;
****for**** (index = 0; index < BufferLength; index++)
{
CRC- >DR = pBuffer[index];
}
****return**** (CRC- >DR);
}
三、MCU****中CRC的4個典型應(yīng)用場景
從日常家電到工業(yè)設(shè)備,CRC的身影無處不在:
? 傳感器數(shù)據(jù)校驗 :溫濕度傳感器通過單總線發(fā)送數(shù)據(jù)時,末尾會帶1字節(jié)CRC8校驗碼,用硬件CRC快速驗證,避免因電磁干擾導(dǎo)致“25℃”變成“85℃”的誤判問題;
? 工業(yè)通信協(xié)議 :MODBUS-RTU協(xié)議規(guī)定,每個指令幀末尾必須附加2字節(jié)CRC16校驗碼,通過硬件CRC實時驗證,確保控制指令準(zhǔn)確傳遞到變頻器、伺服電機(jī);
? Flash存儲校驗 :用戶配置數(shù)據(jù)(如家電的亮度、音量參數(shù))存在Flash時,會同時存儲數(shù)據(jù)的CRC值;讀取時用硬件CRC校驗,防止Flash擦寫次數(shù)過多導(dǎo)致數(shù)據(jù)出錯;
? 汽車電子控制 :汽車行業(yè)在與氣囊、ABS系統(tǒng)通信時,需要用CRC32校驗關(guān)鍵數(shù)據(jù),一旦檢測到錯誤立即觸發(fā)安全機(jī)制,避免事故風(fēng)險。
四、開發(fā)中用CRC的3個“避坑指南”
用好CRC的關(guān)鍵是“細(xì)節(jié)”,這3個問題一定要注意:
- 參數(shù)必須“對齊” :發(fā)送方和接收方的CRC參數(shù)(多項式、初始值、輸入/輸出反轉(zhuǎn)、最終異或值)必須完全一致。比如MODBUS-RTU用CRC16/IBM(多項式0x8005,初始值0xFFFF),若一方用錯多項式,校驗必失敗;
- 字節(jié)序別搞反 :多字節(jié)數(shù)據(jù)(如uint32_t)計算CRC前,要統(tǒng)一字節(jié)序。AS32系列MCU芯片是小端機(jī),把0x12345678存到內(nèi)存是0x78 0x56 0x34 0x12,確保不同設(shè)備間結(jié)果一致;
- 硬件配置看手冊 :不同MCU的硬件CRC模塊寄存器略有差異——開發(fā)前一定要查芯片手冊,避免配置錯誤。
字節(jié)序檢測方法 :多字節(jié)數(shù)據(jù)CRC計算前需明確MCU字節(jié)序,可通過C語言共用體(union)檢測——利用共用體成員共享內(nèi)存的特性,定義包含多字節(jié)整數(shù)(如uint32_t)和單字節(jié)數(shù)組(uint8_t[4])的共用體,賦值多字節(jié)整數(shù)(如0x12345678)后讀取單字節(jié)數(shù)組首元素:若為0x78則為小端(低字節(jié)存低地址),若為0x12則為大端(高字節(jié)存低地址)。檢測代碼示例如下:
union
{
uint32_t value;
uint8_t bytes[4];
} endian_test;
endian_test.value = 0x12345678;
if (endian_test.bytes[0] == 0x78)
{
Printf("Little-Endian");
}
else if (endian_test.bytes[0] == 0x12)
{
Printf("Big-Endian");
}
在MCU系統(tǒng)中,CRC不像其他外設(shè)那樣“顯眼”,卻是保障數(shù)據(jù)可靠性的“基礎(chǔ)安全網(wǎng)”。硬件CRC則為高性能、高安全需求“保駕護(hù)航”。理解CRC的原理、選型和應(yīng)用細(xì)節(jié),能讓你的MCU項目更穩(wěn)定、更可靠——畢竟,對電子設(shè)備來說,“數(shù)據(jù)沒錯”是一切功能的前提。
審核編輯 黃宇
-
芯片
+關(guān)注
關(guān)注
463文章
53849瀏覽量
463041 -
mcu
+關(guān)注
關(guān)注
147文章
18779瀏覽量
392841
發(fā)布評論請先 登錄
如何在IAR Embedded Workbench中配置生成對應(yīng)代碼區(qū)域的CRC校驗碼
芯源的CRC硬件計算誰用過嗎?MCU的CRC你們喜歡用硬件的還是軟件的啊?
STM32芯片CRC計算模塊的算法
靈動微電子 | MM32SPIN2x 電機(jī)專用MCU功能特色——CRC計算單元
STM32系列MCU自帶CRC與標(biāo)準(zhǔn)CRC存在差別
ST MCU芯片中的UID簡析
如何將程序下載到芯昇科技MCU芯片中
CRC計算工具CRC校驗碼計算器應(yīng)用程序免費下載
如何擦除mcu芯片中的灰塵
RA MCU中的CRC模塊和使用方法
AS32系列MCU芯片中CRC計算模塊的應(yīng)用介紹
評論