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

📄 timer.c

📁 三星mcu S3C4510B评估板的原码
💻 C
📖 第 1 页 / 共 2 页
字号:
/*************************************************************************/
/*                                                                       */
/* FILE NAME                                      VERSION                */
/*                                                                       */
/* source\timer.c                                  1.0                   */
/*                                                                       */
/* DESCRIPTION                                                           */
/*                                                                       */
/*     DIAGNOSTIC CODE for S3C4510B0                                     */
/*                                                                       */
/*                                                                       */
/* DATA STRUCTURES                                                       */
/*                                                                       */
/* FUNCTIONS : Timer init. and test                                      */
/*                                                                       */
/* DEPENDENCIES                                                          */
/*                                                                       */
/*                                                                       */
/* NAME:    Nicolas Park           					 */
/* The last Modification date:  18-April-2002                            */
/* REMARKS:  Created initial version 1.0                                 */
/*                                                                       */
/*                                Copyright (C) 2002 AIJISYSTEM CO.,LTD  */
/*************************************************************************/

#include <stdio.h>
#include "s3c4510b0.h"
#include "uart.h"
#include "isr.h"
#include "timer.h"
#include "pollio.h"
#include "sysconf.h"


#define   MAX_LINE_BUF     250

volatile unsigned int  clk_tick0 = 0;  /* time tick for timer 0 */
volatile unsigned int  clk_tick1 = 0;  /* time tick for timer 0 */
volatile unsigned int  WatchDogStatus = 0;  

/* Timer0,1 can be used for system real time clock */
TIME tm0 = {0,0,0,0,0,0};
TIME tm1 = {0,0,0,0,0,0};


void tm_init(int TIMER_DEV, int t) 
{

   if(TIMER_DEV)  /* for TIMER 1 */
   {
         Disable_Int(nTIMER1_INT);    
	 SysSetInterrupt(nTIMER1_INT, tm1isr);

         TDATA1 = t_data_ms(t);    /* unit is [ms] */
         TCNT1 = 0x0;
         TMOD  = TM1_TOGGLE;       /* Toggle pulse will be out to port */
         Enable_Int(nTIMER1_INT);  /* Timer interrupt enable */
   }
   else  /* for TIMER0 */
   {
         Disable_Int(nTIMER0_INT);    
	 SysSetInterrupt(nTIMER0_INT, tm0isr);

         TDATA0 = t_data_ms(t);  
         TCNT0 = 0x0;
         TMOD  = TM0_TOGGLE;        
         Enable_Int(nTIMER0_INT); 
   }
}



void tmReset(int TIMER_DEV)
{

    if(TIMER_DEV) {
              TMOD &= ~TM1_RUN;       /* Clear Timer mode register */     
              TDATA1 = 0;             /* Clear Timer data register */
              TCNT1  = 0xffffffff;    /* Clear timer counter register */
    }
    else {
              TMOD &= ~TM0_RUN;       /* Clear Timer mode register */     
              TDATA0 = 0;             /* Clear Timer data register */
              TCNT0  = 0xffffffff;    /* Clear timer counter register */
    }

    ClrTimeVar(TIMER_DEV); /* Initialize timer variable */
}

void ClrTimeVar(int TIMER_DEV)
{
   if(TIMER_DEV) /* for timer1 */
   {
        tm1.tm_sec = 0;   
        tm1.tm_min = 0;
        tm1.tm_hour = 0;
        tm1.tm_mday = 0;
        tm1.tm_mon = 0;
        tm1.tm_year = 0;
        clk_tick1    = 0;
   } 
   else  /* for timer0 */
   {
        tm0.tm_sec = 0;   
        tm0.tm_min = 0;
        tm0.tm_hour = 0;
        tm0.tm_mday = 0;
        tm0.tm_mon = 0;
        tm0.tm_year = 0;
        clk_tick0    = 0;
   }
}



void tmCntr(TM_PARAM *t)
{
     if(t->TM_CHANNEL) 
     {
         Disable_Int(nTIMER1_INT);    
	 SysSetInterrupt(nTIMER1_INT, t->TIMER_Lisr);
         TCNT1 = 0x0;
         TDATA1 = t->TM_DATA;
         TMOD   = t->TM_MODE;
         if(t->TM_OUT_PORT) IOPCON |= (1<<30); /* enable Timer1 out */
         Enable_Int(nTIMER1_INT); 
   
   }
   else 
   {
         Disable_Int(nTIMER0_INT);    
	 SysSetInterrupt(nTIMER0_INT, t->TIMER_Lisr);
         TCNT0 = 0x0;
         TDATA0 = t->TM_DATA;
         TMOD   = t->TM_MODE;
         if(t->TM_OUT_PORT) IOPCON |= (1<<29); /* enable Timer1 out */
         Enable_Int(nTIMER0_INT); 
   }
} 



