1DMA的基本定義
DMA,全稱Direct Memory Access,即直接存儲器訪問。
DMA傳輸將數(shù)據(jù)從一個地址空間復制到另一個地址空間,提供在外設和存儲器之間或者存儲器和存儲器之間的高速數(shù)據(jù)傳輸。當CPU初始化這個傳輸動作,傳輸動作本身是由DMA控制器來實現(xiàn)和完成的。DMA傳輸方式無需CPU直接控制傳輸,也沒有中斷處理方式那樣保留現(xiàn)場和恢復現(xiàn)場過程,通過硬件為RAM和IO設備開辟一條直接傳輸數(shù)據(jù)的通道,使得CPU的效率大大提高。
2DMA的主要特征
- 每個通道都直接連接專用的硬件DMA請求,每個通道都同樣支持軟件觸發(fā)。這些功能通過軟件來配置;
- 在同一個DMA模塊上,多個請求間的優(yōu)先權可以通過軟件編程設置(共有四級:很高、高、中等和低),優(yōu)先權設置相等時由硬件決定(請求0優(yōu)先于請求1,依此類推);
- 獨立數(shù)據(jù)源和目標數(shù)據(jù)區(qū)的傳輸寬度(字節(jié)、半字、全字),模擬打包和拆包的過程。源和目標地址必須按數(shù)據(jù)傳輸寬度對齊;
- 支持循環(huán)的緩沖器管理;
- 每個通道都有3個事件標志(DMA半傳輸、DMA傳輸完成和DMA傳輸出錯),這3個事件標志邏輯或成為一個單獨的中斷請求;
- 存儲器和存儲器間的傳輸、外設和存儲器、存儲器和外設之間的傳輸;
- 閃存、SRAM、外設的SRAM、APB1、APB2和AHB外設均可作為訪問的源和目標;
- 可編程的數(shù)據(jù)傳輸數(shù)目:最大為65535。
3STM33F10x系列芯片DMA控制器
STM32F10x系列芯片最多有2個DMA控制器(DMA2僅存在大容量產品中),DMA1有7個通道。DMA2有5個通道。每個通道專門用來管理來自于一個或多個外設對存儲器訪問的請求。還有一個仲裁起來協(xié)調各個DMA請求的優(yōu)先權。
從外設(TIMx[x=1、2、3、4]、ADC1、SPI1、SPI/I2S2、I2Cx[x=1、2]和USARTx[x=1、2、3])產生的7個請求,通過邏輯或輸入到DMA1控制器,這意味著同時只能有一個請求有效。各個通道的DMA1請求一覽見下圖:
從外設(TIMx[5、6、7、8]、ADC3、SPI/I2S3、UART4、DAC通道1、2和SDIO)產生的5個請求,經邏輯或輸入到DMA2控制器,這意味著同時只能有一個請求有效。各個通道的DMA2請求一覽見下圖:
DMA的基本原理
DMA控制器和Cortex?-M3核心共享系統(tǒng)數(shù)據(jù)總線,執(zhí)行直接存儲器數(shù)據(jù)傳輸。當CPU和DMA同時訪問相同的目標(RAM或外設)時,DMA請求會暫停CPU訪問系統(tǒng)總線達若干個周期,總線仲裁器執(zhí)行循環(huán)調度,以保證CPU至少可以得到一半的系統(tǒng)總線(存儲器或外設)帶寬。
0DMA的工作框圖
DMA模塊的框圖看起來比較復雜,接下來會一點一點地對它進行分析。
1DMA處理
在發(fā)生一個事件后,外設向DMA控制器發(fā)送一個請求信號。DMA控制器根據(jù)通道的優(yōu)先權處理請求。當DMA控制器開始訪問發(fā)出請求的外設時,DMA控制器立即發(fā)送給它一個應答信號。當從DMA控制器得到應答信號時,外設立即釋放它的請求。一旦外設釋放了這個請求,DMA控制器同時撤銷應答信號。如果有更多的請求時,外設可以啟動下一個周期。
總之,每次DMA傳送由3個操作組成:
- 從外設數(shù)據(jù)寄存器或者從當前外設/存儲器地址寄存器指示的存儲器地址取數(shù)據(jù),第一次傳輸時的開始地址是DMA_CPARx或DMA_CMARx寄存器指定的外設基地址或存儲器單元;
- 存數(shù)據(jù)到外設數(shù)據(jù)寄存器或者當前外設/存儲器地址寄存器指示的存儲器地址,第一次傳輸時的開始地址是DMA_CPARx或DMA_CMARx寄存器指定的外設基地址或存儲器單元;
- 執(zhí)行一次DMA_CNDTRx寄存器的遞減操作,該寄存器包含未完成的操作數(shù)目。
2仲裁器
仲裁器根據(jù)通道請求的優(yōu)先級來啟動外設/存儲器的訪問。
優(yōu)先權管理分2個階段:
- 軟件:每個通道的優(yōu)先權可以在DMA_CCRx寄存器中設置,有4個等級:最高優(yōu)先級、高優(yōu)先級、中等優(yōu)先級、低優(yōu)先級;
- 硬件:如果2個請求有相同的軟件優(yōu)先級,則較低編號的通道比較高編號的通道有較高的優(yōu)先權。比如:如果軟件優(yōu)先級相同,通道2優(yōu)先于通道4。?
注意:在大容量產品和互聯(lián)型產品中,DMA1控制器擁有高于DMA2控制器的優(yōu)先級。
3DMA通道
每個通道都可以在有固定地址的外設寄存器和存儲器地址之間執(zhí)行DMA傳輸。DMA傳輸?shù)臄?shù)據(jù)量是可編程的,最大達到65535。包含要傳輸?shù)臄?shù)據(jù)項數(shù)量的寄存器,在每次傳輸后遞減。
4可編程的數(shù)據(jù)量
外設和存儲器的傳輸數(shù)據(jù)量可以通過DMA_CCRx寄存器中的PSIZE和MSIZE位編程。
6指針增量
通過設置DMA_CCRx寄存器中的PINC和MINC標志位,外設和存儲器的指針在每次傳輸后可以有選擇地完成自動增量。當設置為增量模式時,下一個要傳輸?shù)牡刂穼⑹乔耙粋€地址加上增量值,增量值取決于所選的數(shù)據(jù)寬度為1、2或4。
第一個傳輸?shù)牡刂肥谴娣旁贒MA_CPARx /DMA_CMARx寄存器中的值。在傳輸過程中,這些寄存器保持它們初始的數(shù)值,軟件不能改變和讀出當前正在傳輸?shù)牡刂罚ㄋ趦炔康漠斍巴庠O/存儲器地址寄存器中)。
當通道配置為非循環(huán)模式時,傳輸結束后(即傳輸計數(shù)變?yōu)?)將不再產生DMA操作。要開始新的DMA傳輸,需要在關閉DMA通道的情況下,在DMA_CNDTRx寄存器中重新寫入傳輸數(shù)目。在循環(huán)模式下,最后一次傳輸結束時,DMA_CNDTRx寄存器的內容會自動地被重新加載為其初始數(shù)值,內部的當前外設/存儲器地址寄存器也被重新加載為DMA_CPARx/DMA_CMARx寄存器設定的初始基地址。
6循環(huán)模式
循環(huán)模式用于處理循環(huán)緩沖區(qū)和連續(xù)的數(shù)據(jù)傳輸(如ADC的掃描模式)。
在DMA_CCRx寄存器中的CIRC位用于開啟這一功能。當啟動了循環(huán)模式,數(shù)據(jù)傳輸?shù)臄?shù)目變?yōu)?時,將會自動地被恢復成配置通道時設置的初值,DMA操作將會繼續(xù)進行。
7存儲器到存儲器模式
DMA通道的操作可以在沒有外設請求的情況下進行,這種操作就是存儲器到存儲器模式。
當設置了DMA_CCRx寄存器中的MEM2MEM位之后,在軟件設置了DMA_CCRx寄存器中的EN位啟動DMA通道時,DMA傳輸將馬上開始。當DMA_CNDTRx寄存器變?yōu)?時,DMA傳輸結束。存儲器到存儲器模式不能與循環(huán)模式同時使用。
8可編程的數(shù)據(jù)傳輸寬度、對齊方式和數(shù)據(jù)大小端
當PSIZE和MSIZE不相同時,DMA模塊按照下圖進行數(shù)據(jù)對齊。
9中斷
每個DMA通道都可以在DMA傳輸過半、傳輸完成和傳輸錯誤時產生中斷。為應用的靈活性考慮,通過設置寄存器的不同位來打開這些中斷。
注意:在大容量產品中,DMA2通道4和DMA2通道5的中斷被映射在同一個中斷向量上。在互聯(lián)型產品中,DMA2通道4和DMA2通道5的中斷分別有獨立的中斷向量。所有其他的DMA通道都有自己的中斷向量。
DMA相關配置寄存器
DMA配置參數(shù)包括:通道地址、優(yōu)先級、數(shù)據(jù)傳輸方向、存儲器/外設數(shù)據(jù)寬度、存儲器/外設地址是否增量、循環(huán)模式、數(shù)據(jù)傳輸量。
1DMA通道x配置寄存器(DMA_CCRx)
作用:配置DMA通道模式、優(yōu)先級、數(shù)據(jù)寬度、是否增量、傳輸方向、是否增量參數(shù)。
2DMA通道x傳輸數(shù)量寄存器(DMA_CNDTRx)
作用:配置DMA通道的數(shù)據(jù)傳輸數(shù)量,范圍為0-65535。
主要注意:該寄存器的值會隨著傳輸?shù)倪M行而減少,當該寄存器的值為0的時候,就代表著此次傳輸已經全部結束了。也就是說,當DMA通道開啟傳輸了之后,該寄存器變成只讀,指示的是數(shù)據(jù)傳輸數(shù)量中剩余待傳輸?shù)淖止?jié)數(shù)目。
3DMA通道x外設地址寄存器(DMA_CPARx)
作用:配置DMA通道的外設地址。比如使用串口1的數(shù)據(jù)引腳,則該寄存器必須寫上0x40013804(其實就是串口數(shù)據(jù)寄存器的地址,