博客專欄

EEPW首頁(yè) > 博客 > DMA 中的突發(fā)傳輸(Burst)是什么意思?

DMA 中的突發(fā)傳輸(Burst)是什么意思?

發(fā)布人:魚(yú)鷹談單片機(jī) 時(shí)間:2021-10-21 來(lái)源:工程師 發(fā)布文章

以下文章來(lái)源于茶話MCU ,作者M(jìn)iler

STM32系列芯片都內(nèi)置DMA外設(shè),其中很多系列的DMA配備了FIFO。這里以STM32F429芯片及開(kāi)發(fā)板為例,演示一下帶FIFO的DMA傳輸實(shí)現(xiàn)過(guò)程。

大致情況是這樣的,我用TIMER1通道1的比較事件觸發(fā)DMA,將內(nèi)存數(shù)據(jù)寫(xiě)進(jìn)UART5的數(shù)據(jù)發(fā)送寄存器DR,并將UART5的TX/RX腳物理短接,同時(shí)開(kāi)啟UART5的DMA接收模式,即DMA將UART5接收到的數(shù)據(jù)寫(xiě)到指定的接收內(nèi)存區(qū)。下面重點(diǎn)介紹UART5的DMA方式的接收過(guò)程。

首先使用STM32CubeMx完成基本配置。

下面是關(guān)于TIM1的相關(guān)配置,使用通道1的比較事件觸發(fā)DMA,將內(nèi)存數(shù)據(jù)寫(xiě)入U(xiǎn)ART的發(fā)送數(shù)據(jù)寄存器。為什么還要搞個(gè)定時(shí)器來(lái)觸發(fā),其中一個(gè)原因是為了后面好演示結(jié)果。

1.png

下面是關(guān)于UART5的基本配置,并開(kāi)啟其接收的DMA傳輸。此時(shí)配置還沒(méi)有使用FIFO.

2.png

添加用戶代碼。代碼基于STM32Cube庫(kù)而準(zhǔn)備,這里發(fā)送端發(fā)送17個(gè)字節(jié)數(shù)據(jù)出來(lái)。

3.png4.png

我們不妨先看看基于上面不使用FIFO的配置,即使用DMA 直接傳輸時(shí)的運(yùn)行結(jié)果。

5.png

在演示基于FIFO的DMA應(yīng)用結(jié)果之前,不妨簡(jiǎn)單介紹下FIFO的結(jié)構(gòu)以及DMA傳輸過(guò)程中使用它有什么好處。

對(duì)于STM32F4來(lái)講,每個(gè)DMA stream都有4個(gè)字的FIFO可用。它用來(lái)暫存來(lái)自DMA源端的數(shù)據(jù),每當(dāng)FIFO里存放的數(shù)據(jù)達(dá)到設(shè)定的閾值后,數(shù)據(jù)就會(huì)被移走。閾值可以設(shè)置為從1個(gè)字到4個(gè)字的深度。

6.png

啟用DMA的FIFO可以最大程度地避免數(shù)據(jù)傳輸過(guò)程中的溢出問(wèn)題,可以減少DMA對(duì)內(nèi)存的訪問(wèn)次數(shù)從而減少總線訪問(wèn)競(jìng)爭(zhēng),通過(guò)BURST分組傳輸優(yōu)化傳輸帶寬以提升芯片性能。利用FIFO,通過(guò)對(duì)源端/目標(biāo)端的數(shù)據(jù)進(jìn)行打包或拆包以適應(yīng)不同數(shù)據(jù)寬度的訪問(wèn)需求.讓DMA的使用更為方便靈活.

這里以UART5的數(shù)據(jù)接收為例。當(dāng)啟用FIFO時(shí),目的端數(shù)據(jù)寬度可以從字節(jié)/半字/字格式自由設(shè)置。首先,當(dāng)UART5的DMA接收配置成下面這樣時(shí),即DMA single模式。

7.png