uint32 TimeStopCheck(int TIMER_DEV)
{
	float TIME ;

	if (TIMER_DEV) 
        { 
            TIME = (float)TCNT1 ;
	    Timer1Stop() ; 
        }
	else 
        { 
            TIME = (float)TCNT0 ;
            Timer0Stop() ; 
	}

	TIME = (float)(0xFFFFFFFF - TIME) ;

	return (TIME-1);
}


void PrtSysTime(int TIMER_DEV,char *s)
{
    char buff[MAX_LINE_BUF];
    int i;
    int sec,ms;
    
    if(TIMER_DEV) {
        sec = tm1.tm_sec+(int)(clk_tick1/TICKS_PER_SECOND);
        ms =  (clk_tick1%TICKS_PER_SECOND);
        sprintf(buff,"%s is %d:%d:%d.%d",s,tm1.tm_hour,tm1.tm_min,sec,ms);
        put_string(buff);
        for(i=0;i < MAX_LINE_BUF;i++)  put_byte('\b'); 
               
    }
    else {
            sec = tm0.tm_sec+(int)(clk_tick0/TICKS_PER_SECOND);
            ms  = (clk_tick0%TICKS_PER_SECOND);
            sprintf(buff,"%s is %d:%d:%d.%d",s,tm0.tm_hour,tm0.tm_min,sec,ms);
            put_string(buff);
            for(i=0;i < MAX_LINE_BUF;i++)  put_byte('\b'); 
    }
}


char *GetSysTime(int TIMER_DEV)
{
    char buff[MAX_LINE_BUF];
    int sec,ms;

    
    if(TIMER_DEV) 
    {
        sec = tm1.tm_sec+(int)(clk_tick1/TICKS_PER_SECOND);
        ms =  (clk_tick1%TICKS_PER_SECOND);
        sprintf(buff,"time = %d:%d:%d.%d",tm1.tm_hour,tm1.tm_min,sec,ms);
        return(buff);
    }
    else {
           sec = tm0.tm_sec+(int)(clk_tick0/TICKS_PER_SECOND);
           ms  = (clk_tick0%TICKS_PER_SECOND);
           sprintf(buff,"time = %d:%d:%d.%d",tm0.tm_hour,tm0.tm_min,sec,ms);
           return(buff);
    }
}


void tm0isr(void)
{
    clk_tick0++;  

     if(clk_tick0 == TICKS_PER_SECOND) 
     {
         clk_tick0 = 0;
         if(tm0.tm_sec++ > 59) 
         { 
              tm0.tm_sec = 0;
              if(tm0.tm_min++ > 59) 
              {  
                  tm0.tm_min = 0;
                  if(tm0.tm_hour++ > 23) 
                  {
                      tm0.tm_hour = 0;
                      if(tm0.tm_mday++ > 30) 
                      {
                          tm0.tm_mday = 0;
                          if(tm0.tm_mon++ > 11) 
                          { 
                              tm0.tm_mon = 0; 
                              tm0.tm_year++;
                           }
                       }
                  }
              }
          }
          /* 4 means digit number for LED display */
          IOPDATA = ~(1<<tm0.tm_sec%4); 
    }  
}



void tm1isr(void)
{
    clk_tick1++;  

     if(clk_tick1 == TICKS_PER_SECOND) 
     {
         clk_tick1 = 0;
         if(tm1.tm_sec++ > 59) 
         { 
              tm1.tm_sec = 0;
              if(tm1.tm_min++ > 59) 
              {  
                  tm1.tm_min = 0;
                  if(tm1.tm_hour++ > 23) 
                  {
                      tm1.tm_hour = 0;
                      if(tm1.tm_mday++ > 30) 
                      {
                          tm1.tm_mday = 0;
                          if(tm1.tm_mon++ > 11) 
                          { 
                              tm1.tm_mon = 0; 
                              tm1.tm_year++;
                           }
                       }
                  }
              }
          }
          /* 4 means digit number for LED display */
          IOPDATA = ~(16<<tm1.tm_sec%4); 
    }  
}


void WaitTime_ms(int TIMER_DEV, int t)
{
    int rDATA;

    rDATA = t_data_ms(t); 

    if(TIMER_DEV) {
         TDATA1 = 0;    /* Clear Timer data register */
         TCNT1  = 0;    /* Clear timer counter register */

         Timer1Start();
         while(TCNT1 < rDATA);
         Timer1Stop();
    }
    else {
           TDATA0 = 0;    /* Clear Timer data register */
           TCNT0  = 0;    /* Clear timer counter register */
           Timer0Start();
           while(TCNT0 < rDATA);
           Timer0Stop();
    }
}



void WatchDogFunc(int reconf)
{

⌨️ 快捷键说明

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