簡介
基於STM32F105介紹STM32的硬件CRC和使用方法,並記錄軟件檢驗實現。
STM32的CRC介紹
手冊中說明STM32的CRC硬件校驗使用的是32位CRC校驗,多項式為0x04C11DB7;CRC計算時一次性運算32bits,不是按照字節運算;CRC_DR寄存器的復位值為0xFFFFFFFF,即CRC計算的初始值。
STM32的CRC使用
- STM32的CRC_DR寄存器既作為輸入寄存器又作為輸出寄存器
- 作為輸入寄存器時直接寫入要進行CRC計算的數據
- 作為輸出寄存器時,通過讀操作返回上次CRC計算結果
- 每一次寫入數據寄存器的計算結果是前一次計算結果和新計算結果的組合;在新的數據塊進行CRC計算之前,需要復位CRC_DR寄存器
以STM32F105的標准庫為例,介紹CRC計算的步驟
uint32_t buff[4] = {0x01,0x02,0x03,0x04};
CRC_ResetDR();
CRC_CalcBlockCRC(buff,4);
delay(5);
ret = CRC_GetCRC();
STM32的CRC軟件實現
STM32硬件CRC計算出來的結果與常用的CRC32計算出的CRC值不一樣,如果通信中用到了STM32的硬件CRC計算值,需要外部實現與硬件CRC一致的計算結果,詳細代碼如下,提供參考鏈接
uint32_t crc32_st(uint32_t *pbuf, uint32_t size)
{
const uint32_t st_const_value = 0x04c11db7;
uint32_t crc_value = 0xffffffff;
uint32_t xbit;
uint32_t bits;
uint32_t i;
for (i = 0; i < size; i++)
{
xbit = 0x80000000;
for (bits = 0; bits < 32; bits++)
{
if (crc_value & 0x80000000)
{
crc_value <<= 1;
crc_value ^= st_const_value;
}
else
{
crc_value <<= 1;
}
if (pbuf[i] & xbit)
{
crc_value ^= st_const_value;
}
xbit >>= 1;
}
}
return crc_value;
}
總結
其它平台與STM32通信時,如果用到CRC值,可以通過這種軟件計算與STM32的CRC保持一致。