?? timer.c
字號:
/* File: TIMER.C */
/****************************************************************************
*
* STK16XSW.TIMER
* ==============
*
* Timer routines
*
* TQ-Systems GmbH
* ---------------
* Customer: TQ-Components
* Project : STK16XSW
* Tools : uVision 2.05
*
*
* Rev: Date: Name: Modification:
* ----+---------+----------------+------------------------------------------
* 100 16.01.01 A. Lichte taken over from STK16X.506
*****************************************************************************/
/****************************************************************************
*
* availability summary
*
* available for Starterkit: STK16X STK16XU
* conformed for Starterkit: STK16X
* available for Modul : TQM164 TQM165 TQM165U TQM166 TQM167
* TQM167LC TQM167U TQM167UL
* conformed for Modul : TQM164 TQM165 TQM165U TQM166 TQM167
* TQM167LC TQM167U TQM167UL
*****************************************************************************/
/*==========================================================================*
* pragmas:
*===========================================================================*/
/*=========================================================================*
* include files (#INCLUDE):
*==========================================================================*/
/*-------------------------------------------------------------------------*
* standard include files:
*--------------------------------------------------------------------------*/
#include <stdio.h> /* standard I/O functions */
#include <ctype.h> /* typecast functions */
#include <string.h> /* String functions */
#include <setjmp.h> /* global jump functions */
#include <absacc.h> /* absolute accesss */
#include <intrins.h> /* intrinsic functions */
#include <reg167.h> /* Special function register */
/*-------------------------------------------------------------------------*
* project specific include files:
*--------------------------------------------------------------------------*/
#include "timer.h" /* timer functions */
/*=========================================================================*
* modul internal definitions (#DEFINE):
*==========================================================================*/
#define T3_ICTRL T3IC^6 /* timer 3 interrupt control bit */
/*=========================================================================*
* modul internal type definitions(TYPEDEF):
*==========================================================================*/
/*=========================================================================*
* modul internal constants (CONST):
*==========================================================================*/
/*=========================================================================*
* extern available constants (CONST):
*==========================================================================*/
/*=========================================================================*
* modul internal variables:
*==========================================================================*/
TIMER_COUNTER idata timer_counter; /* 10 ms counter variable */
t_timer_idle_func timer_idle_func; /* idle function for timer interrupt*/
unsigned int timer_looptime;
sbit t3_ictrl = T3_ICTRL; /* timer 3 interrupt control bit */
/*=========================================================================*
* global extern available variables (EXTERN):
*==========================================================================*/
/*=========================================================================*
* modul internal functions:
*==========================================================================*/
/*-------------------------------------------------------------------------*
* void timer3_int(void) interrupt 0x23
*--------------------------------------------------------------------------*
* FT: interrupt service routine for timer 3 over/underflow interrupt
* EP: -
* RW: -
* GP: timer_idlefunc = pointer to idle function for timer interrupt
*--------------------------------------------------------------------------*/
void timer3_int(void) interrupt 0x23
{
timer_counter++;
if (timer_idle_func) (*timer_idle_func) ();
}
/*=========================================================================*
* extern available functions:
*==========================================================================*/
/*--------------------------------------------------------------------------*
* BOOL timer_init(t_timer_idle_func idle_func)
*---------------------------------------------------------------------------*
* FT: init timer 3 time base; calculation refers to CPU frequency (20 MHz)
* EP: idlefunc = pointer to idle function, called from interrupt service
* routine (NULL if not used)
* RW: TRUE = function succesfully; FALSE= function failed
* GP:
*---------------------------------------------------------------------------*/
BOOL timer_init(t_timer_idle_func idle_func)
{ USHORT i, j;
/* init timer 3: */
T2CON = 0x0027; /* reload timer 2 at over/underflow of timer 3 */
T3CON = 0x0080; /* timer mode: 400 ns time base, count down */
T2 = 25000; /* init timer 2 register: 10 ms T2 overflow */
T3 = 25000; /* init timer 3 register: 10 ms T3 overflow */
T3IC = T3INT_INI; /* init timer 3 interrupt control register */
T3R = 1; /* init timer 3 enable register: 1 = running */
timer_counter = TIMER_MIN; /* init 10 ms timer */
IEN = 1; /* general interrupt enable */
*timer_idle_func = idle_func; /* init idle function */
/* detect number of loops for 20 us delay: */
for (i=0; i<0x3FF; i++) /* time measurement for 3FFh loops */
{
for (j=0; j<1000; j++) _nop_(); /* 1000 x deceleration (us -> ms) */
}
if ((timer_counter > 0x1FF) || (timer_counter < 0x04))
{
timer_looptime=0xFF; return (FALSE); /* initialization failed */
}
/* get loops for 20 us counter (offset 2 for compensation of outer loop):*/
timer_looptime = 0x7FF / timer_counter - 2;
return (TRUE);
}
/*--------------------------------------------------------------------------*
* void timer_reset(void)
*---------------------------------------------------------------------------*
* FT: reset timer counter
* EP: -
* RW: -
* GP: -
*---------------------------------------------------------------------------*/
void timer_reset(void)
{
t3_ictrl = 0; /* disable timer 3 interrupt (32 bit variable access) */
timer_counter = TIMER_MIN; /* init 10 ms timer */
t3_ictrl = 1; /* re-enable timer 3 interrupt */
}
/*--------------------------------------------------------------------------*
* TIMER_COUNTER timer_get_10ms(TIMER_COUNTER base_time)
*---------------------------------------------------------------------------*
* FT: calculate time difference between parameter t and current time
* EP: base_time = base time for calculate time difference
* RW: -
* GP: -
*---------------------------------------------------------------------------*/
TIMER_COUNTER timer_get_10ms(TIMER_COUNTER t)
{ TIMER_COUNTER val;
t3_ictrl = 0; /* disable timer 3 interrupt (32 bit variable access) */
val = timer_counter - t; /* calculate time difference */
t3_ictrl = 1; /* re-enable timer 3 interrupt */
return (val);
}
/*--------------------------------------------------------------------------*
* void timer_delay_10ms(TIMER_COUNTER len)
*---------------------------------------------------------------------------*
* FT: generate delay for len x 10 ms
* EP: len = amount of 10 ms ticks (result of len = 0 may be 0..1)
* RW: -
* GP: -
*---------------------------------------------------------------------------*/
void timer_delay_10ms(TIMER_COUNTER len)
{ TIMER_COUNTER base_time;
base_time = timer_get_10ms(0);
while (timer_get_10ms(base_time) < len);
}
/*--------------------------------------------------------------------------*
* void timer_delay_20us(USHORT len)
*---------------------------------------------------------------------------*
* FT: generate delay for len x 20 us
* EP: len = amount of 20 us ticks
* RW: -
* GP: -
*---------------------------------------------------------------------------*/
void timer_delay_20us(USHORT len)
{ USHORT i, j;
for (i=0; i<len; i++) /* number of 20 us delays */
{
for (j=0; j<timer_looptime; j++); /* wait for 20 us */
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -