TI中文支持网
TI专业的中文技术问题搜集分享网站

c6722b GPIO中断问题?

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

谢谢

Thomas Yang1:

1)

我不太明白你的意思

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

中断子程共是10us

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

2)

CPU指令并没有停止

long haitao:

回复 Thomas Yang1:

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);
    }
  }
 

谢谢

 

Thomas Yang1:

回复 Thomas Yang1:

200MHZ 的主频 8us 会执行1600个cycle

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

long haitao:

回复 Thomas Yang1:

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);    }  } 我的所有时间都是用示波器测量得到的.

Thomas Yang1:

回复 Thomas Yang1:

你好

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

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

谢谢!

Thomas Yang1:

回复 Thomas Yang1:

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

谢谢!

deyisupport:

回复 Thomas Yang1:

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

long haitao:

   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;      

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

Thomas Yang1:

回复 long haitao:

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

赞(0)
未经允许不得转载:TI中文支持网 » c6722b GPIO中断问题?
分享到: 更多 (0)