扫帚菜~~ 发表于 2012-11-12 15:13:36

2440的DMA通道

刚刚学习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 static/image/common/back.gif
对了,另外,你的程序里面DMA应用软件启动吧

现在可以了,非常感谢
页: [1]
查看完整版本: 2440的DMA通道