Other Parts Discussed in Thread: SYSCONFIG
Hello, I am facing a problem with CLB and ePWM modules. I had configured CLB to create an auxiliary clock using CLB TILE4 and I could capture the clock in oscilloscope with the sysconfig standalone project. However, when I integrated the project into a motor control program that configured the ePWM1 module like in the following code, there would be no clock generated anymore. I found that the function InitEPwmTcExample(0) at line 32 was the reason. How could I resolve this confict?
Thanks for taking the time to read this!
#include <Main.h>
volatile struct EPWM_REGS *ePWM[] ={ &EPwm1Regs,
                                     &EPwm2Regs,
                                     &EPwm3Regs,
                                     &EPwm4Regs,
                                     &EPwm5Regs,
                                     &EPwm6Regs,
                                     &EPwm7Regs,
                                     &EPwm8Regs,
                                     &EPwm9Regs,
                                     &EPwm10Regs,
                                     &EPwm11Regs,
                                     &EPwm12Regs };
void ConfigEPWM(void)
{
    EALLOW;
    CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 0;
    EDIS;
    EALLOW;
    ClkCfgRegs.PERCLKDIVSEL.bit.EPWMCLKDIV = 0;
    EDIS;
    EALLOW;
    EPwm1Regs.TZFRC.bit.OST = 1;
    EPwm2Regs.TZFRC.bit.OST = 1;
    EPwm3Regs.TZFRC.bit.OST = 1;
    EDIS;
    InitEPwmTcExample(0);
    InitEPwmTcExample(1);
    InitEPwmTcExample(2);
    EPwm1Regs.ETSEL.bit.SOCAEN = 1;
    EPwm1Regs.ETSEL.bit.SOCASEL = 1;
    EPwm1Regs.ETPS.bit.SOCAPRD = 1;
    EPWM_disablePhaseShiftLoad(EPWM1_BASE);
    EPWM_setPhaseShift(EPWM1_BASE, 0U);
    EPWM_enableSyncOutPulseSource(EPWM1_BASE, EPWM_SYNC_OUT_PULSE_ON_CNTR_ZERO);
    configurePhase(EPWM2_BASE, EPWM1_BASE, 0);
    configurePhase(EPWM3_BASE, EPWM1_BASE, 0);
    EPWM_setSyncInPulseSource(EPWM2_BASE, EPWM_SYNC_IN_PULSE_SRC_SYNCOUT_EPWM1);
    EPWM_setSyncInPulseSource(EPWM3_BASE, EPWM_SYNC_IN_PULSE_SRC_SYNCOUT_EPWM1);
    EPWM_enablePhaseShiftLoad(EPWM2_BASE);
    EPWM_enablePhaseShiftLoad(EPWM3_BASE);
    EALLOW;
    GpioCtrlRegs.GPAPUD.bit.GPIO0 = 1;
    GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1;
    GpioCtrlRegs.GPAPUD.bit.GPIO1 = 1;
    GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 1;
    GpioCtrlRegs.GPAPUD.bit.GPIO2 = 1;
    GpioCtrlRegs.GPAMUX1.bit.GPIO2 = 1;
    GpioCtrlRegs.GPAPUD.bit.GPIO3 = 1;
    GpioCtrlRegs.GPAMUX1.bit.GPIO3 = 1;
    GpioCtrlRegs.GPAPUD.bit.GPIO4 = 1;
    GpioCtrlRegs.GPAMUX1.bit.GPIO4 = 1;
    GpioCtrlRegs.GPAPUD.bit.GPIO5 = 1;
    GpioCtrlRegs.GPAMUX1.bit.GPIO5 = 1;
    EDIS;
    EALLOW;
    CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 1;
    EDIS;
    GPIO_setDirectionMode(84, GPIO_DIR_MODE_OUT); // Enable PWM EN (PWMEN_INV - SN74LVCC3245A) refer to CJ_GPIO.c
    PWM_EN;
}
void InitEPwmTcExample(Uint16 module)
{
    ePWM[module]->TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;
    ePWM[module]->TBCTL.bit.PHSEN = TB_DISABLE;
    ePWM[module]->TBPHS.bit.TBPHS = 0x0000;
    ePWM[module]->TBCTL.bit.HSPCLKDIV = TB_DIV1;
    ePWM[module]->TBCTL.bit.CLKDIV = TB_DIV1;
    ePWM[module]->TBPRD = 6250;
    ePWM[module]->TBCTR = 0x0000;
    ePWM[module]->AQCTLA.bit.CAU = AQ_CLEAR;
    ePWM[module]->AQCTLA.bit.CAD = AQ_SET;
    ePWM[module]->DBCTL.bit.OUT_MODE = DB_FULL_ENABLE;
    ePWM[module]->DBCTL.bit.IN_MODE = DBA_ALL;
    ePWM[module]->DBRED.bit.DBRED = 660;
    ePWM[module]->DBFED.bit.DBFED = 660;
    ePWM[module]->DBCTL.bit.POLSEL = DB_ACTV_LOC;
    ePWM[module]->CMPA.bit.CMPA = 3124;
}
void configurePhase(uint32_t base, uint32_t masterBase, uint16_t phaseVal)
{
    uint32_t readPrdVal, phaseRegVal;
    readPrdVal = EPWM_getTimeBasePeriod(masterBase);
    if((HWREGH(base + EPWM_O_TBCTL) & 0x3U) == EPWM_COUNTER_MODE_UP_DOWN)
    {
        phaseRegVal = (2U * readPrdVal * phaseVal) / 360U;
    }
    else if((HWREGH(base + EPWM_O_TBCTL) & 0x3U) < EPWM_COUNTER_MODE_UP_DOWN)
    {
        phaseRegVal = (readPrdVal * phaseVal) / 360U;
    }
    EPWM_selectPeriodLoadEvent(base, EPWM_SHADOW_LOAD_MODE_SYNC);
    EPWM_setPhaseShift(base, phaseRegVal);
    EPWM_setTimeBaseCounter(base, phaseRegVal);
}
								
				
                          