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] = " Hello 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 }