/*******************************************************************
* Function: SysTick_TimeCfg
* Description: This function configure the core timer cycle (N * 10us)=10us~2550us
* Note: N10us must larger than 1
*******************************************************************/
static void SysTick_TimeCfg(const unsigned char N10us)
{
#if !defined (_USED_SSL_CORETIMER_)
unsigned long ulPeriod = 0;
ulPeriod = getCodeCLK() / 100000;
/* active state, auto reload, generate interrupt */
*pTCNTL = TMPWR | TAUTORLD | TINT;
*pTPERIOD = ulPeriod;
if (N10us < 1)
{
*pTSCALE = 0; //default, system tick = 10us
}
else
{
*pTSCALE = N10us-1;//TSCALE = 0~255
g_u8TickN10us = N10us;
}
/* TCOUNT decrements once every TSCALE + 1 clock cycles.
* When the value of TCOUNT reaches 0, an interrupt is generated and the
* TINT bit of the TCNTL register is set.
* Values written to the TPERIOD register are automatically copied to the TCOUNT register.
*/
*pTCOUNT = ulPeriod;
#else
ADI_TMR_RESULT Result;
unsigned long ulPeriod = getCodeCLK() / 100000;
u32 count, period, scale;
Result = adi_tmr_Open(ADI_TMR_CORE_TIMER);
u32InitStatus += Result;
if (ADI_TMR_RESULT_SUCCESS != Result)
AIO_printf("\r\n[CT] Error >>1");
/* active state, auto reload, generate interrupt */
*pTCNTL = TMPWR | TAUTORLD | TINT;
period = ulPeriod;
if (N10us < 1)
{
scale = 0; //default, system tick = 10us
}
else
{
scale = N10us-1;//TSCALE = 0~255
g_u8TickN10us = N10us;
}
/* TCOUNT decrements once every TSCALE + 1 clock cycles.
* When the value of TCOUNT reaches 0, an interrupt is generated and the
* TINT bit of the TCNTL register is set.
* Values written to the TPERIOD register are automatically copied to the TCOUNT register.
*/
count = ulPeriod;
ADI_TMR_CORE_CMD_VALUE_PAIR CoreTable [] = {
{ ADI_TMR_CORE_CMD_SET_AUTO_RELOAD, (void *)TRUE },
{ ADI_TMR_CORE_CMD_SET_COUNT, (void *)&count },
{ ADI_TMR_CORE_CMD_SET_PERIOD, (void *)&period },
{ ADI_TMR_CORE_CMD_SET_SCALE, (void *)&scale },
{ ADI_TMR_CORE_CMD_SET_ACTIVE_MODE, (void *)TRUE },
{ ADI_TMR_CORE_CMD_RESET_INTERRUPT_OCCURRED, (void *)TRUE},
{ ADI_TMR_CORE_CMD_ENABLE_TIMER, (void *)FALSE },
{ ADI_TMR_CORE_CMD_END, NULL },
};
Result = adi_tmr_CoreControl(ADI_TMR_CORE_CMD_TABLE, CoreTable);
u32InitStatus += Result;
if (ADI_TMR_RESULT_SUCCESS != Result)
AIO_printf("\r\n[CT] Error >>2");
#endif
}
void SysTick_Start(void)
{
#if !defined (_USED_SSL_CORETIMER_)
/* enable the timer */
*pTCNTL |= TMREN;
#else
ADI_TMR_RESULT Result;
Result = adi_tmr_CoreControl(ADI_TMR_CORE_CMD_ENABLE_TIMER, (void *)TRUE);
u32InitStatus += Result;
if (ADI_TMR_RESULT_SUCCESS != Result)
AIO_printf("\r\n[CT] Error >>3");
AIO_printf("\r\n[CT] S...%d",u32InitStatus);
#endif
}
void SysTick_Stop(void)
{
#if !defined (_USED_SSL_CORETIMER_)
/* enable the timer */
*pTCNTL &= (unsigned long)~TMREN;
#else
adi_tmr_CoreControl(ADI_TMR_CORE_CMD_ENABLE_TIMER, (void *)FALSE);
#endif
}
/*******************************************************************
* Function: Init_Timer_Interrupts
* Description: This function initialises the interrupts for core timer
*******************************************************************/
static void Init_Timer_Interrupts(void)
{
#if !defined (_USED_SSL_CORETIMER_)
register_handler(ik_timer, CoreTimer_ISR);
#else
ADI_TMR_RESULT Result;
Result = adi_tmr_InstallCallback
(ADI_TMR_CORE_TIMER, TRUE, (void *)0x22222222, NULL, CoreTimerCallback);
u32InitStatus += Result;
if (ADI_TMR_RESULT_SUCCESS != Result)
AIO_printf("\r\n[CT] Error >>4");
#endif
}
void SysTick_Init(void)
{
g_ulTickCount = 0;
SysTick_TimeCfg(10);//system tick configure as 10*10us = 100us
Init_Timer_Interrupts();
}
中断处理:
static void CoreTimerCallback(void *ClientHandle, u32 Event, void *pArg)
{
// Event = ADI_TMR_EVENT_TIMER_EXPIRED
if (ADI_TMR_CORE_TIMER != (u32)pArg)
{
AIO_printf("1");
return;
}
AIO_printf("2");
// do processing when core timer expires
// ClientHandle = 0x22222222
unsigned int n;
//unsigned int uiTIMASK = cli();
g_ulTickCount++;
/* decrement each counter if it is non-zero */
for( n = 0; n < MAX_NUM_COUNTDOWN_TIMERS; n++ )
{
if( 0 != sCountDownTimer[n].m_ulTimeoutCounter )
{
sCountDownTimer[n].m_ulTimeoutCounter--;
}
}
}