STM32的硬件CRC


簡介

基於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保持一致。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM