天嵌 ARM开发社区

 找回密码
 注册
查看: 3245|回复: 3

2440的DMA通道

[复制链接]
扫帚菜~~ 发表于 2012-11-12 15:13:36 | 显示全部楼层 |阅读模式
刚刚学习DMA通道,做了如下的程序,但是运程不成功,哪位大哥可以帮忙分析一下程序


unsigned int length;
unsigned char *src,*dst;//源地址和目标地址

/*
功能:配置DMA寄存器
入口:源地址,目的地址,和数据大小
出口:无
*/

void Dma_Init(unsigned srcaddr,unsigned dstaddr,unsigned int length)
{
         //配置DMA
         
        rDISRC2 = (U32)srcaddr;                     //DMA的源基址
        rDISRCC2 = (0<<1)|(0<<0);                   //AHB,源地址递增

        rDIDST2 = (U32)dstaddr;          //DMA的目的基址为
       
        rDIDSTC2 = (0<<2)| (1<<1)|(1<<0);          //当传输计数值为0时中断,APB,目的地址不变
       
       

        //握手模式,PCLK同步,传输计数中断,单元传输,单步服务模式
        //硬件请求模式,非自动重载,半字,
        rDCON2 = (1<<31) | (0<<30) | (1<<29) | (0<<28) | (0<<27) | (0<<24) | (1<<23) | (1<<22) | (1<<20) | (0x200);
        rDMASKTRIG2=(0<<2)|(1<<1)|0 ;     //不停止DMA,DMA通道开启,非软件触发  

}


void Dma_Test()
{
       
        int i;
       
        length = 0x400;
        src = (unsigned char *)malloc(length);//内存中申请一块地址,此地址前一半用作源目的地址,后一半用作目标地址
        dst = (src + length / 2);//目的地址为所申请地址的后半部分
       
        for(i = 0 ; i < length / 2 ; i++)//对源地址数据赋值
                *(src + i) = 5;

        for(i = 0 ; i < length / 2 ; i++)//对目的地址数据清零
                *(dst + i) = 0;

        Dma_Init((unsigned)src,(unsigned)dst,length / 2);
}

int Main()
{
        unsigned int a = 10 ;
        unsigned int i ;
       
       
        Uart0_Init(115200) ;
       
        Dma_Test();
       
        for(i = 0; i < length / 2; i++)
                Uart0_Printf("%d",*(dst + i)) ;
       
        for(i = 0; i < length / 2; i++)
                Uart0_Printf("%d",*(src + i)) ;

       
        while(1)
        {       
               
        }
        return 0;
       
}
Mr_Double 发表于 2012-11-13 11:10:58 | 显示全部楼层
  //配置DMA
         
        rDISRC2 = (U32)srcaddr;                     //DMA的源基址
        rDISRCC2 = (0<<1)|(0<<0);                   //AHB,源地址递增

        rDIDST2 = (U32)dstaddr;          //DMA的目的基址为
        
        rDIDSTC2 = (0<<2)| (1<<1)|(1<<0);          //当传输计数值为0时中断,APB,目的地址不变

我个人觉得哈,你既然是动态申请了一块内存,为什么源地址和目的地址的总线模式不一样呢?一个AHB,一个APB。这里可能出了问题
Mr_Double 发表于 2012-11-13 12:29:09 | 显示全部楼层
对了,另外,你的程序里面DMA应用软件启动吧
 楼主| 扫帚菜~~ 发表于 2012-11-27 16:28:28 | 显示全部楼层
Mr_Double 发表于 2012-11-13 12:29
对了,另外,你的程序里面DMA应用软件启动吧

现在可以了,非常感谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号 )

GMT+8, 2024-6-3 20:54 , Processed in 1.078125 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表