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

2015年(72)

我的朋友

分类: 嵌入式

2015-04-15 10:47:53

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) ;
}
阅读(442) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~