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.

[参考译文] AM2634:RTI 计时器在调试模式下转向

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1615395/am2634-rti-timers-are-getting-stooped-in-debug-mode

器件型号: AM2634

您好、我需要帮助了解为什么我的计时器在调试时停止运行。 我们在代码中使用三种不同的硬件计时器 (500µs 、1ms 和 256ms )。 在调试期间、计时器之一最终停止、其中断标志未被清除。 我们尝试更改了失速模式(打开和关闭)、当前设置为打开、但问题仍然存在。

有人能帮我弄清楚为什么会发生这种情况吗? 以及如何解决

 

image.png

image.png

image.png


image.png

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

    您好、

    1.您能否分享正在使用的所有三个 RTI 实例的 RTI 寄存器转储?

    2.请问您如何确认特定的 RTI2 正在停止。

    3.还可以共享 example.syscfg 文件吗?

    此致、
    Shaunak

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

    您好、

    我提供了相关信息。

    ->

    当 RTI 回调中调用的代码功能停止时、我设置一个断点以检查是否仍在触发 ISR。 我还通过切换三个不同的引脚并在示波器上进行观察来验证这一点。 该问题不会在 RTI2 等特定计时器上始终如一地发生、而是该行为适用于其他计时器。 有时 RTI1 和 RTI2 停止、而在其他情况下、不同的计时器组合会停止。

    ->

    静态 void Drivers_rtiOpen (void)


    HwiP_Params rtiHwiParams;
    int32_t 状态;
    uint32_t baseAddr;
    uint64_t timeInNsec;
    uint32_t cntr预 分频器;
    uint32_t Comp预 分频器;

    baseAddr = CONFIG_RTI1_BASE_ADDR;

    /*配置 RTI 输入时钟源*/
    SoC_controlModuleUnlockMMR (SOC_DOMAIN_ID_MAIN、MSS_RCM_PARTITION0);
    *(volatile uint32_t *) AddrTranslateP_getLocalAddr (CONFIG_RTI1_CLOCK_SRC_MUX_ADDR)= CONFIG_RTI1_CLOCK_SRC_WUCPUCLK;
    SoC_controlModuleLockMMR (SOC_DOMAIN_ID_MAIN、MSS_RCM_PARTITION0);

    /*启用/禁用暂停时继续*/
    RTIG_setStallMode (baseAddr、 RTI/GC_STALL_MODE_ON );

    /*配置计数器块 0 */
    cntrPrescaler =(CONFIG_RTI1_INPUT_CLK_Hz/CONFIG_RTI1_CNTR0_OUTPUT_CLK_Hz)- 1;
    RTI_CounterConfigure (baseAddr、RTI_TMR_CNT_BLK_INDEX_0、RTI_TMR_CLK_SRC_COUNTER、RTI_TMR_NTU_0、cntrPrescaler);
    RTI_captureConfig (baseAddr、RTI_TMR_CNT_BLK_INDEX_0、RTI_TMR_CAPTURE_EVT_0);


    /*配置比较事件 0 */
    timeInNsec = CONFIG_RTI1_nsec_per_tick_COMP0;
    if (timeInnsec == 0)

    timeInNsec = CONFIG_RTI1_USEC_PER_TICK_COMP0 * 1000U;
    }
    CompPrescaler =(timeInNsec*CONFIG_RTI1_COMP0_INPUT_CLK_Hz)/1000000000;

    RTI_compareEventConfig(baseAddr、RTI_TMR_CMP_BLK_INDEX_0、CONFIG_RTI1_COMP0_SRC,比较预分频器,比较预分频器);
    RTI_intStatusClear (baseAddr、RTI_TMR_INT_INT0_FLAG);
    HwiP_Params_init (&rtiHwiParams);
    rtiHwiParams.intNum = CONFIG_RTI1_INT_NUM_EVENT0;
    rtiHwiParams.callback = RTI1_event0Isr_1mSec;
    rtiHwiParams.isPulse = 0;// 电平边沿 但我们尝试了 但结果相同
    rtiHwiParams.priority = 13;
    Status = HwiP_Construct (&gRtiEvent0HwiObj[CONFIG_RTI1]、&rtiHwiParams);
    DebugP_assertNoLog (STATUS==SystemP_Success);

    RTI_intEnable (baseAddr、RTI_TMR_INT_INT0_FLAG);

    RTI_intDisable (baseAddr、RTI_TMR_INT_DMA0_FLAG);


    baseAddr = CONFIG_RTI2_BASE_ADDR;

    /*配置 RTI 输入时钟源*/
    SoC_controlModuleUnlockMMR (SOC_DOMAIN_ID_MAIN、MSS_RCM_PARTITION0);
    *(volatile uint32_t *) AddrTranslateP_getLocalAddr (CONFIG_RTI2_Clock_SRC_MUX_ADDR)= CONFIG_RTI2_Clock_SRC_WUCPUCLK;
    SoC_controlModuleLockMMR (SOC_DOMAIN_ID_MAIN、MSS_RCM_PARTITION0);

    /*启用/禁用暂停时继续*/
    RTIG_setStallMode (baseAddr、 RTI/GC_STALL_MODE_ON );

    /*配置计数器块 0 */
    cntrPrescaler =(CONFIG_RTI2_INPUT_CLK_Hz/CONFIG_RTI2_CNTR0_OUTPUT_CLK_Hz)- 1;
    RTI_CounterConfigure (baseAddr、RTI_TMR_CNT_BLK_INDEX_0、RTI_TMR_CLK_SRC_COUNTER、RTI_TMR_NTU_0、cntrPrescaler);
    RTI_captureConfig (baseAddr、RTI_TMR_CNT_BLK_INDEX_0、RTI_TMR_CAPTURE_EVT_0);


    /*配置比较事件 0 */
    timeInNsec = CONFIG_RTI2_nsec_per_tick_COMP0;
    if (timeInnsec == 0)

    timeInNsec = CONFIG_RTI2_USEC_PER_TICK_COMP0 * 1000U;
    }
    CompPrescaler =(timeInNsec*CONFIG_RTI2_COMP0_INPUT_CLK_Hz)/1000000000;

    RTI_compareEventConfig(baseAddr、RTI_TMR_CMP_BLK_INDEX_0、CONFIG_RTI2_COMP0_SRC,比较预分频器,比较预分频器);
    RTI_intStatusClear (baseAddr、RTI_TMR_INT_INT0_FLAG);
    HwiP_Params_init (&rtiHwiParams);
    rtiHwiParams.intNum = CONFIG_RTI2_INT_NUM_EVENT0;
    rtiHwiParams.callback = RTI2_event0Isr_500uSec;
    rtiHwiParams.isPulse = 0;
    rtiHwiParams.priority = 14;
    Status = HwiP_Construct (&gRtiEvent0HwiObj[CONFIG_RTI2]、&rtiHwiParams);
    DebugP_assertNoLog (STATUS==SystemP_Success);

    RTI_intEnable (baseAddr、RTI_TMR_INT_INT0_FLAG);

    RTI_intDisable (baseAddr、RTI_TMR_INT_DMA0_FLAG);

    baseAddr = CONFIG_RTI3_BASE_ADDR;

    /*配置 RTI 输入时钟源*/
    SoC_controlModuleUnlockMMR (SOC_DOMAIN_ID_MAIN、MSS_RCM_PARTITION0);
    *(volatile uint32_t *) AddrTranslateP_getLocalAddr (CONFIG_RTI3_CLOCK_SRC_MUX_ADDR)= CONFIG_RTI3_CLOCK_SRC_WUCPUCLK;
    SoC_controlModuleLockMMR (SOC_DOMAIN_ID_MAIN、MSS_RCM_PARTITION0);

    /*启用/禁用暂停时继续*/
    RTIG_setStallMode (baseAddr、 RTI/GC_STALL_MODE_ON );

    /*配置计数器块 0 */
    cntrPrescaler =(CONFIG_RTI3_INPUT_CLK_Hz/CONFIG_RTI3_CNTR0_OUTPUT_CLK_Hz)- 1;
    RTI_CounterConfigure (baseAddr、RTI_TMR_CNT_BLK_INDEX_0、RTI_TMR_CLK_SRC_COUNTER、RTI_TMR_NTU_0、cntrPrescaler);
    RTI_captureConfig (baseAddr、RTI_TMR_CNT_BLK_INDEX_0、RTI_TMR_CAPTURE_EVT_0);


    /*配置比较事件 0 */
    timeInNsec = CONFIG_RTI3_Nsec_PER_TICK_COMP0;
    if (timeInnsec == 0)

    timeInNsec = CONFIG_RTI3_USEC_PER_TICK_COMP0 * 1000U;
    }
    CompPrescaler =(timeInNsec*CONFIG_RTI3_COMP0_INPUT_CLK_Hz)/1000000000;

    RTI_compareEventConfig(baseAddr、RTI_TMR_CMP_BLK_INDEX_0、CONFIG_RTI3_COMP0_SRC,比较预分频器,比较预分频器);
    RTI_intStatusClear (baseAddr、RTI_TMR_INT_INT0_FLAG);
    HwiP_Params_init (&rtiHwiParams);
    rtiHwiParams.intNum = CONFIG_RTI3_INT_NUM_EVENT0;
    rtiHwiParams.callback = RTI3_event0Isr_256mSec;
    rtiHwiParams.isPulse = 0;
    rtiHwiParams.priority = 15;
    Status = HwiP_Construct (&gRtiEvent0HwiObj[CONFIG_RTI3]、&rtiHwiParams);
    DebugP_assertNoLog (STATUS==SystemP_Success);

    RTI_intEnable (baseAddr、RTI_TMR_INT_INT0_FLAG);

    RTI_intDisable (baseAddr、RTI_TMR_INT_DMA0_FLAG);


    }

    下图包含 RTI 停止时的 INTflag 状态、此处 rti1 和 rti2 停止。

    此致、

    Gopala Lakshmana Swamy

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

    您好、

    让我回顾一下、然后回来。

    此致、
    Shaunak

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

    您好、

    还有几个问题:

    1.您的 ISR 逻辑有多长时间? 通常、巨大的 ISR 逻辑会导致延迟中断标志清除并导致时序问题。

    2.是否在 ISR 中设置断点? 如果是、这是预期结果、

    3.可以验证每个 ISR 是否调用 RTI_intStatusClear () 标志。

    4.您能否确认配置了多少个比较和计数器事件(我看到 3 个中断)以及是否清除所有事件的中断。

    我相信未配置的比较块 1、2、3 会生成虚假中断、而这些虚假中断永远不会被清除、从而导致中断控制器锁定。 在初始化时清除并禁用所有比较块、然后仅启用您正在使用的比较块。

    此致、
    Shaunak

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

    您好、

    1.我的 ISR 只包含 LED 闪烁。

    2.如果 LED 闪烁停止,则设置断点并验证。

    3.yes、全部 3 个 ISR   在 ISR API 中调用 RTI_intStatusClear ()。

    4.我已经配置了 一个比较事件和一个计数器事件,使用 Hwip_clearInt () 清除 ISR API 内的中断。 同时、我将通过清除未配置的比较块进行检查

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

    您能分享您的 ISR 代码吗?

    此致、
    Shaunak

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

    您好、请在下面找到 ISR。

    此致、

    Gopala Lakshmana Swamy

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

    您好、

    我认为问题是我们只清除 INT0、而不是清除所有标志、尝试清除所有可能的标志、而不仅仅是 INT0。

    此致、
    Shaunak

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

    您好、Shaunak、

    感谢你能抽出时间。

    1) 我按照你在我的 ISR 中的建议做了更改,但仍然面临同样的问题。

    2) 在我的实际 ISR 代码中,在 1ms 计时器中,我设置了 不同的标志,并 据此调用我的函数。 我可以这样做吗? 并且我的 ISR 是否可以保留比实际所需时间更多的时间。

    void SendData1ms_timer (void)


    if ((timerFlag.tmr16mSecFlags >> 0)&(0x01))

    timerFlag.tmr16mSecFlags =(timerFlag.tmr16mSecFlags & 0xFFFFFFFE);
    ICMtimer1 毫秒+;
    }

    }


    void SL_ICM_SER_IncreICMSyncTimer_100mSec (void)

    //该函数将由 100ms RTI 计时器调用


    if ((timerFlag.tmr100mSecFlags >> 0)&(0x01))

    timerFlag.tmr100mSecFlags =(timerFlag.tmr100mSecFlags & 0xFFFFFFFE);
    ICM_Handl.syncTimer ++;
    ICM_Handl.uiFrameMsgTmr_100mSec ++;
    icm_handle.hrtBeatMsgTmr_100mSec ++;
    icm_handle.msgDataTmr_100msec ++;
    }


    }

    正如我在上面分享的。 我正在设置变量,并基于不同的位状态 (0 或 1) 我正在递增我的 funciton 相关标志. 我可以得到任何建议。

     我们无法保持 ISR 更多时间、并且我们有更多的函数要在 ISR 中调用、因此我们遵循了这种方法。

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

    您好、

    我目前正在出差、请允许我有时间回来。

    此致、
    Shaunak

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

    您好、

    此问题是否仍然存在? 如果是、您能将您的应用分享给我进行调试吗?

    此致、
    Shaunak

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

    您好、

    它仍处于打开状态、但我无法共享该应用程序。 机密信息。

    到目前为止、我们使用 SysTick 代替计时器。

    谢谢、此致。

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

    我无法使用开箱即用的示例重现此问题。

    此致、
    Shaunak