【原創】DMA


什么是DMA

    DMA,Direct Memory Access,直接內存訪問,是一種不經過CPU而直接從內存存取數據的數據交換模式。在DMA模式下,CPU只需要向DMA控制器下達指令,傳輸數據由DMA來完成,數據傳送完再把信息反饋給CPU,這樣能夠減少CPU的資源占有率。DMA由硬件實現,從共用系統數據總線的角度看,DMA和CPU是競爭對手的關系,當完成一批數據的傳輸工作之后,快速設備可以向CPU發出中斷請求,報告本次傳輸結束的同時,請示下一步的操作要求。
 
應用場合
    DMA應用於快速設備和主存儲器成批交換數據的場合,DMA應用在數據交換,既能夠保證數據傳輸的准確性,即不丟失快速設備提供出來的數據,也能夠進一步減少快速設備讀寫操作對CPU的干擾。
 
DMA中斷和普通中斷的區別
    兩者最大的不同表現為對CPU的干擾程度不同: DMA 傳送方式的優先級高於程序中斷,兩者的區別主要表現在對CPU的干擾程度不同。中斷請求不但使CPU停下來,而且要CPU執行中斷服務程序為中斷請求服務,這個請求包括了對斷點和現場的處理以及CPU與外設的傳送,所以CPU付出了很多的代價;DMA請求僅僅使CPU暫停一下,不需要對斷點和現場的處理,並且是由DMA控制外設與主存之間的數據傳送,無需CPU的干預,DMA只是借用了一點CPU的時間而已。還有一個區別就是,CPU對這兩個請求的響應時間不同,對中斷請求一般都在執行完一條指令的時鍾周期末尾響應,而對DMA的請求,由於考慮它的高效性,CPU在每條指令執行的各個階段之中都可以讓給DMA使用,是立即響應。 DMA主要由硬件來實現,此時高速外設和內存之間進行數據交換不通過CPU的控制,而是利用系統總線。DMA方式是I/O系統與主機交換數據的主要方式之一,另外還有程序查詢方式和中斷方式。
 
DMA特性
● 12個 獨立的可配置的通道(請求) DMA1 有7個通道DMA2有5個通道
● 每個通道都直接連接專用的硬件DMA請求,每個通道都同樣支持 軟件觸發。這些功能通過 軟件來配置。
● 在七個 請求間的優先權可以通過軟件編程設置(共有四級:很高、高、中等和低),假如在相 等優先權時由硬件決定(請求0優先於請求1 ,依此類推) 。
● 獨立的源和目標數據區的傳輸寬度(字節、半字、全字),模擬打包和拆包的過程。 源和目標 地址必須按數據傳輸寬度對齊
● 支持 循環的緩沖器管理
● 每個通道都有 3個事件標志(DMA 半傳輸, DMA傳輸完成和DMA傳輸出錯),這3個事件標志 邏輯或成為一個單獨的中斷請求。
存儲器和存儲器間的傳輸
外設和存儲器,存儲器和外設的傳輸
● 閃存、 SRAM、外設的SRAM、 APB1 APB2和AHB外設均可作為 訪問的源和目標
可編程的數據傳輸數目:最大為65536
 
DMA配置過程
(1)外設寄存器地址;DMA_CPARx(x=1-7),DMA1和DMA2共享用7個,DMA2沒有6和7
(2)存儲器地址;DMA_CMARx(x=1-7), DMA1和DMA2共享用7個99,DMA2沒有6和7
(3)傳輸量,DMA_CNDTRx,只用bit0-15,0-65535,只在DMA_CCRx的EN為0時,可寫,減為0時,不會發生任何數據傳輸,除非使用循環模式; 傳輸數據寬度, 傳輸方向,DMA_CCRx
(4)循環/正常模式,地址增量模式(包括外設和存儲器的地址),DMA_CCRx
(5)通道優先級,DMA_CCRx
(6)中斷請求標志,DMA_ISR和DMA_IFCR
 
