This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

TMS320F28377S: EPwm3 ISR Stops When Using the Emulator

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

}