⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 timer.c

📁 一个基于ARM9的操作系统, 实现了很多的功能,包括内存管理,进程创建等
💻 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 + -