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

📄 timer.c

📁 windows mobile 6.13 dnldr下载源码
💻 C
字号:
/*******************************************************************************
 * Copyright:   Copyright (c) 2007. Hisilicon Technologies, CO., LTD.
 * Version:     V300R001B04
 * Filename:    Timer.c
 * Description: 实现系统Timer的操作功能
 * History:
                1.Created by SunShaoJie on 2007/12/25
*******************************************************************************/

#include "sys.h"
#include "Timer.h"

/*******************************************************************************
Function:           GetSysTimer
Description:        得到当前的系统时钟值
Input:              无
Output:             无
Return:             当前的时钟寄存器值
Others:             无
*******************************************************************************/
UINT32 GetSysTimer(void)
{
    return INREG32(SYS_TIMER_VALUE);
}

/*******************************************************************************
Function:           GetPassedMicSec
Description:        得到相对于记录点,已经消逝的时间值,以ms为单位
Input:              dwBaseTick:    记录的时间点
Output:             无
Return:             消逝的时间值,以ms为单位
Others:             无
*******************************************************************************/
UINT32 GetPassedMicSec(UINT32 dwBaseTick)
{
    UINT32 dwCurTick;
    UINT32 dwDeltaTime;

    dwCurTick = INREG32(SYS_TIMER_VALUE);

    dwDeltaTime = dwBaseTick - dwCurTick;
    //return (((dwDeltaTime+1) * 1000) >> 15);  /* div 32768 clk (ms) */
    return (((((dwDeltaTime+1)&0x3FFFFF)*1000)>>15) + ((((dwDeltaTime+1)>>22)*1000)<<7));
}


/* 等待4000个周期,以240MHz的ARM时钟计,每次循环至少2个指令周期,
4000次循环后,Timer的值必然发生变化 */
#define SYS_TIMER_MIN_TICK  4000

/*******************************************************************************
Function:           InitSysTimer
Description:        初始化系统时钟,并检测时钟是否开始运行
Input:              无
Output:             无
Return:             TRUE:  时钟已经开始运行
                    FALSE: 时钟没有运行
Others:             无
*******************************************************************************/
BOOL InitSysTimer(void)
{
    volatile UINT32  i, dwBaseTick;
#ifdef HISI3610_CHIP
    CLRREG32(HISI3610_SYSCTRL_SCSYSCTRL, 0x8800);       /* set SysTimer 32KHz */
#else
    CLRREG32(SYSTEM_CONTROL_BASE, 0x18000);             /* set SysTimer 32KHz */
#endif

    OUTREG32(SYS_TIMER_LOAD, 0);
    OUTREG32(SYS_TIMER_CTRL, 0xC2);                     /* open System Timer */

    dwBaseTick = GetSysTimer();

    for(i=0; i<SYS_TIMER_MIN_TICK; i++);

    return (dwBaseTick != GetSysTimer())?TRUE:FALSE;
}

/*******************************************************************************
Function:           Sleep
Description:        延时,以ms为单位
Input:              dwNum:  需要延时的毫秒数
Output:             无
Return:             无
Others:             无
*******************************************************************************/
void Sleep(UINT32 dwNum)
{
    UINT32 dwBaseTick, dwCurTime=0;

    dwBaseTick = GetSysTimer();

    while(dwNum > dwCurTime)
    {
        dwCurTime = GetPassedMicSec(dwBaseTick);
        //OALMSG(1 ,(TEXT("Sleep curTime %d\r\n"), curTime));
    }
}

⌨️ 快捷键说明

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