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.

[参考译文] TMS570LS1114:,ECAP IRQ无法再次输入。

Guru**** 2392765 points
Other Parts Discussed in Thread: TMS570LS1114, HALCOGEN

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1086595/tms570ls1114-ecap-irq-cannot-enter-again

部件号:TMS570LS1114
主题中讨论的其他部件: HALCOGEN

您好:

  MCU是当前设计的TMS570LS1114  

vimREG->FIRQPR0 = 0x0.0003万;vimREG->FIRQPR1 = 0x0万000000;vimREG->FIRQPR2 =0万 = 0x0万000000;vimREG->FIRQPR3 =0万 = 0x00000000;

vimREG->REQMASSKSET0 = 0x03;vimREG->REQMASSSET1 = 0x00;vimREG->REQMASSET2 = 0x00;

vimREG->REQMASSSET3 =(1U<11u);  /*ECAP4 interrupT*/

实际上,ECAP4具有实际脉冲输入,则ECAP4中断正常。 同时,MCU_self_test正在运行。   运行几个小时后,系统报告VIM_PRTY,VIM_CRC64错误,

出现错误后,系统无法进入ECAP4中断。 然后我检查核心寄存器CPSR I=0 (允许IRQ) F=0 (允许FIQ),并检查eCAP4寄存器,ECFLG=0x0003 (中断标志正常),ECEINT=0x0002 (中断启用正常),TSCTR正在运行,CAP1正在运行。

