1、概述
STM32 的 CRC 外设是用来实现 CRC 计算的硬件单元,硬件实现 CRC 计算相对于软件算法实现来说,可以大大提高运算速度。CRC 计算单元具有单个 32 位读/写数据寄存器(CRC_DR)。它用于输入新数据(写访问)并保存以前的 CRC 计算结果(读访问)。当 DMA用作数据传输处理器时,可以极大地减轻 CPU 负荷。本文以 STM32G474 为例,介绍如何通过 DMA 配合 CRC 计算,以供读者参考。
2、原理
2.1. 时间上的可能性
单次 DMA 传输包括两个 AHB 传输阶段,通过 DMA AHB 总线 master 实现:
- 通过内部当前外设/存储器地址寄存器进行寻址,向外设数据寄存器或存储器单元中写入单个数据(字节、半字或字)。
在 AHB 总线上一次读+写就至少需要 4 个 AHB 时钟周期,这就已经可以满足 CRC 单次计算所需的时间。所以单次 DMA 数据传输之后即可进行下次数据传输(背靠背传输),无需额外等待。
3、实现
这里以 NUCLEO-G474RE 为例进行介绍,这里不对基本操作做过多介绍,只介绍与
DMA 和 CRC 相关的配置部分,详细配置可参考附件。
3.1. 创建工程
- 使用 STM32CubeMX 选择 STM32G474RET6 创建工程。然后选择 CRC 外设,点击"Activated"选项。本例的"Input Data Format"参数配置为"Words",其他参数保持默认,这里大家在实际应用中可以根据自己需求进行配置,这里 CRC 外设已经配置完毕。
- 找到 DMA 外设。点击"Add"添加 DMA Request,并选择"MemToMem"模式。配置保持默认即可,Mode 设置为"Normal"。要注意"Dst Memory"不要勾选,因为CRC_DR 寄存器的地址是固定的。这里的"Data Width"配置为 Byte、Half Word 或者Word 都可以,本示例中配置为 Word。
- 配置 DMA 中断。在"NVIC"里面 Enable "DMA1 channel1 global interrupt",注意这里与你使用的 DMA 相关,本例中使用的是 DMA1。
- 然后点击"GENERATE CODE"即可生成代码。
4、小结
本文对通过 DMA 配合 CRC 应用从原理上进行了可行性分析,并且介绍了如何实现这个过程,希望能对读者有所帮助。
阅读全文