问题如下:
在DSP1上开启了定时器6、9、10、11、14、15,设定定时器周期运行,当没有启动定时器6时,其他定时器工作不正常,比如定时器11进入中断的周期时间不等于设定值,进入中断的时间会变长,异常几十us到ms不等。当开启定时器6时,其他定时器能更快的进入中断,但是与预期时间不符。请问有大佬知道是什么问题吗?谢谢!
部分定时器配置代码如下:
Timer_Params TimerParams;
Error_Block eb;
Error_init(&eb);
/* 启动定时器6 */
Timer_Params_init(&TimerParams);
TimerParams.period = period; // us
TimerParams.periodType = Timer_PeriodType_MICROSECS;
TimerParams.runMode = Timer_RunMode_CONTINUOUS;
TimerParams.startMode = Timer_StartMode_USER;
TimerParams.extFreq.lo = 19200000;
TimerParams.extFreq.hi = 0;
TimerParams.hwiParams->priority=15;
timer_set_period.timer6 = period;
Timer6Handle = Timer_create(5, timer6_isr, &TimerParams, &eb);
if(Timer6Handle == NULL) {
Log_print0(Diags_INFO, "--> timer6_init: Timer_create error!");
return;
}else {
Log_print0(Diags_INFO, "--> timer6_init: Timer_create success!");
Timer_start(Timer6Handle);
//timer_reg_enable_function(TIMER6_REG_ADDR,timer_set_period.timer6);
timer6_disable_function();
}
Hwi_Params hwiParams;
Timer_Params TimerParams;
Error_Block eb;
Error_init(&eb);
Timer_Params_init(&TimerParams);
TimerParams.period = period; // us
TimerParams.periodType = Timer_PeriodType_MICROSECS;
TimerParams.runMode = Timer_RunMode_CONTINUOUS;
TimerParams.startMode = Timer_StartMode_USER;
TimerParams.extFreq.lo = 19200000;
TimerParams.extFreq.hi = 0;
TimerParams.arg = 1;
TimerParams.hwiParams->priority=15;
timer_set_period.timer11 = period;
Timer11Handle = Timer_create(10, timer11_isr, &TimerParams, &eb);
if(Timer11Handle == NULL) {
Log_print0(Diags_INFO, "--> timer11_init: Timer_create error!");
return;
}else {
Log_print0(Diags_INFO, "--> timer11_init: Timer_create success!");
Timer_start(Timer11Handle);
timer11_disable_function();
}
补充:
继续调试发现在 CSL_MPU_L4PER_CM_CORE_REGS 上的定时器周期不正常,而CSL_DSP_IPU_CM_CORE_AON_REGS上的定时器周期正常。
这可能是需要什么特别配置吗?谢谢
下面是定时器的时钟初始化。
/* 配置时钟TIMER6 */
CSL_ipu_cm_core_aonRegs *ipu_cm_core_aonRegs = ((CSL_ipu_cm_core_aonRegs *)PHYSTOVIR_REG_40000000(CSL_DSP_IPU_CM_CORE_AON_REGS));
/* 配置运行模式 */
ipu_cm_core_aonRegs->CM_IPU_TIMER6_CLKCTRL_REG = CM_IPU_TIMER6_CLKCTRL_MODULEMODE_ENABLE;
while(CM_IPU_TIMER6_CLKCTRL_IDLEST_FUNC !=
CSL_FEXT(ipu_cm_core_aonRegs->CM_IPU_TIMER6_CLKCTRL_REG,
IPU_CM_CORE_AON_CM_IPU_TIMER6_CLKCTRL_REG_IDLEST));
ipu_cm_core_aonRegs->CM_IPU_TIMER7_CLKCTRL_REG = CM_IPU_TIMER7_CLKCTRL_MODULEMODE_ENABLE;
while(CM_IPU_TIMER7_CLKCTRL_IDLEST_FUNC !=
CSL_FEXT(ipu_cm_core_aonRegs->CM_IPU_TIMER7_CLKCTRL_REG,
IPU_CM_CORE_AON_CM_IPU_TIMER7_CLKCTRL_REG_IDLEST));
CSL_l4per_cm_core_componentRegs *csl_l4per_t = (CSL_l4per_cm_core_componentRegs*)PHYSTOVIR_REG_40000000(CSL_MPU_L4PER_CM_CORE_REGS);
csl_l4per_t->CM_L4PER_TIMER9_CLKCTRL_REG = CM_L4PER_TIMER9_CLKCTRL_MODULEMODE_ENABLE;
while(CM_L4PER_TIMER9_CLKCTRL_IDLEST_FUNC !=
CSL_FEXT(csl_l4per_t->CM_L4PER_TIMER9_CLKCTRL_REG,
L4PER_CM_CORE_COMPONENT_CM_L4PER_TIMER9_CLKCTRL_REG_IDLEST));
补充:
问题分析可能是由于时钟进入休眠,导致周期不准,解决办法是禁止定时器进入休眠模式。

如果有其他更好的方法,或者更详细的分析,请告诉我,谢谢!