Hi, I'm writing a program that uses ePWM7 ADCSOCA to trigger SOC1 and then ADCINT1. In ADCISR, CLA1TASK1 is triggered through software __asm(" IACK #0x0001");
In this case, ADCINT1 can be triggered and executed, but CLA1TASK1 cannot be triggered.
If I configure ADCINT1 to be triggered by software, then both ADCINT and CLA1TASK1 can be triggered and executed.
What may cause the problem?
The code for ePWM7 ADCSOCA to trigger SOC1 and then ADCINT1 is shown below:
//ePWM7 initialization
void EPWM7_Config( USHORT period )
{
EPwm7Regs.ETSEL.bit.SOCAEN = 1; // Enable SOC on A group
EPwm7Regs.ETSEL.bit.SOCASEL = 4; // Select SOC from from CPMA on upcount
EPwm7Regs.ETPS.bit.SOCAPRD = 1; // Generate pulse on 1st event
EPwm7Regs.CMPA.half.CMPA = period/2; // Set compare A value
EPwm7Regs.TBPRD = period; // Set period for ePWM1
EPwm7Regs.TBCTL.bit.CTRMODE = 0; // count up and start
UNPROTECT_REGS( );
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;
PROTECT_REGS( );
}
//ADC initialization
void Adc_SOC_Init( void )
{
EALLOW;
PieVectTable.ADCINT1 = &adc_isr; //映射ADC中断
EDIS;
InitAdc();
PieCtrlRegs.PIEIER1.bit.INTx1 = 1; //使能PIE级INT1.1中断
IER |= M_INT1; //使能CPU级INT1中断
// EINT; //使能总中断
EALLOW;
AdcRegs.ADCCTL1.bit.INTPULSEPOS = 1; //转换完成前一个ADC时钟周期产生EOC
AdcRegs.INTSEL1N2.bit.INT1E = 1; //使能ADCINT1
AdcRegs.INTSEL1N2.bit.INT1CONT = 0; //关闭连续模式
AdcRegs.INTSEL1N2.bit.INT1SEL = 1; //将ADCINT1映射到EOC1
AdcRegs.ADCSOC0CTL.bit.TRIGSEL = 0x11; //epwm7A 触发
AdcRegs.ADCSOC1CTL.bit.TRIGSEL = 0x11; //
AdcRegs.ADCSOC2CTL.bit.TRIGSEL = 0x11; //
AdcRegs.ADCSOC3CTL.bit.TRIGSEL = 0x11;
AdcRegs.ADCSOC4CTL.bit.TRIGSEL = 0x11;
AdcRegs.ADCSOC5CTL.bit.TRIGSEL = 0x11;
AdcRegs.ADCSOC6CTL.bit.TRIGSEL = 0x11;
AdcRegs.ADCSOC7CTL.bit.TRIGSEL = 0x11;
AdcRegs.ADCSOC8CTL.bit.TRIGSEL = 0x11;
AdcRegs.ADCSOC9CTL.bit.TRIGSEL = 0x11;
AdcRegs.ADCSOC10CTL.bit.TRIGSEL = 0x11;
AdcRegs.ADCSOC11CTL.bit.TRIGSEL = 0x11;
AdcRegs.ADCSOC12CTL.bit.TRIGSEL = 0x11;
AdcRegs.ADCSOC13CTL.bit.TRIGSEL = 0x11;
AdcRegs.ADCSOC0CTL.bit.CHSEL = 8; //B0 DC V1
AdcRegs.ADCSOC1CTL.bit.CHSEL = 9; //B1 DC V2
AdcRegs.ADCSOC2CTL.bit.CHSEL = 10; //B2 DC V3
AdcRegs.ADCSOC3CTL.bit.CHSEL = 11; //B3 DC V4
AdcRegs.ADCSOC4CTL.bit.CHSEL = 12; //B4 DC V5
AdcRegs.ADCSOC5CTL.bit.CHSEL = 13; //B5 DC V6
AdcRegs.ADCSOC6CTL.bit.CHSEL = 14; //B6 DC V7
AdcRegs.ADCSOC7CTL.bit.CHSEL = 7; //A7 DC I1
AdcRegs.ADCSOC8CTL.bit.CHSEL = 6; //A6 DC I2
AdcRegs.ADCSOC9CTL.bit.CHSEL = 5; //A5 DC I3
AdcRegs.ADCSOC10CTL.bit.CHSEL = 4; //A4 DC I4
AdcRegs.ADCSOC11CTL.bit.CHSEL = 3; //A3 DC I5
AdcRegs.ADCSOC12CTL.bit.CHSEL = 2; //A2 DC I6
AdcRegs.ADCSOC13CTL.bit.CHSEL = 1; //A1 DC I7
AdcRegs.ADCSOC0CTL.bit.ACQPS = 6; //set SOC0 S/H Window to 7 ADC Clock Cycles, (6 ACQPS plus 1)
AdcRegs.ADCSOC1CTL.bit.ACQPS = 6; //set SOC1 S/H Window to 7 ADC Clock Cycles, (6 ACQPS plus 1)
AdcRegs.ADCSOC2CTL.bit.ACQPS = 6; //set SOC1 S/H Window to 7 ADC Clock Cycles, (6 ACQPS plus 1)
AdcRegs.ADCSOC3CTL.bit.ACQPS = 6; //set SOC1 S/H Window to 7 ADC Clock Cycles, (6 ACQPS plus 1)
AdcRegs.ADCSOC4CTL.bit.ACQPS = 6; //set SOC1 S/H Window to 7 ADC Clock Cycles, (6 ACQPS plus 1)
AdcRegs.ADCSOC5CTL.bit.ACQPS = 6; //set SOC1 S/H Window to 7 ADC Clock Cycles, (6 ACQPS plus 1)
AdcRegs.ADCSOC6CTL.bit.ACQPS = 6; //set SOC1 S/H Window to 7 ADC Clock Cycles, (6 ACQPS plus 1)
AdcRegs.ADCSOC7CTL.bit.ACQPS = 6; //set SOC0 S/H Window to 7 ADC Clock Cycles, (6 ACQPS plus 1)
AdcRegs.ADCSOC8CTL.bit.ACQPS = 6; //set SOC1 S/H Window to 7 ADC Clock Cycles, (6 ACQPS plus 1)
AdcRegs.ADCSOC9CTL.bit.ACQPS = 6; //set SOC1 S/H Window to 7 ADC Clock Cycles, (6 ACQPS plus 1)
AdcRegs.ADCSOC10CTL.bit.ACQPS = 6; //set SOC1 S/H Window to 7 ADC Clock Cycles, (6 ACQPS plus 1)
AdcRegs.ADCSOC11CTL.bit.ACQPS = 6; //set SOC1 S/H Window to 7 ADC Clock Cycles, (6 ACQPS plus 1)
AdcRegs.ADCSOC12CTL.bit.ACQPS = 6; //set SOC1 S/H Window to 7 ADC Clock Cycles, (6 ACQPS plus 1)
AdcRegs.ADCSOC13CTL.bit.ACQPS = 6; //set SOC1 S/H Window to 7 ADC Clock Cycles, (6 ACQPS plus 1)
EDIS;
}
//ADC中断服务函数
interrupt void adc_isr(void)
{
unsigned char chan;
Measurement_Vd[0] = AdcResult.ADCRESULT0; //
Measurement_Vd[1] = AdcResult.ADCRESULT1;
Measurement_Vd[2] = AdcResult.ADCRESULT2;
Measurement_Vd[3] = AdcResult.ADCRESULT3;
Measurement_Vd[4] = AdcResult.ADCRESULT4;
Measurement_Vd[5] = AdcResult.ADCRESULT5;
//Measurement_Vd[6] = AdcResult.ADCRESULT6;
Measurement_Id[0] = AdcResult.ADCRESULT7;
Measurement_Id[1] = AdcResult.ADCRESULT8;
Measurement_Id[2] = AdcResult.ADCRESULT9;
Measurement_Id[3] = AdcResult.ADCRESULT10;
Measurement_Id[4] = AdcResult.ADCRESULT11;
Measurement_Id[5] = AdcResult.ADCRESULT12;
// Measurement_Id[6] = AdcResult.ADCRESULT13;
////
__asm(" IACK #0x0001"); //强制触发CLA1
AdcRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; //清除EOC1信号(ADCINT1)
PieCtrlRegs.PIEACK.all |= PIEACK_GROUP1; //写1清0,写0无效
return;
}
//:
void main(void)
{
//other configuration
...
Adc_SOC_Init(); //初始化ADC
EPWM7_Config( KSwPrdCnst*10 );; // 初始化EPWM7 KSwPrdCnst = 600
... //其他函数
}