mini2440裸机DMA(1)

第8章 直接存储器存取DMA

mini2440裸机DMA(1)

mini2440裸机DMA(1)

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

 

这里主要以通道0位讲解

第一个寄存器 DISRC

mini2440裸机DMA(1)

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

 

 

 

 

第二个 寄存器DISRCC

mini2440裸机DMA(1)

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

 

第三个寄存器 DIDST

mini2440裸机DMA(1)

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

 

4个寄存器 DIDSTC0

mini2440裸机DMA(1)

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

 

5个寄存器 DCON

mini2440裸机DMA(1)

  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

mini2440裸机DMA(1)

mini2440裸机DMA(1)

 

 

6个寄存器 DSTAT

mini2440裸机DMA(1)

 

7个寄存器 DSTAT

mini2440裸机DMA(1)

 

8个寄存器 DSTAT

mini2440裸机DMA(1)

 

 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.****.net/zhaocj/article/details/5583935

 

 

 

 

 

 

9个寄存器 DSTAT

mini2440裸机DMA(1)

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

mini2440裸机DMA(1)

#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