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.

[参考译文] TMS320F28379D:复位时 ISR 非法

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1479817/tms320f28379d-illegal-isr-upon-reset

器件型号:TMS320F28379D

工具与软件:

尊敬的专家:

我正在尝试将 RAM 中的 ADC_ISR 代码从闪存中复制、以获得更高的速度。 为了执行此操作,我 在 main ()中添加了"#define _flash",以将 InitFlash ()包含在 InitSysCtrl ()中。

然后、在 ADC_ISR 之前添加"#pragma CODE_SECTION (ADC_EOC、"ramfuncs")"。 在调试过程中、我只是根据链接器文件检查 ADC_ISR 是否已加载到指定地址中、并且是否在预期中找到该地址、您可以在第一个映像中看到它! 它从0x8000开始、这是 LS0RAM 的 strat 地址。 一旦运行被按下、一切看起来都很完美-根据模拟信号采集模拟信号和角蛋白并由 ePWM1触发 ADC。

#include "F28x_Project.h"
#include <math.h>
#include <stdio.h>

#define _FLASH

extern void InitSysCtrl(void);
extern void InitPieCtrl(void);
extern void InitPieVectTable(void);

#define TWO_PI 6.283185307179586476925286766559



interrupt void ADCs_EOC(void);

void Initialize_GPIO(void);
void Custom_Init(void);

void PWM1_Init(void);
void Init_ADCs(void);
void X_bar(void);

int buff[100],i,b,c,d=0;
float pi,V_alpha,V_beta,Vd,Vq,R,Y,B,temp,temp2,theta,a;


void main(void)
{

   InitSysCtrl();
   Custom_Init();
   PWM1_Init();
   Init_ADCs();
   DINT;
   Initialize_GPIO();
   InitPieCtrl();

   IER = 0x0000;
   IFR = 0x0000;
   InitPieCtrl();
   InitPieVectTable();

   EALLOW;
   PieCtrlRegs.PIEIER1.bit.INTx1 = 1;    //ADC-A1

   PieVectTable.ADCA1_INT = &ADCs_EOC;
   PieCtrlRegs.PIECTRL.bit.ENPIE= 1;
   EDIS;

   IER |= 1;
   EINT;  // Enable Global interrupt INTM
   ERTM;  // Enable Global realtime interrupt DBGM

   while(1)
       {

        }
}
void Initialize_GPIO(void)
{
    EALLOW;
    //GPIO 18 - Xbar input
 /*       GpioCtrlRegs.GPAMUX2.bit.GPIO18 = 0;
    //    GpioCtrlRegs.GPAGMUX2.bit.GPIO18 = 0;
    //    GpioCtrlRegs.GPAPUD.bit.GPIO18 = 1;
   //     GpioCtrlRegs.GPADIR.bit.GPIO18 = 0;
   //     GpioCtrlRegs.GPACSEL3.bit.GPIO18 = 0;
   //     GpioCtrlRegs.GPAQSEL2.bit.GPIO18 = 3;
        InputXbarRegs.INPUT5SELECT = 18;

*/
    // LED out
        GpioCtrlRegs.GPBDIR.bit.GPIO34 = 1;
        GpioCtrlRegs.GPADIR.bit.GPIO31 = 1;
        GpioCtrlRegs.GPCDIR.bit.GPIO73= 1;


   //PWMs
        GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1; //ePWM1A
        GpioCtrlRegs.GPAMUX1.bit.GPIO2 = 1; //ePWM2A
        GpioCtrlRegs.GPAMUX1.bit.GPIO4 = 1; //ePWM3A
        GpioCtrlRegs.GPAMUX1.bit.GPIO6 = 1; //ePWM4A
        GpioCtrlRegs.GPAMUX1.bit.GPIO8 = 1; //ePWM5A
        GpioCtrlRegs.GPAMUX1.bit.GPIO10 = 1; //ePWM6A

    EDIS;

}
void Custom_Init(void)
{
    EALLOW;
    ClkCfgRegs.CLKSRCCTL1.bit.OSCCLKSRCSEL=1;
    ClkCfgRegs.AUXPLLMULT.bit.IMULT=20;
    ClkCfgRegs.SYSCLKDIVSEL.bit.PLLSYSCLKDIV=0;
    ClkCfgRegs.SYSPLLCTL1.bit.PLLCLKEN = 1;
    ClkCfgRegs.LOSPCP.bit.LSPCLKDIV = 2;
    ClkCfgRegs.PERCLKDIVSEL.bit.EPWMCLKDIV = 0;
    CpuSysRegs.PCLKCR0.bit.CPUTIMER0 = 1;
    CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 1;   ///source initsysctrl
    CpuSysRegs.PCLKCR2.bit.EPWM1 = 1;
    CpuSysRegs.PCLKCR2.bit.EPWM2 = 1;
    CpuSysRegs.PCLKCR2.bit.EPWM3 = 1;
    CpuSysRegs.PCLKCR2.bit.EPWM4 = 1;
    CpuSysRegs.PCLKCR2.bit.EPWM5 = 1;
    CpuSysRegs.PCLKCR2.bit.EPWM6 = 1;
    CpuSysRegs.PCLKCR2.bit.EPWM7 = 1;

    CpuSysRegs.PCLKCR13.bit.ADC_A = 1;
    CpuSysRegs.PCLKCR0.bit.CLA1 = 1;
    DevCfgRegs.CPUSEL0.bit.EPWM1 = 0;

    Flash0CtrlRegs.FPAC1.bit.PMPPWR = 1;  // Enable flash pump
    Flash0CtrlRegs.FRDCNTL.bit.RWAIT = 3; // Adjust wait states
    EDIS;
}

