STM32F10x 学习笔记3(CRC计算单元)
时间:11-20
来源:互联网
点击:
STM32F系列的单片机内部带了CRC32计算单元。这个内置CRC模块的方法使用非常简单。其操作如下图所示。
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算法得到的结果有些不同。
下面是个简单的例子。
图1CRC计算单元框图
归纳起来有如下几步操作: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"
- 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(;;)
- {
- }
- }
STM32F10xCRC计算单 相关文章:
- STM32F10x 学习笔记4(CRC计算单元 续)(11-20)
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)