【实用】STM32F10x 学习笔记3、4(CRC计算单元)

http://blog.csdn.net/liyuanbhu/article/details/8746044


归纳起来有如下几步操作:


1. 开启CRC单元的时钟。RCC_AHBPeriphClockCmd(RCC_AHBPeriph_CRC, ENABLE)
2. 复位CRC模块(设置CRC_CR=0x01),这个操作把CRC余数初始化为0xFFFFFFFF
3. 把要计算的数据按逐个地写入CRC_DR寄存器
4. 写完所有的数据字后,从CRC_DR寄存器读出计算的结果

STM32F10x StdPeriph Driver 中提供了几个函数。

CRC_ResetDR(void) 
用来复位CRC模块。

uint32_t CRC_CalcCRC(uint32_t Data)
将一个数据写入CRC_DR寄存器,返回值为计算结果。

uint32_t CRC_CalcBlockCRC(uint32_t pBuffer[], uint32_t BufferLength)
计算一个数组的CRC 值。

uint32_t CRC_GetCRC(void)
读取CRC_DR寄存器的结果。

另外,CRC 模块中还有个独立数据寄存器(CRC_IDR)。这是个单字节的寄存器,用于临时存放1字节的数据,不受复位操作影响。相应的操作函数有两个。

void CRC_SetIDRegister(uint8_t IDValue)
uint8_t CRC_GetIDRegister(void)
分别是写CRC_IDR和读 CRC_IDR 寄存器。

虽然STM32F 上的CRC 单元用起来很简单,但是似乎它计算出来的结果与传统的CRC32算法得到的结果有些不同。

下面是个简单的例子。

#include "stm32f10x.h"


int main(void)
{
uint32_t j;
uint32_t str[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(;;)
{
}
}

http://blog.csdn.net/liyuanbhu/article/details/7882789 循环冗余校验(CRC)算法入门引导

http://blog.csdn.net/liyuanbhu/article/details/8753136 STM32F10x 学习笔记4(CRC计算单元 续)








你可能感兴趣的:(CRC)