📄 timerhc12.h
字号:
/* timerHC12.h - timer header for Motorola HC12 */
/*****************************************************
* *
* copyright (c) 2002 by 3SOFT GmbH *
* - all rights reserved - *
* *
* 3SOFT GmbH *
* Phone: +49 (0)9131 7701 0 *
* Frauenweiherstr. 14, 91058 Erlangen *
* GERMANY *
* *
*****************************************************/
/*
This file contains macros to setup and handle the various hardware timer
of HC12 used as OSEK system counter. For the recalculation of the timer compare
values are 2 methods provided:
1) ShiftMode: The recalculation is done in a manner that the time value is added
to the current value of the TCNT. Using this is a) fast and b) safe but causes
some microseconds delay for every tick. This mode is the default. It can be enabled
by setting the (cpp) define INCLUDE_HC12TIMER_ShiftMode.
2) SimpleMode: The recalculation of the timer compare value is made with: add the
time value to the timer compare value. This causes a exact timing with the
problem that the timer calculation is wrong if TCNT > (timer value+TCx). This can happen
if the timer interrupt is delayed for a long time, thus the TCNT is getting bigger than
the new calculated value. As a result in this situation, the time needed to get the next
timer interrupt may be very long (exact: time needed until the TCNT is again equal to TCx)
It can be enabled by setting the (cpp) define INCLUDE_HC12TIMER_SimpleMode.
modification history
--------------------
01a,06mar00,cs written
*/
/* uses values from board.h */
#include "board.h"
#ifndef __DRV_TIMER_TIMERHC12h
#define __DRV_TIMER_TIMERHC12h
#ifndef INCLUDE_HC12TIMER_ShiftMode
#ifndef INCLUDE_HC12TIMER_SimpleMode
#define INCLUDE_HC12TIMER_ShiftMode
#endif
#endif
#if defined(INCLUDE_HC12TIMER_ShiftMode)
#define OSEKOS_RELOAD_TIMER(TIMER,TIMEINNS) do{TIMER=OSEKOS_REG_TCNT+OSEKOS_RELOAD_TC(TIMEINNS);}while(0)
#endif
#if defined(INCLUDE_HC12TIMER_SimpleMode)
#define OSEKOS_RELOAD_TIMER(TIMER,TIMEINNS) do{TIMER=TIMER+OSEKOS_RELOAD_TC(TIMEINNS);}while(0)
#endif
/********************************************************************/
/* */
/* */
/* S T A R 1 2 */
/* */
/* */
/********************************************************************/
#if (defined __uC_MCS912DP256__) || (defined __uC_MCS912DB128__) || (defined __uC_MCS912D64__) || (defined __uC_MCS912DT128__ ) || (defined __uC_MCS912B128__)
#define __OSEKOS_ARCHITECTURE_FOUND__
/* RTI */
#ifndef BOARD_RTICTL_MODULUS
#error "Need BOARD_RTICTL_MODULUS from BSP for RTI"
#endif
#ifndef BOARD_RTICTL_PRESCALE
#error "Need BOARD_RTICTL_PRESCALE from BSP for RTI"
#endif
#if ((BOARD_RTICTL_MODULUS<0) || (BOARD_RTICTL_MODULUS>15))
#error "BOARD_RTICTL_MODULUS not in valid range"
#endif
#if ((BOARD_RTICTL_PRESCALE<1) || (BOARD_RTICTL_PRESCALE>7))
#error "BOARD_RTICTL_PRESCALE not in valid range"
#endif
/* We check if RTI is running yet, if not we use a divide rate of 2^16 */
#define OSEKOS_timerInit_RTI() do { OSEKOS_REG_RTICTL=(BOARD_RTICTL_PRESCALE<<4)|BOARD_RTICTL_MODULUS;\
OSEKOS_REG_CRGINT |= 0x80; } while(0)
#define OSEKOS_timerClearISRFlag_RTI() OSEKOS_REG_CRGFLG=0x80
/* TCx */
#define OSEKOS_RELOAD_TC(TIMEINNS) ((BOARD_CPU_FREQ_MHZ*(TIMEINNS/1000))>>(BOARD_TCNT_PRESCALER))
#define OSEKOS_timerInit_TC(TIMEINNS,NR) do { \
OSEKOS_REG_TIOS|=(1<<NR); /* select output compare */ \
OSEKOS_REG_TSCR1|=0x80; /* run the TCNT */ \
OSEKOS_REG_TC##NR=OSEKOS_REG_TCNT+OSEKOS_RELOAD_TC(TIMEINNS); \
OSEKOS_REG_TIE|=(1<<NR); /* enable interrupt */ \
} while(0)
#define OSEKOS_timerInit_TC0(TIMEINNS) OSEKOS_timerInit_TC(TIMEINNS,0)
#define OSEKOS_timerReload_TC0(TIMEINNS) OSEKOS_RELOAD_TIMER(OSEKOS_REG_TC0,TIMEINNS)
#define OSEKOS_timerClearISRFlag_TC0() OSEKOS_REG_TFLG1=0x01
#define OSEKOS_timerInit_TC1(TIMEINNS) OSEKOS_timerInit_TC(TIMEINNS,1)
#define OSEKOS_timerReload_TC1(TIMEINNS) OSEKOS_RELOAD_TIMER(OSEKOS_REG_TC1,TIMEINNS)
#define OSEKOS_timerClearISRFlag_TC1() OSEKOS_REG_TFLG1=0x02
#define OSEKOS_timerInit_TC2(TIMEINNS) OSEKOS_timerInit_TC(TIMEINNS,2)
#define OSEKOS_timerReload_TC2(TIMEINNS) OSEKOS_RELOAD_TIMER(OSEKOS_REG_TC2,TIMEINNS)
#define OSEKOS_timerClearISRFlag_TC2() OSEKOS_REG_TFLG1=0x04
#define OSEKOS_timerInit_TC3(TIMEINNS) OSEKOS_timerInit_TC(TIMEINNS,3)
#define OSEKOS_timerReload_TC3(TIMEINNS) OSEKOS_RELOAD_TIMER(OSEKOS_REG_TC3,TIMEINNS)
#define OSEKOS_timerClearISRFlag_TC3() OSEKOS_REG_TFLG1=0x08
#define OSEKOS_timerInit_TC4(TIMEINNS) OSEKOS_timerInit_TC(TIMEINNS,4)
#define OSEKOS_timerReload_TC4(TIMEINNS) OSEKOS_RELOAD_TIMER(OSEKOS_REG_TC4,TIMEINNS)
#define OSEKOS_timerClearISRFlag_TC4() OSEKOS_REG_TFLG1=0x10
#define OSEKOS_timerInit_TC5(TIMEINNS) OSEKOS_timerInit_TC(TIMEINNS,5)
#define OSEKOS_timerReload_TC5(TIMEINNS) OSEKOS_RELOAD_TIMER(OSEKOS_REG_TC5,TIMEINNS)
#define OSEKOS_timerClearISRFlag_TC5() OSEKOS_REG_TFLG1=0x20
#define OSEKOS_timerInit_TC6(TIMEINNS) OSEKOS_timerInit_TC(TIMEINNS,6)
#define OSEKOS_timerReload_TC6(TIMEINNS) OSEKOS_RELOAD_TIMER(OSEKOS_REG_TC6,TIMEINNS)
#define OSEKOS_timerClearISRFlag_TC6() OSEKOS_REG_TFLG1=0x40
#define OSEKOS_timerInit_TC7(TIMEINNS) OSEKOS_timerInit_TC(TIMEINNS,7)
#define OSEKOS_timerReload_TC7(TIMEINNS) OSEKOS_RELOAD_TIMER(OSEKOS_REG_TC7,TIMEINNS)
#define OSEKOS_timerClearISRFlag_TC7() OSEKOS_REG_TFLG1=0x80
#endif
#if (defined __uC_MC68HC912BC32__) || (defined __uC_MC68HC912D60__) || (defined __uC_MC68HC912DG128__) || (defined __uC_MC68HC912D60A__) || (defined __uC_MC68HC912DG128A__)
#define __OSEKOS_ARCHITECTURE_FOUND__
/********************************************************************/
/* */
/* */
/* original H C 1 2 */
/* */
/* */
/********************************************************************/
/* The RTI is fixed, it is up to the user to select the right prescaler... */
#define OSEKOS_timerInit_RTI() OSEKOS_REG_RTICTL=0xa1
#define OSEKOS_timerClearISRFlag_RTI() OSEKOS_REG_RTIFLG=0x80
/* The timer compare unit has a prescaler which have to be configured in the BSP part */
#define OSEKOS_RELOAD_TC(TIMEINNS) ((BOARD_CPU_FREQ_MHZ*(TIMEINNS/1000))>>(BOARD_TCNT_PRESCALER))
#define OSEKOS_timerInit_TC0(TIMEINNS) do { \
OSEKOS_REG_TIOS|=0x01; \
OSEKOS_REG_TMSK1|=0x01; \
OSEKOS_REG_TSCR|=0xa0; \
OSEKOS_REG_TC0=OSEKOS_REG_TCNT+OSEKOS_RELOAD_TC(TIMEINNS); \
} while(0)
#define OSEKOS_timerReload_TC0(TIMEINNS) OSEKOS_RELOAD_TIMER(OSEKOS_REG_TC0,TIMEINNS)
#define OSEKOS_timerClearISRFlag_TC0() OSEKOS_REG_TFLG1=0x01
#define OSEKOS_timerInit_TC1(TIMEINNS) do { \
OSEKOS_REG_TIOS|=0x02; \
OSEKOS_REG_TMSK1|=0x02; \
OSEKOS_REG_TSCR|=0xa0; \
OSEKOS_REG_TC1=OSEKOS_REG_TCNT+OSEKOS_RELOAD_TC(TIMEINNS); \
} while(0)
#define OSEKOS_timerReload_TC1(TIMEINNS) OSEKOS_RELOAD_TIMER(OSEKOS_REG_TC1,TIMEINNS)
#define OSEKOS_timerClearISRFlag_TC1() OSEKOS_REG_TFLG1=0x02
#define OSEKOS_timerInit_TC2(TIMEINNS) do { \
OSEKOS_REG_TIOS|=0x04; \
OSEKOS_REG_TMSK1|=0x04; \
OSEKOS_REG_TSCR|=0xa0; \
OSEKOS_REG_TC2=OSEKOS_REG_TCNT+OSEKOS_RELOAD_TC(TIMEINNS); \
} while(0)
#define OSEKOS_timerReload_TC2(TIMEINNS) OSEKOS_RELOAD_TIMER(OSEKOS_REG_TC2,TIMEINNS)
#define OSEKOS_timerClearISRFlag_TC2() OSEKOS_REG_TFLG1=0x04
#define OSEKOS_timerInit_TC3(TIMEINNS) do { \
OSEKOS_REG_TIOS|=0x08; \
OSEKOS_REG_TMSK1|=0x08; \
OSEKOS_REG_TSCR|=0xa0; \
OSEKOS_REG_TC3=OSEKOS_REG_TCNT+OSEKOS_RELOAD_TC(TIMEINNS); \
} while(0)
#define OSEKOS_timerReload_TC3(TIMEINNS) OSEKOS_RELOAD_TIMER(OSEKOS_REG_TC3,TIMEINNS)
#define OSEKOS_timerClearISRFlag_TC3() OSEKOS_REG_TFLG1=0x08
#define OSEKOS_timerInit_TC4(TIMEINNS) do { \
OSEKOS_REG_TIOS|=0x10; \
OSEKOS_REG_TMSK1|=0x10; \
OSEKOS_REG_TSCR|=0xa0; \
OSEKOS_REG_TC4=OSEKOS_REG_TCNT+OSEKOS_RELOAD_TC(TIMEINNS); \
} while(0)
#define OSEKOS_timerReload_TC4(TIMEINNS) OSEKOS_RELOAD_TIMER(OSEKOS_REG_TC4,TIMEINNS)
#define OSEKOS_timerClearISRFlag_TC4() OSEKOS_REG_TFLG1=0x10
#define OSEKOS_timerInit_TC5(TIMEINNS) do { \
OSEKOS_REG_TIOS|=0x20; \
OSEKOS_REG_TMSK1|=0x20; \
OSEKOS_REG_TSCR|=0xa0; \
OSEKOS_REG_TC5=OSEKOS_REG_TCNT+OSEKOS_RELOAD_TC(TIMEINNS); \
} while(0)
#define OSEKOS_timerReload_TC5(TIMEINNS) OSEKOS_RELOAD_TIMER(OSEKOS_REG_TC5,TIMEINNS)
#define OSEKOS_timerClearISRFlag_TC5() OSEKOS_REG_TFLG1=0x20
#define OSEKOS_timerInit_TC6(TIMEINNS) do { \
OSEKOS_REG_TIOS|=0x40; \
OSEKOS_REG_TMSK1|=0x40; \
OSEKOS_REG_TSCR|=0xa0; \
OSEKOS_REG_TC6=OSEKOS_REG_TCNT+OSEKOS_RELOAD_TC(TIMEINNS); \
} while(0)
#define OSEKOS_timerReload_TC6(TIMEINNS) OSEKOS_RELOAD_TIMER(OSEKOS_REG_TC6,TIMEINNS)
#define OSEKOS_timerClearISRFlag_TC6() OSEKOS_REG_TFLG1=0x40
#define OSEKOS_timerInit_TC7(TIMEINNS) do { \
OSEKOS_REG_TIOS|=0x80; \
OSEKOS_REG_TMSK1|=0x80; \
OSEKOS_REG_TSCR|=0xa0; \
OSEKOS_REG_TC7=OSEKOS_REG_TCNT+OSEKOS_RELOAD_TC(TIMEINNS); \
} while(0)
#define OSEKOS_timerReload_TC7(TIMEINNS) OSEKOS_RELOAD_TIMER(OSEKOS_REG_TC7,TIMEINNS)
#define OSEKOS_timerClearISRFlag_TC7() OSEKOS_REG_TFLG1=0x80
#endif
#ifndef __OSEKOS_ARCHITECTURE_FOUND__
#error "No timer support for specified derivate!"
#endif
#endif /* __DRV_TIMER_TIMERHC12h */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -