stm32採用的crc校驗模組使用的校驗演算法與主流crc32校驗演算法不同。
主流32位校驗演算法包括crc-32 和 crc-32/mpeg-2兩種,而stm32採用的校驗演算法與這兩種都不同,儘管形式上很像crc-32/mpeg-2,但stm32是32為逐位計算的,而主流演算法都是按位元組計算的。
stm32crc權值為0x4c11db7,初始值為0xffffffff,,輸入值和輸出值不需要反轉,輸出值不需要異或運算,形式和 crc-32/mpeg-2相同,但計算結果卻不同。
以下為官方文件中給出的crc計算單元的c語言描述:
dword dwpolynomial= 0x04c11db7;
dword cal_crc(dword *ptr, int len)
else
crc <<= 1;
if (data & xbit)
crc ^= dwpolynomial;
xbit >>= 1;}}
return cr;
}
以下為c#中crc-32/mpeg-2演算法:
private uint32 crc32_mpeg_2(uint data, int length)
}return crc;
}
此**和上述**中crc-32/mpeg-2計算結果一致。
以下是筆者根據stm32官方crc單元c語言**更改的c#**:
uint32 cal_crc(byte ptr)
else
if ((data & xbit) != 0)
xbit >>= 1;}}
return crc;
}
計算結果和stm32計算結果一致。
stm32f10x、fl1x、f2x、f4x系列crc模組使用起來比較簡單,只需呼叫官方庫中的函式:
//使能crc模組時鐘
rcc_ahbperiphclockcmd(rcc_ahbperiph_crc, enable);
//復位crc暫存器為初始值
crc_resetdr();
//計算data32位陣列crc校驗值
crc1 = crc_calcblockcrc(data, length);
//計算乙個32為數的crc校驗值
x=crc_calccrc(data);
而stm32f0x、f30x、f37x系列比較複雜,可以更改crc校驗多項式。
筆者根據c#crc演算法和stm32f103硬體crc單元組成上位機和下位機通訊,校驗結果相同。
STM32 CRC32與對應的軟體CRC32
簡單實現stm32 crc32使用 使用前記得使能stm32 crc時鐘 stm32硬體crc32 byte資料計算,將資料移到最高位,低位補上ff u32 stm32 crc32 byte u8 pbuff,u32 len return crc dr stm32硬體crc32 u32資料計算 u3...
stm32硬體除錯
stm32的基本系統主要涉及下面幾個部分 一 電源 1 無論是否使用模擬部分和ad部分,mcu外圍出去vcc和gnd,vdda vssa vref 如果 封裝有該引腳 都必需要連線,不可懸空 2 對於每組對應的vdd和gnd都應至少放置乙個104的陶瓷電容用於濾波,並接該 電容應放置盡量靠近mcu ...
STM32硬體除錯詳解
stm32的基本系統主要涉及下面幾個部分 一 電源 1 無論是否使用模擬部分和ad部分,mcu外圍出去vcc和gnd,vdda vssa vref 如果封裝有該引腳 都必需要連線,不可懸空 2 對於每組對應的vdd和gnd都應至少放置乙個104的陶瓷電容用於濾波,並接該電容應放置盡量靠近mcu 3 ...