關於DMA相關知識的總結,寫給將來的本身,但願有幫助。立個Flag[堅持寫博客總結本身工做或學習記錄本身的生活]編程
-------------------------------------------------------------------------------------有事作,有人愛,有所期待----------------------------------------------------------------------------------------------------------------------------------------------------架構
DMA基礎知識點
學習
DMA 簡介
直接存儲器訪問 (DMA) 用於在外設與存儲器之間以及存儲器與存儲器之間提供高速數據傳輸。能夠在無需任何 CPU 操做的狀況下經過 DMA 快速移動數據。這樣節省的 CPU 資源可供其它操做使用。優化
DMA 控制器基於複雜的總線矩陣架構,將功能強大的雙 AHB 主總線架構與獨立的 FIFO 結合在一塊兒,優化了系統帶寬。兩個 DMA 控制器總共有 16 個數據流(每一個控制器 8 個),每個 DMA 控制spa
器都用於管理一個或多個外設的存儲器訪問請求。每一個數據流總共能夠有多達 8 個通道(或稱請求)。每一個通道都有一個仲裁器,用於處理 DMA 請求間的優先級。 3d
(說白了,就是經過AHB總線將數據從源地址--->目標地址無需CPU參與高效數據傳輸模式,在數據傳輸的過程當中經過寄存器配置好要傳輸的數據流和數據通道而後DMA控制器管理相關的寄存器進行數據傳輸)指針
DMA 框圖blog
DMA 控制器執行直接存儲器傳輸:由於採用 AHB 主總線,它能夠控制 AHB 總線矩陣來啓
動 AHB 事務。
它能夠執行下列事務:
● 外設到存儲器的傳輸
● 存儲器到外設的傳輸
● 存儲器到存儲器的傳輸
事件
DMA 控制器提供兩個 AHB 主端口: AHB 存儲器端口(用於鏈接存儲器)和 AHB 外設端口(用於鏈接外設)。可是,要執行存儲器到存儲器的傳輸, AHB 外設端口必須也能訪問存
儲器。AHB 從端口用於對 DMA 控制器進行編程(它僅支持 32 位訪問)
事務
DMA 事務(DMA實現過程)
DMA 事務由給定數目的數據傳輸序列組成。要傳輸的數據項的數目及其寬度(8 位、 16 位或 32 位)可用軟件編程。
每一個 DMA 傳輸包含三項操做:
● 經過 DMA_SxPAR(外設) 或 DMA_SxM0AR (存儲器)寄存器尋址,從外設數據寄存器或存儲器單元中加載數據。
● 經過 DMA_SxPAR 或 DMA_SxM0AR 寄存器尋址,將加載的數據存儲到外設數據寄存器或存儲器單元。
● DMA_SxNDTR 計數器在數據存儲結束後遞減,該計數器中包含仍需執行的事務數。
在產生事件後,外設會向 DMA 控制器發送請求信號。 DMA 控制器根據通道優先級處理該請求。只要 DMA 控制器訪問外設, DMA 控制器就會向外設發送確認信號。外設得到 DMA 控
制器的確認信號後,便會當即釋放其請求。一旦外設使請求失效, DMA 控制器就會釋放確認信號。若是有更多請求,外設能夠啓動下一個事務。 (DMA 就是將設定好目的地址和源地址
設定好的數據大小(8字節16位半字 32位字),傳輸的數據量,傳輸模式,傳輸的方向等基本配置後按照指定的源地址將經過AHB總線將數據傳輸到目的地址);
DMA數據流和數據通道 [DMA_SxCR寄存器控制 CHSEL[2:0]]
每一個數據流都與一個 DMA 請求相關聯,此 DMA 請求能夠從 8 個可能的通道請求中選出。此選擇由 DMA_SxCR 寄存器中的 CHSEL[2:0] 位控制。
來自外設的 8 個請求(TIM、 ADC、 SPI、 I2C 等)獨立鏈接到每一個通道,具體的鏈接取決於產品實現狀況。
DMA1,控制器控制UART數據流和數據通道
DMA 仲裁器(控制每一個數據流[0-7]優先級) 【相同的優先級,數據流編號低的數據流優先】
仲裁器爲兩個 AHB 主端口(存儲器和外設端口)提供基於請求優先級的 8 個 DMA 數據流請
求管理,並啓動外設/存儲器訪問序列。
優先級管理分爲兩個階段:
● 軟件:每一個數據流優先級均可以在 DMA_SxCR 寄存器中配置。分爲四個級別:
— 很是高優先級
— 高優先級
— 中優先級
— 低優先級
● 硬件:若是兩個請求具備相同的軟件優先級,則編號低的數據流優先於編號高的數據流。例如,數據流 2 的優先級高於數據流 4。
DMA 數據流
8 個 DMA 控制器數據流都可以提供源和目標之間的單向傳輸鏈路。每一個數據流配置後均可以執行:
● 常規類型事務:存儲器到外設、外設到存儲器或存儲器到存儲器的傳輸。
● 雙緩衝區類型事務:使用存儲器的兩個存儲器指針的雙緩衝區傳輸(當 DMA 正在進行自/
至緩衝區的讀/寫操做時,應用程序能夠進行至/自其它緩衝區的寫/讀操做)。
要傳輸的數據量(多達 65535)能夠編程,並與鏈接到外設 AHB 端口的外設(請求 DMA 傳
輸)的源寬度相關。每一個事務完成後,包含要傳輸的數據項總量的寄存器都會遞減。
源、目標和傳輸模式
源傳輸和目標傳輸在整個 4 GB 區域(地址在 0x0000 0000 和 0xFFFF FFFF 之間)均可以尋址外設和存儲器。
傳輸方向使用 DMA_SxCR 寄存器中的 DIR[1:0] 位進行配置,有三種可能的傳輸方向:存儲器到外設、外設到存儲器或存儲器到存儲器。 表 37 介紹了相應的源和目標地址。
DMA 模式
源地址------------->目標地址
外 設---DMA--> 存儲器
存儲器 ---------> 外設
存儲器----------->存儲器
外設到存儲器模式
圖 28 介紹了這種模式。
使能這種模式(將 DMA_SxCR 寄存器中的位 EN 置 1) 時,每次產生外設請求,數據流都會啓動數據源到 FIFO 的傳輸。
達到 FIFO 的閾值級別時, FIFO 的內容移出並存儲到目標中。
若是 DMA_SxNDTR 寄存器達到零、外設請求傳輸終止(在使用外設流控制器的狀況下)或DMA_SxCR 寄存器中的 EN 位由軟件清零,傳輸即會中止。
在直接模式下(當 DMA_SxFCR 寄存器中的 DMDIS 值爲「0」時),不使用 FIFO 的閾值級別控制:每完成一次從外設到 FIFO 的數據傳輸後,相應的數據當即就會移出並存儲到目標中。
只有贏得了數據流的仲裁後,相應數據流纔有權訪問 AHB 源或目標端口。系統使用在
DMA_SxCR 寄存器 PL[1:0] 位中爲每一個數據流定義的優先級執行仲裁。
存儲器到外設模式
圖 29 介紹了這種模式。
使能這種模式(將 DMA_SxCR 寄存器中的 EN 位置 1)時,數據流會當即啓動傳輸,從源完
全填充 FIFO。
每次發生外設請求, FIFO 的內容都會移出並存儲到目標中。當 FIFO 的級別小於或等於預約
義的閾值級別時,將使用存儲器中的數據徹底重載 FIFO。
若是 DMA_SxNDTR 寄存器達到零、外設請求傳輸終止(在使用外設流控制器的狀況下)或
DMA_SxCR 寄存器中的 EN 位由軟件清零,傳輸即會中止。
在直接模式下(當 DMA_SxFCR 寄存器中的 DMDIS 值爲「0」時),不使用 FIFO 的閾值級
別。一旦使能了數據流, DMA 便會預裝載第一個數據,將其傳輸到內部 FIFO。一旦外設請
求數據傳輸, DMA 便會將預裝載的值傳輸到配置的目標。而後,它會使用要傳輸的下一個數
據再次重載內部空 FIFO。預裝載的數據大小爲 DMA_SxCR 寄存器中 PSIZE 位字段的值。
只有贏得了數據流的仲裁後,相應數據流纔有權訪問 AHB 源或目標端口。系統使用在
DMA_SxCR 寄存器 PL[1:0] 位中爲每一個數據流定義的優先級執行仲裁。
存儲器到存儲器模式
DMA 通道在沒有外設請求觸發的狀況下一樣能夠工做。此爲圖 30 中介紹的存儲器到存儲器
模式。
經過將 DMA_SxCR 寄存器中的使能位 (EN) 置 1 來使能數據流時,數據流會當即開始填充
FIFO,直至達到閾值級別。達到閾值級別後, FIFO 的內容便會移出,並存儲到目標中。
若是 DMA_SxNDTR 寄存器達到零或 DMA_SxCR 寄存器中的 EN 位由軟件清零,傳輸即會
中止。
只有贏得了數據流的仲裁後,相應數據流纔有權訪問 AHB 源或目標端口。系統使用在
DMA_SxCR 寄存器 PL[1:0] 位中爲每一個數據流定義的優先級執行仲裁。
注意: 使用存儲器到存儲器模式時,不容許循環模式和直接模式。
只有 DMA2 控制器可以執行存儲器到存儲器的傳輸