#pragma CODE_SECTION(ADCs_EOC, "ramfuncs")

void ADCs_EOC(void)
{
    Vd=100;
    Vq=0;
    c =c +1;
    if(c>3)
    {
        c=0;
    }

    a = AdcaResultRegs.ADCRESULT0; //Va

    temp = (a*62500)/4095;

    R = 1000-a;

    EPwm1Regs.CMPA.bit.CMPA = temp;
    EPwm1Regs.CMPB.bit.CMPB = temp + 9000;

    i= i+1;

    EPwm1Regs.ETCLR.bit.SOCA = 1;
    AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; //clear INT1 flag
    PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
}



void PWM1_Init(void)
{
          EALLOW;
          //R Phase
          EPwm1Regs.TBCTL.bit.CTRMODE = 0;             // Count up
          EPwm1Regs.TBPRD = 62500;                    // Set timer period
          EPwm1Regs.TBCTL.bit.PHSEN = 0;               // 1 for external SYNC
          EPwm1Regs.TBPHS.bit.TBPHS = 0x0000;          // Phase is 0
          EPwm1Regs.TBCTR = 0x0000;                    // Clear counter
          EPwm1Regs.TBCTL.bit.HSPCLKDIV = 2;           // Clock ratio to SYSCLKOUT
          EPwm1Regs.TBCTL.bit.CLKDIV = 4;
          EPwm1Regs.TBCTL.bit.SYNCOSEL = 1;
          // Setup shadow register load on ZERO
          EPwm1Regs.CMPCTL.bit.SHDWAMODE = 0;
          EPwm1Regs.CMPCTL.bit.SHDWBMODE = 0;
          EPwm1Regs.CMPCTL.bit.LOADAMODE = 0;
          EPwm1Regs.CMPCTL.bit.LOADBMODE = 0;
          // Set Compare values
                // Set compare A value
          // Set actions
          EPwm1Regs.AQCTLA.all = 0;
          EPwm1Regs.AQCTLA.bit.CAU = 2;                // Set PWM1A on TBCTR = CMPA
          EPwm1Regs.AQCTLA.bit.CBU = 1;                // Clear PWM1A on TBCTR = CMPB= CMPA + 100


          //SOCA to ADC
          EPwm1Regs.ETSEL.bit.SOCAEN=1;
          EPwm1Regs.ETSEL.bit.SOCASEL=1;
          EPwm1Regs.ETPS.bit.SOCAPRD = 1;
          EPwm1Regs.ETCLR.bit.SOCA = 1;

          EDIS;
}

