博客專欄

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

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

        發(fā)布人:魚鷹談單片機 時間:2021-10-21 來源:工程師 發(fā)布文章

        以下文章來源于茶話MCU ,作者Miler

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

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

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

        下面是關于TIM1的相關配置,使用通道1的比較事件觸發(fā)DMA,將內存數(shù)據(jù)寫入UART的發(fā)送數(shù)據(jù)寄存器。為什么還要搞個定時器來觸發(fā),其中一個原因是為了后面好演示結果。

        1.png

        下面是關于UART5的基本配置,并開啟其接收的DMA傳輸。此時配置還沒有使用FIFO.

        2.png

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

        3.png4.png

        我們不妨先看看基于上面不使用FIFO的配置,即使用DMA 直接傳輸時的運行結果。

        5.png

        在演示基于FIFO的DMA應用結果之前,不妨簡單介紹下FIFO的結構以及DMA傳輸過程中使用它有什么好處。

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

        6.png

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

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

        7.png

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

        8.png

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

        我們還是以上面的應用為例,調整配置并開啟BURST模式后具體看看。

        9.png

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

        10.png

        針對上述應用,我們還可以再次調整burst配置,比如下面的樣子:

        11.png

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

        12.png

        順便提醒下,我們在做基于FIFO的burst模式的DMA傳輸時,BURST的大小乘以數(shù)據(jù)大小不得超過設置的FIFO閾值大小,否則會出錯。比方以剛才上面的配置來看。

        13.png

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

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

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



        關鍵詞: 單片機

        相關推薦

        技術專區(qū)

        關閉
        主站蜘蛛池模板: 民乐县| 岳阳县| 九江市| 邵阳县| 景东| 灯塔市| 林周县| 新昌县| 佛学| 阳高县| 上蔡县| 瑞金市| 印江| 合水县| 桃园县| 漾濞| 陇川县| 新邵县| 华安县| 丽水市| 塘沽区| 贵州省| 舞钢市| 宁国市| 文化| 金昌市| 泉州市| 涞源县| 象州县| 林甸县| 平远县| 阜新市| 保康县| 永宁县| 兴城市| 汝州市| 弋阳县| 阳朔县| 荣昌县| 乐山市| 灵武市|