📄 drvtimer.c
字号:
{
int32_t i;
if ((TIMER3->TCSR.IE == 1) && (TIMER3->TISR.TIF == 1))
TIMER3->TISR.TIF = 1;
if ((TIMER3->TEXCON.TEXEN == 1) && (TIMER3->TEXCON.TEXIEN == 1) && (TIMER3->TEXISR.TEXIF == 1))
TIMER3->TEXISR.TEXIF = 1;
uTimer3Tick++;
if (bIsSetTime3Event) /* Timer Event Handle */
{
for (i=0; i<TIMER_EVENT_COUNT; i++)
{
if (tTime3Event[i].active)
{
tTime3Event[i].curTick--;
if (tTime3Event[i].curTick == 0)
{
(*tTime3Event[i].funPtr)(tTime3Event[i].transParam);
tTime3Event[i].curTick = tTime3Event[i].initTick;
}
}
}
}
}
/*---------------------------------------------------------------------------------------------------------*/
/* Function: DrvTIMER_Init */
/* */
/* Parameters: */
/* None */
/* Returns: */
/* None */
/* Description: */
/* User must to call this function before any timer operations after system boot up. */
/*---------------------------------------------------------------------------------------------------------*/
void DrvTIMER_Init(void)
{
bIsTimer0Initial = TRUE;
bIsTimer1Initial = TRUE;
bIsTimer2Initial = TRUE;
bIsTimer3Initial = TRUE;
}
/*---------------------------------------------------------------------------------------------------------*/
/* Function: DrvTIMER_Open */
/* */
/* Parameters: */
/* ch - [in] */
/* E_TIMER_CHANNEL, it could be E_TMR0/E_TMR1/E_TMR2/E_TMR3 */
/* uTicksPerSecond - [in] */
/* This value means how many timer interrupt ticks in one second */
/* op_mode - [in] */
/* E_TIMER_OPMODE, E_ONESHOT_MODE/E_PERIODIC_MODE/E_TOGGLE_MODE/E_CONTINUOUS_MODE */
/* Returns: */
/* E_SUCCESS Operation successful */
/* E_DRVTIMER_CHANNEL Invalid Timer channel */
/* E_DRVTIMER_CLOCK_RATE Calculate initial value fail */
/* Description: */
/* Open the specified timer channel with specified operation mode. */
/*---------------------------------------------------------------------------------------------------------*/
int32_t DrvTIMER_Open(E_TIMER_CHANNEL ch, uint32_t uTicksPerSecond, E_TIMER_OPMODE op_mode)
{
uint32_t i;
uint32_t uRegTcmpr, uRegTcr = 0x0;
switch (ch)
{
case E_TMR0:
{
if ((bIsTimer0Initial != TRUE) || (bIsTimer0Used != FALSE))
return E_DRVTIMER_EIO;
bIsTimer0Used = TRUE;
SYSCLK->APBCLK.TMR0_EN = 1;
outpw((uint32_t)&TIMER0->TCSR, 0); /* disable timer */
TIMER0->TISR.TIF = 1; /* write 1 to clear for safty */
for (i=0; i<TIMER_EVENT_COUNT; i++)
{
tTime0Event[i].active = FALSE;
}
uTimer0Tick = 0;
_sys_uTimer0TickPerSecond = uTicksPerSecond;
uRegTcmpr = CalTimerInitValue(GetTimerClock(E_TMR0), uTicksPerSecond);
if (uRegTcmpr == (uint32_t)-1)
{
return E_DRVTIMER_CLOCK_RATE;
}
TIMER0->TCMPR = (uRegTcmpr << 8) >> 8;
outpw((uint32_t)&TIMER0->TCSR, (uRegTcr|(uRegTcmpr>>24))|(op_mode<<27));
break;
}
case E_TMR1:
{
if ((bIsTimer1Initial != TRUE) || (bIsTimer1Used != FALSE))
return E_DRVTIMER_EIO;
bIsTimer1Used = TRUE;
SYSCLK->APBCLK.TMR1_EN = 1;
outpw((uint32_t)&TIMER1->TCSR, 0); /* disable timer */
TIMER1->TISR.TIF = 1; /* write 1 to clear for safty */
for (i=0; i<TIMER_EVENT_COUNT; i++)
{
tTime1Event[i].active = FALSE;
}
uTimer1Tick = 0;
_sys_uTimer1TickPerSecond = uTicksPerSecond;
uRegTcmpr = CalTimerInitValue(GetTimerClock(E_TMR1), uTicksPerSecond);
if(uRegTcmpr == (uint32_t)-1)
{
return E_DRVTIMER_CLOCK_RATE;
}
TIMER1->TCMPR = (uRegTcmpr << 8) >> 8;
outpw((uint32_t)&TIMER1->TCSR, (uRegTcr|(uRegTcmpr>>24))|(op_mode<<27));
break;
}
case E_TMR2:
{
if ((bIsTimer2Initial != TRUE) || (bIsTimer2Used != FALSE))
return E_DRVTIMER_EIO;
bIsTimer2Used = TRUE;
SYSCLK->APBCLK.TMR2_EN =1;
outpw((uint32_t)&TIMER2->TCSR, 0); /* disable timer */
TIMER2->TISR.TIF = 1; /* write 1 to clear for safty */
for (i=0; i<TIMER_EVENT_COUNT; i++)
{
tTime2Event[i].active = FALSE;
}
uTimer2Tick = 0;
_sys_uTimer2TickPerSecond = uTicksPerSecond;
uRegTcmpr = CalTimerInitValue(GetTimerClock(E_TMR2), uTicksPerSecond);
if(uRegTcmpr == (uint32_t)-1)
{
return E_DRVTIMER_CLOCK_RATE;
}
TIMER2->TCMPR = (uRegTcmpr << 8) >> 8;
outpw((uint32_t)&TIMER2->TCSR, (uRegTcr|(uRegTcmpr>>24))|(op_mode<<27));
break;
}
case E_TMR3:
{
if ((bIsTimer3Initial != TRUE) || (bIsTimer3Used != FALSE))
return E_DRVTIMER_EIO;
bIsTimer3Used = TRUE;
SYSCLK->APBCLK.TMR3_EN = 1;
outpw((uint32_t)&TIMER3->TCSR, 0); /* disable timer */
TIMER3->TISR.TIF = 1; /* write 1 to clear for safty */
for (i=0; i<TIMER_EVENT_COUNT; i++)
{
tTime3Event[i].active = FALSE;
}
uTimer3Tick = 0;
_sys_uTimer3TickPerSecond = uTicksPerSecond;
uRegTcmpr = CalTimerInitValue(GetTimerClock(E_TMR3), uTicksPerSecond);
if(uRegTcmpr == (uint32_t)-1)
{
return E_DRVTIMER_CLOCK_RATE;
}
TIMER3->TCMPR = (uRegTcmpr << 8) >> 8;
outpw((uint32_t)&TIMER3->TCSR, (uRegTcr|(uRegTcmpr>>24))|(op_mode<<27));
break;
}
default:
{
return E_DRVTIMER_CHANNEL ;
}
}
if (op_mode == E_TOGGLE_MODE)
{
switch (ch)
{
case E_TMR0:
case E_TMR1:
case E_TMR2:
case E_TMR3:
{
DrvGPIO_InitFunction((E_DRVGPIO_FUNC)((uint32_t)E_FUNC_TMR0 + (uint32_t)ch));
}
default:
{
return E_DRVTIMER_CHANNEL ;
}
}
}
return E_SUCCESS;
}
/*---------------------------------------------------------------------------------------------------------*/
/* Function: TIMER_Close */
/* */
/* Parameters: */
/* ch - [in] */
/* E_TIMER_CHANNEL, it could be E_TMR0/E_TMR1/E_TMR2/E_TMR3 */
/* Returns: */
/* E_SUCCESS Operation successful */
/* E_DRVTIMER_CHANNEL Invalid Timer channel */
/* Description: */
/* The function is used to close the timer channel. */
/*---------------------------------------------------------------------------------------------------------*/
int32_t DrvTIMER_Close(E_TIMER_CHANNEL ch)
{
switch (ch)
{
case E_TMR0:
{
DrvTIMER_DisableInt(E_TMR0);
TIMER0->TCSR.CRST = 1;
bIsTimer0Used = FALSE;
bIsSetTime0Event = FALSE;
break;
}
case E_TMR1:
{
DrvTIMER_DisableInt(E_TMR1);
TIMER1->TCSR.CRST = 1;
bIsTimer1Used = FALSE;
bIsSetTime1Event = FALSE;
break;
}
case E_TMR2:
{
DrvTIMER_DisableInt(E_TMR2);
TIMER2->TCSR.CRST = 1;
bIsTimer2Used = FALSE;
bIsSetTime2Event = FALSE;
break;
}
case E_TMR3:
{
DrvTIMER_DisableInt(E_TMR3);
TIMER3->TCSR.CRST = 1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -