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.

[参考译文] TDA4VM:如何将MCU_Timer1级联到MCU域中的MCU_TIMER0?

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1099194/tda4vm-how-to-cascaded-mcu_timer1-to-mcu_timer0-in-mcu-domain

部件号:TDA4VM

您好,专家

我在MCU1_0中使用了AUTOSAR,我需要一个计时器具有比较功能,作为生成任务计划的计时器。 所以我想选择MCU Timer0和MCU Timer1 级联为64位计时器。计时器0可以生成任务计划的比较中断和溢出中断以 增加Timer1。

但初始化计时器时,Timer1无法成功初始化。 下面是我的代码中的配置:

Step1, I 启用MCU_Timer1到MCU_TIMER0的级联

/* enables cascading of MCU_TIMER1 to MCU_TIMER0 */
HW_WR_REG32_RAW((CSL_MCU_CTRL_MMR0_CFG0_BASE + CSL_MCU_CTRL_MMR_CFG0_MCU_TIMER1_CTRL), 0x100U);

步骤2, I配置计时器0和计时器1。 Timer0初始化成功,但调用 TIMERDisable (baseAddr)时Timer1初始化失败,如下图所示。 寄存器MCU_Timer1_TWP.W_Pend_TCLR = 0x01,这意味着写入TCLR寄存器待处理。 Timer1无法成功运行。

sint32 Osshell_Timer_Init(uint32 baseAddr)
{
    sint32 cslRet = CSL_EFAIL;
    
    /* Reset timer configuration */
    cslRet = TIMERResetConfigure(baseAddr,TIMER_SFT_RESET_ENABLE);
    /* Reset the timer */
    if (cslRet == CSL_PASS)
    {
        cslRet = TIMERReset(baseAddr);
    }
    
    /* when debugger breaked, timer will stop when select TIMER_FROZEN */
    if (cslRet == CSL_PASS)
    {
        cslRet = TIMEREmuModeConfigure(baseAddr, TIMER_FROZEN);
    }
    /* Keep channel disabled till config complete */
    if (cslRet == CSL_PASS)
    {
        cslRet = TIMERDisable(baseAddr);
    }
    /* Enable not posted mode of timer operation. */
    if(cslRet == CSL_PASS)
    {
        cslRet = TIMERPostedModeConfig(baseAddr, TIMER_NONPOSTED);
    }

    return cslRet;
}

/* Init Hardware Counter for SystemTimer */
void OsShell_Core0_SystemTimerInit(void)
{
    TickType Now;
    sint32 cslRet = CSL_EFAIL;

    /* Reset the timer */
    cslRet = Osshell_Timer_Init(SYSTEM_TIMER_BASE_ADDR0);
    /* set timer0 Prescale */
    if (cslRet == CSL_PASS)
    {
        cslRet = TIMERPreScalerClkEnable(SYSTEM_TIMER_BASE_ADDR0, SYSTEM_TIMER0_PTV | SYSTEM_TIMER0_PRE);
    }

    if(cslRet == CSL_PASS)
    {
        cslRet = TIMERTrigModeConfigure(SYSTEM_TIMER_BASE_ADDR0, SYSTEM_TIMER0_TRG | SYSTEM_TIMER0_PT);
    }
    /* enable timer0 compare function. */
    if (cslRet == CSL_PASS)
    {
        cslRet = TIMERModeConfigure(SYSTEM_TIMER_BASE_ADDR0, TIMER_AUTORLD_CMP_ENABLE);
    }
    
    /* Make sure old cmp register will not accidentally match */
    Now = (TickType)TIMERCounterGet(SYSTEM_TIMER_BASE_ADDR0);
    cslRet = TIMERCompareSet(SYSTEM_TIMER_BASE_ADDR0, Now - 1);
    
    /* Enable compare interrupt */
    cslRet = TIMERIntEnable(SYSTEM_TIMER_BASE_ADDR0, TIMER_INT_MAT_EN_FLAG);

    cslRet = Osshell_Timer_Init(SYSTEM_TIMER_BASE_ADDR1);
    /* set timer1 Prescale */
    if (cslRet == CSL_PASS)
    {
        cslRet = TIMERPreScalerClkEnable(SYSTEM_TIMER_BASE_ADDR1, SYSTEM_TIMER1_PTV | SYSTEM_TIMER1_PRE);
    }
    if (cslRet == CSL_PASS)
    {
        cslRet = TIMERModeConfigure(SYSTEM_TIMER_BASE_ADDR0, TIMER_AUTORLD_NOCMP_ENABLE);
    }
    TIMEREnable(SYSTEM_TIMER_BASE_ADDR0);
    TIMEREnable(SYSTEM_TIMER_BASE_ADDR1);
}

步骤3,然后我尝试在 步骤1中提交级联设置,然后计时器1可以成功初始化,如下图所示。

 

我试图在 PDK中找到一个级联计时器的例子,但是找不到任何例子。 能否给我一个关于  MCU域中的级联计时器的例子, 特别是初始化部分。

我使用SDK版本: ti-processor-sdk-RTos-j721e-EVM-EVM-08_00_00_12

谢谢