📄 timer.c
字号:
/*
* file:
* timer.c
* description:
* timer controller code.
*/
static unsigned int _tclk;
void timer_ctrl_init(unsigned long pclk, int ms)
{
AT91_REG* tc_smr = AT91C_AIC_SMR;
/* tc0 interrupt mode */
tc_smr[AT91C_ID_TC0] = AT91C_AIC_SRCTYPE_INT_LEVEL_SENSITIVE | 0x07;
/* enable TC clock */
*AT91C_PMC_PCER = (1<<AT91C_ID_TC0);
*AT91C_TC0_IDR = 0xff;
*AT91C_TC0_CCR = AT91C_TC_CLKDIS;
/* no external TCLK */
*AT91C_TCB_BMR &= ~(0x03);
*AT91C_TCB_BMR |= (0x01);
/* selected MCLK/128 */
*AT91C_TC0_CMR = (AT91C_TC_CLKS_TIMER_DIV4_CLOCK | AT91C_TC_CPCTRG);
/* comparison count */
_tclk = pclk / 128;
*AT91C_TC0_RC = (ms * _tclk / 1000) - 1;
*AT91C_TC0_IER = AT91C_TC_CPCS;
}
int timer_ctrl_get_irq(void)
{
return AT91C_ID_TC0;
}
unsigned int timer_ctrl_load_value(void)
{
/* resolution of 1us */
return ((*AT91C_TC0_RC+1) * (1000*1000)) / _tclk;
}
unsigned int timer_ctrl_get_count(void)
{
/* resolution of 1us */
return ((*AT91C_TC0_CV) * (1000*1000)) / _tclk;
}
void timer_ctrl_start(void)
{
/* Start timer */
*AT91C_TC0_CCR = (AT91C_TC_CLKEN | AT91C_TC_SWTRG);
}
void timer_ctrl_udelay(unsigned long usec)
{
unsigned long now, time = 0;
unsigned long last = *AT91C_TC0_CV;
usec *= _tclk + (500*1000);
usec /= (1000*1000);
while(time < usec)
{
now = *AT91C_TC0_CV;
if(now >= last)
time += now - last;
else
time += *AT91C_TC0_RC + now - last + 1;
last = now;
}
}
/* end of file */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -