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