打印

PERINTFRC如何启动DMA

[复制链接]
2768|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
heweibig|  楼主 | 2012-1-2 15:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
heweibig|  楼主 | 2012-1-2 15:20 | 只看该作者
#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的情况。

使用特权

评论回复
板凳
shimx| | 2012-1-2 15:22 | 只看该作者
楼主详细说说

使用特权

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

使用特权

评论回复
5
huangchui| | 2012-1-2 15:24 | 只看该作者
感觉你的初始化程序是哪儿没设置好

使用特权

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

使用特权

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

使用特权

评论回复
8
jlyuan| | 2012-1-2 15:29 | 只看该作者
试一下楼上说的

使用特权

评论回复
9
heweibig|  楼主 | 2012-1-2 15:30 | 只看该作者
好的,结贴了

使用特权

评论回复
10
teet| | 2012-1-2 23:02 | 只看该作者
貌似都是高手啊

使用特权

评论回复
11
teet| | 2012-1-2 23:03 | 只看该作者
我都没看明白呢

使用特权

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

本版积分规则

869

主题

13089

帖子

7

粉丝