void Init_ADCs(void)
{
    EALLOW;

            AdcaRegs.ADCCTL1.bit.INTPULSEPOS = 1;
            AdcbRegs.ADCCTL1.bit.INTPULSEPOS = 1;
            AdccRegs.ADCCTL1.bit.INTPULSEPOS = 1;

            AdcaRegs.ADCCTL1.bit.ADCPWDNZ = 1;
            AdcbRegs.ADCCTL1.bit.ADCPWDNZ = 1;
            AdccRegs.ADCCTL1.bit.ADCPWDNZ = 1;
   //         DELAY_US(1);

            AdcaRegs.ADCCTL2.bit.PRESCALE = 6;
            AdcbRegs.ADCCTL2.bit.PRESCALE = 6;
            AdccRegs.ADCCTL2.bit.PRESCALE = 6;

            AdcaRegs.ADCSOC0CTL.bit.CHSEL = 0;  //SOC0 will convert pin A0
            AdcaRegs.ADCSOC1CTL.bit.CHSEL = 1;  //SOC1 will convert pin A1
            AdcaRegs.ADCSOC2CTL.bit.CHSEL = 2;  //SOC2 will convert pin A2
            AdcaRegs.ADCSOC3CTL.bit.CHSEL = 3;  //SOC3 will convert pin A3
            AdcaRegs.ADCSOC4CTL.bit.CHSEL = 4;  //SOC4 will convert pin A4
            AdcaRegs.ADCSOC5CTL.bit.CHSEL = 5;  //SOC5 will convert pin A5


            AdcaRegs.ADCSOC0CTL.bit.ACQPS = 14; //sample window is 100 SYSCLK cycles
            AdcaRegs.ADCSOC1CTL.bit.ACQPS = 14; //sample window is 100 SYSCLK cycles
            AdcaRegs.ADCSOC2CTL.bit.ACQPS = 14; //sample window is 100 SYSCLK cycles
            AdcaRegs.ADCSOC3CTL.bit.ACQPS = 14; //sample window is 100 SYSCLK cycles
            AdcaRegs.ADCSOC4CTL.bit.ACQPS = 14; //sample window is 100 SYSCLK cycles
            AdcaRegs.ADCSOC5CTL.bit.ACQPS = 14; //sample window is 100 SYSCLK cycles


            AdcaRegs.ADCBURSTCTL.bit.BURSTEN = 1;
            AdcaRegs.ADCBURSTCTL.bit.BURSTSIZE = 11;
            AdcaRegs.ADCBURSTCTL.bit.BURSTTRIGSEL = 5;



            //interrupt
            AdcaRegs.ADCINTSEL1N2.bit.INT1SEL = 0; //end of SOC0 will set INT1 flag
            AdcaRegs.ADCINTSEL1N2.bit.INT1E = 1;   //enable INT1 flag
            AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; //make sure INT1 flag is cleared
            AdcaRegs.ADCINTSEL1N2.bit.INT1SEL = 0;
            AdcaRegs.ADCSOC1CTL.bit.TRIGSEL = 05;

    EDIS;
}

e2e.ti.com/.../5123.blink.zip

下图显示了 ADCIER、它从0x8000开始。

在微控制器复位之前、一切看起来都是正常的! 我希望它能继续发挥预期的功能(ePWM、获取模拟、PWM 三角 ADC)、但它停止了这种做法、最后得到 ILLEGAL_ISR!

我怀疑内存、 发现代码与前一个视图不同。 我不知道这是否是罪魁祸首、但只是分享意见。

请帮助我解决这个问题。

此致、

