STM32F 系列的单片机内部带了CRC32 计算单元。这个内置CRC模块的方法使用非常简单。其操作如下图所示。
图 1 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算法得到的结果有些不同。
下面是个简单的例子。
- #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(;;)
- {
- }
- }
-
关键字:STM32F10x CRC 计算单元
引用地址:
STM32F10x 学习笔记3(CRC计算单元)
推荐阅读最新更新时间:2024-03-16 14:52
STM32F10x处理器在应用中编程的实现方法
引 言 Cortex-M3是首款基于ARMv7-M体系结构的32位标准处理器,RISC结构,包含高效灵活的Thumb-2指令集,拥有杰出的低功耗特性,为微控制器系统、汽车车身控制系统、工业控制系统和无线网络等嵌入式应用量身设计。ST公司推出基于Cortex-M3内核的STM32系列处理器,凭借其出众的性能、创新的外设、优越的功耗控制,得到众多工程师的青睐。 针对嵌入式应用的特点,STM32处理器提供功能强大的硬件调试接口——JTAG接口和串行接口,极大方便了设计,缩短了产品的开发周期。不仅如此,STM32处理器内嵌的闪存存储器允许在电路编程(In-Circuit Pro-gramming,ICP)和在应用中编程(In-Ap
[单片机]
自学STM32F10x单片机需要注意的地方
由于之前一直使用PIC和51的芯片,从没接触过STM32系列的芯片,近期着手学习STM32F10x的芯片,通过学习后发现STM32的中断系统比较特殊(与PIC和51相比较........),有着不同的响应方式,看了几遍相关的手册和视频资料,还是有些稀里糊涂,通过实际写代码配置芯片后,逐渐有点眉目了,因此想记录下来,算是总结笔记。当然文章中有存在描述错误和不足的地方,还请大家指正。(可能有些地方理解的方式存在问题,望指教。) STM32采用了ARM Cortex_M3内核,而Cortex_M3内核具有256个中断源,其中内核自己的有16个中断源和外部设备的(最多)240个中断源,每个中断源都具有自己独立的中断优先级控制寄存器,该
[单片机]
40位以内任意长度的CRC计算及校验的实现
1 引言
循环冗余校验码,简称CRC码,是常用的检测错误码,它在数据通信中得到了非常广泛的应用。不同CRC码的生成多项式各不相同,CRC码的比特数也不同,且在有的通信协议中要求将余数寄存器先初始化为全0,另外的则须初始化为全1。因此,在程序设计时必须充分利用CRC码的共性及所用DSP的指令特点。
2 用TMS320C5000实现不同CRC计算的设计思想
CRC码的计算及校验都用到模2的多项式除法,而多项式除法可以采用带反馈的移位寄存器来实现,因此,用DSP来实现CRC计算的关键是通过DSP来模拟一个移位寄存器(也就是模拟手写多项式除法)。考虑到TMS320C5000系列DSP的累加器A和B均为40位,
[网络通信]
单片机CRC源码
1 /****************************************************************************************** 2 * 函数功能:CRC校验用函数 3 * 函数输入:puchMsgg是要进行CRC校验的消息,usDataLen是消息中字节数 4 * 函数输出:计算出来的CRC校验码。 5 ****************************************************************8*************************/ 6 uint16_t CRC16(uint8_t *puchMsgg,uint
[单片机]
STM32F10X软加密方法及实例代码
///////////tst//STM32F10X软加密方法及实例代码////////////////////////////// #define ID_ENCRYPT_EOR_RESULT_ADDRESS (0x0800F000) #define ID_ENCRYPT_ADD_RESULT_ADDRESS (0x0800F004) volatile uint32 gU32IdAdressVar;//这里一定要定义此变量,否则会被优化器优化掉 void Stm32F10xEncryptDemo(void) { uint32 *u32IdAddress; uint32 u32EorRslt, u3
[单片机]
STM32F10x 学习笔记7独立看门狗IWDG 模块
按照STM32参考手册的说法: 独立看门狗(IWDG)由专用的低速时钟(LSI)驱动,即使主时钟发生故障它也仍然有效。IWDG最适合应用于那些需要看门狗作为一个在主程序之外,能够完全独立工作,并且对时间精度要求较低的场合。WWDG最适合那些要求看门狗在精确计时窗口起作用的应用程序。 简单的说,STM32 中的IWDG 其核心就是一个12bits的向下递减的计数器,当计数器计数到零时就会触发系统复位。因此,要在每次计数到零之前将其复位到一个初始值。这个初始值就在重装载寄存器(IWDG_RLR)中存放,其默认值为0xFFF,我们也可以将其改为其他值。 计数器的时钟由LSI时钟经过分频后提供,预分频因子由预分频寄存器(IWDG
[单片机]
STM32F10X USART 中断接受+发送,测试无误
硬件平台:STM32F10X USART模块 + JLink+USB转TTL小板 软件平台:Keil 4 前一个程序只是作为下位机的MCU将数据发送给串口助手,也就是上位机,相当于单工通信,对于一个完整的通信来说只是完成了一半的功能。 这是一个完整的通信例程,作为下位机的单片机可以将数据发送给上位机,也可以检测上位机是否发了数据回来。中断方式检测,如果接收到数据,则将数据发送给上位机,相当于半双工模式。 其实与基础的51串口通信无实质区别,只是STM32相关寄存器配置稍微复杂些而已。相比于前一个发送程序,只是在中断检测和主函数里做了相应的修改而已,RCC模块、USART模块与GPIO模块配置基本没变。 二、发送程序例程 程序涉及
[单片机]
STM32CubeMX配置硬件CRC
实验目的: 通过STM32CubeMX进行简单配置生成HAL库实现硬件CRC32校验的功能。 一、STM32CubeMX配置如下: 二、生成的HAL库源码如下: 三、Debug结果如下: 对字符串 DA0000000000 进行CRC32计算结果如下: 四、在线工具CRC校验结果如下: 完美,收工!
[单片机]