📄 timer.c
字号:
/*************************************************************************/
/* */
/* 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 + -