第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