目錄
作業原理
DMA硬體架構
DMA通道的作用
DMA暫存器
DMA出現的目的
作業原理
DMA全拼Direct Memory Access(直接記憶體存取),在傳統的CPU存取資料時會先將資料放到快取暫存器中然后在寫入到指定位置
CPU存取資料流程圖:

CPU經歷了三個步驟,先將記憶體中指定位置上的資料取到資料快取器中,然后在將資料快取器中的內容寫入到記憶體中,總共用了三步來完成記憶體兩天不同地址上的資料寫入
而使用DMA之后就會變得非常簡單,DMA不會放入暫存器,而是直接寫入寫入記憶體,你只需要設定好源地址,目標地址,傳輸量,那么DMA就會開始傳輸資料,但DMA會占用你設備的總線,也就是這個程序中你無法使用總線,需要進行一個控制權轉移,這樣雖然傳輸變快了但是傳輸期間CPU基本上做不了別的事情,但是有些架構已經為DMA提供了一套自己的總線,在DMA傳輸程序中CPU依然可以控制外設,這個控制權轉移不是一直DMA有效的,為了保證CPU也能正常通過系統總線去控制外設,一般會給DMA一定時間然后控制權在切回CPU,然后CPU處理一段時間在切回DMA直到DMA結束才會停止控制權轉移,

DMA硬體架構
以下取自STM32芯片手冊中對DMA的框架描述

- 從上圖可以看到DMA是一個單獨的控制器,并且它有兩個,掛設在AHB總線上,可以看到DMA1 CH1 - CH7也就是可配置的控制通道而DMA2只有5個,CPU通過配置DMA來完成資料傳輸
- 可以看到它們不是使用System總線,而是使用了DMA自己的控制總線,所以這個架構會比使用系統總線的架構要快許多,但是功耗要大于使用系統總線的架構
以下是兩個DMA控制器的結構圖,可以清晰的看到每個通道用于做什么的
DMA1

DMA2

DMA通道的作用
通道是一個小型的IO控制器,每個通道對應控制不同的外設、Memory,可以通過MCU資料手冊里查看你的DMA里的每個通道對應控制的外設,
從上圖給出的通道結構圖中可以看到每個通道IO都支持Uart、SPI、I2C外設功能,值得注意的是這里外設是有編號的,可以在上圖通道中看到,不同的外設由不同的通道程式來控制,如你使用I2C2外設,則需要找到支持I2C2的通道并使用它,其中也可以看到SW trigger (MEM2MEM BIT)這個意思代表支持Memory到Memory之間的通訊,如內部的Sram到Sram,也可以看到上圖中有HW request 4 意味著這個通道支持中斷通知,意思是當這個通道開始作業時會設定對應暫存器里的值,然后產生中斷,我們可以在對應的中斷標志暫存器里讀到哪個通道產生了中斷,以及做了什么事情
如果是對外設進行控制的話記得,如果是內部的Memory到Memory之間傳輸資料的話可以隨便選擇一個通道,因為從上圖的結構可以看出每個通道IO都支持內部Memory
通道可以理解成一個小型的程式,它是一個簡單的IO控制程式,只能處理對應外設之間的資料傳輸,作業之前需要配置DMA里使用哪個通道,可以選擇多個通道,也可以選擇一個通道,這些通道是支持同時作業的,
DMA暫存器
可以看到可以通過上面的通道來配置Uart、SPI、I2C的一些功能,同時看到Internal/Request是內部帶有中斷功能的,具體如何配置還需要看暫存器功能

暫存器介紹
① 中斷類
| 暫存器名 | 作用 |
|---|---|
| DMA_ISR | 中斷狀態暫存器 |
| DMA_IFCR | DMA中斷標志位清除暫存器 |
② 控制傳輸類
| 暫存器名 | 作用 |
|---|---|
| DMA_CCRx | DMA通道x配置暫存器 |
| DMA_CNDTRx | DMA通道x資料數量暫存器 |
| DMA_CPARx | DMA通道x外設地址暫存器 |
| DMA_CMARx | DMA通道x記憶體地址暫存器 |
需要注意上面的暫存器針對DMA1與DMA2都有對應的一組,它們倆不使用一組暫存器控制
可以簡單把DMA理解成CPU的一個傳輸小幫手,CPU通過告訴DMA該傳輸哪些資料,然后由DMA去完成傳輸作業
DMA是一個獨立的控制器,內部有小型芯片來控制的,也有自己的一套架構,一般集成在MCU內部與CPU緊密貼合
DMA出現的目的
DMA的出現就是為了解決CPU在處理大量資料傳輸時的時間耗費成本,在傳輸大資料時CPU會先放到暫存器中這樣的速度會影響效率,速度較慢,同時CPU如果一直忙于傳輸資料就不能去做別的事情了,所以DMA的誕生解決了這個問題,需要值得注意的是在使用DMA之前要看下架構,DMA是否與CPU使用同一總線,若同一總線的情況下是會影響CPU作業效率而非傳輸效率
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/297374.html
標籤:其他
