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

ADC與DMA簡介
STM32的DMA簡介
1. stm32 mcu簡介

基于STM32F407的DMA解析-ADC單通道DMA讀取數(shù)據(jù)

STM32學(xué)習(xí)筆記(7)——DMA直接存儲(chǔ)器訪問

STM32F1開發(fā)指南筆記32----DMA

STM32串口DMA發(fā)送數(shù)據(jù)

Stm32之DMA直接內(nèi)存讀取(2021-07-30)

STM32之串口DMA接收不定長數(shù)據(jù)

【DMA】淺談STM32F4xx的DMA(附初始化代碼)

STM32F1的DMA使用

STM32 DMA傳輸?shù)膯栴}分析

評(píng)論