STM32系列芯片都內置DMA外設,其中很多系列的DMA配備了FIFO。這里以STM32F429芯片及開發板為例,演示一下帶FIFO的DMA傳輸實現過程。
大致情況是這樣的,我用TIMER1通道1的比較事件觸發DMA,將內存數據寫進UART5的數據發送寄存器DR,并將UART5的TX/RX腳物理短接,同時開啟UART5的DMA接收模式,即DMA將UART5接收到的數據寫到指定的接收內存區。下面重點介紹UART5的DMA方式的接收過程。
首先使用STM32CubeMx完成基本配置。
下面是關于TIM1的相關配置,使用通道1的比較事件觸發DMA,將內存數據寫入UART的發送數據寄存器。為什么還要搞個定時器來觸發,其中一個原因是為了后面好演示結果。
下面是關于UART5的基本配置,并開啟其接收的DMA傳輸。此時配置還沒有使用FIFO.
添加用戶代碼。代碼基于STM32Cube庫而準備,這里發送端發送17個字節數據出來。
我們不妨先看看基于上面不使用FIFO的配置,即使用DMA 直接傳輸時的運行結果。
在演示基于FIFO的DMA應用結果之前,不妨簡單介紹下FIFO的結構以及DMA傳輸過程中使用它有什么好處。
對于STM32F4來講,每個DMA stream都有4個字的FIFO可用。它用來暫存來自DMA源端的數據,每當FIFO里存放的數據達到設定的閾值后,數據就會被移走。閾值可以設置為從1個字到4個字的深度。
啟用DMA的FIFO可以最大程度地避免數據傳輸過程中的溢出問題,可以減少DMA對內存的訪問次數從而減少總線訪問競爭,通過BURST分組傳輸優化傳輸帶寬以提升芯片性能。利用FIFO,通過對源端/目標端的數據進行打包或拆包以適應不同數據寬度的訪問需求.讓DMA的使用更為方便靈活.
這里以UART5的數據接收為例。當啟用FIFO時,目的端數據寬度可以從字節/半字/字格式自由設置。首先,當UART5的DMA接收配置成下面這樣時,即DMA single模式。
FIFO閾值設置為1/4滿,即1個字的深度。運行上面代碼,我們可看到來自源端的4個Byte被封裝成1個word字。數據會按字方式逐一寫入內存。【為看效果,我將定時器的觸發放慢后做多次截圖】
不過,按照上面方式將4個字節封裝成一個字的傳輸過程中如果發生被打斷的情況,此時就會遇到數據損壞的風險。因此就引入了DMA BURST傳輸,或稱DMA節拍傳輸。即幾個數據【4/8/16】被封裝成1組,或稱1個burst,或稱1節。在一節內逐個進行數據傳輸,每個數據的傳輸相當于1拍。儼如音樂里的節拍,4拍1節、8拍1節之類的。對于每1節內的數據傳輸,DMA對總線的占用不會被總線矩陣仲裁器解除或打斷,以保證每節數據的可靠完成。
我們還是以上面的應用為例,調整配置并開啟BURST模式后具體看看。
我對memory端,也就是這里的目的端啟用了BURST節拍傳輸。因為FIFO深度為1個字,每次源端數據剛好達到FIFO閾值水平時,通過1節4拍即可傳輸完畢,每拍對應1個byte的傳輸?;贐USRT模式配置可以實現跟上面Single模式下同樣的效果,而且數據傳輸更有保障。通過下圖可以看出DMA按節進行傳輸,每節傳輸4個數據。
針對上述應用,我們還可以再次調整burst配置,比如下面的樣子:
此時FIFO閾值為2個字,源端Memory的數據訪問寬度為半字,Burst大小為4。這樣的話,源端數據達到FIFO閾值時,4個半字數據組成1節分四拍傳輸完成,其中每拍傳輸半字數據。我們同樣看看慢動作后的結果。
順便提醒下,我們在做基于FIFO的burst模式的DMA傳輸時,BURST的大小乘以數據大小不得超過設置的FIFO閾值大小,否則會出錯。比方以剛才上面的配置來看。
FIFO閾值為2個字,即8字節。數據寬度為半字,即2字節,Burst大小為4。完全合規。
-
fifo
+關注
關注
3文章
389瀏覽量
43865 -
dma
+關注
關注
3文章
566瀏覽量
100967 -
STM32F429
+關注
關注
0文章
40瀏覽量
10793
原文標題:STM32帶FIFO的DMA傳輸應用示例
文章出處:【微信號:stmcu832,微信公眾號:茶話MCU】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
STM32F429的USART應用之八個串口FIFO實現
STM32F429的GPIO應用之按鍵FIFO
"【STM32F429開發板用戶手冊】第36章 STM32F429的FMC總線應用之DMA雙緩沖驅動AD7606(8通道同步采樣, 16bit, 正負
!["【<b class='flag-5'>STM32F429</b>開發板用戶手冊】第36章 <b class='flag-5'>STM32F429</b>的FMC總線應用之<b class='flag-5'>DMA</b>雙緩沖驅動AD7606(8通道同步采樣, 16bit, 正負](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
【STM32F429開發板用戶手冊】第13章 STM32F429啟動過程詳解
![【<b class='flag-5'>STM32F429</b>開發板用戶手冊】第13章 <b class='flag-5'>STM32F429</b>啟動<b class='flag-5'>過程</b>詳解](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
【STM32F429開發板用戶手冊】第21章 STM32F429的NVIC中斷分組和配置(重要)
![【<b class='flag-5'>STM32F429</b>開發板用戶手冊】第21章 <b class='flag-5'>STM32F429</b>的NVIC中斷分組和配置(重要)](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
【STM32F429開發板用戶手冊】第1章 初學STM32F429的準備工作
![【<b class='flag-5'>STM32F429</b>開發板用戶手冊】第1章 初學<b class='flag-5'>STM32F429</b>的準備工作](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
【STM32F429開發板用戶手冊】第8章 STM32F429的終極調試組件Event Recorder
![【<b class='flag-5'>STM32F429</b>開發板用戶手冊】第8章 <b class='flag-5'>STM32F429</b>的終極調試組件Event Recorder](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
【STM32F429開發板用戶手冊】第19章 STM32F429的GPIO應用之按鍵FIFO
![【<b class='flag-5'>STM32F429</b>開發板用戶手冊】第19章 <b class='flag-5'>STM32F429</b>的GPIO應用之按鍵<b class='flag-5'>FIFO</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
【STM32F429開發板用戶手冊】第14章 STM32F429的電源,復位和時鐘系統
![【<b class='flag-5'>STM32F429</b>開發板用戶手冊】第14章 <b class='flag-5'>STM32F429</b>的電源,復位和時鐘系統](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
【STM32F429開發板用戶手冊】第24章 STM32F429的USART應用之八個串口FIFO實現
![【<b class='flag-5'>STM32F429</b>開發板用戶手冊】第24章 <b class='flag-5'>STM32F429</b>的USART應用之八個串口<b class='flag-5'>FIFO</b><b class='flag-5'>實現</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
調試 STM32F429 + USB3300
![調試 <b class='flag-5'>STM32F429</b> + USB3300](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
評論