DMA的工作過程及循環模式、存儲器到存儲器模式
    配置DMA完后,並且使能了DMA,當發生外設數據傳輸請求時,如果傳輸量不為0,在DMA的控制下,數據以指定的方向,以傳輸數據寬度,從源地址傳輸到目標地址,一次傳輸完成,傳輸量減1,此時如果開啟了地址增量模式,那么下一個源地址、目標地址將會是前一個地址加上增量值,增量值取決於所選的數據寬度(8位+1,16位+2,32位+4),當源地址設定的數據寬度小於目標地址的數據寬度,那么源數據全部寫入目標地址后,目標地址剩下的位置將寫0,當大於時,目標地址將全被寫滿,源數據未寫部分將被舍棄。如果開啟了循環模式,數據傳輸量變為0時,將會自動恢復成配置通道時設置的初值,DMA操作繼續執行。
     如果開啟了中斷(傳輸錯誤中斷、傳輸完成中斷、半傳輸中斷),將會產生相應的中斷事件。三種不同中斷共用一個中斷函數,但可以通過中斷標志區分。
     當設置了DMA_CCRx的MEM2MEM位,在軟件設置了DMA_CCRx的EN位啟動DMA傳輸,DMA傳輸 立即開始 ,當傳輸量減為0,傳輸結束。 注意存儲器到存儲器模式不能和循環模式共同使用。
 
DMA的DMA_ISR和DMA_IFCR的區別
    DMA_ISR,存儲中斷標志位,由硬件置位,使用了前28位,共7個通道,每個通道使用4位,分別是GIFx(全局中斷)、TCIFx(傳輸完成)、HTIFx(半傳輸)、TEIFx;特別地,GIFx  置1時,表示有中斷發生。
    DMA_IFCR,中斷標志清除寄存器,由軟件置位,   使用了前28位,共7個通道,每個通道使用4位,分別是CGIFx(全局中斷)、CTCIFx(傳輸完成)、CHTIFx(半傳輸)、CTEIFx;寫入0不起作用,寫入1清除DMA_ISR相應的標志位。
 
錯誤管理
    讀寫一個保留的地址區域,將會產生DMA傳輸錯誤。當在DMA讀寫操作時發生DMA傳輸錯誤 時,硬件會自動地清除發生錯誤的通道所對應的通道配置寄存器(DMA_CCRx)的EN位,該通道 操作被停止。此時,在DMA_IFT寄存器中對應該通道的傳輸錯誤中斷標志位(TEIF)將被置位, 如果在DMA_CCRx寄存器中設置了傳輸錯誤中斷允許位,則將產生中斷。
 
操作一個不支持字節或半字寫的AHB設備
    當DMA模塊開始一個AHB的字節或半字寫操作時,數據將在HWDATA[31:0]總線中未使用的部 分重復。因此,如果DMA以字節或半字寫入不支持字節或半字寫操作的AHB設備時(即HSIZE不 適於該模塊),不會發生錯誤, DMA將按照下面兩個例子寫入32位HWDATA數據:
● 當HSIZE=半字時,寫入半字’0xABCD’, DMA將設置HWDATA總線為’0xABCDABCD’。
● 當HSIZE=字節時,寫入字節’0xAB’, DMA將設置HWDATA總線為’0xABABABAB’。
假定AHB/APB橋是一個AHB的32位從設備,它不處理HSIZE參數,它將按照下述方式把任何 AHB上的字節或半字按32位傳送到APB上:
● 一個AHB上對地址0x0(或0x1 、 0x2或0x3)的寫字節數據’0xB0’操作,將轉換到APB上對地址 0x0的寫字據’0xB0B0B0B0’操作。
● 一個AHB上對地址0x0(或0x2)的寫半字數據’0xB1B0’操作,將轉換到APB上對地址0x0的寫 字數據’0xB1B0B1B0’操作。
例如,如果要寫入APB后備寄存器(與32位地址對齊的16位寄存器),需要配置存儲器數據源寬 度(MSIZE)為’16位’,外設目標數據寬度(PSIZE)為’32位’。    
 
注意:
(1)存儲器到存儲器模式下,可以使用任意DMA通道;
(2)開啟DMA數據傳輸模式,除了存儲器到存儲器的數據傳輸,其他外設的DMA傳輸,不僅要支持DMA,還要在使用的時候,自己開啟DMA功能,比如USART1的DMA開啟為,USART_DMACmd(USART1,USART_DMAReq_Tx,ENABLE);
(3)外設的DMA,還要注意選擇的通道是否正確。
       
 
 
                       


免責聲明!

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



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