#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,不能点运行太快 ,容易死机!!
阅读(537) | 评论(0) | 转发(0) |