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

📄 hw_timer.c

📁 瑞星微公司RK27XX系列芯片的SDK开发包
💻 C
字号:
/******************************************************************/
/*   Copyright (C) 2007 ROCK-CHIPS FUZHOU . All Rights Reserved.  */
/*******************************************************************
File :  hw_timer.c
Desc :  Timer接口函数的实现

Author : huangxinyu
Date : 2007-05-31
Notes :

$Log: hw_timer.c,v $
Revision 1.2  2008/06/19 04:43:37  Administrator
代码整理!

Revision 1.1.1.1  2008/05/07 04:15:08  Administrator
no message

Revision 1.10  2008/01/07 12:52:21  Huangshilin
no message

Revision 1.1.1.1  2007/12/21 02:34:34  Lingzhaojun
12.21

Revision 1.2  2007/12/14 15:09:32  Hanjiang
rm972 pp后的版本上传

Revision 1.1.1.1  2007/12/11 14:19:29  cvsadmin
no message

Revision 1.2  2007/12/01 08:46:02  Shenfuming
no message

Revision 1.1.1.1  2007/12/01 01:30:13  Lingzhaojun
no message

Revision 1.7  2007/11/21 11:56:36  Huangxinyu
修正videotimer问题

Revision 1.6  2007/11/15 14:07:46  Huangxinyu
增加video timer

Revision 1.5  2007/11/10 04:31:05  Huangxinyu
调试修改

Revision 1.4  2007/10/15 09:20:10  Huangxinyu
根据RK27提交修改driver

Revision 1.3  2007/10/08 02:38:50  Lingzhaojun
添加版本自动注释脚本

*********************************************************************/
#include "include.h"
#include "hw_include.h"
#include "hw_timer.h"


#define pTimerReg   ((pTimerReg_t)TIMER_REG_BASE)

static pTimerCallBack gTimerIRQ[3] = {NULL, NULL, NULL};

static UINT32 gTimerTick[3] = {0, 20*1000, 0};
/**************************************************************************
* 函数描述: 得到指定Timer的count值
* 入口参数: index -- Timer0/Timer1/Timer2
* 出口参数: 无
* 返回值: 指定Timer的count值
*
***************************************************************************/
UINT32 Timer_GetCount(UINT8 index)
{
    UINT32 count;
    switch (index)
    {
        case 0:
            count = ReadReg32(&(pTimerReg->TMR0CVR));
            break;
        case 1:
            count = ReadReg32(&(pTimerReg->TMR1CVR));
            break;
        case 2:
            count = ReadReg32(&(pTimerReg->TMR2CVR));
            break;
        default:
            break;
    }
    return count;
}

/**************************************************************************
* 函数描述: 初始化Timer
* 入口参数: index -- Timer0/Timer1/Timer2
*           mstick -- 每个tick的毫秒数
* 出口参数: 无
* 返回值:   TRUE -- 初始化成功
*           FALSE -- 初始化失败
***************************************************************************/
/* index: Timer0/Timer1/Timer2
   mstick: set millisecond per tick */
BOOL Timer_PowerOnInit(UINT8 index, UINT32 mstick)
{
    UINT32 pll_timer_conf[3];
    UINT32 pll_timer_apb_clk;

    gTimerTick[index] = mstick;
    pll_timer_apb_clk = Pll_get_apb_freq();

    pll_timer_conf[index] = PORSCHE_TIMER_EN |
                            PORSCHE_TIMER_CNT_MODE_PERIODICAL |
                            PRESCALE_1 |
                            PORSCHE_TIMER_INT_MASK_DIS |
                            PORSCHE_TIMER_INT_LEVEL_TRIG;

    switch (index)
    {
        case 0:
            /* Disable the timer 0*/
            WriteReg32(&(pTimerReg->TMR0CON), PORSCHE_TIMER_DIS);
            /* load the counting value to timer0 */
            WriteReg32(&(pTimerReg->TMR0LR), mstick*pll_timer_apb_clk / 1000);   // Video usTick
            /* set periodical mode and enable the timer  */
            WriteReg32(&(pTimerReg->TMR0CON), pll_timer_conf[index]);
            break;
        case 1:
            /* Disable the timer 1*/
            WriteReg32(&(pTimerReg->TMR1CON), PORSCHE_TIMER_DIS);        /* load the counting value to timer1 */
            WriteReg32(&(pTimerReg->TMR1LR), mstick*pll_timer_apb_clk);
            /* set periodical mode and enable the timer  */
            WriteReg32(&(pTimerReg->TMR1CON), pll_timer_conf[index]);
            break;
        case 2:
            /* Disable the timer 2*/
            WriteReg32(&(pTimerReg->TMR2CON), PORSCHE_TIMER_DIS);
            /* load the counting value to timer2 */
            WriteReg32(&(pTimerReg->TMR2LR), mstick*pll_timer_apb_clk);
            /* set periodical mode and enable the timer  */
            WriteReg32(&(pTimerReg->TMR2CON), pll_timer_conf[index]);
            break;
        default:
            break;

    }

    return TRUE;
}

/**************************************************************************
* 函数描述: Timer中断服务程序
* 入口参数: 无
* 出口参数: 无
* 返回值:   无
***************************************************************************/
void Timer0ISR(void)
{
    pTimerCallBack callback;
    Timer_ClearIntrFlag(0);   // 同时只有一个中断产生
    callback = gTimerIRQ[0];
//   gTimerIRQ[gTimerIndex] = NULL;   // 中断产生的速度比全局变量赋值快
    if (callback)
        callback();
}

