📄 timer.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 + -