请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
部件号: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
谢谢