📄 timer.c
字号:
/***********************************************
***********************************************/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#include "S3C2410.h"
#include "base.h"
/*
设置6个软定时器,单位百分之一秒
定时器:0-4为应用软件使用
定时器:10-11为应用定时事件
定时器:5-9为内部定时计数
定时器:12-13为内部定时事件
*/
#define MAX_USER_TIMER 7
#define MAX_SYS_TIMER 7
#define MAX_TIMER 14
//#define MAX_TIMER MAX_USER_TIMER+MAX_SYS_TIMER
static unsigned long TimerCount[MAX_TIMER];
static unsigned long OldCount[4];
static void (*TimerProc[4])(void);
void s_TimerInit(void);
void s_TimerSet(unsigned char TimerNo, unsigned long count);
unsigned long s_TimerCheck(unsigned char TimerNo);
void s_TimerProc(void);
void TimerSet(unsigned char TimerID, unsigned short Cnts);
unsigned short TimerCheck(unsigned char TimerID);
int SetTimerEvent(unsigned short uElapse, void (*TimerFunc)(void));
int s_SetTimerEvent(unsigned short uElapse, void (*TimerFunc)(void));
void KillTimerEvent(int handle);
void s_KillTimerEvent(int handle);
static int k_Timer4StartFlag;
//extern unsigned char k_ScrBackLightMode;
//extern int k_ScrBackLightTime;
void s_TimerInit(void)
{
int i;
//set timer2,3,4 clock frequency=100M
//if PCLK=100MHZ then Timer234 clock frequency=100/(24+1)/2=2MHZ
//if PCLK=50MHZ then Timer234 clock frequency=50/(4+1)/2=5MHZ
rTCFG0 &= ~(0xff<<8);
rTCFG0 |= (24<<8);
rTCFG1 &= ~(0x0fff<<8);//set MUX4=1/2
//INTMSK[14]=TIMER4
rINTMSK |= (1<<14);
rSRCPND = (1<<14);
//rINTPND = (1<<14);
for(i=0;i<MAX_TIMER;i++) TimerCount[i]=0;
TimerProc[0]=NULL;
TimerProc[1]=NULL;
TimerProc[2]=NULL;
TimerProc[3]=NULL;
k_Timer4StartFlag=0;
s_SetIRQHandler(INT_TIMER4,s_TimerProc);
rTCNTB4=20280; // 10MS 20000=80ms
//rTCON |= (0x07<<20); // START=1 AUTOLOAD=1
//rTCON &= ~(1<<21); //CLEAR MANUAL UPDATE BIT
rTCON &= ~(7<<20); //stop
rTCON |= (6<<20); //update tcntb4 autor reload
rTCON &= ~(1<<21); //CLEAR MANUAL UPDATE BIT
//rTCON |= (1<<20); //START
//k_Timer4StartFlag=1;
}
void TimerSet(unsigned char TimerID, unsigned short Cnts)
{
TimerCount[TimerID%5]=Cnts*10;
if(k_Timer4StartFlag==0)
{
rTCON &= ~(7<<20); //stop
rTCON |= (0x06<<20); // MANUAL UPDATE AUTOLOAD
rTCON &= ~(1<<21); //CLEAR MANUAL UPDATE BIT
rTCON |= (1<<20); //START
k_Timer4StartFlag=1;
}
rINTMSK &= ~(1<<14);
}
unsigned short TimerCheck(unsigned char TimerID)
{
if(!TimerCount[TimerID%5]) return 0;
if(TimerCount[TimerID%5]>=10)
return (unsigned short)(TimerCount[TimerID%5]/10);
else return 1;
}
void s_TimerSet(unsigned char TimerNo, unsigned long count)
{
unsigned char TN;
//if(TimerNo==0){
// TN=(TimerNo+5)%MAX_TIMER;
// s_UartPrint("TN=%d",TN);
//}
//TimerCount[((TimerNo%9)+5)%MAX_TIMER]=count;
TimerCount[(TimerNo+5)%MAX_TIMER]=count;
if(k_Timer4StartFlag==0)
{
rTCON &= ~(7<<20); //stop
rTCON |= (0x06<<20); // MANUAL UPDATE AUTOLOAD
rTCON &= ~(1<<21); //CLEAR MANUAL UPDATE BIT
rTCON |= (1<<20); //START
k_Timer4StartFlag=1;
}
rINTMSK &= ~(1<<14);
}
unsigned long s_TimerCheck(unsigned char TimerNo)
{
//return TimerCount[((TimerNo%9)+5)%MAX_TIMER];
return TimerCount[(TimerNo+5)%MAX_TIMER];
}
int s_SetTimerEvent(unsigned short uElapse, void (*TimerFunc)(void))
{
int i;
if(TimerProc[2])
{
if(TimerProc[3]) return -1;
i=3;
}
else i=2;
TimerProc[i]=TimerFunc;
OldCount[i]=uElapse;
s_TimerSet(i+5,(unsigned long)uElapse);
return i;
}
void s_KillTimerEvent(int handle)
{
if(handle>3) return;
if(handle<2) return;
TimerProc[handle]=NULL;
TimerCount[handle+10]=0;
OldCount[handle]=0;
}
/*
void s_ClearTimerEvent(int handle)
{
if(handle>3) return;
if(handle<2) return;
OldCount[handle]=0;
TimerCount[handle+10]=0;
//TimerProc[handle]=NULL;
}
*/
int SetTimerEvent(unsigned short uElapse, void (*TimerFunc)(void))
{
int i;
if(TimerProc[0])
{
if(TimerProc[1]) return -1;
i=1;
}
else i=0;
TimerProc[i]=TimerFunc;
OldCount[i]=uElapse;
s_TimerSet(i+5,(unsigned long)uElapse);
return i;
}
void KillTimerEvent(int handle)
{
if(handle>2) return;
if(handle<0) return;
TimerProc[handle]=NULL;
TimerCount[handle+10]=0;
OldCount[handle]=0;
}
void s_TimerProc(void)
{
int i,j;
j=0;
//if(k_ScrBackLightMode==1){ //delay 1min light
// if(k_ScrBackLightTime==0) ScrBackLight(0);
// if(k_ScrBackLightTime>0){
// k_ScrBackLightTime--;
// j=1;
// }
// k_ScrBackLightMode=1;
//}
for(i=0;i<MAX_TIMER;i++)
{
if(TimerCount[i])
{
TimerCount[i]--;
if((i>=10)&&(!TimerCount[i]))
{
if((TimerProc[i-10]!=NULL))
{
//s_UartPrint("i=%d 1",i);
/*
if(i<12){
s_UartPrint("run");
__asm__("MOV r9,#0x10");
__asm__("MSR CPSR_c,r9");
s_UartPrint("run1");
TimerProc[i-10]();
s_UartPrint("end1");
__asm__("MOV r9,#0x92");
__asm__("MSR CPSR_c,r9");
s_UartPrint("end2");
}
else
*/
TimerProc[i-10]();
//s_UartPrint("2\n");
if(OldCount[i-10]!=0)
TimerCount[i]=OldCount[i-10];
else
{
TimerCount[i]=0;
TimerProc[i-10]=NULL;
}
}
}
j=1;
}
}
//rINTMSK &= ~(1<<14);
if(!j)
{
if(k_Timer4StartFlag==1)
{
k_Timer4StartFlag=0;
rTCON &= ~(7<<20); //stop
}
rINTMSK |= (1<<14);
//s_UartPrint("stop");
}
rSRCPND = (1<<14);
rINTPND = (1<<14);
//}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -