
我在使用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:
你可以在此时的中断子程查看中断标志寄存器,看是否有其他中断存在还没有响应或者如果高优先级中断挂接了函数,在函数中断点跟踪一下
TI中文支持网