Part Number: TDA4VP-Q1
Tool/software:
Below is a code snippet from another thread
#define GPTIMER_MAX_RESOLUTION (0xFFFFFFFFU)
#define TIMER_INITIAL_COUNT (0x3C0U)
#define TIMER_RLD_COUNT (0x3C0U)
#define TIMER16_IRQ_NUM 172
void TimerMode_Init(uint32_t baseAddr)
{
TIMERReset(baseAddr);
TIMEREmuModeConfigure(baseAddr, TIMER_TIOCP_CFG_EMUFREE_TIMER_FREE);//GPTIMER_FREE);
TIMERIdleModeConfigure(baseAddr, TIMER_TIOCP_CFG_IDLEMODE_IDLE_MODE_0X1);//GPTIMER_NO_IDLE);
TIMERPostedModeConfig(baseAddr, TIMER_TSICR_POSTED_POSTED_VALUE_0);//GPTIMER_NONPOSTED);
TIMERCounterSet(baseAddr, (GPTIMER_MAX_RESOLUTION - TIMER_INITIAL_COUNT));
TIMERReloadSet(baseAddr, (GPTIMER_MAX_RESOLUTION - TIMER_RLD_COUNT));
TIMERModeConfigure(baseAddr, TIMER_TCLR_AR_MASK); //GPTIMER_AUTORLD_NOCMP_ENABLE);
TIMERWakeEnable(baseAddr, TIMER_IRQWAKEEN_OVF_WUP_ENA_MASK);
TIMERIntEnable(baseAddr, TIMER_INT_OVF_EN_FLAG);
TIMERDisable(baseAddr);
}
Timer_PeriodConfig(uint32_t baseAddr, uint32_t wTime)
{
HW_WR_REG32(baseAddr + TIMER_TCLR, 0x0002);
HW_WR_REG32(baseAddr + TIMER_TCRR, (GPTIMER_MAX_RESOLUTION - wTime));
HW_WR_REG32(baseAddr + TIMER_TLDR, (GPTIMER_MAX_RESOLUTION - wTime));
HW_WR_REG32(baseAddr + TIMER_TCLR, 0x0003); /* start timer */
}
void Timer_IntCfg(void)
{
uint32_t baseAddr;
HwiP_Handle hwiHandle;
OsalInterruptRetCode_e osalRetVal = 0;
OsalRegisterIntrParams_t intrPrms;
/*Timer18*/
baseAddr = TIMER16_ADDRESS;
Osal_RegisterInterrupt_initParams(&intrPrms);
intrPrms.corepacConfig.arg = (uintptr_t)baseAddr;
intrPrms.corepacConfig.name = NULL;
intrPrms.corepacConfig.isrRoutine = Timer16_InterruptIsr;
intrPrms.corepacConfig.priority = 0x01U;
intrPrms.corepacConfig.corepacEventNum = 0U; /* NOT USED ? */
intrPrms.corepacConfig.triggerSensitivity = OSAL_ARM_GIC_TRIG_TYPE_HIGH_LEVEL;
intrPrms.corepacConfig.intVecNum = TIMER16_IRQ_NUM;
osalRetVal = Osal_RegisterInterrupt(&intrPrms, &hwiHandle);
if(osalRetVal == 0)
{
printf("Timer16_IntCfg success!\n");
}
else
{
printf("Timer16_IntCfg is fail!\n");
}
}
I have following questions.
- TIMERIdleModeConfigure(baseAddr, TIMER_TIOCP_CFG_IDLEMODE_IDLE_MODE_0X1);//GPTIMER_NO_IDLE); Why is this required
- TIMERPostedModeConfig(baseAddr, TIMER_TSICR_POSTED_POSTED_VALUE_0);//GPTIMER_NONPOSTED); I do not really understand what is a Posted mode and non-posted mode.?
- TIMEREmuModeConfigure what is EMu mode?
- Why is the timer disabled in line 20?
- Can you please explain the magic numbers in Timer_Period_config function. What does 0x000002 and 0x00003 mean?