DMA控制

Posted LeoSanford

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DMA控制相关的知识,希望对你有一定的参考价值。

1.S3C6410中DMA操作步骤

S3C6410中DMA操作步骤:
1、决定使用安全DMAC(SDMAC)还是通用DMAC(DMAC);
2、开始相应DMAC的系统时钟,并关闭另外一组的时钟(系统默认开启SDMA时钟);
3、开启DMAC控制,设置DMAC_Configuration寄存器;
4、清除传输结束中断寄存器和错误中断寄存器;
5、选择合适的优先级通道;
6、设置通道的源数据地址和目的数据地址(设置DMACCxSrcAddr和DMACCxDestAddr);
7、设置通道控制寄存器0(设置DMACCxControl0);
8、设置通道控制寄存器1,(传输大小,设置DMACCxControl1);
9、设置通道配置寄存器;(设置DMACCxConfiguration)
10、使能相应通道(设置DMACCxConfiguratoin);

2.各个寄存器的初始化

2.1 Secure DMA control register

2.2 Synchronization Register

2.3 DMACConfiguration

2.4 Souce Address Register

因为从内存取,要自增;目的地址固定;目标主机选择AHB主机2;源主机选择AHB主机1。

传输的大小

 2.4 Destination Address Register

发送消息到串口

 2.5 DMACC0Configuration设置

3. 代码

 dma.c

 1 /*
 2 S3C6410中DMA操作步骤:
 3 1、决定使用安全DMAC(SDMAC)还是通用DMAC(DMAC);
 4 2、开始相应DMAC的系统时钟,并关闭另外一组的时钟(系统默认开启SDMA时钟);
 5 3、开启DMAC控制,设置DMAC_Configuration寄存器;
 6 4、清除传输结束中断寄存器和错误中断寄存器;
 7 5、选择合适的优先级通道;
 8 6、设置通道的源数据地址和目的数据地址(设置DMACCxSrcAddr和DMACCxDestAddr);
 9 7、设置通道控制寄存器0(设置DMACCxControl0);
10 8、设置通道控制寄存器1,(传输大小,设置DMACCxControl1);
11 9、设置通道配置寄存器;(设置DMACCxConfiguration)
12 10、使能相应通道(设置DMACCxConfiguratoin);
13 
14 */
15 
16 
17 #define SDMA_SEL              (*((volatile unsigned long *)0x7E00F110))
18 #define DMACIntTCClear          (*((volatile unsigned long *)0x7DB00008))
19 #define DMACIntErrClr          (*((volatile unsigned long *)0x7DB00010))
20 #define DMACConfiguration          (*((volatile unsigned long *)0x7DB00030))
21 #define DMACSync              (*((volatile unsigned long *)0x7DB00034))
22 #define DMACC0SrcAddr         (*((volatile unsigned long *)0x7DB00100))
23 #define DMACC0DestAddr         (*((volatile unsigned long *)0x7DB00104))
24 #define DMACC0Control0          (*((volatile unsigned long *)0x7DB0010c))
25 #define DMACC0Control1          (*((volatile unsigned long *)0x7DB00110))
26 #define DMACC0Configuration     (*((volatile unsigned long *)0x7DB00114))
27 
28 
29 
30 #define UTXH0              (volatile unsigned long *)0x7F005020
31 
32 char src[100] = "\\n\\rHello World->";
33 
34 
35 void dma_init()
36 {
37     //DMA控制器的选择(SDMAC0)
38     SDMA_SEL = 0;
39     
40     /* 如果外设的工作时钟与DMA控制器的时钟不相同, 要使能"同步逻辑" */
41     DMACSync = 0;
42     
43     //DMA控制器使能
44     DMACConfiguration = 1;
45     
46     
47     //初始化源地址
48     DMACC0SrcAddr = (unsigned int)src;
49     
50     
51     //初始化目的地址
52     DMACC0DestAddr = (unsigned int)UTXH0;
53     
54     
55     
56     
57     //对控制寄存器进行配置
58     /*
59     源地址自增
60     目的地址固定、
61     目标主机选择AHB主机2
62     源主机选择AHB主机1
63     */
64     DMACC0Control0 =(1<<25) | (1 << 26)| (1<<31);   
65     DMACC0Control1 = 0x64;     //传输的大小
66     
67     
68     
69     
70     
71     //开启channel0 DMA
72     /*
73     流控制和传输类型:MTP 为 001
74     目标外设:DMA_UART0_1,源外设:DMA_MEM
75     通道有效: 1
76     */
77     
78     DMACC0Configuration = (1<<6) | (1<<11) | (1<<14) | (1<<15);
79                     
80 }
81 
82 
83 void dma_start()
84 {
85     DMACC0Configuration  = 1;    
86 }
View Code

 

以上是关于DMA控制的主要内容,如果未能解决你的问题,请参考以下文章

DMA (直接存储器访问)

dma子系统 dmac

嵌入式:ARM的DMA设计

DMA+USART+stm32

DMA控制器原理详解

DMA控制器原理详解