35_DMA基本原理
目錄
DMA簡介
DMA框圖
STM32的DMA有一下一些特征
DMA1控制器
DMA處理
數據方向
仲裁器
DMA通道
可編程的數據量
指針增量
循環模式
存儲器到存儲器模式
通道傳輸數據量
中斷
通道配置過程
DMA簡介
DMA全稱Direct Memroy Access, 既直接存儲器訪問。
DMA傳輸將數據從一個地址空間復制到另一個地址空間。當CPU初始化這個傳輸動作,傳輸動作本身是由DMA控制器來實現和完成的。
DMA傳輸方式無需CPU直接控制傳輸,也沒有中斷處理方式那樣保留現場和恢復現場過程,通過硬件為RAM和IO設備開辟一條直接數據的通道,使得CPU的效率大大提高,為CPU減輕負擔。
STM32最多有2個DMA控制器(DMA2僅存在大容量產品中),DMA1有7個通道。DMA2有5個通道。每個通道專門用來管理來自于一個或多個外設對存儲器訪問的請求。還有一個仲裁器來協調各個DMA請求的優先權。
DMA框圖
?
?從圖上可以看出DMA1有7個通道,可以理解為可以訪問7個不同的地方,DMA2有5個通道,假設是從外設到存儲器,可以看到圖上的APB1,APB2里的外設可以提出DMA請求,通過仲裁器,在到設置好對應的通道,連接總線矩陣,這樣就可以去訪問Flash。或者反過來從Flash訪問外設。
STM32的DMA有一下一些特征
1.每個通道都直接連接專用的硬件DMA請求,都支持軟件觸發,這些通過軟件來配置。
2.在七個請求間的優先權可以通過軟件編程設置(共有四級:很高、高、中等和低),假如在相等優先權時由硬件決定(請求0優先于請求1,依此類推)。
3.獨立的源和目標數據區的傳輸寬度(字節、半字、全字),模擬打包和拆包的過程。源和目標地址必須按數據傳輸寬度對齊。
4.支持循環的緩沖器管理
5.每個通道都有3個事件標志(DMA半傳輸,DMA傳輸完成和DMA傳輸出錯),這3個事件標志邏輯或成為一個單獨的中斷請求。
6.外設和存儲器,存儲器和外設的傳輸,存儲器和存儲器間的傳輸。
7.閃存、SRAM、外設的SRAM、 APB1 APB2和AHB外設均可作為訪問的源和目標。
8.可編程的數據傳輸數目:最大為65536。
DMA1控制器
從外設(TIMx[x=1、2、3、4]、ADC1、 SPI1、 SPI/I2S2、12Cx[x=1、2]和USARTx[x=1、2、3])產生的7個請求,通過邏輯或輸入到DMA1控制器,這意味著同時只能有一個請求有效。參見下圖的DMA1請求映像。
外設的DMA請求,可以通過設置相應外設寄存器中的控制位,被獨立地開啟或關閉。
?DMA2
DMA處理
在發生一個事件后,外設向DMA控制器發送一個請求信號。DMA控制器根據通道的優先權處理請求。當DMA控制器開始訪問發出請求的外設時,DMA控制器立即發送給它一個應答信號。當從DMA控制器得到應答信號時,外設立即釋放它的請求。一旦外設釋放了這個請求,DMA控制器同時撤銷應答信號。如果有更多的請求時,外設可以啟動下一個周期。總之,每次DMA傳送由3個操作組成:
1.從外設數據寄存器或者從當前外設/存儲器地址寄存器指示的存儲器地址取數據,第一次傳輸時的開始地址是DMA_CPARx或DMA_CMARx寄存器指定的外設基地址或存儲器單元。
2.存數據到外設數據寄存器或者當前外設/存儲器地址寄存器指示的存儲器地址,第一次傳輸時的開始地址是DMA_CPARx或DMA_CMARx寄存器指定的外設基地址或存儲器單元。
3.執行一次DMA_CNDTRx寄存器的遞減操作,該寄存器包含未完成的操作數目。
數據方向
仲裁器
仲裁器根據通道請求的優先級來啟動外設/存儲器的訪問。優先權管理分個階段:
軟件:每個通道的優先權可以在DMA_CCRx寄存器中設置,有4個等級:
????????最高優先級
????????高優先級
????????中等優先級
????????低優先級
硬件:如果2個請求有相同的軟件優先級,則較低編號的通道比較高編號的通道有較高的優先權。舉個例子,通道2優先于通道4。
注意: 在大容量產品和互聯型產品中,DMA1控制器擁有高于DMA2控制器的優先級
DMA通道
每個通道都可以在有固定地址的外設寄存器和存儲器地址之間執行DMA傳輸: DMA傳輸的數據量是可編程的,最大達到65535。包含要傳輸的數據項數量的寄存器,在每次傳輸后遞減。
可編程的數據量
外設和存儲器的傳輸數據量可以通過DMA_CCRx寄存器中的PSIZE和MSIZE位編程。
指針增量
通過設置DMA_CCRx寄存器中的PINC和MINC標志位,外設和存儲器的指針在每次傳輸后可以有選擇地完成自動增量。當設置為增量模式時,下一個要傳輸的地址將是前一個地址加上增量值,增量值取決與所選的數據寬度為1、2或4,第一個傳輸的地址是存放在DMA_CPAR/DMA_CMARx寄存器中地址。在傳輸過程中,這些寄存器保持它們初始的數值,軟件不能改變和讀出當前正在傳輸的地址(它在內部的當前外設/存儲器地址寄存器中)。當通道配置為非循環模式時,傳輸結束后(即傳輸計數變為0)將不再產生DMA操作。要開始新的DMA傳輸,需要在關閉DMA通道的情況下,在DMA_CNDTRx寄存器中重新寫入傳輸數目。在循環模式下,最后一次傳輸結束時, DMA_CNDTRx寄存器的內容會自動地被重新加載為其初始數值,內部的當前外設/存儲器地址寄存器也被重新加載為DMA_CPARx/DMA_CMARx寄存器設定的初始基地址。
循環模式
循環模式用于處理循環緩沖區和連續的數據傳輸(如ADC的掃描模式)。在DMA_CCRx寄存器中的CIRC位用于開后這一功能。當啟動了循環模式,數據傳輸的數目變為0時,將會自動地被恢復成配置通道時設置的初值, DMA操作將會繼續進行。
存儲器到存儲器模式
DMA通道的操作可以在沒有外設請求的情況下進行,這種操作就是存儲器到存儲器模式。當設置了DMA_CCRx寄存器中的MEM2MEM位之后,在軟件設置了DMA_CCRx寄存器中的EN位啟動DMA通道時,DMA傳輸將馬上開始。當DMA_CNDTRx寄存器變為0時, DMA傳輸結束。存儲器到存儲器模式不能與循環模式同時使用。
通道傳輸數據量
?中斷
每個DMA通道都可以在DMA傳輸過半、傳輸完成和傳輸錯誤時產生中斷。為應用的靈活性考慮,通過設置寄存器的不同位來打開這些中斷。
通道配置過程
下面是配置DMA通道x的過程(x代表通道號):
1.在DMA_CPARx寄存器中設置外設寄存器的地址。發生外設數據傳輸請求時,這個地址將是數據傳輸的源或目標。
2.在DMA_CMARx寄存器中設置數據存儲器的地址。發生外設數據傳輸請求時,傳輸的數據將從這個地址讀出或寫入這個地址。
3.在DMA_CNDTRx寄存器中設置要傳輸的數據量。在每個數據傳輸后,這個數值遞減。
4.在DMA_CCRx寄存器的PL[1:0]位中設置通道的優先級。在DMA_CCRx寄存器中設置數據傳輸的5.方向、循環模式、外設和存儲器的增量模式、外設和存儲器的數據寬度、傳輸一半產生中斷或傳輸完成產生中斷。
6.設置DMA_CCRx寄存器的ENABLE位,啟動該通道。旦啟動了DMA通道,它既可響應連到該通道上的外設的DMA請求。
總結
以上是生活随笔為你收集整理的35_DMA基本原理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【C/C++】面经总结和心得分享
- 下一篇: SOHO如何给产品定价?如何报价?