mini2440裸機DMA(1)

第8章 直接存儲器存取DMA

在DMA章接種一共有四個通道的DMA源,而每一種源由包括9個寄存器。則我們只需要配置好久個寄存器就可以操作好DMA了。

 

這裏主要以通道0位講解

第一個寄存器 DISRC

  pDMA->DISRC=srcAddr;        //設置源地址

 

 

 

 

第二個 寄存器DISRCC

pDMA->DISRCC=(0<<1)|(0<<0); //設置源控制寄存器   inc,AHB

 

第三個寄存器 DIDST

pDMA->DIDST=dstAddr;        //設置目的地址

 

4個寄存器 DIDSTC0

pDMA->DIDSTC=(0<<1)|(0<<0); //設置目的控制寄存器 inc,AHB

 

5個寄存器 DCON

  pDMA->DCON=(1<<31)|(1<<30)|(1<<29)|(burst<<28)|(1<<27)|

                     (0<<23)|(1<<22)|(dsz<<20)|(tc);

   //DMA控制寄存器  HS,AHB sync,enable interrupt,whole, SW request mode,relaod off

 

 

6個寄存器 DSTAT

 

7個寄存器 DSTAT

 

8個寄存器 DSTAT

 

 s3c2440提供了4個通道的DMA,它們不僅可以實現內存之間的數據交換,還可以實現內存與外設,以及外設與外設之間的數據交換。要用好s3c2440的DMA,關鍵是配置好它的源、目的寄存器,和必要的控制寄存器。寄存器DISRCn是初始DMA源寄存器,它是用於設置DMA數據傳輸的源基址,而寄存器DIDSTn是初始DMA目的寄存器,它是用於設置DMA數據傳輸的目的基址。初始DMA源控制寄存器DISRCCn的第1位用於選擇源的總線(系統總線AHB還是外設總線APB),第0位用於設置源基址在數據傳輸過程中是遞增還是固定不變。初始DMA目的控制寄存器DIDSTCn的低兩位與寄存器DISRCCn相識,但它是用來設置目的基址,而第2位用於設置是在傳輸完數據之後中斷還是在自動重載後中斷。DMA控制寄存器DCONn用於控制數據的DMA傳輸,第31位用於設置傳輸協議是需求模式還是握手模式,第30位用於選擇同步時鐘是PCLK還是HCLK,第29位用於設置DMA中斷是否發生,第28位用於選擇傳輸大小是單元傳輸還是突發傳輸,第27位用於選擇服務模式是單步模式還是完全模式,第24位到第26位用於設置DMA的請求源,第23位用於設置DMA的源是軟件還是硬件,第22位用於設置是否需要重載傳輸的目的和源基址,第20位和第21位用於設置數據傳輸的數據大小(字節、半字還是字),低20位用於初始化傳輸數據的個數。而通過讀取DMA狀態寄存器DSTATn的低20位可以獲知當前的傳輸的計數。DMA掩碼觸發寄存器DMASKTRIGn的第2位可以終止當前DMA操作,第1位可以用於開啓DMA通道,第0位則表示在軟件請求模式下觸發DMA通道。
 

資料來源於

2440中文手冊

 https://blog.csdn.net/zhaocj/article/details/5583935

 

 

 

 

 

 

9個寄存器 DSTAT

pDMA->DMASKTRIG=(1<<1)|1; //DMA on, SW_TRIG

#define _NONCACHE_STARTADDRESS   0x31000000

DMA_M2M(0,_NONCACHE_STARTADDRESS,_NONCACHE_STARTADDRESS+0x800000,0x80000,0,0); //byte,single

 

DMA_M2M(0, 0x31000000, 0x31000000+0x800000,0x80000,0,0); //byte,single

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章