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;
}
//配置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。这里可能出了问题 对了,另外,你的程序里面DMA应用软件启动吧 Mr_Double 发表于 2012-11-13 12:29 static/image/common/back.gif
对了,另外,你的程序里面DMA应用软件启动吧
现在可以了,非常感谢
页:
[1]