Part Number: TMS320F28377S
I have set up EPwm3 (in up-down-count mode) to trigger an interrupt on CMPA match while up-counting. The interrupt executes but will stop at random times unless I manually clear EPwm3Regs.ETCLRbit.INT in a watch window, then it re-starts but eventually stops unless I re-clear it via watch window. This only seems to occur when I've got the emulator (XDS110) connected; when running without the emulator it fortunately doesn't seem to happen.
I am using the EPWMXLINK register to link EPwm3.TBPRD to EPwm1.TBPRD, along with EPwm2, 6, 8, 10 (EPwm3Regs.EPWMXLINK.bit.TBPRDLINK = 0;). If I disable the EPWMXLINK the problem goes away, so it appears to be related to EPWMXLINK.
The initialization and interrupt code for EPwm3 below.
Thanks in advance for any insight.
/***** Configure EPwm3 *******************************************************/
CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 0; /* Disable PWM clocks */
CpuSysRegs.PCLKCR2.bit.EPWM3 = 1;
EPwm3Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;
EPwm3Regs.TBCTL.bit.PHSEN = TB_ENABLE;
EPwm3Regs.TBCTL.bit.PRDLD = TB_SHADOW;
EPwm3Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN;
EPwm3Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;
EPwm3Regs.TBCTL.bit.CLKDIV = TB_DIV1;
EPwm3Regs.TBCTL.bit.FREE_SOFT = 0;
EPwm3Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
EPwm3Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;
EPwm3Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
EPwm3Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
EPwm3Regs.CMPCTL.bit.LOADASYNC = SET_LOADABMODE;
EPwm3Regs.CMPCTL.bit.LOADBSYNC = SET_LOADABMODE;
EPwm3Regs.ETSEL.bit.INTSEL = ET_CTRU_CMPA;
EPwm3Regs.ETSEL.bit.INTEN = ENABLE_EPWM_INTERRUPT; /* EPwm1 interrupt is enabled */
EPwm3Regs.ETSEL.bit.SOCASELCMP = CMPA_CMPB_SOC;
EPwm3Regs.ETSEL.bit.SOCBSELCMP = CMPA_CMPB_SOC;
EPwm3Regs.ETSEL.bit.INTSELCMP = CMPA_CMPB_INT;
EPwm3Regs.ETSEL.bit.SOCASEL = ET_CTR_ZERO;
EPwm3Regs.ETSEL.bit.SOCAEN = DISABLE_EPWM_SOCA;
EPwm3Regs.ETSEL.bit.SOCBSEL = ET_CTR_ZERO;
EPwm3Regs.ETSEL.bit.SOCBEN = DISABLE_EPWM_SOCB;
EPwm3Regs.ETPS.bit.INTPRD = ET_1ST;
EPwm3Regs.ETPS.bit.INTPSSEL = USE_ETPS;
EPwm3Regs.ETPS.bit.SOCPSSEL = USE_ETPS_SOCPS;
EPwm3Regs.ETPS.bit.SOCAPRD = DISABLE_SOCA;
EPwm3Regs.ETPS.bit.SOCBPRD = DISABLE_SOCB;
EPwm3Regs.TBPRD = EPwm1Regs.TBPRD;
EPwm3Regs.CMPA.bit.CMPA = 90;
EPwm3Regs.TBPHS.bit.TBPHS = 0;
EPwm3Regs.TBCTR = 0;
EPwm3Regs.DBCTL.bit.OUT_MODE = DB_DISABLE;
EPwm3Regs.EPWMXLINK.bit.TBPRDLINK = 0;
PieVectTable.EPWM3_INT = &ISR_EPwm;
EPwm3Regs.ETCLR.bit.INT = 1;
PieCtrlRegs.PIEACK.all = PIEACK_GROUP3;
PieCtrlRegs.PIEIER3.bit.INTx3 = 1;
CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 1; /* Enable PWM clocks */
/**************************************************************************/
The ISR code is below. The variable ISR_Counter stops incrementing when the code stops, indicating the problem.
interrupt void ISR_EPwm(void)
{
ISR_Counter++;
EPwm3Regs.ETCLR.bit.INT = 1; /* Clear PCMC EPwm2 interrupt flag */
PieCtrlRegs.PIEACK.all = PIEACK_GROUP3;}
}