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

TMS320F28035: DCAEVT1的中断无法清除

Part Number:TMS320F28035

(*ePWM[1]).DCTRIPSEL.bit.DCAHCOMPSEL = DC_COMP2OUT;// DCAH = Comparator 2 output(*ePWM[1]).TZDCSEL.bit.DCAEVT1 = TZ_DCAH_HI;// DCAEVT1 =  DCAH HIGH(will become active as Comparator output goes high)当DCAH事件为高时则DCAEVT1事件发生(*ePWM[1]).DCACTL.bit.EVT1SRCSEL = DC_EVT1;// DCAEVT1 =No filtered(*ePWM[1]).DCACTL.bit.EVT1FRCSYNCSEL = DC_EVT_ASYNC;// Take async path(*ePWM[1]).TZEINT.bit.DCAEVT1= 1;PieCtrlRegs.PIEIER2.bit.INTx1 = 1;IER |= M_INT2;//TZISR__interrupt void TZ2_ISR(void)
{if((*ePWM[1]).TBSTS.bit.CTRDIR==1){(*ePWM[1]).AQSFRC.bit.OTSFA==1;(*ePWM[3]).AQSFRC.bit.OTSFA==1;}else{(*ePWM[1]).AQSFRC.bit.OTSFA==1;}EPwm1Regs.TZCLR.bit.INT = 1;EPwm1Regs.TZCLR.bit.DCAEVT1 = 1;PieCtrlRegs.PIEACK.all = PIEACK_GROUP2;// Acknowledge interrupt to PIE
//asm("NOP");return;

}

代码中设置了epwm1模块的数字比较器以COPM2的输出作为DCAEVT1事件,并设置了中断触发,但在实际中发现中断只执行了一次,并且TZFLG[INT]以及TZFLG[DCAEVT1]标志位一直是1,在

EPwm1Regs.TZCLR.bit.INT = 1; //Clear TZ flag reinitialize for next SOC
EPwm1Regs.TZCLR.bit.DCAEVT1 = 1;

这两句设置了断点,发现标志位仍然是1,这是什么原因导致的。

Yale Li:

检查一下COMP2是否一直在触发DCAEVT1事件

,

? ?:

请问该如何检查,我观察到COMPSTS寄存器状态是在变化的

,

? ?:

你好,我发现问题所在了,TZCLR寄存器需要配合EALLOW以及EDIS使用,加上以后就能正常清除中断标志位了,进入中断了。但我想知道,我为了防止一次比较器置高事件一直触发DCAEVT1,从而重复进入中断,为此我在中断程序中加入了一段判断语句,以使得只触发一次中断,这样是否可行。

while(Comp1Regs.COMPSTS==1)

{

}

,

Yale Li:

? ? 说:TZCLR寄存器需要配合EALLOW以及EDIS使用,加上以后就能正常清除中断标志位了,进入中断了。

好的,感谢反馈;

你上述的代码准备加在哪里?

,

? ?:

我准备加在中断函数TZ2_ISR的return之前

__interrupt void TZ2_ISR(void)
{EALLOW;if((*ePWM[1]).TBSTS.bit.CTRDIR==1)//假如处于上升沿{(*ePWM[1]).AQSFRC.bit.OTSFA==1;//进行一次软件强制事件,即EPWMA取反(*ePWM[3]).AQSFRC.bit.OTSFA==1;}else//下降沿则同步整流不动作{(*ePWM[1]).AQSFRC.bit.OTSFA==1;}EPwm1Regs.TZCLR.bit.INT = 1;//Clear TZ flag reinitialize for next SOCEPwm1Regs.TZCLR.bit.DCAEVT1 = 1;PieCtrlRegs.PIEACK.all = PIEACK_GROUP2;// Acknowledge interrupt to PIE
//asm("NOP");EDIS;while(Comp2Regs.COMPSTS==1){asm("NOP");}return;
}

赞(0)
未经允许不得转载:TI中文支持网 » TMS320F28035: DCAEVT1的中断无法清除
分享到: 更多 (0)