/**************************************************************************
* 函数描述: Timer1中断服务程序
* 入口参数: 无
* 出口参数: 无
* 返回值: 无
***************************************************************************/
void Timer1ISR(void)
{
    pTimerCallBack callback;
    Timer_ClearIntrFlag(1);  // 同时只有一个中断产生
    callback = gTimerIRQ[1];
//  gTimerIRQ[gTimerIndex] = NULL;   // 中断产生的速度比全局变量赋值快
    if (callback)
        callback();
}

/**************************************************************************
* 函数描述: Timer1中断服务程序
* 入口参数: 无
* 出口参数: 无
* 返回值: 无
***************************************************************************/
void Timer2ISR(void)
{
    pTimerCallBack callback;
    Timer_ClearIntrFlag(1);  // 同时只有一个中断产生
    callback = gTimerIRQ[1];
//  gTimerIRQ[gTimerIndex] = NULL;   // 中断产生的速度比全局变量赋值快
    if (callback)
        callback();
}

/**************************************************************************
* 函数描述: 启动Timer
* 入口参数: index -- Timer0/Timer1/Timer2
*           mstick -- 每个tick的毫秒数
*           callbak -- 用户注册的回调函数
* 出口参数: 无
* 返回值:   无
* 说  明:   此接口仅供系统使用
***************************************************************************/
void StartHWTimer(UINT8 index, UINT32 mstick, pTimerCallBack callback)
{

    gTimerTick[index] = mstick;
    gTimerIRQ[index] =  callback;

    switch (index)
    {
        case 0:
            Intr_RegISR(INTC_TMR0, Timer0ISR);
            break;
        case 1:
            Intr_RegISR(INTC_TMR1, Timer1ISR);
            break;
        case 2:
            Intr_RegISR(INTC_TMR2, Timer2ISR);
            break;
        default:
            break;
    }

    Timer_PowerOnInit(index, mstick);

}

/**************************************************************************
* 函数描述: 启动用户Timer
* 入口参数: mstick -- 每个tick的毫秒数
*           callbak -- 用户注册的回调函数
* 出口参数: 无
* 返回值:   无
* 说  明:   此硬件Timer提供给应用使用
***************************************************************************/
void StartHWUserTimer(UINT32 mstick, pTimerCallBack callback)
{
    StartHWTimer(UserTimerNo, mstick, callback);
}

void StopHWUserTimer(void)
{
    /* Disable the timer 0*/
    WriteReg32(&(pTimerReg->TMR0CON), PORSCHE_TIMER_DIS);
    Intr_Disable(INTC_TMR0);
}

/**************************************************************************
* 函数描述: 启动Video Timer
* 入口参数: ustick -- 每个tick的微秒数
*           callbak -- 用户注册的回调函数
* 出口参数: 无
* 返回值:   无
* 说  明:   此硬件Timer提供给Video使用
***************************************************************************/
void StartHWVideoTimer(UINT32 ustick, pTimerCallBack callback)
{
    StartHWTimer(0, ustick, callback);
}

/**************************************************************************
* 函数描述: 清除Timer中断标志
* 入口参数: index -- Timer0/Timer1/Timer2
* 出口参数: 无
* 返回值:   无
***************************************************************************/
void Timer_ClearIntrFlag(UINT8 index)
{
    switch (index)
    {
        case 0:
            ClrRegBits32(&(pTimerReg->TMR0CON), PORSCHE_TIMER_INT_FLAG);
            break;
        case 1:
            ClrRegBits32(&(pTimerReg->TMR1CON), PORSCHE_TIMER_INT_FLAG);
            break;
        case 2:
            ClrRegBits32(&(pTimerReg->TMR2CON), PORSCHE_TIMER_INT_FLAG);
            break;
        default:
            break;
    }
}

/**************************************************************************
* 函数描述:  根据改变的APB频率校准Timer 参数
* 入口参数:  APBfreq: APB 频率(kHz)
* 出口参数:  无
* 返回值:    无
***************************************************************************/
void Timer_SetFreq(UINT32 APBfreq)
{
    UINT8 i;
    for (i = 0;i < 3;i++)
    {
        Timer_PowerOnInit(i, gTimerTick[i]); //Timer_PowerOnInit内部get apbfreq
    }
}

/**************************************************************************
* 函数描述: 反初始化Timer
* 入口参数: index -- Timer0/Timer1/Timer2
* 出口参数: 无
* 返回值:   TRUE -- 反初始化成功
*           FALSE -- 反初始化失败
***************************************************************************/
BOOL Timer_PowerOffDeinit(UINT8 index)
{
    switch (index)
    {
        case 0:
            /* Disable the timer 0*/
            WriteReg32(&(pTimerReg->TMR0CON), PORSCHE_TIMER_DIS);
            gTimerIRQ[index] =  NULL;
            break;
        case 1:
            /* Disable the timer 1*/
            WriteReg32(&(pTimerReg->TMR1CON), PORSCHE_TIMER_DIS);
            gTimerIRQ[index] =  NULL;
            break;
        case 2:
            /* Disable the timer 1*/
            WriteReg32(&(pTimerReg->TMR2CON), PORSCHE_TIMER_DIS);
            gTimerIRQ[index] =  NULL;
            break;
        default:
            break;
    }
    return TRUE;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -