1、概述
STM32 的 CRC 外設(shè)是用來(lái)實(shí)現(xiàn) CRC 計(jì)算的硬件單元,硬件實(shí)現(xiàn) CRC 計(jì)算相對(duì)于軟件算法實(shí)現(xiàn)來(lái)說,可以大大提高運(yùn)算速度。CRC 計(jì)算單元具有單個(gè) 32 位讀/寫數(shù)據(jù)寄存器(CRC_DR)。它用于輸入新數(shù)據(jù)(寫訪問)并保存以前的 CRC 計(jì)算結(jié)果(讀訪問)。當(dāng) DMA用作數(shù)據(jù)傳輸處理器時(shí),可以極大地減輕 CPU 負(fù)荷。本文以 STM32G474 為例,介紹如何通過 DMA 配合 CRC 計(jì)算,以供讀者參考。
2、原理
2.1. 時(shí)間上的可能性
單次 DMA 傳輸包括兩個(gè) AHB 傳輸階段,通過 DMA AHB 總線 master 實(shí)現(xiàn):
- 通過內(nèi)部當(dāng)前外設(shè)/存儲(chǔ)器地址寄存器進(jìn)行尋址,從外設(shè)數(shù)據(jù)寄存器或存儲(chǔ)器單元中讀取單個(gè)數(shù)據(jù)(字節(jié)、半字或字)。
- 通過內(nèi)部當(dāng)前外設(shè)/存儲(chǔ)器地址寄存器進(jìn)行尋址,向外設(shè)數(shù)據(jù)寄存器或存儲(chǔ)器單元中寫入單個(gè)數(shù)據(jù)(字節(jié)、半字或字)。
在 AHB 總線上一次讀+寫就至少需要 4 個(gè) AHB 時(shí)鐘周期,這就已經(jīng)可以滿足 CRC 單次計(jì)算所需的時(shí)間。所以單次 DMA 數(shù)據(jù)傳輸之后即可進(jìn)行下次數(shù)據(jù)傳輸(背靠背傳輸),無(wú)需額外等待。
3、實(shí)現(xiàn)
這里以 NUCLEO-G474RE 為例進(jìn)行介紹,這里不對(duì)基本操作做過多介紹,只介紹與
DMA 和 CRC 相關(guān)的配置部分,詳細(xì)配置可參考附件。
3.1. 創(chuàng)建工程
- 使用 STM32CubeMX 選擇 STM32G474RET6 創(chuàng)建工程。然后選擇 CRC 外設(shè),點(diǎn)擊"Activated"選項(xiàng)。本例的"Input Data Format"參數(shù)配置為"Words",其他參數(shù)保持默認(rèn),這里大家在實(shí)際應(yīng)用中可以根據(jù)自己需求進(jìn)行配置,這里 CRC 外設(shè)已經(jīng)配置完畢。
- 找到 DMA 外設(shè)。點(diǎn)擊"Add"添加 DMA Request,并選擇"MemToMem"模式。配置保持默認(rèn)即可,Mode 設(shè)置為"Normal"。要注意"Dst Memory"不要勾選,因?yàn)镃RC_DR 寄存器的地址是固定的。這里的"Data Width"配置為 Byte、Half Word 或者Word 都可以,本示例中配置為 Word。
- 配置 DMA 中斷。在"NVIC"里面 Enable "DMA1 channel1 global interrupt",注意這里與你使用的 DMA 相關(guān),本例中使用的是 DMA1。
- 然后點(diǎn)擊"GENERATE CODE"即可生成代碼。
4、小結(jié)
本文對(duì)通過 DMA 配合 CRC 應(yīng)用從原理上進(jìn)行了可行性分析,并且介紹了如何實(shí)現(xiàn)這個(gè)過程,希望能對(duì)讀者有所幫助。