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.

[参考译文] TMDSCNCD28379D:未进入中断状态

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1466187/tmdscncd28379d-not-entering-interrupt

器件型号:TMDSCNCD28379D
Thread 中讨论的其他器件:C2000WARE

工具与软件:

您好!

我试图进入中断函数 ADC_ISR()、但它直接进入下一个 InitCpuTimer()。 我怎么能做到这一点?

谢谢!

-黄梅湾

-------------------------------------------------------

整个主代码如下所示。

空洞 主电源 ( 空洞 )

     //步骤1. 初始化系统控制:

    //此示例函数可在 F2837xD_SYSCTRL.c 文件中找到。

    InitSysCtrl();

   //步骤2. 初始化 GPIO:

   //此示例函数可在 F2837xD_GPIO.c 文件中找到、并且

   //说明了如何将 GPIO 设置为其默认状态。

   InitGpio();

   InitEPwmGpio_tz();

   InitEPwmGpio();

     EALLOW;

             GPIO_SetupPinOptions (72、GPIO_output、GPIO_PushPull);

             GPIO_SetupPinOptions (84、GPIO_output、GPIO_PushPull);

   EDIS;

   //步骤3. 清除所有中断并初始化 PIE 矢量表:

   //禁用 CPU 中断

   颜色;

   //将 PIE 控制寄存器初始化为默认状态。

   //默认状态是禁用所有 PIE 中断并显示标志

   //被清除。

   //此函数位于 F2837xD_PIECTRL.c 文件中。

   InitPieCtrl();

   //禁用 CPU 中断并清除所有 CPU 中断标志

   IER = 0x0000;

   IFR = 0x0000;

   //使用指向 shell 中断的指针初始化 PIE 矢量表

   //服务例程(ISR)。

   //此函数可在 F2837xD_PieVect.c 中找到

   InitPieVectTable();

              //此示例中使用的中断被重新映射到

              //此文件中的 ISR 函数。

              EALLOW; //要写入 EALLOW 保护的寄存器、需要执行此操作

                             PieVectTable.ADCD1_INT =&ADC_ISR;

              EDIS;   //这是禁用对 EALLOW 保护寄存器的写入所必需的

   //步骤4. 初始化器件外设:

              InitCpuTimers ();  //在这个示例中、只初始化 CPU 计时器

              EALLOW;

                             CpuSysRegs.PCLKCR0.bit.TBCLKSYNC =0;

                             ClkCfgRegs.PERCLKDIVSEL.bit.EPWMCLKDIV = 0;

              EDIS;

              initEpwms();

              EALLOW;

                             CpuSysRegs.PCLKCR0.bit.TBCLKSYNC =1;

              EDIS;

              //配置 ADC 并为其加电

              ConfigureADC();

              //设置 ADC 以进行软件转换

              SetupADCEpwm();

              //配置 DAC

              dac_debug();

              //初始化

              Param_Init ((dcParam_t*)&dc);

              //步骤5。 用户专用代码、启用中断:

              IER |= M_INT1;

//启用 PIE:组1中断1

              PieCtrlRegs.PIEIER1.bit.INTx6 = 1;

              EINT;         //启用全局中断 INTM

              erTM;         //启用全局实时中断 DBGM

