网站公告列表

  没有公告

加入收藏
设为首页
联系站长
您现在的位置: 61IC中国电子在线 >> 服务导航 >> 帮助中心 >> C2000 >> 文章正文
  F2812 XINT1中断后,程序总是跑飞?           ★★★ 【字体:
F2812 XINT1中断后,程序总是跑飞?
作者:61IC    文章来源:本站原创    点击数:    更新时间:2006-12-31    

 

问题如下:

问题有两个:

1。 为什么xint1的中断函数中要再次使能group1中断(下面代码中①)和总中断使能(下面代码中②)即使没有关闭中断(DINT)?其它的比如TIMER1,PWM,CAPTURE等中断则不需要在服务程序中再次使能
2。进入XINT1中断后,程序总是跑飞??

void IsrXINT1(void)
{
static Uint16 key_pad =0;
        volatile Uint16 TempPIEIER = PieCtrlRegs.PIEIER1.all;
        IER |= MINT1;                  // ①

      PieCtrlRegs.PIEACK.all |= PIEACK_GROUP1;   // Acknowledge interrupt to PIE
        PieCtrlRegs.PIEACK.all = 0xFFFF;   // Enable PIE interrupts        

        DINT;
        PieCtrlRegs.PIEIER1.all = TempPIEIER;
        EINT; //②
return;
}

答案如下:

不需要对IER寄存器进行操作
不需要返回值,所以使用RETURN是多余的
不清楚你的PIE中断向量表是否已正确的初始化和重定位
PieVectTable.XINT1   = &XINT1_ISR;             //re-mapped XINT1_ISR to PIE_table
还有好几个地方也是多余的
interrupt void  XINT1_ISR(void)
{
     unsigned int tmp;
     int tmpi;
     tmp=*AdinRegs<<2;
     tmpi=tmp;
     Adina[AdCount]=tmpi>>2;
     tmp=*AdinRegs<<2;
     tmpi=tmp;
     Adinb[AdCount]=tmpi>>2;
     tmp=*AdinRegs<<2;
     tmpi=tmp;
     Adinc[AdCount]=tmpi>>2;
     tmp=*AdinRegs<<2;
     tmpi=tmp;
     Adind[AdCount]=tmpi>>2;
     AdCount++;
     if(AdCount>512)
     {
       AdVala=CalTrueVal(Adina+1,512)/65536.0*10+0.0005;
       AdValb=CalTrueVal(Adinb+1,512)/65536.0*10+0.0005;
       AdValc=CalTrueVal(Adinc+1,512)/65536.0*10+0.0005;
       AdVald=CalTrueVal(Adind+1,512)/65536.0*10+0.0005;
       AdCount=0;
     }
  // Insert ISR Code here     
  
  // To receive more interrupts from this PIE group, acknowledge this interrupt
     //PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
     PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
  // Next two lines for debug only to halt the processor here
  // Remove after inserting ISR Code
  //  asm ("  ESTOP0";
  // for(;;

}

问题如下:

上面那一段是TI的例子里面的,只不过中断向量已经重新定位(PieVectTable.XINT1 = &IsrXINT1;)。我很奇怪,它为什么要重新操作IER寄存器,如果不那样做,后面的中断干脆就不进来了,用了之后,即使会跑飞(掉到陷阱里),但是还可以进这个XINT1中断。

另外,你的程序里面为什么连PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;都不要?不要清中断标志吗?

答案如下:

有啊,没看清楚?
这是一段AD采样和计算512点电压有效值的程序,很正常的!

问题如下:

我是没看清楚 :P。隐藏在注释中了。我就是有疑问,TI的例程干嘛要那样写。而且,我在调试的时候去掉还不行。而且我看了寄存器,GLOBLE 使能位在中断后就被清零,导致其他中断也没有响应。所以,加了EINT就可以了。郁闷。就这个XINT1其他中断都正常。

               欢迎点击进入:TI德州中文网   (国内唯一针对TI应用的中文技术网站)    文章录入:admin    责任编辑:admin 
  • 上一篇文章:

  • 下一篇文章:
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    最新热点 最新推荐 相关文章
    TMS320F2812 ADC初始化问题
    TMS320F2812外部存储器的疑问
    如何软件模拟出硬件中断
    关于调试仿真时的问题
    DSP/BIOS问题?
    如何在分配数组时,让它的首…
    TMS320F2812的.sect "ramfun…
    TMS3202812外扩RAM代替FLASH…
    成功烧写TMS320F2812经验
    TMS320F2812允许中断嵌套吗?
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    站长:61IC 湘ICP备05002478号