📄 timer.c
字号:
/*************************************************************************/
/* */
/* The last modification date: 02-23-2004 */
/* REMARKS: Created initial version 1.0 */
/* */
/* Copyright (C) 2004 Vimicro CO.,LTD */
/*************************************************************************/
#include "..\inc\44b.h"
#include "..\inc\IntControl.h"
#include "..\inc\timer.h"
extern UINT32 g_mclk;
#define MaxTime 0x0000ffff
static void __irq Exint1(void); //For deal command.
void DrvInitInt(void)
{
rPCONG |= 0xc; //EINT1
rPUPG=0x0; //pull up enable
rEXTINT &= ~(0xf0);
rEXTINT |= 0x10; //"1" level mode
pISR_EINT1 = (unsigned)Exint1;
Enable_Intr(nINT_EXT1);
}
void Exint1()
{
rI_ISPC=BIT_EINT1;
}
void __irq Timer0_isr(void); //For deal command.
static void (*CommandDeal)() = (void (*)())0;
void InitTimer0ForCommandParase(void (*func)(),int interval)
{
UINT32 Freq, Tcount;
CommandDeal= func;
pISR_TIMER0 = (unsigned)Timer0_isr;
rTCFG0 = 0xa;
rTCFG1 = TIMER0_CLK_DIVISOR_8;
Freq = g_mclk/8/(0xa+1); // Timer0_clock (in Hz)
// Timer0_clock=MCLK_FREQ/(prescale+1)/Divisor
Tcount = (interval*Freq)/1000; //100ms timer
rTCNTB0 = (UINT16)Tcount;
rTCON |= TIMER0_LOAD;
rTCON &= (~TIMER0_LOAD);
rTCON |= TIMER0_RUN | TIMER0_INTERVAL;
Enable_Intr(nINT_TIMER0);
}
void Timer0_isr(void)
{
rI_ISPC=BIT_TIMER0;
CommandDeal();
}
void Timer0_stop(void)
{
rI_ISPC=BIT_TIMER0;
Disable_Intr(nINT_TIMER0);
}
void __irq Timer1_isr(void); //For deal command.
static void (*CommandDeal1)() = (void (*)())0;
void InitTimer1(void (*func)())
{
UINT32 Freq, Tcount;
CommandDeal1= func;
pISR_TIMER1 = (unsigned)Timer1_isr;
rTCFG0 |= 0xa;
rTCFG1 |= TIMER1_CLK_DIVISOR_32;
Freq = g_mclk/32/(0x0a+1) ; // Timer1_clock (in Hz)
// Timer1_clock=MCLK_FREQ/(prescale+1)/Divisor
Tcount = (50*Freq)/1000; //50ms timer
rTCNTB1 = (UINT16)Tcount;
rTCON |= TIMER1_LOAD;
rTCON &= ~TIMER1_LOAD;
rTCON |= TIMER1_RUN | TIMER1_INTERVAL;
Enable_Intr(nINT_TIMER1);
}
void InitCaculaterTime(void)
{
rTCFG0 |= 0xff00; //max 44s
rTCFG1 |= TIMER2_CLK_DIVISOR_32;
}
UINT32 ReturnTime(void)
{
UINT32 Freq, Tcount;
Tcount=rTCNTO2;
Timer2_Stop();
Tcount=MaxTime-Tcount;
Freq = g_mclk/32/(0xff+1);
Tcount=Tcount*1000/Freq; //ms
return Tcount;
}
void StartCaculateTime(void)
{
UINT32 Freq;
Freq = g_mclk/8/(0xa+1) ; // Timer2_clock (in Hz)
// Prescaler=256=2^8, Divisor=4=2^2
// Timer2_clock=MCLK_FREQ/(prescale+1)/Divisor
rTCNTB2 = MaxTime;
rTCON |= TIMER2_LOAD;
rTCON &= ~TIMER2_LOAD;
rTCON |= TIMER2_RUN;
}
void Timer1_isr(void)
{
rI_ISPC=BIT_TIMER1;
CommandDeal1();
}
UINT32 G_MS;
UINT32 ReturnCount(void)
{
UINT32 Freq, Tcount;
Tcount=rTCNTO2;
Tcount=MaxTime-Tcount;
Freq = g_mclk/32/(0xff+1);
Tcount=Tcount*1000/Freq; //ms
if(!rTCNTO2)
{
Timer2_Stop();
rTCNTB2 = MaxTime;
rTCON |= TIMER2_LOAD;
rTCON &= ~TIMER2_LOAD;
rTCON |= TIMER2_RUN;
G_MS+=Tcount;
}
;
return (G_MS+Tcount);
}
void StartCaculate(void)
{
UINT32 Freq;
Timer2_Stop();
Freq = g_mclk/32/(0xff+1) ; // Timer2_clock (in Hz)
// Prescaler=256=2^8, Divisor=4=2^2
// Timer2_clock=MCLK_FREQ/(prescale+1)/Divisor
rTCNTB2 = MaxTime;
rTCON |= TIMER2_LOAD;
rTCON &= ~TIMER2_LOAD;
rTCON |= TIMER2_RUN;
G_MS=0;
}
void StopCaulate(void)
{
Timer2_Stop();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -