STM32F10x 學(xué)習(xí)筆記3(CRC計算單元)
圖1CRC計算單元框圖
歸納起來有如下幾步操作:1. 開啟CRC單元的時鐘。RCC_AHBPeriphClockCmd(RCC_AHBPeriph_CRC, ENABLE)
2. 復(fù)位CRC模塊(設(shè)置CRC_CR=0x01),這個操作把CRC余數(shù)初始化為0xFFFFFFFF
3. 把要計算的數(shù)據(jù)按逐個地寫入CRC_DR寄存器
4. 寫完所有的數(shù)據(jù)字后,從CRC_DR寄存器讀出計算的結(jié)果
STM32F10x StdPeriph Driver 中提供了幾個函數(shù)。
CRC_ResetDR(void)
用來復(fù)位CRC模塊。
uint32_t CRC_CalcCRC(uint32_t Data)
將一個數(shù)據(jù)寫入CRC_DR寄存器,返回值為計算結(jié)果。
uint32_t CRC_CalcBlockCRC(uint32_t pBuffer[], uint32_t BufferLength)
計算一個數(shù)組的CRC 值。
uint32_t CRC_GetCRC(void)
讀取CRC_DR寄存器的結(jié)果。
另外,CRC 模塊中還有個獨立數(shù)據(jù)寄存器(CRC_IDR)。這是個單字節(jié)的寄存器,用于臨時存放1字節(jié)的數(shù)據(jù),不受復(fù)位操作影響。相應(yīng)的操作函數(shù)有兩個。
void CRC_SetIDRegister(uint8_t IDValue)
uint8_t CRC_GetIDRegister(void)
分別是寫CRC_IDR和讀 CRC_IDR 寄存器。
雖然STM32F 上的CRC 單元用起來很簡單,但是似乎它計算出來的結(jié)果與傳統(tǒng)的CRC32算法得到的結(jié)果有些不同。
下面是個簡單的例子。
- #include"stm32f10x.h"
- intmain(void)
- {
- uint32_tj;
- uint32_tstr[11]={1,2,3,4,5,6,7,8,9,};
- SystemInit();
- RCC_AHBPeriphClockCmd(RCC_AHBPeriph_CRC,ENABLE);
- CRC_ResetDR();
- str[9]=CRC_CalcBlockCRC(str,1);
- CRC_ResetDR();
- CRC_CalcCRC(0xA5A5A5A5);
- j=CRC_GetCRC();
- CRC_CalcCRC(j);
- for(;;)
- {
- }
- }
評論