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.

AM5728: DSP1 定时器周期异常

Part Number: AM5728


问题如下:

在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));

补充:

问题分析可能是由于时钟进入休眠,导致周期不准,解决办法是禁止定时器进入休眠模式。

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