但系统无法再次进入ecap4中断。 为什么? 如何调试? 如何避免这种情况发生?  我认为情况是中断冲突。

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

    您好,

    VIM ADDERR寄存器的值是什么?  ADDERR寄存器存储第一个奇偶校验错误位置的地址,其值将永远不会被电源重置和其他重置源重置。

    1114 -enter-again]但系统不能再次进入ecap4中断。 为什么? 如何调试? 如何避免这种情况发生?  [/引述]

    如果发生奇偶校验错误, 将 绕过中断向量表。  然后,任何IRQ/FRQ中断的结果向量就是FBPARERR寄存器中包含的值,直到清除该位为止。

    您是否对VIM FBPARERR寄存器进行了编程? 您可以使用此ISR清除PARFLG以恢复VIM INT矢量表的完整性。  

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

    感谢您的回复!

    我将研究这一部分。  

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

    sys_vim.c

    func void viminit (void)(失效)

       vim_PARCTL = 0xAU;

       VIM_FBPARERR =(UINT32)&vimParityErrorHandler;

      。。。

    }

    #pragma code_State(vimParityErrorHandler, 32)
    #pragma interrupt (vimParityErrorHandler,IRQ)
    #pragma weak (vimParityErrorHandler)

    /*源ID:vim_sourceId_006 */
    /* DesignId:VIM_DesignId_006 */
    /*要求:HL_SR105 */

    func void vimParityErrorHandler(void)

      。。。。

    }

    我看到了这个功能。 但我不知道可以为它分配哪个信道矢量。

    静态连接t_isrFuncPTR s_vim_init[128U]=

      phantomInterrupt (&F),

      &ESM_HIGH _INtr_handler,       /*信道0 */

      。。 &vimParityErrorHandler,   /* channel?(&vimParityErrorHandler,/* */

       ecap4Interrupt (&E),       /*信道107 */

    }

    您知道ecap4interrupt将导致IRQ,然后程序将跳转至  

    #pragma code_State(ecap4Interrupt,32)
    #pragma中断(ecap4Interrupt,IRQ)

    /*源ID:ecap_sourceId_035 */
    /* DesignId:ECAP_DesignId_021 */
    /*要求:HL_ECAP_SR15 */
    void ecap4Interrupt (void)(空ecap4

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    1114 -enter-again/4023855#4023855"]但402.3855万但我402.3855万我不知道我可以为其分配哪个通道向量

    您不需要将此回退例程映射到VIM通道。 它只是具有奇偶校验错误的ISR的临时替代。

    当发生中断且CPU尝试获取相应的ISR地址并在VIM RAM位置发现奇偶校验错误时,会发生VIM奇偶校验错误。 VIM中的ISR地址寄存器(IRQVECREG)将自动更新回退地址,PC分支将使用该地址。

    回退例程处理程序需要执行以下操作:

    1.清除 VIM RAM中的奇偶校验错误。 您可以在 VIM RAM中重写ISR地址,以便清除奇偶校验错误

    2.通过读取这两个寄存器或禁用/启用中断来更新IRQVECREG或FIQVECREG。  一旦您退出回退例程(奇偶校验处理程序),IRQVECREG和FIQVECREG将不会更新为正确的ISR地址(即使您在 VIM RAM中重写了该地址)。 寄存器仍将保留回退地址。  

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

    您好,

    1、在调试模式下,我可以看到程序已输入vimParityErrorHandler。

    2、在此中断中,您可以看到功能调用vimInit(),在vimInit, vimRAM->ISR[]已被重写。

    3、我想通过  读取这两个寄存器来更新IRQVECREG或FIQVECREG,以便您查看

       u32lv_irqvecreg = vimREG->IRQVECREG;
       u32lv_fiqvecreg = vimREG->FIQVECREG;

      但 IRQVECREG或FIQVECREG不会更改。 然后我检查CPSR_I,此位已设置为1,并返回到0。禁用/启用中断

      IRQVECREG=FBPARERR=(UINT32)&vimParityErrorHandler; Still

      FIQVECREG=&phantomInterrupt

      因此无法再次输入ECAP中断。

    感谢您的回复,我想我有点了解。 我需要更多帮助。 谢谢!

    #pragma code_State(vimParityErrorHandler, 32)
    #pragma interrupt (vimParityErrorHandler,IRQ)
    #pragma weak (vimParityErrorHandler)

    /*源ID:vim_sourceId_006 */
    /* DesignId:VIM_DesignId_006 */
    /*要求:HL_SR105 */
    void vimParityErrorHandler(void)

    UINT32 VEC;
    uINT32_t u32lv_irqvecreg;
    uINT32_t u32lv_fiqvecreg;

    /*识别损坏的地址*/
    UINT32 ERROR_ADDR = VIM_ADDERR;

    /*识别信道编号*/
    uINT32 error_channel =((error_addr & 0x1FFU)>> 2U);

    /*更正损坏的位置*/
    vimRAM->ISR[ERROR_CHANGE]= s_vim_init[ERROR_CHANGE];

    /*清除奇偶校验错误标志*/
    vim_PARFLG = 1U;

    /*禁用并启用最高优先级的待处理信道*/
    如果(vimREG->FIQINDEX != 0U)

    VEC = vimREG->FIQINDEX - 1U;
    }
    否则

    /*SAFETYMCUSW 134 S MR:12.2 <approved>"Read 32 bit volatile register"*/
    VEC = vimREG->IRQINDEX - 1U;
    }
    IF (VEC == 0U)

    vimREG->INTREQ0 = 1U;
    VEC = esmREG->IOFFHR - 1U;

    如果(VEC < 32U)

    esmREG->SR1[0U]=(UINT32) 1U << VEC;
    esmGroup1通知(VEC);
    }
    否则,如果(VEC < 64U)

    esmREG->SR1[1U]=(UINT32) 1U <<(VEC-32U);
    esmGroup2通知(VEC-32U);
    }
    否则,如果(VEC < 96U)

    esmREG->SR4[0U]=(UINT32) 1U <<(VEC-64U);
    esmGroup1通知(VEC-32U);
    }
    否则

    esmREG->SR4[1U]=(UINT32) 1U <<(VEC-96U);
    esmGroup2通知(VEC-64U);
    }
    }
    否则,如果(VEC < 32U)

    VIMREG->REQMASSKCLR0 =(UINT32) 1U << VEC;
    vimREG->REQMASSKSET0 =(UINT32) 1U << VEC;
    }
    否则,如果(VEC < 64U)

    VIMREG->REQMASSKCLR1 =(UINT32) 1U <<(VEC-32U);
    VIMREG->REQMASSSET1 =(UINT32) 1U <<(VEC-32U);
    }
    否则,如果(VEC < 96U)

    vimREG->REQMASSKCLR2 =(UINT32) 1U <<(VEC-64U);
    VIMREG->REQMASSSET2 =(UINT32) 1U <<(VEC-64U);
    }
    否则

    VIMREG->REQMACKCLR3 =(UINT32) 1U <<(VEC-96U);
    VIMREG->REQMASSSET3 =(UINT32) 1U <<(VEC-96U);
    }

    u32lv_irqvecreg = vimREG->IRQVECREG;
    u32lv_fiqvecreg = vimREG->FIQVECREG;
    vimInit();
    }

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

    QJ:您好!

    请问您是否可以获得此问题故障排除的后续更新? 如需更多信息,请告诉我。 感谢您的支持。

    此致,

    陈苔丝

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

    你好,我仍然没有解决这个问题。

    但我知道这个 vimParityError,它是由我的程序引起的。

    当程序正在执行check_vim()时,当ECAP频繁中断时,就会导致此问题。

    我找到"

    /*禁用ESM中断生成*/
    esmREG->IECR1 = GET_ESM_BIT NUM(ESM_G1ERR_VIM_PARTY_CORERR);
    u32lv_tmp = esmREG->IECR1;
    /*禁用ESM错误影响*/
    esmREG->DEPAPR1 = Get_ESM_Bit_NUM(ESM_G1ERR_VIM_PARTY_CORERR);"

    不起作用。

    我想了解如何禁用ESM vim_parity错误。

    我需要帮助,谢谢!

    以下是计划:仅供参考

    /*备份PCR寄存器*/
    u32lv_vimparctl_bk = REG_VIM_PARCTL;
    /*Backup Grp1 ESM中断启用寄存器*/
    u32lv_Bak_reg_IESR1 = esmREG->IESR1;
    u32lv_Bak_reg_EEPAPR1 = esmREG->EEPAPR1;
    /*禁用ESM中断生成*/
    esmREG->IECR1 = GET_ESM_BIT NUM(ESM_G1ERR_VIM_PARTY_CORERR);
    u32lv_tmp = esmREG->IECR1;
    /*禁用ESM错误影响*/
    esmREG->DEPAPR1 = Get_ESM_Bit_NUM(ESM_G1ERR_VIM_PARTY_CORERR);
    /*启用奇偶校验测试模式*/
    Bit_Set (REG_VIM_PARCTL,VIM_TEST_MODE);
    /*在VIM RAM奇偶校验位置翻转位*/
    Bit_Flip (REG_VIRAMPARLOC,0x1U);
    /*禁用奇偶校验测试模式*/
    Bit_Clear(REG_VIM_PARCTL,VIM_TEST_MODE);
    /*导致奇偶校验错误*/
    u32lv_vimramread = REG_VIRAMLOC;

    /*检查ESM组1通道15是否未标记*/
    u32lv_tmp = esmREG->SR1[0U]和GET_ESM_bit_NUM(ESM_G1ERR_VIM_PARTY_CORERR);
    如果((((REG_VIM_PARFLG & VIM_PAR_ERR_FLG)== 0U)||
    (u32lv_tmp == 0U))

    /* VIM RAM奇偶校验错误未标记为ESM。 */
    b8lv_err_vim_prty_test = BTRUE;
    }
    否则

    /*验证朗朗朗的地址*/
    IF (REG_VIM_ADDERR == VAL_VIMRAMLOC)

    b8lv_err_vim_prty_test = BFALSE;
    }
    否则

    b8lv_err_vim_prty_test = BTRUE;
    }
    }

    /*清除VIM */中的VIM奇偶校验错误标志
    位集(REG_VIM_PARFLG,VIM_PAR_ERR_FLG);
    /*清除ESM组1通道15标志*/
    esmREG->SR1[0U]= Get_ESM_Bit_NUM(ESM_G1ERR_VIM_PARTY_CORERR);
    /*启用奇偶校验测试模式*/
    Bit_Set (REG_VIM_PARCTL,VIM_TEST_MODE);
    /*恢复到正确的奇偶校验*/
    Bit_Flip (REG_VIRAMPARLOC,0x1U);
    /* Restrore奇偶校验控制寄存器*/
    REG_VIM_PARCTL = u32lv_vimparctl_bk;
    /*恢复ESM寄存器状态*/
    esmREG->IESR1 = u32lv_Bak_reg_IESR1;
    esmREG->EEPAPR1 = u32lv_Bak_reg_EEPAPR1;

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

    您好,

    您是否使用 了由HALCoGen生成的vimParityCheck()? 此功能应清除错误标志。

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

    我的程序类似于  HALCoGen生成的vimParityCheck()。  

    我放弃我的程序,并使用由HALCoGen生成的vimParityCheck( sys_selftest.c )。 此外,apear程序将导致vimParityErrorHandler,然后ecap4中断无法再次输入。

    如果ecap4 pin处没有中断,vimParityCheck程序正常,程序将不会进入vimParityErrorHandler。 但当我在ecap4 pin处引起中断时,程序将在vimParityErrorHandler中输入。

    我要查找使用vimParityCheck时掩码vimParityErrorHandler的方法。

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

    执行 vimParityCheck时,不应启用中断。 执行 vimParityCheck后,将更正VIM奇偶校验值的翻转位(0xFFF8.24万处)。

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

    您好,

      我想我已经找到了麦可。 感谢您的在线帮助。

      几天之后,我通过禁用了中断  

      _禁用_中断_();

      vimParityCheck();

      _enable_interrupit_();

      但这还不够,所以测试失败了。

      今天,按照您的说明,我还禁用ecap4中断

       _禁用_中断_();
      ecapREG4->ECCTL2 &=(uint16)~(uint16)0x0010U;/* ecapStopCounter(ecapREG4);*/
      ecapREG4->ECEINT = 0x0000U;/* ecapDisableInterrupt (ecapREG4,ecapInt_CEVT1);*/
      ecapREG4->TSCTR= 0U;
      vimParityCheck();
      /**-设置中断启用*/
      ecapREG4->ECCLR = 0xHU;
      ecapInit();
      _enable_interrupit_();

       结果令人兴奋,程序将不  会再次输入vimParityErrorHandler。

       昨天晚上,我想我会改变一种方法。  为什么我不在ecap4中断中执行vimParityCheck? 所以我今天早上就试了。 是的,测试也是成功的。

        此方法比禁用中断好。 我将使用此方法,在ISR中进行vimparitycheck。  

        如果您有任何问题,您可以回复。

       谢谢,致以最诚挚的谢意!

        ZSM/2022.0415万