Chinaunix首页 | 论坛 | 博客
  • 博客访问: 69193
  • 博文数量: 72
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 12
  • 用 户 组: 普通用户
  • 注册时间: 2014-12-04 23:21
文章分类
文章存档

2015年(72)

我的朋友

分类: 嵌入式

2015-04-15 10:47:56

#include "2440lib.h"
#include "2440addr.h"
static volatile int dma_done;
static void __irq DMA_ISR(void)
{
    rSRCPND |= (1<<17);
    rINTPND |= (1<<17);
 
    Uart_Printf("dma is done\n");
    dma_done = 1;
}
//  TC=len DSZ = 4  TSZ=1  len=0x200000;  实际大小为 0x200000*4;
void dma_memcpy(int src, int dst, int len)
{

 rDISRC0 = ((int)src &0x7FFFFFFF);
 
 rDISRCC0 = 0; //地址增加  AHB 总线
 
 rDIDST0 = ((int)dst & 0x7FFFFFFF);
 
 rDIDSTC0 = 0;//TC 为0 中断出现 AHB总线 地址增加
 
    rDCON0 = (1<<31)|(1<<30)|(1<<29)|(1<<27)|(1<<22)|(2<<20)|(len);
  
   /* 20: word  22: 1 为0 通道关闭   23 :soft  24:26: nXDREQ0 
   27:  whole  28:0  29:1 30:1 31:1
   */
  
    rDMASKTRIG0 = 0x03;
}
 
 
int xmain(void)
{
 char *str;        
    char string[255];
   
    char *zero = 0;
    int i;
    int j;
    char *send_data = (char *) 0x31800000;
    char *buf = "please input a string :\n";
    ChangeClockDivider(3,1);//1:3:6
 ChangeMPllValue(127,2,1);  //405MHZ
 
 Isr_Init();
 Uart_Init(0, 115200);
 Uart_Select(0); //必须加上面三行 否则串口打印出错的信息
  
    rSRCPND |= (1<<17);
    rINTPND |= (1<<17);
    pISR_DMA0 = (U32) DMA_ISR;
    rINTMSK &= ~(1<<17);//打开中断
   
    for (i=0;buf[i] != '\0';i++)
   
    {
     send_data[i] = buf[i];
   
    }
  
   
    Uart_Printf("dma is start\n");
    dma_done = 0;
   
    dma_memcpy(0x31800000,0x31000000,0x200000);//注意此处的方向  如果是内存到内存  那么源地址只能是 高地址 ----低地址
   
    /****  0x200000  为大小   这个是最大的    TC=0x200000=len***/
    
    while(dma_done == 0) ;
   
    Uart_Printf("dma is success!\n");
   
    Uart_Printf("%c \n",(*(int*)0x31000000)); //打印出第一个字符 进行验证  注意 不能打印 0x31000002  4字节对齐才行
      
      
 
   while (1) ;
}
 
 
可以从高到低也可以从低到高 ,但是调试的时候要注意多重启动AXD,不能点运行太快 ,容易死机!!
阅读(507) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~