搜索
bottom↓
回复: 6

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

[复制链接]

出0入0汤圆

发表于 2013-3-30 22:12:20 | 显示全部楼层 |阅读模式
先上程序



#define GLOBAL_CLK 1
#include "def.h"
#include "option.h"
#include "2440addr.h"     
#include "2440lib.h"
#include "2440slib.h"
unsigned char SendBuffer[255];
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]=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;                          //destination  is 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]=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天都没解决

阿莫论坛20周年了!感谢大家的支持与爱护!!

你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。

出0入0汤圆

 楼主| 发表于 2013-3-30 22:36:42 | 显示全部楼层
求建议或者解决方法~~~~~

出0入0汤圆

发表于 2013-3-30 23:24:27 | 显示全部楼层
是否有cache?建议进行指令级的调试,并直接观察内存。

出0入0汤圆

 楼主| 发表于 2013-3-31 17:37:01 | 显示全部楼层
aozima 发表于 2013-3-30 23:24
是否有cache?建议进行指令级的调试,并直接观察内存。

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

出0入0汤圆

发表于 2013-3-31 18:36:38 | 显示全部楼层
可以先把cache关掉,再研究怎么解决。

出0入0汤圆

 楼主| 发表于 2013-3-31 21:52:36 | 显示全部楼层
aozima 发表于 2013-3-31 18:36
可以先把cache关掉,再研究怎么解决。

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

出0入0汤圆

发表于 2013-3-31 21:56:43 | 显示全部楼层
深入研究:
cache line size
刷新cache
数据缓冲 cache line size对齐
dma buffer与普通buffer
同时对整个SDRAM进行两次映射,默认为cache,另1块1:1映射的区域 non-cacheable
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-10-3 05:25

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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