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

📄 timer.c

📁 基于s3c2440的U盘读写程序
💻 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 + -