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.

[参考译文] TMS320F280025:添加 TI 诊断库后 EPWM4中断停止

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1105632/tms320f280025-epwm4-interrupt-stop-after-add-ti-diagnostic-library

器件型号:TMS320F280025
主题中讨论的其他器件:AFE031C2000WARE

你(们)好

我的项目使用 TI AFE031 FSK boostxl_afe031_f28004x_Rx 作为模板。 我只需如下所示将中断源更改为 EPWM4

#pragma CODE_SECTION (epwm2_ISR、".TI.ramfunc");
_interrupt void epwm4_ISR (void)

   EALLOW;

   //
   //启用 ADC ISR 嵌套
   //
   uint16_t TempPIEIER;
   TempPIEIER = PieCtrlRegs.PIEIER2.all;
   IER |= M_INT1;
   IER &= MINT1;                        //设置"全局"优先级
   PieCtrlRegs.PIEIER2.all &= MG1_1;    //设置“组”优先级
   PieCtrlRegs.PIEACK.ALL = 0xFFFF;     //启用 PIE 中断
   asm ("      NOP");                   //等待一个周期
   EINT;                                //清除 INTM 以启用中断

   //
   //运行 FSK 相关性检测器函数
   //
   FSK_corr_Detector _ OverSampl_run (&FSK_struct1);

   //
   //查看是否检测到标记或空格位
   //
   if (fsk_struct1.bit_detected!= 0)
   {
       rxMessage[message_index+]= FSK_struct1.bit_detected;//将检测到的位保存在消息缓冲区中

       FSK_struct1.bit_detected = 0;//清除检测到的位成员

       //
       //在消息缓冲器已满时设置标志
       //
       if (RX_MESSAGE_SIZE <= MESSAGE_INDEX)
       {
           MESSAGE_INDEX = 0;
           msgFull = 1;
       }
   }

   //
   //清除 EPwm2的 INT 标志
   //
   //EPwm2Regs.ETCLR.bit.INT = 1;

  EPwm2Regs.ETCLR.bit.INT = 1;

   //
   //确认此中断以接收来自组3的更多中断
   //
   PieCtrlRegs.PIEACX.ALL = PIEACK_Group3;

   //
   //恢复为 ADC ISR 嵌套保存的寄存器
   //
   Dint;
   PieCtrlRegs.PIEIER2.all = TempPIEIER;

   //
   //切换 GPIO 引脚以测量频率、进行调试
   //
   //GpioDataRegs.GPCTOGGL.bit.GPIO65=1;// LP 引脚47

#define INTERRUPT_BIT_ISR &epwm4_ISI

中断寄存器(INT_EPWM4、INTERRUPT_BIT_ISR)

只要我添加了 TI 诊断函数代码(该代码引用了诊断库示例 f28002x_test_application.c)、任何操作都正常

           Dint;

           uint16_t returnVal =
                   STL_CPU_REG_checkCPURegisters (STA_Tests _注入错误);
           IF (返回值=STL_CPU_REG_FAIL)
          {

                 mcuFAULT_Status = mcuFAULT_Status | CPU_REGISTER_FAULT;
           }
           EINT;

一段时间~ 7分钟后 ISR 函数不会运行。 诊断功能将每14ms 在主循环~中运行一次。

