STM32F407之DMA-筆記


學習要點記錄,並不全面,祥參 參考手冊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中的剩余數據。

 

 

 

 

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM