工具与软件:
下面是另一个线程的代码片段
#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");
}
}
我有以下问题。
- TIMERIdleModeConfigure (baseAddr、TIMER_TIOCP_CFG_IDLEMODE_IDLE_MODE_0x1);//GPTIMER_NO_IDLE); 为什么需要这样做
- TIMERPostedModeConfig (baseAddr、TIMER_TSICR_POSTD_POSTD_VALUE_0);//GPTIMER_NONPOSTED); 我不明白什么是发布模式和未发布模式。
- TIMEREmuModeConfigure 什么是 EMU 模式?
- 为什么在第20行中禁用计时器?
-您能解释一下 Timer_Period_ 函数中的幻数吗? 0x000002和0x00003是什么意思?