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.

[参考译文] TMS320F28035:CLA 不能被触发

Guru**** 2606725 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/684379/tms320f28035-cla-cannot-be-triggered

器件型号:TMS320F28035

大家好、我正在编写一个程序、该程序使用  ePWM7 ADCSOCA 触发 SOC1、然后使用 ADCINT1。 在 ADCISC 中、CLA1TASK1通过软件 __asm (" IACK #0x0001")触发;  

在这种情况下、可以触发并执行 ADCINT1、但不能触发 CLA1TASK1。

如果我将 ADCINT1配置为由软件触发、那么 ADCINT 和 CLA1TASK1都可以被触发并执行。

什么可能导致问题?

 ePWM7 ADCSOCA  触发 SOC1、然后触发 ADCINT1的代码如下所示:

 //ePWM7初始化

void EPWM7_Config (USHORT 周期)

          EPwm7Regs.ETSEL.bit.SOCAEN        = 1;                    //在组上启用 SOC

          EPwm7Regs.ETSEL.bit.SOCASEL      = 4;                    //从 CPMA 中选择 SOC,启用计数

          EPwm7Regs.ETPS.bit.SOCAPRD       = 1;                    //在发生第一个事件时生成脉冲

 

          EPwm7Regs.CMPA.half.CMPA =周期/2;          //设置比较值

          EPwm7Regs.TBPRD                            =周期;         //为 ePWM1设置周期

          EPwm7Regs.TBCTL.bit.CTRMODE = 0;                    //向上计数并启动

 

          unprotect_regs();

          SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC=1;

          protect_regs();

 

//ADC 初始化

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中断 μ s

          // EINT;                 使能总中断 μ s

 

           EALLOW;

            AdcRegs.ADCCTL1.bit.INTPULSEPOS = 1;  转换完成前一个ADC时钟周期产生EOC μ s

            AdcRegs.INTSEL1N2.bit.INT1E  = 1;  使能ADCINT1 μ s

            AdcRegs.INTSEL1N2.bit.INT1CONT = 0;  //关闭连续模式

            AdcRegs.INTSEL1N2.bit.INT1SEL = 1;  将ADCINT1映射到EOC1 μ s

 

            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;   //将 SOC0 S/H 窗口设置为7个 ADC 时钟周期(6个 ACQPS 加1)

                    AdcRegs.ADCSOC1CTL.bit.ACQPS          = 6;   //将 SOC1 S/H 窗口设置为7个 ADC 时钟周期(6个 ACQPS 加1)

                    AdcRegs.ADCSOC2CTL.bit.ACQPS          = 6;   //将 SOC1 S/H 窗口设置为7个 ADC 时钟周期、(6个 ACQPS 加1)

                    AdcRegs.ADCSOC3CTL.bit.ACQPS          = 6;   //将 SOC1 S/H 窗口设置为7个 ADC 时钟周期(6个 ACQPS 加1)

                    AdcRegs.ADCSOC4CTL.bit.ACQPS          = 6;   //将 SOC1 S/H 窗口设置为7个 ADC 时钟周期(6个 ACQPS 加1)

                    AdcRegs.ADCSOC5CTL.bit.ACQPS          = 6;   //将 SOC1 S/H 窗口设置为7个 ADC 时钟周期(6个 ACQPS 加1)

                    AdcRegs.ADCSOC6CTL.bit.ACQPS          = 6;   //将 SOC1 S/H 窗口设置为7个 ADC 时钟周期(6个 ACQPS 加1)

                    AdcRegs.ADCSOC7CTL.bit.ACQPS          = 6;   //将 SOC0 S/H 窗口设置为7个 ADC 时钟周期(6个 ACQPS 加1)

                    AdcRegs.ADCSOC8CTL.bit.ACQPS          = 6;   //将 SOC1 S/H 窗口设置为7个 ADC 时钟周期(6个 ACQPS 加1)

                    AdcRegs.ADCSOC9CTL.bit.ACQPS          = 6;   //将 SOC1 S/H 窗口设置为7个 ADC 时钟周期(6个 ACQPS 加1)

                    AdcRegs.ADCSOC10CTL.bit.ACQPS = 6;          //将 SOC1 S/H 窗口设置为7个 ADC 时钟周期(6个 ACQPS 加1)

                    AdcRegs.ADCSOC11CTL.bit.ACQPS = 6;          //将 SOC1 S/H 窗口设置为7个 ADC 时钟周期(6个 ACQPS 加1)

                    AdcRegs.ADCSOC12CTL.bit.ACQPS = 6;          //将 SOC1 S/H 窗口设置为7个 ADC 时钟周期、(6个 ACQPS 加1)

                    AdcRegs.ADCSOC13CTL.bit.ACQPS = 6;          //将 SOC1 S/H 窗口设置为7个 ADC 时钟周期(6个 ACQPS 加1)

            EDIS;

 

ADC中断服务函数 μ s

中断空 ADC_ISR (空)

 

          unsigned char chan;

 

          measuring_Vd[0]= AdcResult.ADCRESULT0;//

          measuring_Vd[1]= AdcResult.ADCRESULT1;

          measuring_Vd[2]= AdcResult.ADCRESULT2;

          measuring_Vd[3]= AdcResult.ADCRESULT3;

          measuration_Vd[4]= AdcResult.ADCRESULT4;

          measuring_Vd[5]= AdcResult.ADCRESULT5;

          //Measurement_Vd[6]= AdcResult.ADCRESULT6;

 

          measuration_ID[0]= AdcResult.ADCRESULT7;

          测量_ID[1]= AdcResult.ADCRESULT8;

          measuration_ID[2]= AdcResult.ADCRESULT9;

          measuration_ID[3]= AdcResult.ADCRESULT10;

          measuration_ID[4]= AdcResult.ADCRESULT11;

          measuration_ID[5]= AdcResult.ADCRESULT12;

//       测量_ID[6]= AdcResult.ADCRESULT13;

////

 

          _asm (" IACK #0x0001");//强制触发CLA1

 

           AdcRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;  清除EOC1信号(ADCINT1)

           PieCtrlRegs.PIEACK.ALL |= PIEACK_Group1; //写1清0,写0无效

 返回;

 

//:

void main (void)

 //其他配置

 (笑声)

 ADC_SOC_Init(); //初始化ADC

 EPWM7_Config (KSwPrdCnst*10);//初始化EPWM7 KSwPrdCnst = 600

(笑声) 其他函数 μ s

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Howard、

    您确定在 CLA 中启用了 IACK 功能了。 您是否在 CLA 寄存器中设置了 IACKE 位?

    此致、
    SAL