1.自动reload模式开关 DCON0的 22位 0:表示自动重载 1:表示当TC为0 后 DMA关闭
2. 单服务模式 : 表示 每传输一次后 DMA停止 等待其他DMA请求
全服务模式 : 进行一个原子操作后DMA释放总线 又试图重新得到总线 防止其他总线设备得到总控制
3.在串口传输中 地址不应该增加,而是固定
4.注意在传输大小上 DSZ要 为BYTE 一个字节
#define uart 0x50000020
#define fclk (405000000)
#define pclk (fclk/6)
#define baud (115200)
static volatile int dma_done;
char buf[] = "please input a string :\n";
static void __irq DMA_ISR(void)
{
rSRCPND |= (1<<17);
rINTPND |= (1<<17);
dma_done = 1;
}
// TC=len DSZ = 4 TSZ=1 len=0x200000; 实际大小为 0x200000*4;
void dma_memcpy(void)
{
int len;
// len = strlen(buf);
rDISRC0 = (U32)buf;
rDISRCC0 = 0; ////注意此处要为 地址固定
rDIDST0 = UTXH0;
rDIDSTC0 = (1<<1)|(1<<0);//TC 为0 中断出现 AHB总线 地址增加 //注意此处要为 固定模式
rDCON0 = (1<<31)|(0<<30)|(1<<29)|(0<<27)|(1<<24)|(1<<23)|(1<<22)|(0<<20)|(0x2);//该为单服务模式
/* 20: word 22: 1 为0 通道关闭 23 :soft 24:26: nXDREQ0
27: whole 28:0 29:1 30:1 31:1
*/
//rDMASKTRIG0 = 0x03;//
rDMASKTRIG0 = 0x02;
}
void uart_init(void)
{
rGPHCON = rGPHCON & (~(0xffff)) ;
rGPHCON = rGPHCON | (0xaaa0) ;
rGPHUP = 0x0; // The pull up function is enable
rULCON0 = 0x03;
rUCON0 = 0x0a; //DMA请求模式 非中断模式
rUFCON0 = 0;
rUBRDIV0 = ( (int)(pclk/16./baud+0.5) -1 );
}
int xmain(void)
{
char *str;
char string[255];
char a;
char *zero = 0;
int i;
int j;
// char *send_data = (char *) 0x31800000;
ChangeClockDivider(3,1);//1:3:6
ChangeMPllValue(127,2,1); //405MHZ
Isr_Init();
uart_init();
rSRCPND |= (1<<17);
rINTPND |= (1<<17);
pISR_DMA0 = (U32) DMA_ISR;
rINTMSK &= ~(1<<17);//打开中断
// Uart_Printf("dma_uarttest is ....\n");
dma_done = 0;
dma_memcpy();//注意此处的方向 如果是内存到内存 那么源地址只能是 高地址 ----低地址
//Uart_Printf("%x\n",rUTXH0);
/**** 0x200000 为大小 这个是最大的 TC=0x200000=len ***/
while(dma_done == 0) ;
Uart_Printf("\n0x%x\n",buf);
Uart_Printf("\n%s\n",buf);
while (1) ;
}
阅读(3260) | 评论(0) | 转发(3) |