Rajesh。

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

    尊敬的 Rajesh:

    我正在 NMI 专家中循环查看您的问题。

    此致、

    Delaney

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

    尊敬的  Delaney:

    我还有另一个与 CLA 相关的问题、如果你不介意、请查看这个范围。

    TMS320F28379D:无法触发 CLA - C2000微控制器论坛- C2000 ︎ 微控制器- TI E2E 支持论坛

    此致、

    Rajesh。

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

    尊敬的 Rajesh:

    您是否能够单步执行代码并将其范围缩小到触发 ITRAP 的位置?

    是否确定设备已重置? 您是否知道它是因为 ITRAP ?

    谢谢

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

    您好、普拉坦:

    是、器件在复位时进入非法子例程(按下 launchpad 按钮)。

    我不确定是否是 ITRAP 使计算机进入非法 ISR。 我能看到的是、按下复位后、CPU 会指向地址0x082064、该地址对应于 ILLEGAL_ISR、调试模式退出运行模式。 按下 RUN 时、cCPU 在没有 PWM 和 ADC 运行的情况下运行!

    此致、

    Rajesh。

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

    尊敬的 Rajesh:

    你想达到什么目的?

    如果您的目标是触发 Xrsn (器件复位)并开始运行应用程序、请检查该应用程序是否在闪存中编程、以及引导模式是否设置为闪存引导模式。 可以使用引导模式引脚将引导模式设置为闪存引导模式、请查看参考手册以了解更多详细信息。

    谢谢

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

    Prarthan、您好!

    我认为这里存在一些混淆。

    在本线程的最初帖子中、我提到过目标是从闪存中复制 RAM 中的一段程序(ADC ISR)、以实现更好的延迟。

    引导模式引脚配置为制造商提供的默认位置、我认为它位于与闪存相对应的位置;

    如前所述、当 ISR 未复制到 RAM 时、运行过程将不会出现毛刺脉冲(省略"# pragma code section (rammfunc)"行)

    我希望我能更好地解释这一目标。 我在原始帖子中分享了该项目、供您参考。

    此致、

    Rajesh。

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

    尊敬的 Rajesh:

    请参阅注释 https://www.ti.com/lit/an/spra958l/spra958l.pdf

    我没有看到从闪存到 RAM 的 ADC ISR 的运行时副本。 您能否参考上面的应用手册并为此添加 memcpy 函数。

    谢谢

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

    尊敬的 Prarthan:

    "#define _FLASH"是在调用 InitSysCtrl()时用于合并闪存相关初始化的程序顶部定义的。 不管怎样、我也尝试根据您的建议使用 memcpy 运行。 但是、我看不到任何改善。

    此致、

    Rajesh。

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

    你(们)好

    我只是换了一行 #pragma CODE_SECTION (ADC_EOC、"ramfuncs") 或者会与  #pragma CODE_SECTION (ADCS_EOC、".TI.ramfunc")  现在运转正常。

    但是、我看到了几个 ITRAP0 存储器行的地址   ADC_ISR   复制。  

    下面是反汇编代码:

    这是 main.c

    #include "F28x_Project.h"
    #include <math.h>
    #include <stdio.h>
    
    #define _FLASH
    
    extern void InitSysCtrl(void);
    extern void InitPieCtrl(void);
    extern void InitPieVectTable(void);
    extern void InitFlash(void);
    extern void SeizeFlashPump(void);
    extern unsigned int  RamfuncsLoadStart;
    extern unsigned int  RamfuncsLoadEnd;
    extern unsigned int  RamfuncsRunStart;
    
    #define TWO_PI 6.283185307179586476925286766559
    
    
    
    interrupt void ADCs_EOC(void);
    interrupt void TimerOvf(void);
    
    void Initialize_GPIO(void);
    void Custom_Init(void);
    
    void PWM1_Init(void);
    void Init_ADCs(void);
    void X_bar(void);
    void timer0_init(void);
    
    int buff[100],i,b,c,d=0;
    float pi,V_alpha,V_beta,Vd,Vq,R,Y,B,temp,temp2,theta,a;
    
    
    void main(void)
    {
    
       InitSysCtrl();
       Custom_Init();
       PWM1_Init();
       Init_ADCs();
       DINT;
       Initialize_GPIO();
       InitPieCtrl();
       timer0_init();
    
     //  memcpy(&RamfuncsRunStart, &RamfuncsLoadStart, &RamfuncsLoadEnd - &RamfuncsLoadStart);
    
       memcpy(&RamfuncsRunStart, &RamfuncsLoadStart, (Uint32)&RamfuncsLoadSize);
    
    
       IER = 0x0000;
       IFR = 0x0000;
       InitPieCtrl();
       InitPieVectTable();
    
       EALLOW;
       PieCtrlRegs.PIEIER1.bit.INTx1 = 1;    //ADC-A1
       PieCtrlRegs.PIEIER1.bit.INTx7 = 1;
    
       PieVectTable.ADCA1_INT = &ADCs_EOC;
       PieVectTable.TIMER0_INT = &TimerOvf;
    
       PieCtrlRegs.PIECTRL.bit.ENPIE= 1;
       EDIS;
    
       IER |= 1;
       EINT;  // Enable Global interrupt INTM
       ERTM;  // Enable Global realtime interrupt DBGM
       CpuTimer0Regs.TCR.bit.TSS=0;
       while(1)
           {
    
            }
    }
    void Initialize_GPIO(void)
    {
        EALLOW;
        //GPIO 18 - Xbar input
     /*       GpioCtrlRegs.GPAMUX2.bit.GPIO18 = 0;
        //    GpioCtrlRegs.GPAGMUX2.bit.GPIO18 = 0;
        //    GpioCtrlRegs.GPAPUD.bit.GPIO18 = 1;
       //     GpioCtrlRegs.GPADIR.bit.GPIO18 = 0;
       //     GpioCtrlRegs.GPACSEL3.bit.GPIO18 = 0;
       //     GpioCtrlRegs.GPAQSEL2.bit.GPIO18 = 3;
            InputXbarRegs.INPUT5SELECT = 18;
    
    */
        // LED out
            GpioCtrlRegs.GPBDIR.bit.GPIO34 = 1;
            GpioCtrlRegs.GPADIR.bit.GPIO31 = 1;
            GpioCtrlRegs.GPCDIR.bit.GPIO73= 1;
    
    
       //PWMs
            GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1; //ePWM1A
            GpioCtrlRegs.GPAMUX1.bit.GPIO2 = 1; //ePWM2A
            GpioCtrlRegs.GPAMUX1.bit.GPIO4 = 1; //ePWM3A
            GpioCtrlRegs.GPAMUX1.bit.GPIO6 = 1; //ePWM4A
            GpioCtrlRegs.GPAMUX1.bit.GPIO8 = 1; //ePWM5A
            GpioCtrlRegs.GPAMUX1.bit.GPIO10 = 1; //ePWM6A
    
        EDIS;
    
    }
    void Custom_Init(void)
    {
        EALLOW;
        ClkCfgRegs.CLKSRCCTL1.bit.OSCCLKSRCSEL=1;
        ClkCfgRegs.AUXPLLMULT.bit.IMULT=20;
        ClkCfgRegs.SYSCLKDIVSEL.bit.PLLSYSCLKDIV=0;
        ClkCfgRegs.SYSPLLCTL1.bit.PLLCLKEN = 1;
        ClkCfgRegs.LOSPCP.bit.LSPCLKDIV = 2;
        ClkCfgRegs.PERCLKDIVSEL.bit.EPWMCLKDIV = 0;
        CpuSysRegs.PCLKCR0.bit.CPUTIMER0 = 1;
        CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 1;   ///source initsysctrl
        CpuSysRegs.PCLKCR2.bit.EPWM1 = 1;
        CpuSysRegs.PCLKCR2.bit.EPWM2 = 1;
        CpuSysRegs.PCLKCR2.bit.EPWM3 = 1;
        CpuSysRegs.PCLKCR2.bit.EPWM4 = 1;
        CpuSysRegs.PCLKCR2.bit.EPWM5 = 1;
        CpuSysRegs.PCLKCR2.bit.EPWM6 = 1;
        CpuSysRegs.PCLKCR2.bit.EPWM7 = 1;
    
        CpuSysRegs.PCLKCR13.bit.ADC_A = 1;
        CpuSysRegs.PCLKCR0.bit.CLA1 = 1;
        DevCfgRegs.CPUSEL0.bit.EPWM1 = 0;
    
        Flash0CtrlRegs.FPAC1.bit.PMPPWR = 1;  // Enable flash pump
        Flash0CtrlRegs.FRDCNTL.bit.RWAIT = 3; // Adjust wait states
        EDIS;
    }
    
    void timer0_init(void)
    {
        EALLOW;
        CpuTimer0Regs.PRD.bit.MSW = 0x0004;
        CpuTimer0Regs.PRD.bit.LSW = 0x0080;
        CpuTimer0Regs.TPR.bit.TDDR = 0x0013;
    
    
        CpuTimer0Regs.TCR.bit.TIE= 1;
        CpuTimer0Regs.TCR.bit.TSS=1;
        CpuTimer0Regs.TCR.bit.FREE=0;
        CpuTimer0Regs.TCR.bit.TRB=0;
        EDIS;
    }
    
    void TimerOvf(void)
    {
        b= b+1;
    
        if(b>10)
        {
            b=1;
        }
        GpioDataRegs.GPBTOGGLE.bit.GPIO34=1;
        GpioDataRegs.GPATOGGLE.bit.GPIO31=1;
        CpuTimer0Regs.TCR.bit.TIF = 1;
        PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
    }
    
    #pragma CODE_SECTION(ADCs_EOC, ".TI.ramfunc")
    
    void ADCs_EOC(void)
    {
        Vd=100;
        Vq=0;
        c =c +1;
        if(c>3)
        {
            c=0;
        }
    
        a = AdcaResultRegs.ADCRESULT0; //Va
    
        temp = (a*62500)/4095;
    
        R = 1000-a;
    
        EPwm1Regs.CMPA.bit.CMPA = temp;
        EPwm1Regs.CMPB.bit.CMPB = temp + 9000;
    
        i= i+1;
    
        EPwm1Regs.ETCLR.bit.SOCA = 1;
        AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; //clear INT1 flag
        PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
    }
    
    
    
    void PWM1_Init(void)
    {
              EALLOW;
              //R Phase
              EPwm1Regs.TBCTL.bit.CTRMODE = 0;             // Count up
              EPwm1Regs.TBPRD = 62500;                    // Set timer period
              EPwm1Regs.TBCTL.bit.PHSEN = 0;               // 1 for external SYNC
              EPwm1Regs.TBPHS.bit.TBPHS = 0x0000;          // Phase is 0
              EPwm1Regs.TBCTR = 0x0000;                    // Clear counter
              EPwm1Regs.TBCTL.bit.HSPCLKDIV = 2;           // Clock ratio to SYSCLKOUT
              EPwm1Regs.TBCTL.bit.CLKDIV = 4;
              EPwm1Regs.TBCTL.bit.SYNCOSEL = 1;
              // Setup shadow register load on ZERO
              EPwm1Regs.CMPCTL.bit.SHDWAMODE = 0;
              EPwm1Regs.CMPCTL.bit.SHDWBMODE = 0;
              EPwm1Regs.CMPCTL.bit.LOADAMODE = 0;
              EPwm1Regs.CMPCTL.bit.LOADBMODE = 0;
              // Set Compare values
                    // Set compare A value
              // Set actions
              EPwm1Regs.AQCTLA.all = 0;
              EPwm1Regs.AQCTLA.bit.CAU = 2;                // Set PWM1A on TBCTR = CMPA
              EPwm1Regs.AQCTLA.bit.CBU = 1;                // Clear PWM1A on TBCTR = CMPB= CMPA + 100
    
    
              //SOCA to ADC
              EPwm1Regs.ETSEL.bit.SOCAEN=1;
              EPwm1Regs.ETSEL.bit.SOCASEL=1;
              EPwm1Regs.ETPS.bit.SOCAPRD = 1;
              EPwm1Regs.ETCLR.bit.SOCA = 1;
    
              EDIS;
    }
    
    void Init_ADCs(void)
    {
        EALLOW;
    
                AdcaRegs.ADCCTL1.bit.INTPULSEPOS = 1;
                AdcbRegs.ADCCTL1.bit.INTPULSEPOS = 1;
                AdccRegs.ADCCTL1.bit.INTPULSEPOS = 1;
    
                AdcaRegs.ADCCTL1.bit.ADCPWDNZ = 1;
                AdcbRegs.ADCCTL1.bit.ADCPWDNZ = 1;
                AdccRegs.ADCCTL1.bit.ADCPWDNZ = 1;
       //         DELAY_US(1);
    
                AdcaRegs.ADCCTL2.bit.PRESCALE = 6;
                AdcbRegs.ADCCTL2.bit.PRESCALE = 6;
                AdccRegs.ADCCTL2.bit.PRESCALE = 6;
    
                AdcaRegs.ADCSOC0CTL.bit.CHSEL = 0;  //SOC0 will convert pin A0
                AdcaRegs.ADCSOC1CTL.bit.CHSEL = 1;  //SOC1 will convert pin A1
                AdcaRegs.ADCSOC2CTL.bit.CHSEL = 2;  //SOC2 will convert pin A2
                AdcaRegs.ADCSOC3CTL.bit.CHSEL = 3;  //SOC3 will convert pin A3
                AdcaRegs.ADCSOC4CTL.bit.CHSEL = 4;  //SOC4 will convert pin A4
                AdcaRegs.ADCSOC5CTL.bit.CHSEL = 5;  //SOC5 will convert pin A5
    
    
                AdcaRegs.ADCSOC0CTL.bit.ACQPS = 14; //sample window is 100 SYSCLK cycles
                AdcaRegs.ADCSOC1CTL.bit.ACQPS = 14; //sample window is 100 SYSCLK cycles
                AdcaRegs.ADCSOC2CTL.bit.ACQPS = 14; //sample window is 100 SYSCLK cycles
                AdcaRegs.ADCSOC3CTL.bit.ACQPS = 14; //sample window is 100 SYSCLK cycles
                AdcaRegs.ADCSOC4CTL.bit.ACQPS = 14; //sample window is 100 SYSCLK cycles
                AdcaRegs.ADCSOC5CTL.bit.ACQPS = 14; //sample window is 100 SYSCLK cycles
    
    
                AdcaRegs.ADCBURSTCTL.bit.BURSTEN = 1;
                AdcaRegs.ADCBURSTCTL.bit.BURSTSIZE = 11;
                AdcaRegs.ADCBURSTCTL.bit.BURSTTRIGSEL = 5;
    
    
    
                //interrupt
                AdcaRegs.ADCINTSEL1N2.bit.INT1SEL = 0; //end of SOC0 will set INT1 flag
                AdcaRegs.ADCINTSEL1N2.bit.INT1E = 1;   //enable INT1 flag
                AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; //make sure INT1 flag is cleared
                AdcaRegs.ADCINTSEL1N2.bit.INT1SEL = 0;
                AdcaRegs.ADCSOC1CTL.bit.TRIGSEL = 05;
    
        EDIS;
    }
    

    那么、ITRAP0行在程序正常中是否有?

    此致、

    Rajesh。

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

    否、 这是不正常的。

    ITRAP0行要在程序正常

    我尝试使用最新的 main()运行您的项目、它运行良好。

    即使在复位后、反汇编代码也没有问题。

    谢谢