DMA是MCU一個非常重要的部分,它提供了一種直接、高效、快速的方式來傳輸數據,而不需要CPU的介入,大大提高了MCU的工作效率。
我們先來看一下沒有DMA,數據是怎么流動的。
如圖所示,紅色線表示外設數據的讀寫,藍色線表示內存數據的讀寫。數據必須要先加載到內核,然后再通過內核寫入外設或內存,讀寫操作都需要內核做很多工作,雖然C代碼可能就一行語句,但是匯編可不止一條。我們知道在程序執行的過程中這樣的數據傳輸操作非常頻繁,如果都這樣處理,內核將花費太多時間在搬運數據上,無法集中精力處理更為重要的計算和中斷事件,處理速度和效率就會非常的低。
使用DMA后,數據的流動變成了下圖所示方式。
數據的傳輸工作由DMA控制器接管,假如我們配置由外設到內存,那么外設的數據一旦準備好,DMA就會自動將數據搬運到內存,內核只需要直接讀取內存就可以獲取到最新的外設數據。反過來也是同樣的道理。整個傳輸過程不需要內核的參與,如果數據量很大,DMA的優勢會非常明顯。
內核有點像一個工廠,SRAM類似倉庫,DMA就是物流。如果沒有“物流”,這個“工廠”就需要自己進貨、入庫、出庫、發貨,而如果有了“物流”,“工廠”就不需要進貨和發貨了,這對“工廠”的生產效率有質的提升。
在STM32中,DMA控制器有多個通道,每個通道對應某幾個外設,使用前需要指定好該通道給哪個外設使用。
具體使用DMA需要做下面的配置操作:
1、 使能DMA時鐘
2、 配置外設和內存地址
3、 配置傳輸的數據個數
4、 配置通道的優先級
5、 配置數據傳輸方向
6、 配置circular模式或normal模式
7、 配置外設/內存incremented模式
8、 配置外設/內存數據位數
9、 配置中斷,編寫中斷服務程序
10、使能DMA傳輸
之后內核只需要等待DMA中斷的到來即可,然后讀寫內存數據。DMA有四種中斷標志:全局中斷、傳輸完成中斷、半傳輸中斷、傳輸錯誤中斷,清除全局中斷標志可以將所有的中斷標志位清零。
DMA的外設和內存的數據位數可以不同,不同的位數傳輸最終的結果如下表所示:
使用STM32的LL庫的代碼如下:
1、 打開時鐘
2、 配置地址
這里ADC是外設。
3、 數據個數
4、 優先級
5、 傳輸方向
6、 Circular模式
7、 Incremented模式
這里外設只有一個寄存器,所以不需要increment,內存是一個數組,所以要increment。
8、 數據位
數據位可以是8位(BYTE)、16位(HALFWORD)、32位(WORD)
9、 中斷相關
10、 使能DMA
-
mcu
+關注
關注
146文章
17123瀏覽量
350994 -
cpu
+關注
關注
68文章
10854瀏覽量
211587 -
內存
+關注
關注
8文章
3019瀏覽量
74005 -
STM32
+關注
關注
2270文章
10895瀏覽量
355744 -
dma
+關注
關注
3文章
560瀏覽量
100548
發布評論請先 登錄
相關推薦
評論