FIFO閾值設(shè)置為1/4滿,即1個(gè)字的深度。運(yùn)行上面代碼,我們可看到來(lái)自源端的4個(gè)Byte被封裝成1個(gè)word字。數(shù)據(jù)會(huì)按字方式逐一寫(xiě)入內(nèi)存。【為看效果,我將定時(shí)器的觸發(fā)放慢后做多次截圖】

8.png

不過(guò),按照上面方式將4個(gè)字節(jié)封裝成一個(gè)字的傳輸過(guò)程中如果發(fā)生被打斷的情況,此時(shí)就會(huì)遇到數(shù)據(jù)損壞的風(fēng)險(xiǎn)。因此就引入了DMA BURST傳輸,或稱DMA節(jié)拍傳輸。即幾個(gè)數(shù)據(jù)【4/8/16】被封裝成1組,或稱1個(gè)burst,或稱1節(jié)。在一節(jié)內(nèi)逐個(gè)進(jìn)行數(shù)據(jù)傳輸,每個(gè)數(shù)據(jù)的傳輸相當(dāng)于1拍。儼如音樂(lè)里的節(jié)拍,4拍1節(jié)、8拍1節(jié)之類的。對(duì)于每1節(jié)內(nèi)的數(shù)據(jù)傳輸,DMA對(duì)總線的占用不會(huì)被總線矩陣仲裁器解除或打斷,以保證每節(jié)數(shù)據(jù)的可靠完成。

我們還是以上面的應(yīng)用為例,調(diào)整配置并開(kāi)啟BURST模式后具體看看。

9.png

我對(duì)memory端,也就是這里的目的端啟用了BURST節(jié)拍傳輸。因?yàn)镕IFO深度為1個(gè)字,每次源端數(shù)據(jù)剛好達(dá)到FIFO閾值水平時(shí),通過(guò)1節(jié)4拍即可傳輸完畢,每拍對(duì)應(yīng)1個(gè)byte的傳輸?;贐USRT模式配置可以實(shí)現(xiàn)跟上面Single模式下同樣的效果,而且數(shù)據(jù)傳輸更有保障。通過(guò)下圖可以看出DMA按節(jié)進(jìn)行傳輸,每節(jié)傳輸4個(gè)數(shù)據(jù)。

10.png

針對(duì)上述應(yīng)用,我們還可以再次調(diào)整burst配置,比如下面的樣子:

11.png

此時(shí)FIFO閾值為2個(gè)字,源端Memory的數(shù)據(jù)訪問(wèn)寬度為半字,Burst大小為4。這樣的話,源端數(shù)據(jù)達(dá)到FIFO閾值時(shí),4個(gè)半字?jǐn)?shù)據(jù)組成1節(jié)分四拍傳輸完成,其中每拍傳輸半字?jǐn)?shù)據(jù)。我們同樣看看慢動(dòng)作后的結(jié)果。

12.png

順便提醒下,我們?cè)谧龌贔IFO的burst模式的DMA傳輸時(shí),BURST的大小乘以數(shù)據(jù)大小不得超過(guò)設(shè)置的FIFO閾值大小,否則會(huì)出錯(cuò)。比方以剛才上面的配置來(lái)看。

13.png

FIFO閾值為2個(gè)字,即8字節(jié)。數(shù)據(jù)寬度為半字,即2字節(jié),Burst大小為4。完全合規(guī)。

本文主要基于帶FIFO的DMA傳輸?shù)膶?shí)現(xiàn)做了簡(jiǎn)單而比較直觀的演示,順便對(duì)DMA的burst傳輸做了些簡(jiǎn)單介紹,更多細(xì)節(jié)需閱讀STM32參考手冊(cè)相關(guān)內(nèi)容。相信具體的實(shí)現(xiàn)示例配合技術(shù)手冊(cè)閱讀理解后再運(yùn)用起來(lái)會(huì)更加得心應(yīng)手。

*博客內(nèi)容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀點(diǎn),如有侵權(quán)請(qǐng)聯(lián)系工作人員刪除。



關(guān)鍵詞: 單片機(jī)

相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