Part Number: TMS320F280049C
Hi,
I want to use the CLA, when the trip zone interrupt occurs. Trip zone occurs cycle by cycle. I use CLA_forceTasks inside the tripzone interrupt ISR. But CLA is not working. Variables in CLA is not changing.
The following code is variables that are transferred between CPU and CLA.
#pragma DATA_SECTION(iL1_sensed_real_poz,"CpuToCla1MsgRAM");
volatile float32_t iL1_sensed_real_poz;
#pragma DATA_SECTION(iL1_sensed_real_neg,"CpuToCla1MsgRAM");
volatile float32_t iL1_sensed_real_neg;
#pragma DATA_SECTION(TTPLPFC_ac_vol_sensed_Volts,"CpuToCla1MsgRAM");
volatile float32_t TTPLPFC_ac_vol_sensed_Volts;
#pragma DATA_SECTION(TTPLPFC_vBus_sensed_Volts,"CpuToCla1MsgRAM");
volatile float32_t TTPLPFC_vBus_sensed_Volts;
#pragma DATA_SECTION(TripZoneCNTR1,"CpuToCla1MsgRAM");
volatile float32_t TripZoneCNTR1;
#pragma DATA_SECTION(grid_direction,"CpuToCla1MsgRAM");
volatile int16_t grid_direction;
#pragma DATA_SECTION(iL1_ort,"Cla1ToCpuMsgRAM");
volatile float32_t iL1_ort;
The following code is CLA configuration.
void setupCLA(void)
{
memcpy((uint32_t *)&Cla1ProgRunStart, (uint32_t *)&Cla1ProgLoadStart,(uint32_t)&Cla1ProgLoadSize);
memcpy((uint32_t *)&Cla1ConstRunStart, (uint32_t *)&Cla1ConstLoadStart,(uint32_t)&Cla1ConstLoadSize );
MemCfg_initSections(MEMCFG_SECT_MSGCPUTOCLA1);
MemCfg_initSections(MEMCFG_SECT_MSGCLA1TOCPU);
while(!MemCfg_getInitStatus(MEMCFG_SECT_MSGCPUTOCLA1));
while(!MemCfg_getInitStatus(MEMCFG_SECT_MSGCLA1TOCPU));
MemCfg_setLSRAMMasterSel(MEMCFG_SECT_LS0, MEMCFG_LSRAMMASTER_CPU_ONLY);
MemCfg_setLSRAMMasterSel(MEMCFG_SECT_LS1, MEMCFG_LSRAMMASTER_CPU_ONLY);
MemCfg_setLSRAMMasterSel(MEMCFG_SECT_LS2, MEMCFG_LSRAMMASTER_CPU_ONLY);
MemCfg_setLSRAMMasterSel(MEMCFG_SECT_LS3, MEMCFG_LSRAMMASTER_CPU_ONLY);
MemCfg_setLSRAMMasterSel(MEMCFG_SECT_LS4, MEMCFG_LSRAMMASTER_CPU_CLA1);
MemCfg_setLSRAMMasterSel(MEMCFG_SECT_LS5, MEMCFG_LSRAMMASTER_CPU_ONLY);
MemCfg_setLSRAMMasterSel(MEMCFG_SECT_LS6, MEMCFG_LSRAMMASTER_CPU_ONLY);
MemCfg_setLSRAMMasterSel(MEMCFG_SECT_LS7, MEMCFG_LSRAMMASTER_CPU_ONLY);
MemCfg_setCLAMemType(MEMCFG_SECT_LS0, MEMCFG_CLA_MEM_PROGRAM);
MemCfg_setCLAMemType(MEMCFG_SECT_LS1, MEMCFG_CLA_MEM_PROGRAM);
MemCfg_setCLAMemType(MEMCFG_SECT_LS2, MEMCFG_CLA_MEM_PROGRAM);
MemCfg_setCLAMemType(MEMCFG_SECT_LS3, MEMCFG_CLA_MEM_PROGRAM);
MemCfg_setCLAMemType(MEMCFG_SECT_LS4, MEMCFG_CLA_MEM_PROGRAM);
MemCfg_setCLAMemType(MEMCFG_SECT_LS5, MEMCFG_CLA_MEM_PROGRAM);
MemCfg_setCLAMemType(MEMCFG_SECT_LS6, MEMCFG_CLA_MEM_DATA);
MemCfg_setCLAMemType(MEMCFG_SECT_LS7, MEMCFG_CLA_MEM_DATA);
#pragma diag_suppress=770
CLA_mapTaskVector(CLA1_BASE , CLA_MVECT_1, (uint16_t)&Cla1Task1);
CLA_setTriggerSource(CLA_TASK_1, CLA_TRIGGER_SOFTWARE);
#pragma diag_warning=770
CLA_enableIACK(CLA1_BASE);
CLA_enableTasks(CLA1_BASE, CLA_TASKFLAG_1 | CLA_TASKFLAG_2 );
Interrupt_register(INT_myCLA01, &cla1Isr1);
Interrupt_enable(INT_myCLA01);
}
The following code is trip zone interrupt setup
void setupInterrupt(void)
{
Interrupt_register(INT_myEPWM2_TZ, &INT_myEPWM2_TZ_ISR);
EPWM_enableTripZoneInterrupt(EPWM2_BASE, EPWM_TZ_INTERRUPT_DCBEVT2);
Interrupt_enable(INT_myEPWM2_TZ);
setupCLA();
EALLOW;
//
//Enable Global interrupt INTM
//
EINT;
//
//Enable Global realtime interrupt DBGM
//
ERTM;
EDIS;
}
interrupt void cla1Isr1(void)
{
//
// Acknowledge the end-of-task interrupt for task 1
//
Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP11);
//
// Uncomment to halt debugger and stop here
//
// asm(" ESTOP0");
}
In the following code, iL1_ort is calculated in CLA. But, it is not working.
interrupt void INT_myEPWM2_TZ_ISR(void)
{
TripZoneCNTR1 = (EPWM_getTimeBaseCounterValue(TTPLPFC_HIGH_FREQ_PWM1_BASE) + 1) * CPU_SYS_CLOCK_PERIOD;
duty_ref = TripZoneCNTR1;
CLA_forceTasks(CLA1_BASE,CLA_TASKFLAG_1);
iL1_avg = iL1_ort;
Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP2);
}