This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

c6722b GPIO中断问题?



我在使用6722b的过程中,有如上两个问题想咨询一下?

谢谢

  • 1)

    我不太明白你的意思

    你是否想问的是从中断产生到中断响应到发出读命令是8us?

    中断子程共是10us

    8us比较长了,你的测试方法不对,因为你加入了 进入中断子程到发命令的时间

    2)

    CPU指令并没有停止

  • Thomas Yang,你好!
    首先,非常感谢你的回复.
     
    我想问的是从中断产生到中断响应到发出读命令是8us, 也太长了点.
       *(int *)PLLDIV0 = DIVENABLED | DIV1;        //25MHz
       *(int *)PLLM = 8;//TIMES10;       
       *(int *)PLLDIV1 = DIVENABLED | DIV1;        //SysClk1=200MHz 
       for(i=0;i<8;i++);
       *(int *)PLLDIV2 = DIVENABLED | DIV2;        //SysClk2=200MHz/4=50MHz
       for(i=0;i<8;i++);
       *(int *)PLLDIV3 = DIVENABLED | 4;//DIV3;   //SysClk3=200MHz/5=40MHz 
    我使用的是6722b, CPU 时钟为200MHz, EMIF时钟为40MHz.
    为了能接收GPIO中断,我还添加了:
            -l rts67plus.lib
            applySystemPatch.obj
            -l c672xSystemPatchV2_00_00.lib
    我将程序分段贴上来, 请帮我看看:
    这是中断响应部分(我使用的EMIF的时钟为100MHz): 
    Uint16  ReadGPIO_StatusLwy(void)
    {
        volatile Uint16 *p;  
        p=(Uint16 *)0x90000014; //`define cStatusRegAddr 9'b000001010
        return (*p);
    }
    volatile int theIsPulse=0;
    void interrupt xint( void )
    {
        Uint16 theRet;
        theIsTx=0;
        theRet=ReadGPIO_StatusLwy();    //此时操作EMIF,也即清中断部分
        i f (theRet & 0x0020)
       {
           theIsTx=1;
       }
      if (theRet & 0x0040)
      {
           theIsRx=1;
           theRx=ReadRxData();
      }
      if (theRet & 0x0080)
      {
           theIsPCIWrite=1;
      }
      if (theRet & 0x0400)
      {
           theIsPulse=1;
      }
    }
     
    这是主程序循环部分:
      while(1)
      {
        if (theIsPulse)
       {
         theIsPulse=0;  
         i++;  
         if (i & 1)
         {  
            m=20;
            j=0x8000;
         }
         else
        {
           m=10;
          j=0;
        }
        WritePulseData(0x84,m);
        WritePulseData(0x88,j);
        WritePulseData(0x8C,10);
        WritePulseData(0x90,0);  
        WritePulseData(0x94,10);
        WritePulseData(0x98,0);  
        WritePulseData(0x9C,10);
        WritePulseData(0xA0,0);  
        WritePulseStatus(1);
        }
      }
     
    谢谢
     
  • 200MHZ 的主频 8us 会执行1600个cycle

    你是从什么时间点开始计算的?

  • Thomas Yang,你好!
    首先,非常感谢你的回复.
     
    我想问的是从中  产生到中断响应到发出读命令是8us, 也太长了点.
       *(int *)PLLDIV0 = DIVENABLED | DIV1;        //25MHz
       *(int *)PLLM = 8;//TIMES10;       
       *(int *)PLLDIV1 = DIVENABLED | DIV1;        //SysClk1=200MHz
       for(i=0;i<8;i++);
       *(int *)PLLDIV2 = DIVENABLED | DIV2;        //SysClk2=200MHz/4=50MHz
       for(i=0;i<8;i++);
       *(int *)PLLDIV3 = DIVENABLED | 4;//DIV3;   //SysClk3=200MHz/5=40MHz

    我使用的是6722b, CPU 时钟为200MHz, EMIF时钟为40MHz.
    为了能接收GPIO中断,我还添加了:
            -l rts67plus.lib
            applySystemPatch.obj
            -l c672xSystemPatchV2_00_00.lib
    我将程序分段贴上来, 请帮我看看:
    这是中断响应部分(我使用的EMIF的时钟为100MHz):
    Uint16  ReadGPIO_StatusLwy(void)
    {
        volatile Uint16 *p; 
        p=(Uint16 *)0x90000014; //`define cStatusRegAddr 9'b000001010
        return (*p);
    }
    volatile int theIsPulse=0;
    void interrupt xint( void )
    {
        Uint16 theRet;
        theIsTx=0;
        theRet=ReadGPIO_StatusLwy();    //此时操作EMIF,也即清中断部分
        i f (theRet & 0x0020)
       {
           theIsTx=1;
       }
      if (theRet & 0x0040)
      {
           theIsRx=1;
           theRx=ReadRxData();
      }
      if (theRet & 0x0080)
      {
           theIsPCIWrite=1;
      }
      if (theRet & 0x0400)
      {
           theIsPulse=1;
      }
    }
     
    这是主程序循环部分:
      while(1)
      {
        if (theIsPulse)
       {
         theIsPulse=0; 
         i++; 
         if (i & 1)
         { 
            m=20;
            j=0x8000;
         }
         else
        {
           m=10;
          j=0;
        }
        WritePulseData(0x84,m);
        WritePulseData(0x88,j);
        WritePulseData(0x8C,10);
        WritePulseData(0x90,0); 
        WritePulseData(0x94,10);
        WritePulseData(0x98,0); 
        WritePulseData(0x9C,10);
        WritePulseData(0xA0,0); 
        WritePulseStatus(1);
        }
      }
     
    我的所有时间都是用示波器测量得到的.

  • 你好

    有没有可能在你外部中断接收的时候,DSP运行在一个高优先级的中断程序里,出现了中断嵌套或者你的中断子程是关中断的。导致你测量时间比较长。

    建议检查下中断配置和运行情况

    谢谢!

  • 另外,你可以在一个帖子里发帖吗?便于跟踪

    谢谢!

  • 已经把贴子合并,请您在一个贴子下提问,这样便于我们的专家跟踪问题。谢谢!

  •    CFGMCASP0 = 1; //select extrnal interrupt is AXR0[7]/spi1_clk  

      GBLCTL =0;     //disable McASP0

       PFUNC |= 0x080; //AXR0[7] is GPIO

       PDIR  &= ~0x080; //AXR0[7] is GP Input

       AMUTE &= ~8; //INEN =0 ;

       EVENT26 = EVENT26_PARA;

       DEPR  &= ~0x04000000;

       DEHPR |= 0x04000000;

       DEER  |= 0x04000000;      

    这是我关于中断部分的初始化, 应该没有其它更高优先级的中断在运行啊?????

  • 你可以在此时的中断子程查看中断标志寄存器,看是否有其他中断存在还没有响应或者如果高优先级中断挂接了函数,在函数中断点跟踪一下