器件型号: AM2634
您好、我需要帮助了解为什么我的计时器在调试时停止运行。 我们在代码中使用三种不同的硬件计时器 (500µs 、1ms 和 256ms )。 在调试期间、计时器之一最终停止、其中断标志未被清除。 我们尝试更改了失速模式(打开和关闭)、当前设置为打开、但问题仍然存在。
有人能帮我弄清楚为什么会发生这种情况吗? 以及如何解决




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
您好、我需要帮助了解为什么我的计时器在调试时停止运行。 我们在代码中使用三种不同的硬件计时器 (500µs 、1ms 和 256ms )。 在调试期间、计时器之一最终停止、其中断标志未被清除。 我们尝试更改了失速模式(打开和关闭)、当前设置为打开、但问题仍然存在。
有人能帮我弄清楚为什么会发生这种情况吗? 以及如何解决




您好、
我提供了相关信息。


->
->
静态 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
您好、
还有几个问题:
1.您的 ISR 逻辑有多长时间? 通常、巨大的 ISR 逻辑会导致延迟中断标志清除并导致时序问题。
2.是否在 ISR 中设置断点? 如果是、这是预期结果、
3.可以验证每个 ISR 是否调用 RTI_intStatusClear () 标志。
4.您能否确认配置了多少个比较和计数器事件(我看到 3 个中断)以及是否清除所有事件的中断。
我相信未配置的比较块 1、2、3 会生成虚假中断、而这些虚假中断永远不会被清除、从而导致中断控制器锁定。 在初始化时清除并禁用所有比较块、然后仅启用您正在使用的比较块。
此致、
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 中调用、因此我们遵循了这种方法。