//开始无限循环

 的说明 (;-)

   {

     GPIO_WritePin (72、1);

     GPIO_WritePin (84、1);

   }//end of infinite loop

}//end of main function

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

    您好!

    反汇编过程显示:

    有人能帮我弄清楚为什么我无法进入中断吗? 情况紧急。

    谢谢!

    洪美湾

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

    您好!

    我需要为中断进行其他哪些配置? EPWM10用于 ADC 转换、我具有以下要转换的 ADC。  

    谢谢你,祝你周末愉快!

    洪美湾

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

    尊敬的 Hongmei:

    很抱歉我的答复被推迟。

    您最初展示的代码片段将在 ePIE 矢量表中设置中断。 它不会导致中断立即分支。 需要注意的一点是、您似乎没有在代码中的任何位置定义 ISR (除非您在不同的文件中定义了 ISR?)。 有关正确使用中断配置的示例、我建议查看 C2000ware 中使用中断的示例(sci_loopback_interrupts_cpu01是一个简单示例、我建议从开始)。 然后、您应该能够在调试模式下运行代码、在 ISR 定义的开头添加一个断点、然后运行调试器并在条件下看到它命中断点。

    此致、

    Delaney

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

    尊敬的 Delaney:

    非常感谢、我正在学习您的建议。 我正在学习示例:adc_soc_epwm_cpu01。 但我还是没弄清楚。 有时没问题、有时它只是脱离中断、似乎程序已冻结、不进行刷新。 您能抽出宝贵的时间查看我下面的代码并告诉我缺少了哪些设置吗?  

    void main (void)

    {*****

    EALLOW;

    PieVectTable.ADCD1_INT =&ADC_ISR;

    EDIS;    

    PieCtrlRegs.PIEIER1.bit.INTx6 = 1;

    }

    中断失效 ADC_ISR (void)

    {*****

    AdcdRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;

    PieCtrlRegs.PIEACK.all = PIEACK_Group1;

    }

    void SetupADCEpwm (void)

    {*****

    EALLOW;

    EPwm5Regs.ETSEL.bit.SOCAEN = 1;

    EPwm5Regs.TBCTL.bit.CTRMODE = tb_count_updown;

    EDIS;

    EALLOW;

    AdcaRegs.ADCSOC0CTL.bit.CHSEL = 2;

    AdcaRegs.ADCSOC0CTL.bit.ACQPS = 14;

    AdcaRegs.ADCSOC0CTL.bit.TRIGSEL = 0x0D;

    AdcdRegs.ADCSOC0CTL.bit.CHSEL = 3;

    AdcdRegs.ADCSOC0CTL.bit.ACQPS = 14;

    AdcdRegs.ADCSOC0CTL.bit.TRIGSEL = 0x0D;         

    AdcdRegs.ADCINTSEL1N2.bit.INT1SEL = 0;

    AdcdRegs.ADCINTSEL1N2.bit.INT1E = 1;

    AdcdRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;

    EDIS;

    }

    谢谢、祝您周末愉快、

    洪美湾

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

    尊敬的 Hongmei:

    您运行的 adc_soc_epwm_cpu01 示例是否与 C2000ware 中的版本保持不变? 或者您是否进行了修改?

    此致、

    Delaney

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

    尊敬的 Delaney:

    adc_soc_epwm_cpu01 示例很好、我在下面进行了修改。 ADCDC1用作中断、相应地修改设置。 您能否检查我的以下设置是否有任何问题? 在 ADC_ISR 内部、我有另一个函数。 如果设置正常、可能我的函数会发出中断。 请您确认我的设置吗?

    void main (void)

    {*****

    EALLOW;

    PieVectTable.ADCD1_INT =&ADC_ISR;

    EDIS;    

    PieCtrlRegs.PIEIER1.bit.INTx6 = 1;

    }

    中断失效 ADC_ISR (void)

    {*****

    AdcdRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;

    PieCtrlRegs.PIEACK.all = PIEACK_Group1;

    }

    void SetupADCEpwm (void)

    {*****

    EALLOW;

    EPwm5Regs.ETSEL.bit.SOCAEN = 1;

    EPwm5Regs.TBCTL.bit.CTRMODE = tb_count_updown;

    EDIS;

    EALLOW;

    AdcaRegs.ADCSOC0CTL.bit.CHSEL = 2;

    AdcaRegs.ADCSOC0CTL.bit.ACQPS = 14;

    AdcaRegs.ADCSOC0CTL.bit.TRIGSEL = 0x0D;

    AdcdRegs.ADCSOC0CTL.bit.CHSEL = 3;

    AdcdRegs.ADCSOC0CTL.bit.ACQPS = 14;

    AdcdRegs.ADCSOC0CTL.bit.TRIGSEL = 0x0D;         

    AdcdRegs.ADCINTSEL1N2.bit.INT1SEL = 0;

    AdcdRegs.ADCINTSEL1N2.bit.INT1E = 1;

    AdcdRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;

    EDIS;

    }

    谢谢!

    洪美湾

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

    尊敬的 Delaney:

    在 InitSysCtrl()中、有一个名为 InitFlash()的函数。 我输入函数以及代码运行的行以红色数字显示的顺序。 我不知道为什么要以随机的方式来回运行而不是按顺序运行、需要运行的总行数为9、但运行起来就像有16行代码一样。

    这有时会让中断消失吗? 我的中断有时会冻结、有时一切都正常。

    void InitFlash (void)

       EALLOW;

       Flash0CtrlRegs.FBAC.bit.VREADST = 0x14;                              (1、4)

       Flash0CtrlRegs.FPAC1.bit.PMPPWR = 0x1;                        (2、6、9)

       Flash0CtrlRegs.FBFALLBACK.bit.BNKPWR0 = 0x3;              (3、7、10)

       Flash0CtrlRegs.FLD_INTF_CTRL.bit.DATA_CACHE_EN = 0;  (5、8、11)

       Flash0CtrlRegs.FLD_INTF_CTRL.bit.prefetch_EN = 0;         (12)

     

       #if CPU_FRQ_200MHz

       Flash0CtrlRegs.FRDCNTL.bit.RWAIT = 0x3;                               (13)

       #endif

       #if CPU_FRQ_150MHz

       Flash0CtrlRegs.FRDCNTL.bit.RWAIT = 0x2;

       #endif

       #if CPU_FRQ_120MHz

       Flash0CtrlRegs.FRDCNTL.bit.RWAIT = 0x2;

       #endif

       Flash0CtrlRegs.FLD_INTF_CTRL.bit.DATA_CACHE_EN = 1;  (14)

       Flash0CtrlRegs.FLD_INTF_CTRL.bit.prefetch_EN = 1;       (15)

       Flash0EccRegs.ECC_ENABLE.bit.enable = 0xA;                   (16)

       EDIS;

       _asm (" RPT #7 || NOP");

    }

    谢谢!

    洪美湾

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

    尊敬的 Hongmei:

    您在  InitFlash ()函数中描述的内容听起来似乎是优化的结果。 如果您的项目已打开优化、则很可能会显示某些行正在逐步切换到"不按顺序"/跳过"行"。 话虽如此、这应该不会影响中断的运行方式、通常无法针对 F2837xD_SYSCTRL.c 等提供的文件将其禁用

    它只是退出中断、似乎程序已冻结、没有刷新

    在这种情况下、如果你在 ISR 内添加一个断点、它是否被命中、但是当你越过该行时、程序不再被暂停? 在程序到达断点后(如果遇到)、你到底在执行什么操作? 我对这种描述有点困惑。

    为了让调试更轻松、您可以验证是否已关闭项目的优化? 如果与在 C2000ware 中的方式相比未更改此设置、那么它应该已经关闭。

    此致、

    Delaney

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

    谢谢! 设置正确后、一切都在运行!

    再次感谢、祝您愉快!

    Hongmei