• 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] = "
    
    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 }
    View Code
  • 相关阅读:
    基于JFinal中搭建wopi协议支撑办法
    mysql 增加列
    国王分金币
    口算题卡升级版本
    elasticsearch牛人的日志列表
    牛B的大数据库
    golang --rune
    golang ---rune与byte
    golang学习笔记--接口
    golang学习笔记--函数和方法
  • 原文地址:https://www.cnblogs.com/boyiliushui/p/6032163.html
Copyright © 2020-2023  润新知