秉火429笔记之十五 DMA--直接存储区访问
目錄
1. 簡介
2. 功能
2.1 外設通道
2.2 仲裁器
2.3 FIFO
2.4 存儲器端口和外設端口
2.5 編程接口
3. DMA數據配置
1. 簡介
直接存儲器訪問 (DMA) 用于在外設與存儲器之間以及存儲器與存儲器之間提供高速數據傳 輸。可以在無需任何 CPU 操作的情況下通過 DMA 快速移動數據。這樣節省的 CPU 資源可 供其它操作使用。
從硬件層次上來說,DMA控制器是獨立于Cortex-M4內核的,有點類似GPIO、USART外設一般,只是DMA的功能是可以快速移動內存數據。
STM32F4xx系列的DMA支持外設到存儲器傳輸、存儲器到外設傳輸和存儲器到存儲器傳輸三種傳輸模式。這里的外設一般指外設的數據寄存器,比如ADC、SPI、I2C、DCMI等等外設的數據寄存器,存儲器一般是指片內SRAM、外部存儲器、片內Flash等等。
外設到存儲器傳輸。比如進行ADC采集時我們可以利用DMA傳輸把AD轉換數據轉移到我們定義的存儲區中,這樣對于多通道采集、采樣頻率高、連續輸出數據的AD采集是非常高效的處理方法。
存儲器到存儲器傳輸就是把一個指定的存儲區內容拷貝到另一個存儲區空間。功能類似于C語言內存拷貝函數memcpy,利用DMA傳輸可以達到更高的傳輸效率,特別是DMA傳輸是不占用CPU的,可以節省很多CPU資源。
2. 功能
DMA 控制器基于復雜的總線矩陣架構,將功能強大的雙 AHB 主總線架構與獨立的 FIFO 結 合在一起,優化了系統帶寬。?
2.1 外設通道
兩個DMA控制器,同時外設繁多,為實現正常傳輸,DMA需要通道選擇控制。每個DMA控制器具有8個數據流,每個數據流對應8個外設請求。每個外設請求都占用一個數據流通道,相同外設請求可以占用不同數據流通道。
2.2 仲裁器
簡單講,判別數據流具有優先傳輸的權利。
仲裁器為兩個 AHB 主端口(存儲器和外設端口)提供基于請求優先級的 8 個 DMA 數據流請 求管理,并啟動外設/存儲器訪問序列。
優先級管理分為兩個階段:
● 軟件:每個數據流優先級都可以在 DMA_SxCR 寄存器中配置。分為四個級別:
— 非常高優先級
— 高優先級
— 中優先級
— 低優先級
● 硬件:如果兩個請求具有相同的軟件優先級,則編號低的數據流優先于編號高的數據流。例如,數據流 2 的優先級高于數據流 4。
2.3 FIFO
FIFO 用于在源數據傳輸到目標之前臨時存儲這些數據。
每個數據流都有一個獨立的 4 字 FIFO,閾值級別可由軟件配置為 1/4、1/2、3/4 或滿。為了使能 FIFO 閾值級別,必須通過將 DMA_SxFCR 寄存器中的 DMDIS 位置 1 來禁止直接 模式。
DMA傳輸具有FIFO模式和直接模式。
直接模式在每個外設請求都立即啟動對存儲器傳輸。在直接模式下,如果DMA配置為存儲器到外設傳輸那DMA會見一個數據存放在FIFO內,如果外設啟動DMA傳輸請求就可以馬上將數據傳輸過去。
FIFO對于要求源地址和目標地址數據寬度不同時非常有用,比如源數據是源源不斷的字節數據,而目標地址要求輸出字寬度的數據,即在實現數據傳輸時同時把原來4個8位字節的數據拼湊成一個32位字數據。此時使用FIFO功能先把數據緩存起來,分別根據需要輸出數據。
FIFO另外一個作用使用于突發(burst)傳輸。
2.4 存儲器端口和外設端口
DMA控制器實現雙AHB主接口,更好利用總線矩陣和并行傳輸。DMA控制器通過存儲器端口和外設端口與存儲器和外設進行數據傳輸。DMA控制器的功能是快速轉移內存數據,需要一個連接至源數據地址的端口和一個連接至目標地址的端口。
DMA2(DMA控制器2)的存儲器端口和外設端口都是連接到AHB總線矩陣,可以使用AHB總線矩陣功能。DMA2存儲器和外設端口可以訪問相關的內存地址,包括有內部Flash、內部SRAM、AHB1外設、AHB2外設、APB2外設和外部存儲器空間。
DMA1的存儲區端口相比DMA2的要減少AHB2外設的訪問權,同時DMA1外設端口是沒有連接至總線矩陣的,只有連接到APB1外設,所以DMA1不能實現存儲器到存儲器傳輸。
2.5 編程接口
AHB從器件編程端口是連接至AHB2外設的。AHB2外設在使用DMA傳輸時需要相關控制信號
3. DMA數據配置
- DMA 傳輸模式
DMA2支持全部三種傳輸模式,而DMA1只有外設到存儲器和存儲器到外設兩種模式。
在DMA_SxCR寄存器的PSIZE[1:0]和MSIZE[1:0]位分別指定外設和存儲器數據寬度大小,可以指定為字節(8位)、半字(16位)和字(32位),我們可以根據實際情況設置。直接模式要求外設和存儲器數據寬度大小一樣,實際上在這種模式下DMA數據流直接使用PSIZE,MSIZE不被使用。
- 源地址和目標地址
DMA數據流x外設地址DMA_SxPAR(x為0~7)寄存器用來指定外設地址,它是一個32位數據有效寄存器。DMA數據流x存儲器0地址DMA_SxM0AR(x為0~7) 寄存器和DMA數據流x存儲器1地址DMA_SxM1AR(x為0~7) 寄存器用來存放存儲器地址,其中DMA_SxM1AR只用于雙緩沖模式,DMA_SxM0AR和DMA_SxM1AR都是32位數據有效的。
當選擇外設到存儲器模式時,即設置DMA_SxCR寄存器的DIR[1:0] 位為“00”,DMA_SxPAR寄存器為外設地址,也是傳輸的源地址,DMA_SxM0AR寄存器為存儲器地址,也是傳輸的目標地址。對于存儲器到存儲器傳輸模式,即設置DIR[1:0] 位為“10”時,采用與外設到存儲器模式相同配置。而對于存儲器到外設,即設置DIR[1:0]位為“01”時,DMA_SxM0AR寄存器作為為源地址,DMA_SxPAR寄存器作為目標地址。
- 流控制器
流控制器主要涉及到一個控制DMA傳輸停止問題。
。DMA傳輸在DMA_SxCR寄存器的EN位被置1后就進入準備傳輸狀態,如果有外設請求DMA傳輸就可以進行數據傳輸。很多情況下,我們明確知道傳輸數據的數目,比如要傳1000個或者2000個數據,這樣我們就可以在傳輸之前設置DMA_SxNDTR寄存器為要傳輸數目值,DMA控制器在傳輸完這么多數目數據后就可以控制DMA停止傳輸。
DMA數據流x數據項數DMA_SxNDTR(x為0~7)寄存器用來記錄當前仍需要傳輸數目,它是一個16位數據有效寄存器,即最大值為65535。這個值在程序設計是非常有用也是需要注意的地方。我們在編程時一般都會明確指定一個傳輸數量,在完成一次數目傳輸后DMA_SxNDTR計數值就會自減,當達到零時就說明傳輸完成。
如果某些情況下在傳輸之前我們無法確定數據的數目,那DMA就無法自動控制傳輸停止了,此時需要外設通過硬件通信向DMA控制器發送停止傳輸信號。這里有一個大前提就是外設必須是可以發出這個停止傳輸信號,只有SDIO才有這個功能,其他外設不具備此功能
- 循環模式
循環模式相對應于一次模式。一次模式就是傳輸一次就停止傳輸,下一次傳輸需要手動控制,而循環模式在傳輸一次后會自動按照相同配置重新傳輸,周而復始直至被控制停止或傳輸發生錯誤。
- 傳輸類型
DMA傳輸類型有單次(Single)傳輸和突發(Burst)傳輸。突發傳輸就是用非常短時間結合非常高數據信號率傳輸數據,相對正常傳輸速度,突發傳輸就是在傳輸階段把速度瞬間提高,實現高速傳輸,在數據傳輸完成后恢復正常速度,有點類似達到數據塊“秒傳”效果。為達到這個效果突發傳輸過程要占用AHB總線,保證要求每個數據項在傳輸過程不被分割,這樣一次性把數據全部傳輸完才釋放AHB總線;而單次傳輸時必須通過AHB的總線仲裁多次控制才傳輸完成。
- 直接模式
默認情況下,DMA工作在直接模式,不使能FIFO閾值級別。
直接模式在每個外設請求都立即啟動對存儲器傳輸的單次傳輸。直接模式要求源地址和目標地址的數據寬度必須一致,所以只有PSIZE控制,而MSIZE值被忽略。突發傳輸是基于FIFO的所以直接模式不被支持。另外直接模式不能用于存儲器到存儲器傳輸(一旦配置存儲器到存儲器模式,則硬件自動配置為FIFO模式)。
在直接模式下,如果DMA配置為存儲器到外設傳輸那DMA會見一個數據存放在FIFO內,如果外設啟動DMA傳輸請求就可以馬上將數據傳輸過去。
- 雙緩存
設置DMA_SxCR寄存器的DBM位為1可啟動雙緩沖傳輸模式,并自動激活循環模式。雙緩沖不應用與存儲器到存儲器的傳輸。雙緩沖模式下,兩個存儲器地址指針都有效。
雙緩沖模式應用在需要解碼程序的地方是非常有效的。如MP3
- DMA中斷
達到半傳輸:DMA數據傳輸達到一半時HTIF標志位被置1,如果使能HTIE中斷控制位將產生達到半傳輸中斷;
傳輸完成:DMA數據傳輸完成時TCIF標志位被置1,如果使能TCIE中斷控制位將產生傳輸完成中斷;
傳輸錯誤:DMA訪問總線發生錯誤或者在雙緩沖模式下試圖訪問“受限”存儲器地址寄存器時TEIF標志位被置1,如果使能TEIE中斷控制位將產生傳輸錯誤中斷;
FIFO錯誤:發生FIFO下溢或者上溢時FEIF標志位被置1,如果使能FEIE中斷控制位將產生FIFO錯誤中斷;
直接模式錯誤:在外設到存儲器的直接模式下,因為存儲器總線沒得到授權,使得先前數據沒有完成被傳輸到存儲器空間上,此時DMEIF標志位被置1,如果使能DMEIE中斷控制位將產生直接模式錯誤中斷。
注: 實例見官方ADC DMA例程等
?
?
?
總結
以上是生活随笔為你收集整理的秉火429笔记之十五 DMA--直接存储区访问的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一加手机android auto,一加手
- 下一篇: ios快捷指令:一键登录/登出南京大学校