打印

如何启动DMA

[复制链接]
3072|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wuhany|  楼主 | 2013-2-28 21:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
wuhany|  楼主 | 2013-2-28 21:11 | 只看该作者
#pragma DATA_SECTION(DMABuf1,"DMARAML4");
#pragma DATA_SECTION(DMABuf2,"DMARAML5");

volatile Uint16 DMABuf1[1024];
volatile Uint16 DMABuf2[1024];

volatile Uint16 *DMADest;
volatile Uint16 *DMASource;
Uint16 i,j;
//interrupt void local_DINTCH1_ISR(void);


void main(void)
{
   Uint16 i;
        InitSysCtrl();
   InitPieCtrl();

// Disable CPU interrupts and clear all CPU interrupt flags:
   IER = 0x0000;
   IFR = 0x0000;

        DMAInitialize();

        // Initialize Tables
   for (i=0; i<BUF_SIZE; i++)
   {
     DMABuf1[i] = 0;
         DMABuf2[i] = i;
   }

        
// Configure DMA Channel
    DMADest   = &DMABuf1[0];
        DMASource = &DMABuf2[0];
           DMACH1AddrConfig(DMADest,DMASource);
        DMACH1BurstConfig(31,2,2);         //Will set up to use 32-bit datasize, pointers are based on 16-bit words
        DMACH1TransferConfig(31,2,2);      //so need to increment by 2 to grab the correct location
        DMACH1WrapConfig(0xFFFF,0,0xFFFF,0);
        
   // DMACH1ModeConfig(0,PERINT_ENABLE,ONESHOT_ENABLE,CONT_DISABLE,SYNC_DISABLE,SYNC_SRC,OVRFLOW_DISABLE,THIRTYTWO_BIT,CHINT_END,0);

    DmaRegs.CH1.MODE.bit.ONESHOT=1;
        DmaRegs.CH1.MODE.bit.DATASIZE=1;
        

    DmaRegs.CH1.MODE.bit.PERINTSEL=0;
    DmaRegs.CH1.CONTROL.bit.PERINTFRC=1;
        DmaRegs.CH1.MODE.bit.PERINTE=1;
    // Clear any spurious flags:
        DmaRegs.CH1.CONTROL.bit.PERINTCLR = 1;                  // Clear any spurious interrupt flags
        DmaRegs.CH1.CONTROL.bit.SYNCCLR = 1;                    // Clear any spurious sync flags
        DmaRegs.CH1.CONTROL.bit.ERRCLR = 1;

        StartDMACH1();   
  

   while(1)
         {
                  
                    DmaRegs.CH1.CONTROL.bit.PERINTFRC = 1;
                        j = 0;
                  if(DmaRegs.CH1.CONTROL.bit.PERINT标志寄存器==1)
                        j = 1;
                  
                        for(i=0;i<1000;i++);
                        i=0;
                        
         }
   
}

我设置了PERINTFRC = 1,但是始终也没检测到PERINT标志寄存器=1的情况。

使用特权

评论回复
板凳
zhenykun| | 2013-2-28 21:13 | 只看该作者
楼主详细说说

使用特权

评论回复
地板
wuhany|  楼主 | 2013-2-28 21:13 | 只看该作者
就是说虽然给定了PERINTFRC =1,但是PERINTFRC =1事件并没有让PERINT标志寄存器=1,从而没有启动DMA.

使用特权

评论回复
5
wyjie| | 2013-2-28 21:15 | 只看该作者
感觉你的初始化程序是哪儿没设置好

使用特权

评论回复
6
huangchui| | 2013-2-28 21:15 | 只看该作者
这个对我这个菜鸟来说有点高难度,帮你顶上去吧。

使用特权

评论回复
7
jiaxw| | 2013-2-28 21:35 | 只看该作者
我也不太懂,不过PERINTFRC是受保护的--
你这样试试,或许能行:
EALLOW;
DmaRegs.CH1.CONTROL.bit.PERINTFRC=1;
EDIS;

使用特权

评论回复
8
huangchui| | 2013-2-28 21:35 | 只看该作者
试一下楼上说的

使用特权

评论回复
9
wuhany|  楼主 | 2013-2-28 21:38 | 只看该作者
好的,结贴了

使用特权

评论回复
10
wuhany|  楼主 | 2013-2-28 21:38 | 只看该作者
多谢大家啊

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

879

主题

10435

帖子

4

粉丝