请告知我有没有做错了?

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

    我认为这是因为 STL_CPU_REG_checkCPURegisters 正在测试 IFR 寄存器。 它会将其备份并恢复、但由于设置 INTM 不会阻止中断在 IFR 标志处传播。 备份后可能会有一个中断进入、但随后会被恢复擦除。

    我想您有几个选择:

    1. 修改 STL_CPU_REG_checkCPURegisters ()以删除 IFR 测试。 您可以在启动时在 PIE 中启用任何中断之前单独测试 IFR 是否存在卡住的位、但不要使用 STL_CPU_REG_CHECKCPURegisters 定期检查。 我猜您可能已经准备好了一些其他类型的中断监控、这些中断监控会发现 IFR 寄存器存在任何问题。
    2. 除了执行 DINT 操作、在运行 STL_CPU_REG_checkCPURegisters 之前、禁用 PIEIER 寄存器中的中断(按照 TRM 中的过程禁用中断)。 运行后、重新启用中断。

    无论采用哪种方法、都应在 SDL 文档中突出显示这一点。 我将会提交一个错误以添加注释。

    惠特尼

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

    惠特尼

    您能否在选项2中提供示例代码?

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

    我认为选项1最干净、所以这就是我要推荐的。

    但是、选项2看起来类似于下面的伪代码

    // Disable all interrupts in the PIE so they can't propagate to IFR
    PieCtrlRegs.PIEIER1.all = 0;
    PieCtrlRegs.PIEIER2.all = 0;
    PieCtrlRegs.PIEIER3.all = 0;
     . . .
    PieCtrlRegs.PIEIER16.all = 0;
    
    // CPU Timer 1 and 2 aren't PIE interrupts, so disable them separately
    CpuTimer1Regs.TCR.bit.TIE = 0;
    CpuTimer2Regs.TCR.bit.TIE = 0;
    
    // Wait five cycles for any final interrupts to propagate to IFR
    NOP;
    NOP;
    NOP;
    NOP;
    NOP;
    
    // The TRM says that when you're disabling interrupts, you should then clear
    // the CPU IFR and PIEACK, but since we're going to be reenabling interrupts
    // as soon as STL_CPU_REG_checkCPURegisters() finishes, we can probably just
    // leave the flags set and let them run then, albeit delayed.
    
    // Run the CPU register test
    STL_CPU_REG_checkCPURegisters();
    
    // Restore PIEIER registers
    PieCtrlRegs.PIEIER1.all = previousPIEIER1Value;
    PieCtrlRegs.PIEIER2.all = previousPIEIER2Value;
    PieCtrlRegs.PIEIER3.all = previousPIEIER3Value;
     . . .
    PieCtrlRegs.PIEIER16.all = previousPIEIER16Value;
    
    // Reenable CPU Timer 1 and 2 interrupts
    CpuTimer1Regs.TCR.bit.TIE = 1;
    CpuTimer2Regs.TCR.bit.TIE = 1;

    惠特尼

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

    您好、Whitney

    首先,我不是一个装配体的家庭。 如果您可以向我展示如何修改它、 我要这个

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

    惠特尼

    这是否意味着无需在代码中使用 DINT 和 EINT?

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

    惠特尼

    我基于您的伪代码编写一个函数、如下所示

    空 cpuRegister_Check (空)

       while (buck_isrCompled_Flag[0]= false);
       uint16_t TempPIEIER1、TempPIEIER2、TempPIEIER3、TempPIEIER4、TempPIEIER5、TempPIEIER6、TempPIEIER7、TempPIEIER8;
       uint16_t TempPIEIER9、TempPIEIER10、TempPIEIER11、TempPIEIER12、TempPIEIER13、TempPIEIER14、TempPIEIER15、TempPIEIER16;
       uint16_t TempPIEIFR1、TempPIEIFR2、TempPIEIFR3、TempPIEIFR4、TempPIEIFR5、TempPIEIFR6、TempPIEIFR7、TempPIEIFR8;
       uint16_t TempPIEIFR9、TempPIEIFR10、TempPIEIFR11、TempPIEIFR12、TempPIEIFR13、TempPIEIFR14、TempPIEIFR15、TempPIEIFR16;
       TempPIEIER1 = PieCtrlRegs.PIEIER1.all;
       TempPIEIER2 = PieCtrlRegs.PIEIER2.all;
       TempPIEIER3 = PieCtrlRegs.PIEIER3.ALL;
       TempPIEIER4= PieCtrlRegs.PIEIER4.ALL;
       TempPIEIER5= PieCtrlRegs.PIEIER5.ALL;
       TempPIEIER6 = PieCtrlRegs.PIEIER6.ALL;
       TempPIEIER7 = PieCtrlRegs.PIEIER7.ALL;
       TempPIEIER8 = PieCtrlRegs.PIEIER8.all;
       TempPIEIER9= PieCtrlRegs.PIEIER9.ALL;
       TempPIEIER10 = PieCtrlRegs.PIEIER10.all;
       TempPIEIER11 = PieCtrlRegs.PIEIER11.all;
       TempPIEIER12 = PieCtrlRegs.PIEIER12.ALL;
       TempPIEIFR1 = PieCtrlRegs.PIEIFR1.all;
       TempPIEIFR2 = PieCtrlRegs.PIEIFR2.all;
       TempPIEIFR3 = PieCtrlRegs.PIEIFR3.ALL;
       TempPIEIFR4 = PieCtrlRegs.PIEIFR4.ALL;
       TempPIEIFR5= PieCtrlRegs.PIEIFR5.ALL;
       TempPIEIFR6 = PieCtrlRegs.PIEIFR6.ALL;
       TempPIEIFR7 = PieCtrlRegs.PIEIFR7.ALL;
       TempPIEIFR8 = PieCtrlRegs.PIEIFR8.all;
       TempPIEIFR9 = PieCtrlRegs.PIEIFR9.ALL;
       TempPIEIFR10 = PieCtrlRegs.PIEIFR10.all;
       TempPIEIFR11 = PieCtrlRegs.PIEIFR11.all;
       TempPIEIFR12 = PieCtrlRegs.PIEIFR12.all;


    //////DINT   ;
    //   //禁用 PIE 中的所有中断,以便它们不能传播到 IFR
       PieCtrlRegs.PIEIER1.ALL = 0;
       PieCtrlRegs.PIEIER2.ALL = 0;
       PieCtrlRegs.PIEIER3.ALL = 0;
       PieCtrlRegs.PIEIER4.ALL = 0;
       PieCtrlRegs.PIEIER5.ALL = 0;
       PieCtrlRegs.PIEIER6.ALL = 0;
       PieCtrlRegs.PIEIER7.ALL = 0;
       PieCtrlRegs.PIEIER8.ALL = 0;
       PieCtrlRegs.PIEIER9.ALL = 0;
       PieCtrlRegs.PIEIER10.ALL = 0;
       PieCtrlRegs.PIEIER11.all = 0;
       PieCtrlRegs.PIEIER12.ALL = 0;
       PieCtrlRegs.PIEIFR1.ALL = 0;
       PieCtrlRegs.PIEIFR2.ALL = 0;
       PieCtrlRegs.PIEIFR3.ALL = 0;
       PieCtrlRegs.PIEIFR4.ALL = 0;
       PieCtrlRegs.PIEIFR5.ALL = 0;
       PieCtrlRegs.PIEIFR6.ALL = 0;
       PieCtrlRegs.PIEIFR7.ALL = 0;
       PieCtrlRegs.PIEIFR8.ALL = 0;
       PieCtrlRegs.PIEIFR9.ALL = 0;
       PieCtrlRegs.PIEIFR10.ALL = 0;
       PieCtrlRegs.PIEIFR11.all = 0;
       PieCtrlRegs.PIEIFR12.ALL = 0;
    //
    //   // CPU 定时器1和2不是 PIE 中断,因此请分别禁用它们
       CpuTimer0Regs.tcr.bit.tie = 0;
       CpuTimer1Regs.tcr.bit.tie = 0;
       CpuTimer2Regs.tcr.bit.tie = 0;
    //   CpuTimer3Regs.tcr.bit.tie = 0;
       //等待五个周期,以便任何最终中断传递到 IFR
       NOP;
       NOP;
       NOP;
       NOP;
       NOP;
       BUCK_IsrCompled_Flag[0]= false;

       cpuRegister_FAIL_Counter++;
       uint16_t returnVal =
               STL_CPU_REG_checkCPURegisters (false);
       PieCtrlRegs.PIEIER1.all = TempPIEIER1;
       PieCtrlRegs.PIEIER2.all = TempPIEIER2;
       PieCtrlRegs.PIEIER3.ALL = TempPIEIER3;
       PieCtrlRegs.PIEIER4.ALL = TempPIEIER4;
       PieCtrlRegs.PIEIER5.ALL = TempPIEIER5;
       PieCtrlRegs.PIEIER6.ALL = TempPIEIER6;
       PieCtrlRegs.PIEIER7.ALL = TempPIEIER7;
       PieCtrlRegs.PIEIER8.ALL = TempPIEIER8;
       PieCtrlRegs.PIEIER9.ALL = TempPIEIER9;
       PieCtrlRegs.PIEIER10.all = TempPIEIER10;
       PieCtrlRegs.PIEIER11.all = TempPIEIER11;
       PieCtrlRegs.PIEIER12.all = TempPIEIER12;
       PieCtrlRegs.PIEIFR1.all = TempPIEIFR1;
       PieCtrlRegs.PIEIFR2.ALL = TempPIEIFR2;
       PieCtrlRegs.PIEIFR3.ALL = TempPIEIFR3;
       PieCtrlRegs.PIEIFR4.ALL = TempPIEIFR4;
       PieCtrlRegs.PIEIFR5.ALL = TempPIEIFR5;
       PieCtrlRegs.PIEIFR6.ALL = TempPIEIFR6;
       PieCtrlRegs.PIEIFR7.ALL = TempPIEIFR7;
       PieCtrlRegs.PIEIFR8.All = TempPIEIFR8;
       PieCtrlRegs.PIEIFR9.ALL = TempPIEIFR9;
       PieCtrlRegs.PIEIFR10.all = TempPIEIFR10;
       PieCtrlRegs.PIEIFR11.all = TempPIEIFR11;
       PieCtrlRegs.PIEIFR12.all = TempPIEIFR12;
    //   PieCtrlRegs.PIEIER13.ALL = TempPIEIER13;
    //   PieCtrlRegs.PIEIER14.all = TempPIEIER14;
    //   PieCtrlRegs.PIEIER15.all = TempPIEIER15;
    //   PieCtrlRegs.PIEIER16.all = TempPIEIER16;

       //重新启用 CPU 定时器1和2中断
       CpuTimer0Regs.tcr.bit.tie = 1;
       CpuTimer1Regs.tcr.bit.tie = 1;
       CpuTimer2Regs.tcr.bit.tie = 1;
       NOP;
       NOP;
       NOP;
       NOP;
       NOP;
    //   CpuTimer3Regs.tcr.bit.tie = 1;
       IF (返回值=STL_CPU_REG_FAIL)
       {

           mcuFAULT_Status = mcuFAULT_Status | CPU_REGISTER_FAULT;
       }


    我使用的 F280025仅具有12个 IER 和 IFR。 MCU 在运行2次后被锁存、屏幕截图如下

    请告知问题所在。

    谢谢

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

    您好、Whitney

    我更改了以下代码

       volatile uint16_t tempPIEIER1 = HWREGH (PIECTRL_BASE + PIE_O_IER1);
       volatile uint16_t tempPIEIER2 = HWREGH (PIECTRL_BASE + PIE_O_IER2);
       volatile uint16_t tempPIEIER3 = HWREGH (PIECTRL_BASE + PIE_O_IER3);
       volatile uint16_t tempPIEIER4 = HWREGH (PIECTRL_BASE + PIE_O_IER4);
       volatile uint16_t tempPIEIER5 = HWREGH (PIECTRL_BASE + PIE_O_IER5);
       volatile uint16_t tempPIEIER6 = HWREGH (PIECTRL_BASE + PIE_O_IER6);
       volatile uint16_t tempPIEIER7 = HWREGH (PIECTRL_BASE + PIE_O_IER7);
       volatile uint16_t tempPIEIER8 = HWREGH (PIECTRL_BASE + PIE_O_IER8);
       volatile uint16_t tempPIEIER9 = HWREGH (PIECTRL_BASE + PIE_O_IER9);
       volatile uint16_t tempPIEIER10 = HWREGH (PIECTRL_BASE + PIE_O_IER10);
       volatile uint16_t tempPIEIER11 = HWREGH (PIECTRL_BASE + PIE_O_IER11);
       volatile uint16_t tempPIEIER12 = HWREGH (PIECTRL_BASE + PIE_O_IER12);
       volatile uint16_t tempPIEIFR1 = HWREGH (PIECTRL_BASE + PIE_O_IFR1);
       volatile uint16_t tempPIEIFR2 = HWREGH (PIECTRL_BASE + PIE_O_IFR2);
       volatile uint16_t tempPIEIFR3 = HWREGH (PIECTRL_BASE + PIE_O_IFR3);
       volatile uint16_t tempPIEIFR4 = HWREGH (PIECTRL_BASE + PIE_O_IFR4);
       volatile uint16_t tempPIEIFR5 = HWREGH (PIECTRL_BASE + PIE_O_IFR5);
       volatile uint16_t tempPIEIFR6 = HWREGH (PIECTRL_BASE + PIE_O_IFR6);
       volatile uint16_t tempPIEIFR7 = HWREGH (PIECTRL_BASE + PIE_O_IFR7);
       volatile uint16_t tempPIEIFR8 = HWREGH (PIECTRL_BASE + PIE_O_IFR8);
       volatile uint16_t tempPIEIFR9 = HWREGH (PIECTRL_BASE + PIE_O_IFR9);
       volatile uint16_t tempPIEIFR10 = HWREGH (PIECTRL_BASE + PIE_O_IFR10);
       volatile uint16_t tempPIEIFR11 = HWREGH (PIECTRL_BASE + PIE_O_IFR11);
       volatile uint16_t tempPIEIFR12 = HWREGH (PIECTRL_BASE + PIE_O_IFR12);
       Dint;
       HWREGH (PIECTRL_BASE + PIE_O_IER1)= 0x00;
       HWREGH (PIECTRL_BASE + PIE_O_IER2)= 0x00;
       HWREGH (PIECTRL_BASE + PIE_O_IER3)= 0x00;
       HWREGH (PIECTRL_BASE + PIE_O_IER4)= 0x00;
       HWREGH (PIECTRL_BASE + PIE_O_IER5)= 0x00;
       HWREGH (PIECTRL_BASE + PIE_O_IER6)= 0x00;
       HWREGH (PIECTRL_BASE + PIE_O_IER7)= 0x00;
       HWREGH (PIECTRL_BASE + PIE_O_IER8)= 0x00;
       HWREGH (PIECTRL_BASE + PIE_O_IER9)= 0x00;
       HWREGH (PIECTRL_BASE + PIE_O_IER10)= 0x00;
       HWREGH (PIECTRL_BASE + PIE_O_IER11)= 0x00;
       HWREGH (PIECTRL_BASE + PIE_O_IER12)= 0x00;
       CPUTimer_disableInterrupt (TASKA_CPUTIME_base);
       CPUTimer_disableInterrupt (TASKB_CPUTIME_base);
       CPUTimer_disableInterrupt (TASKC_CPUTIME_base);
       uint16_t returnVal =
               STL_CPU_REG_checkCPURegisters (false);
       IF (返回值=STL_CPU_REG_FAIL)
       {

           mcuFAULT_Status = mcuFAULT_Status | CPU_REGISTER_FAULT;
       }
       HWREGH (PIECTRL_BASE + PIE_O_IER1)= tempPIEIER1;
       HWREGH (PIECTRL_BASE + PIE_O_IER2)= tempPIEIER2;
       HWREGH (PIECTRL_BASE + PIE_O_IER3)= tempPIEIER3;
       HWREGH (PIECTRL_BASE + PIE_O_IER4)= tempPIEIER4;
       HWREGH (PIECTRL_BASE + PIE_O_IER5)= tempPIEIER5;
       HWREGH (PIECTRL_BASE + PIE_O_IER6)= tempPIEIER6;
       HWREGH (PIECTRL_BASE + PIE_O_IER7)= tempPIEIER7;
       HWREGH (PIECTRL_BASE + PIE_O_IER8)= tempPIEIER8;
       HWREGH (PIECTRL_BASE + PIE_O_IER9)= tempPIEIER9;
       HWREGH (PIECTRL_BASE + PIE_O_IER10)= tempPIEIER10;
       HWREGH (PIECTRL_BASE + PIE_O_IER11)= tempPIEIER11;
       HWREGH (PIECTRL_BASE + PIE_O_IER12)= tempPIEIER12;
       HWREGH (PIECTRL_BASE + PIE_O_IFR1)= tempPIEIFR1;
       HWREGH (PIECTRL_BASE + PIE_O_IFR2)= tempPIEIFR2;
       HWREGH (PIECTRL_BASE + PIE_O_IFR3)= tempPIEIFR3;
       HWREGH (PIECTRL_BASE + PIE_O_IFR4)= tempPIEIFR4;
       HWREGH (PIECTRL_BASE + PIE_O_IFR5)= tempPIEIFR5;
       HWREGH (PIECTRL_BASE + PIE_O_IFR6)= tempPIEIFR6;
       HWREGH (PIECTRL_BASE + PIE_O_IFR7)= tempPIEIFR7;
       HWREGH (PIECTRL_BASE + PIE_O_IFR8)= tempPIEIFR8;
       HWREGH (PIECTRL_BASE + PIE_O_IFR9)= tempPIEIFR9;
       HWREGH (PIECTRL_BASE + PIE_O_IFR10)= tempPIEIFR10;
       HWREGH (PIECTRL_BASE + PIE_O_IFR11)= tempPIEIFR11;
       HWREGH (PIECTRL_BASE + PIE_O_IFR12)= tempPIEIFR12;

       CPUTimer_enableInterrupt (TASKA_CPUTIME_base);
       CPUTimer_enableInterrupt (TASKB_CPUTIME_base);
       CPUTimer_enableInterrupt (TASKC_CPUTIME_base);
       EINT;

    MCU 不再锁存。 开始运行它以查看发现的任何问题。

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

    我本来不会期望你需要保存和恢复 PIEIFR--PIEIER 本来就足够了。

    无论如何、如果您想尝试选项1、则会删除以下部分:

    ; lines 234 and 235
            PUSH    IFR
            POP     @TH                     ; save IFR in TH
    
    ; lines 263-268
            PUSH    @AL
            POP     IFR                     ; write to IFR
            PUSH    IFR
            POP     AR4
            CMP     AL, @AR4
            B       fail16BitRegTest, NEQ
    
    ; lines 346 and 347
            PUSH    @TH
            POP     IFR                     ; restore IFR
    

    惠特尼

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

    惠特尼

    我在下面编写了其他代码、仅用于存储和恢复 IER。 20小时内工作正常

    volatile uint16_t tempPIEIER1 = HWREGH (PIECTRL_BASE + PIE_O_IER1);
    volatile uint16_t tempPIEIER2 = HWREGH (PIECTRL_BASE + PIE_O_IER2);
    volatile uint16_t tempPIEIER3 = HWREGH (PIECTRL_BASE + PIE_O_IER3);
    volatile uint16_t tempPIEIER4 = HWREGH (PIECTRL_BASE + PIE_O_IER4);
    volatile uint16_t tempPIEIER5 = HWREGH (PIECTRL_BASE + PIE_O_IER5);
    volatile uint16_t tempPIEIER6 = HWREGH (PIECTRL_BASE + PIE_O_IER6);
    volatile uint16_t tempPIEIER7 = HWREGH (PIECTRL_BASE + PIE_O_IER7);
    volatile uint16_t tempPIEIER8 = HWREGH (PIECTRL_BASE + PIE_O_IER8);
    volatile uint16_t tempPIEIER9 = HWREGH (PIECTRL_BASE + PIE_O_IER9);
    volatile uint16_t tempPIEIER10 = HWREGH (PIECTRL_BASE + PIE_O_IER10);
    volatile uint16_t tempPIEIER11 = HWREGH (PIECTRL_BASE + PIE_O_IER11);
    volatile uint16_t tempPIEIER12 = HWREGH (PIECTRL_BASE + PIE_O_IER12);
    volatile uint16_t tempPIEIFR1 = HWREGH (PIECTRL_BASE + PIE_O_IFR1);
    volatile uint16_t tempPIEIFR2 = HWREGH (PIECTRL_BASE + PIE_O_IFR2);
    volatile uint16_t tempPIEIFR3 = HWREGH (PIECTRL_BASE + PIE_O_IFR3);
    volatile uint16_t tempPIEIFR4 = HWREGH (PIECTRL_BASE + PIE_O_IFR4);
    volatile uint16_t tempPIEIFR5 = HWREGH (PIECTRL_BASE + PIE_O_IFR5);
    volatile uint16_t tempPIEIFR6 = HWREGH (PIECTRL_BASE + PIE_O_IFR6);
    volatile uint16_t tempPIEIFR7 = HWREGH (PIECTRL_BASE + PIE_O_IFR7);
    volatile uint16_t tempPIEIFR8 = HWREGH (PIECTRL_BASE + PIE_O_IFR8);
    volatile uint16_t tempPIEIFR9 = HWREGH (PIECTRL_BASE + PIE_O_IFR9);
    volatile uint16_t tempPIEIFR10 = HWREGH (PIECTRL_BASE + PIE_O_IFR10);
    volatile uint16_t tempPIEIFR11 = HWREGH (PIECTRL_BASE + PIE_O_IFR11);
    volatile uint16_t tempPIEIFR12 = HWREGH (PIECTRL_BASE + PIE_O_IFR12);
    Dint;
    HWREGH (PIECTRL_BASE + PIE_O_IER1)= 0x00;
    HWREGH (PIECTRL_BASE + PIE_O_IER2)= 0x00;
    HWREGH (PIECTRL_BASE + PIE_O_IER3)= 0x00;
    HWREGH (PIECTRL_BASE + PIE_O_IER4)= 0x00;
    HWREGH (PIECTRL_BASE + PIE_O_IER5)= 0x00;
    HWREGH (PIECTRL_BASE + PIE_O_IER6)= 0x00;
    HWREGH (PIECTRL_BASE + PIE_O_IER7)= 0x00;
    HWREGH (PIECTRL_BASE + PIE_O_IER8)= 0x00;
    HWREGH (PIECTRL_BASE + PIE_O_IER9)= 0x00;
    HWREGH (PIECTRL_BASE + PIE_O_IER10)= 0x00;
    HWREGH (PIECTRL_BASE + PIE_O_IER11)= 0x00;
    HWREGH (PIECTRL_BASE + PIE_O_IER12)= 0x00;
    CPUTimer_disableInterrupt (TASKA_CPUTIME_base);
    CPUTimer_disableInterrupt (TASKB_CPUTIME_base);
    CPUTimer_disableInterrupt (TASKC_CPUTIME_base);
    uint16_t returnVal =
    STL_CPU_REG_checkCPURegisters (false);
    IF (返回值=STL_CPU_REG_FAIL)

    mcuFAULT_Status = mcuFAULT_Status | CPU_REGISTER_FAULT;

    HWREGH (PIECTRL_BASE + PIE_O_IER1)= tempPIEIER1;
    HWREGH (PIECTRL_BASE + PIE_O_IER2)= tempPIEIER2;
    HWREGH (PIECTRL_BASE + PIE_O_IER3)= tempPIEIER3;
    HWREGH (PIECTRL_BASE + PIE_O_IER4)= tempPIEIER4;
    HWREGH (PIECTRL_BASE + PIE_O_IER5)= tempPIEIER5;
    HWREGH (PIECTRL_BASE + PIE_O_IER6)= tempPIEIER6;
    HWREGH (PIECTRL_BASE + PIE_O_IER7)= tempPIEIER7;
    HWREGH (PIECTRL_BASE + PIE_O_IER8)= tempPIEIER8;
    HWREGH (PIECTRL_BASE + PIE_O_IER9)= tempPIEIER9;
    HWREGH (PIECTRL_BASE + PIE_O_IER10)= tempPIEIER10;
    HWREGH (PIECTRL_BASE + PIE_O_IER11)= tempPIEIER11;
    HWREGH (PIECTRL_BASE + PIE_O_IER12)= tempPIEIER12;
    HWREGH (PIECTRL_BASE + PIE_O_IFR1)= tempPIEIFR1;
    HWREGH (PIECTRL_BASE + PIE_O_IFR2)= tempPIEIFR2;
    HWREGH (PIECTRL_BASE + PIE_O_IFR3)= tempPIEIFR3;
    HWREGH (PIECTRL_BASE + PIE_O_IFR4)= tempPIEIFR4;
    HWREGH (PIECTRL_BASE + PIE_O_IFR5)= tempPIEIFR5;
    HWREGH (PIECTRL_BASE + PIE_O_IFR6)= tempPIEIFR6;
    HWREGH (PIECTRL_BASE + PIE_O_IFR7)= tempPIEIFR7;
    HWREGH (PIECTRL_BASE + PIE_O_IFR8)= tempPIEIFR8;
    HWREGH (PIECTRL_BASE + PIE_O_IFR9)= tempPIEIFR9;
    HWREGH (PIECTRL_BASE + PIE_O_IFR10)= tempPIEIFR10;
    HWREGH (PIECTRL_BASE + PIE_O_IFR11)= tempPIEIFR11;
    HWREGH (PIECTRL_BASE + PIE_O_IFR12)= tempPIEIFR12;

    CPUTimer_enableInterrupt (TASKA_CPUTIME_base);
    CPUTimer_enableInterrupt (TASKB_CPUTIME_base);
    CPUTimer_enableInterrupt (TASKC_CPUTIME_base);
    EINT;

    对上述代码的任何注释。

    关于您之前的邮件、您是否意味着"存储和恢复 IER / IFR"不足以解决问题。 有必要更改装配体?

    BR

    HK Woo

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="46959" URL"~支持/microcontrollers/C2000-microcontrollers-group/CC2000/f/C2000-microcontrollers-forume/1105632/tms320f280025-epwm4-interrupt-stop-fer-fer-add-ti-diagnostic-library/4099178#4099178"]您是否意味着"存储和恢复问题对于修复 IER/修复不够好。 有必要更改汇编?

    不、我希望这两种方法都能正常工作。 我喜欢更好地更改汇编的选项、因为它允许您避免保存和恢复所有这些 PIE 寄存器所需的额外执行周期。 如果测试执行时间对您来说不是问题、这是可以的。

    [~ userid="46959" url="支持/microcontrollers/C2000-microcontrollers-group/CC2000/f/C2000-microcontrollers-forume/1105632/tms320f280025-epwm4-interrupt-stop-fer-fer-add-ti-diagnostic-library/4099178#4099178"]对上述代码的任何注释。[/quote

    如果您移除行以读取/写入 PIEIFR 寄存器、它是否仍然有效? 在我看来、这并不是必需的、您可能会无意中取消想要接收的中断。

    惠特尼

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

    惠特尼

    我复制了错误的代码。 实际上、代码应该在一个以下

    volatile uint16_t tempPIEIER1 = HWREGH (PIECTRL_BASE + PIE_O_IER1);
    volatile uint16_t tempPIEIER2 = HWREGH (PIECTRL_BASE + PIE_O_IER2);
    volatile uint16_t tempPIEIER3 = HWREGH (PIECTRL_BASE + PIE_O_IER3);
    volatile uint16_t tempPIEIER4 = HWREGH (PIECTRL_BASE + PIE_O_IER4);
    volatile uint16_t tempPIEIER5 = HWREGH (PIECTRL_BASE + PIE_O_IER5);
    volatile uint16_t tempPIEIER6 = HWREGH (PIECTRL_BASE + PIE_O_IER6);
    volatile uint16_t tempPIEIER7 = HWREGH (PIECTRL_BASE + PIE_O_IER7);
    volatile uint16_t tempPIEIER8 = HWREGH (PIECTRL_BASE + PIE_O_IER8);
    volatile uint16_t tempPIEIER9 = HWREGH (PIECTRL_BASE + PIE_O_IER9);
    volatile uint16_t tempPIEIER10 = HWREGH (PIECTRL_BASE + PIE_O_IER10);
    volatile uint16_t tempPIEIER11 = HWREGH (PIECTRL_BASE + PIE_O_IER11);
    volatile uint16_t tempPIEIER12 = HWREGH (PIECTRL_BASE + PIE_O_IER12);
    volatile uint16_t tempPIEIFR1 = HWREGH (PIECTRL_BASE + PIE_O_IFR1);
    volatile uint16_t tempPIEIFR2 = HWREGH (PIECTRL_BASE + PIE_O_IFR2);
    volatile uint16_t tempPIEIFR3 = HWREGH (PIECTRL_BASE + PIE_O_IFR3);
    volatile uint16_t tempPIEIFR4 = HWREGH (PIECTRL_BASE + PIE_O_IFR4);
    volatile uint16_t tempPIEIFR5 = HWREGH (PIECTRL_BASE + PIE_O_IFR5);
    volatile uint16_t tempPIEIFR6 = HWREGH (PIECTRL_BASE + PIE_O_IFR6);
    volatile uint16_t tempPIEIFR7 = HWREGH (PIECTRL_BASE + PIE_O_IFR7);
    volatile uint16_t tempPIEIFR8 = HWREGH (PIECTRL_BASE + PIE_O_IFR8);
    volatile uint16_t tempPIEIFR9 = HWREGH (PIECTRL_BASE + PIE_O_IFR9);
    volatile uint16_t tempPIEIFR10 = HWREGH (PIECTRL_BASE + PIE_O_IFR10);
    volatile uint16_t tempPIEIFR11 = HWREGH (PIECTRL_BASE + PIE_O_IFR11);
    volatile uint16_t tempPIEIFR12 = HWREGH (PIECTRL_BASE + PIE_O_IFR12);
    Dint;
    HWREGH (PIECTRL_BASE + PIE_O_IER1)= 0x00;
    HWREGH (PIECTRL_BASE + PIE_O_IER2)= 0x00;
    HWREGH (PIECTRL_BASE + PIE_O_IER3)= 0x00;
    HWREGH (PIECTRL_BASE + PIE_O_IER4)= 0x00;
    HWREGH (PIECTRL_BASE + PIE_O_IER5)= 0x00;
    HWREGH (PIECTRL_BASE + PIE_O_IER6)= 0x00;
    HWREGH (PIECTRL_BASE + PIE_O_IER7)= 0x00;
    HWREGH (PIECTRL_BASE + PIE_O_IER8)= 0x00;
    HWREGH (PIECTRL_BASE + PIE_O_IER9)= 0x00;
    HWREGH (PIECTRL_BASE + PIE_O_IER10)= 0x00;
    HWREGH (PIECTRL_BASE + PIE_O_IER11)= 0x00;
    HWREGH (PIECTRL_BASE + PIE_O_IER12)= 0x00;
    CPUTimer_disableInterrupt (TASKA_CPUTIME_base);
    CPUTimer_disableInterrupt (TASKB_CPUTIME_base);
    CPUTimer_disableInterrupt (TASKC_CPUTIME_base);
    uint16_t returnVal =
    STL_CPU_REG_checkCPURegisters (false);
    IF (返回值=STL_CPU_REG_FAIL)

    mcuFAULT_Status = mcuFAULT_Status | CPU_REGISTER_FAULT;

    HWREGH (PIECTRL_BASE + PIE_O_IER1)= tempPIEIER1;
    HWREGH (PIECTRL_BASE + PIE_O_IER2)= tempPIEIER2;
    HWREGH (PIECTRL_BASE + PIE_O_IER3)= tempPIEIER3;
    HWREGH (PIECTRL_BASE + PIE_O_IER4)= tempPIEIER4;
    HWREGH (PIECTRL_BASE + PIE_O_IER5)= tempPIEIER5;
    HWREGH (PIECTRL_BASE + PIE_O_IER6)= tempPIEIER6;
    HWREGH (PIECTRL_BASE + PIE_O_IER7)= tempPIEIER7;
    HWREGH (PIECTRL_BASE + PIE_O_IER8)= tempPIEIER8;
    HWREGH (PIECTRL_BASE + PIE_O_IER9)= tempPIEIER9;
    HWREGH (PIECTRL_BASE + PIE_O_IER10)= tempPIEIER10;
    HWREGH (PIECTRL_BASE + PIE_O_IER11)= tempPIEIER11;
    HWREGH (PIECTRL_BASE + PIE_O_IER12)= tempPIEIER12;
    CPUTimer_enableInterrupt (TASKA_CPUTIME_base);
    CPUTimer_enableInterrupt (TASKB_CPUTIME_base);
    CPUTimer_enableInterrupt (TASKC_CPUTIME_base);
    EINT;

    工作正常、但我有疑问、如果从温度值恢复 IFR 的内容、MCU 将被锁存。 原因

    BR

    HK Woo

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

    您好、Whitney

    我检查了 stl_cpu_reg.asm 版本3.3。 发现与您的邮件略有不同

    234-235正常

    第263-268行:第263行为空白,应为264-268。 我认为没关系

    第346行-347:第346行是 MOV                  IER、@AR0

                             第347行是按                 @TH

                             第348行是 POP                     IFR

    请确认

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="46959" URL"~支持/microcontrollers/C2000-microcontrollers-group/CC2000/f/C2000-microcontrollers-forume/1105632/tms320f280025-epwm4-interrupt-stop-fer-add-ti-diagnostic-library/4100577#4100577"]如果引用了 IFR 内容、则该函数运行正常、但我对该函数的值仍有疑问[如果引用 IFR]。

    当您说 MCU 正在被锁存时、您是否意味着它会触发 Interrupt_defaultISR 以运行、就像您在之前的屏幕截图中所示(当您单击 ESTOP0时)? 您似乎在以某种方式触发一个未注册有效 ISR 的中断。

    您可能需要仔细检查、以确保您没有错误地启用任何未使用的中断。 当您单击 ESTOP0时、您可以检查 PIECTRL 寄存器以查看提取了哪个矢量、以确定哪个中断导致了问题。

    [~ userid="46959" URL"支持/microcontrollers/C2000-microcontrollers-group/C2000/f/C2000-microcontrollers-forum/1105632/tms320f280025-epwm4-interrupt-stop-fer-fer-add-ti-diagnostic-library/4100581#4100581]I 已检查 stl_cpu_reg.asm 版本3.3。 发现与您的邮件略有不同

    我想我是在查看 C2000Ware 4.01.00中的版本。 只要实际的汇编行与我共享的行相同、行号就不重要。 对于最后一节、只有2行需要删除-"按@th"和"POP IFR"。

    惠特尼