學習要點記錄,並不全面,祥參 參考手冊RM0090
簡介:
DMA用於外設-內存,內存-內存之間數據的快速傳輸
DMA控制器由雙AHB 主總線架構和獨立的FIFO組成,以此來優化系統帶寬
兩個DMA控制器一共含有16個數據流,每個控制器含有8個數據流;每個數據流有8個通道,每個數據流有一個優先級仲裁器。
主要特征:
雙AHB總線架構,一個負責內存訪問,另一個負責外設訪問
AHB從機編程接口只支持32位訪問
每個數據流擁有4個獨立的32位FIFO,直接模式和FIFO模式都可以使用
--FIFO模式下,可以通過軟件設置FIFO閾值為1/4,1/2,3/4
--直接模式下,每個DMA請求立即觸發一次數據傳輸。當處於直接模式,從內存向外設傳輸數據時,DMA只從內存預裝載一個數據到FIFO
--每個數據流可以通過軟件配置為:
-------常規通道,支持 外設-內存 ;內存-外設 ;內存-內存 。
-------雙緩沖通道,支持內存雙緩沖
--數據流之間的優先級可以通過軟件設置為:非常高 ;高 ;中等 ;低 ;如果優先級相等,那么數據流編號越小,優先級越高
--只有DMA2的每個數據流支持軟件觸發的數據傳輸,而且只有傳輸方向為: 內存-內存
--每個數據流請求是8個通道中的一個。選擇可以通過軟件設置,而且允許一些外設來觸發DMA請求
--傳輸的數據量可以通過DMA控制器管理,或者通過外設管理
----------通過DMA控制:數據量可以通過軟件設置,從1-65535
---------------外設控制:需要傳輸的數據量未知,通過外設硬件給出傳輸結束的信號
--只有在FIFO模式下,源和目的數據寬度可以不一樣:字節;半字;字
--源和目的地址可以增長或者不增長
--支持增長burst傳輸,每 4次; 8次; 16次請求才進行一次突發傳輸。突發的大小可以通過軟件設置,通常等於外設FIFO的一半。burst詳參:(http://blog.csdn.net/sunjiajiang/article/details/7945057)
--每個數據流支持循環緩沖管理
--5種事件標志經過 或運算 來產生中斷請求:1.DMA傳輸了一半 2.DMA傳輸結束 3.DMA傳輸出錯 4.DMA FIFO錯誤 5.直接模式錯誤
DMA功能框圖請參考數據手冊。
DMA控制器提供兩個AHB主機端口:一個是AHB內存端口,用來連接內存;另一個是AHB外設端口,用來連接外設。但是,如果需要 內存-內存 的數據傳輸,AHB外設端口必須訪問內存。
AHB從機端口用來對DMA控制器進行編程設置,它支持32位訪問。
通過DMA架構,可以看出只有DMA2控制器支持 內存-內存 的數據傳輸。
DMA傳輸:
DMA傳輸有三個步驟:
1. 從外設數據寄存器或者內存中取出數據,外設數據寄存器地址和內存地址分別由DMA_SxPAR寄存器和DMA_SxM0AR寄存器給出
2. 將取出的數據進行存儲
3. DMA_SxNDTR寄存器的自減,DMA_SxNDTR寄存器里的值表示還需要傳輸的數據個數
通道選擇:
每個數據流的通道可以通過DMA_SxCR寄存器中的CHSEL[2:0] 設置。通道和數據流的映射祥參數據手冊。
DMA數據流:
每個數據流提供 源和目的 的單向連接。每個數據流可以配置為:
---------常規傳輸
----------雙緩沖傳輸:雙緩沖傳輸在內存端利用兩個內存指針,當DMA對一個緩沖區進行操作時,應用程序可以對另一個緩沖區進行操作。
源和目的以及傳輸模式:
傳輸方向由DMA_SxCR寄存器中的DIR[1:0]位控制。
當數據寬度是 半字 ;字 的時候,相應地數據地址必須和數據寬度邊界對齊。
外設-內存模式:
在該模式下,每次出現外設請求,數據流就從源地址進行一次數據傳輸去填充FIFO。
當達到FIFO閾值后,FIFO里的內容被取出並且存儲到目的地址。
當DMA_SxNDTR寄存器值減到0時,數據傳輸結束。
在直接模式下,FIFO閾值是沒有用的:每個數據傳到FIFO后,會立即被取出然后存儲到目的地址。
內存-外設模式:
與 外設-內存 操作 類似,祥參技術手冊。
指針增長:
外設和內存的指針可以設置為自動后增(在每次數據傳輸結束后增加)或者恆定,利用 DMA_SxCR寄存器里的PINC and MINC bits。如果使能了增長模式,那么下一次傳輸的地址就會變為前一次地址加1(對於字節傳輸)加2(對於半字)加4(對於字),這是由數據寬度決定的。
burst傳輸時必須使能地址增長,地址不變模式不允許使用burst傳輸。
循環模式:
循環模式用來處理連續的數據流。通過DMA_SxCR寄存器中的CIRC bit 設置。
在循環模式下,傳輸數據量的值被自動重載。
循環模式下,如果內存被配置為burst傳輸,以下規則需要強制遵循:
-------
DMA_SxNDTR = Multiple of ((Mburst beat) × (Msize)/(Psize))
解釋:數據傳輸量=beat數 X 內存數據寬度 / 外設數據寬度
雙緩沖模式:
DMA1和DMA2的所有數據流都可以設置為雙緩沖模式。
雙緩沖模式和常規模式一樣,只不過雙緩沖模式有兩個內存指針。當雙緩沖模式使能后,循環模式自動使能,在每次傳輸結束后,內存指針被交換。
該模式我也不是很清晰。
可編程數據寬度:
在使能數據流之前,必須設置傳輸數據量,除非數據流控制器是外設。
使用FIFO模式時,源和目的 的數據寬度可以通過DMA_SxCR寄存器里的PSIZE and MSIZE bits設置。
在直接傳輸模式時,數據寬度必須相等!
單次傳輸和burst傳輸:
DMA 控制器可以進行單詞傳輸或者地址增長的burst傳輸,burst的節拍數為4 ;8 ;16中的一個。
burst的大小可以通過軟件設置,通過 DMA_SxCR 寄存器里的MBURST[1:0] and PBURST[1:0] bits。
在直接模式下,數據流只能產生單次傳輸。
只有使能地址增長模式,才能使用burst模式。
FIFO:
FIFO是用來暫時存放從源地址取得的數據。
每個數據流擁有一個獨立的 4字 的FIFO,並且FIFO的閾值可以通過軟件設置。如果要使用FIFO的閾值功能,必須禁止直接模式。
內存-內存 方向的數據傳輸不允許使用直接模式。
DMA傳輸結束:
不同的事件能夠通過設置DMA_LISR寄存器里的TCIFx bit來結束數據傳輸。
----------DMA控制數據流模式:
-DMA_SxNDTR計數值為0
-在數據傳輸結束之前數據流被禁止(通過設置DMA_SxCR寄存器里的EN bit )
----------外設控制數據流模式:
-最后一個burst傳輸或單次傳輸,並且FIFO里的數據被傳輸到內存
-數據流被軟件禁止
在傳輸方向為 外設-內存 時,傳輸結束依賴於FIFO中的剩余數據。