mm275861 发表于 2013-3-30 22:12:20

2440的DMA 无法赋值,内容如下

先上程序



#define GLOBAL_CLK 1
#include "def.h"
#include "option.h"
#include "2440addr.h"   
#include "2440lib.h"
#include "2440slib.h"
unsigned char SendBuffer;
char *SendBuffer1 = "Hello world!" ;

void Delay(int time)//看门狗延时,1ms级
{
        U32 val = (PCLK>>3)/1000-1;//计数缓冲器的值,当FCLK=304MHZ时,val=18999
       
        rTCFG0 &= ~(0xff<<8);   //定时器输入时钟频率=PCLK/(预分频值+1)/分频值,19MHZ
        rTCFG0 |= 3<<8;                        //定时器2,3,4的预分频值=3
        rTCFG1 &= ~(0xf<<12);   //定时器3选通输入
        rTCFG1 |= 0<<12;                //分频值=2

        rTCNTB3 = val;          //定时器3计数缓冲值=val
        rTCMPB3 = val>>1;                //定时器3比较缓冲值=val/2
        rTCON &= ~(0xf<<16);    //定时器3的控制寄存器
        rTCON |= 0xb<<16;                //自动加载,关闭变相,手动更新计数值和比较值,启动定时器
        rTCON &= ~(2<<16);                //取消手动更新
        while(time--) {         //延时次数
                while(rTCNTO3>=val>>1);//一直等待计数到小于val/10
                while(rTCNTO3<val>>1);//一直等待计数=0,然后重载计数缓冲值
        };
}

void __irq Dma0Done(void)
{   
    unsigned char i;
    ClearPending(BIT_DMA0);
    Delay(1000);
    for(i=0;i<=250;i++) SendBuffer=i;
    rDISRC0=(U32)SendBuffer;
    rDCON0 |=(1<<31)|(0<<30)|(1<<29)|(0<<28)|(0<<27)|(1<<24)|(1<<23)|(1<<22)|(0<<20)|(250);
    rDMASKTRIG0=(0<<2)|(1<<1)|(0<<0);
}

void DMA_M2M(void)
{
    rINTMSK &=~(1<<17);//open the dma0 interrupt

    rGPBCON |=((1<<19)|(1<<21));            //GPB9,10 used for nXDACK0,nXDREQ0
    rDISRC0=(U32)SendBuffer1;                  //source data address
    rDISRCC0 |=((0<<1)|(0<<0));               //address increment , the source is in the AHB
    rDIDST0=(U32)UTXH0;                        //destinationis UTXH0
    rDIDSTC0 |=((0<<2)|(1<<1)|(1<<0));      //address not change ,APB,   enable interrupt
   
      

    rDCON0 |=(1<<31)|(0<<30)|(1<<29)|(0<<28)|(0<<27)|(1<<24)|(1<<23)|(1<<22)|(0<<20)|(250);
    rDMASKTRIG0=(0<<2)|(1<<1)|(0<<0);//start dma transmitDR_Base=cpar;

}

void Main(void)
{
    char mdiv=127,pdiv=2,sdiv=1,hdivn=13,pdivn=11;
        ChangeMPllValue(mdiv,pdiv,sdiv);
        ChangeClockDivider(hdivn,pdivn);   
         
rGPHCON &= 0xffff0f;
rGPHCON |= 0x0000a0;
rGPHUP = 0x7ff;

rULCON0= 0x03;
rUCON0 |=((1<<0)|(1<<3)|(2<<10));   
//rUCON0   = 0x0005;
rUBRDIV0 = 72;
DMA_M2M();
while(1);
}









程序中的中断语句

void __irq Dma0Done(void)
{   
    unsigned char i;
    ClearPending(BIT_DMA0);
    Delay(1000);
    for(i=0;i<=250;i++) SendBuffer=i;
    rDISRC0=(U32)SendBuffer;
    rDCON0 |=(1<<31)|(0<<30)|(1<<29)|(0<<28)|(0<<27)|(1<<24)|(1<<23)|(1<<22)|(0<<20)|(250);
    rDMASKTRIG0=(0<<2)|(1<<1)|(0<<0);
}

一直卡在for语句   for语句中的i值一直位1加不上去,能不能帮小弟查一下什么问题,之前用DMA实现内存搬运也是这个问题,赋值自动归0不能加上去,现在换串口DMA也是这样,搞了1天都没解决

mm275861 发表于 2013-3-30 22:36:42

求建议或者解决方法~~~~~{:cry:}

aozima 发表于 2013-3-30 23:24:27

是否有cache?建议进行指令级的调试,并直接观察内存。

mm275861 发表于 2013-3-31 17:37:01

aozima 发表于 2013-3-30 23:24 static/image/common/back.gif
是否有cache?建议进行指令级的调试,并直接观察内存。

今天看了一下cache    原来是cache的问题,但不会解决,看不明    能说一下方法不?

aozima 发表于 2013-3-31 18:36:38

可以先把cache关掉,再研究怎么解决。

mm275861 发表于 2013-3-31 21:52:36

aozima 发表于 2013-3-31 18:36 static/image/common/back.gif
可以先把cache关掉,再研究怎么解决。

问题解决了~~~~谢谢,真的是cache问题

aozima 发表于 2013-3-31 21:56:43

深入研究:
cache line size
刷新cache
数据缓冲 cache line size对齐
dma buffer与普通buffer
同时对整个SDRAM进行两次映射,默认为cache,另1块1:1映射的区域 non-cacheable
页: [1]
查看完整版本: 2440的DMA 无法赋值,内容如下