📄 hal.h
字号:
}while (0)
// Macro for setting the main clock division,
#define SET_MAIN_CLOCK_SPEED(frequency) \
do { \
CLKCON = ((CLKCON & ~0x07) | (frequency & 0x07)); \
}while (0)
// where frequency is one of
#define MHZ_26 0x00
#define MHZ_13 0x01
#define MHZ_6_5 0x02
#define MHZ_3_25 0x03
#define MHZ_1_62 0x04
#define MHZ_0_81 0x05
#define MHZ_0_40 0x06
#define MHZ_0_20 0x07
/******************************************************************************
******************* Timer macros/functions *******************
*******************************************************************************
General:
The timers/counters can be configured in a number of ways. The following
functions allow basic configuration of the timers as interrupt timers,
pulse width modulators (PWM) and capture timers. Other uses require manual
configuration of the timers/counters.
Generally 3 steps are nescessary to start a timer:
TIMERx_INIT();
BOOL halSetTimerxPeriod(period);
TIMERx_RUN(TRUE);
where x is the timer number. Please see the function / macro in question for
details.
All timers can generate interrupts. The configuration of interrupts is not
included in the HAL.
******************************************************************************/
/******************************************************************************
* @fn halSetTimer1Period
*
* @brief
* This function sets up timer 1 to run with a given period. If _period_ is
* set to 0, maximum period length will be used. The first time the timer
* is used the macro TIMER1_INIT() should be run to clear all settings. The
* timer is started and stopped with the macro TIMER1_RUN(TRUE / FALSE).
*
* Parameters:
*
* @param DWORD period
* The desired timer period in u-seconds.
*
* @return WORD
* The timer value written to the register if the configuration was
* successful and 0 if the period could not be achieved. This return
* value can be used for determining pulse widths when the timer is
* used in PWM mode.
*
******************************************************************************/
WORD halSetTimer1Period(DWORD period);
// Macro for initialising timer 1. Resets all involved registers and disables
// all interrupt masks.
#define TIMER1_INIT() \
do { \
T1CTL = 0x00; \
T1CCTL0 = 0x00; \
T1CCTL1 = 0x00; \
T1CCTL2 = 0x00; \
TIMIF &= ~0x40; \
} while (0)
// Macro for configuring a channel of timer 1 for PWM. Channel may be
// either 1 or 2.
#define TIMER1_PWM_CONFIG(channel) \
do { \
T1CCTL##channel## = 0x24; \
if(PERCFG&0x40) { \
if(channel == 0x01){ \
IO_FUNC_PORT_PIN(1,1,IO_FUNC_PERIPH);\
} \
else { \
IO_FUNC_PORT_PIN(1,0,IO_FUNC_PERIPH);\
} \
} \
else { \
if(channel == 0x01){ \
IO_FUNC_PORT_PIN(0,3,IO_FUNC_PERIPH);\
} \
else { \
IO_FUNC_PORT_PIN(0,4,IO_FUNC_PERIPH);\
} \
} \
} while(0)
// Macro for changing the pulse length of a timer in PWM mode. The value is
// not scaled and the user must verify that it is correct. _channel_ is the
// channel (1 or 2) configured for PWM operation, whereas _value_ is the
// 16 bit word giving the pulse length. This argument should be shorter than
// or equal to the value returned from the function halSetTimer1Period(...).
#define TIMER1_SET_PWM_PULSE_LENGTH(channel, value) \
do { \
T1CC##channel##L = (BYTE)value; \
T1CC##channel##H = (BYTE)(value >> 8); \
} while(0)
// Macro for configuring a channel of timer 1 for capture.
#define TIMER1_CAPTURE_CHANNEL(channel, edge) \
do { \
T1CCTL ##channel = edge; \
if(PERCFG&0x40) { \
if(channel == 0x01){ \
IO_FUNC_PORT_PIN(1,1,IO_FUNC_PERIPH); \
} \
else { \
IO_FUNC_PORT_PIN(1,0,IO_FUNC_PERIPH); \
} \
} \
else { \
if(channel == 0x01){ \
IO_FUNC_PORT_PIN(0,3,IO_FUNC_PERIPH); \
} \
else { \
IO_FUNC_PORT_PIN(0,4,IO_FUNC_PERIPH); \
} \
} \
} while(0)
// Where _edge_ is either
#define POS_EDGE 0x01 // Capture when a positive edge on the channel input is detected
#define NEG_EDGE 0x02 // Capture when a negative edge on the channel input is detected
#define ANY_EDGE 0x03 // Capture when either a positive or a negative edge on the
// channel input is detected.
// Macro for enabling or disabling overflow interrupts of timer 1.
#define TIMER1_ENABLE_OVERFLOW_INT(val) \
(TIMIF = (val) ? TIMIF | 0x40 : TIMIF & ~0x40)
/******************************************************************************
* @fn halSetTimer2Period
*
* @brief
* This function sets the period timer 2. The values for the counter,
* prescaler and tick period is calculated and written to the corresponding
* registers.
*
* Parameters:
*
* @param UINT32 period
* Period of the timer in u-seconds.
* @param UINT8* cnt
* The value written to T2CT (counter). This value is returned to enable
* a fast setup (without calculation) using the SET_TIMER2_COUNTER.
* @param UINT8* presc
* The value written to T2PR (prescaler). This value is returned to enable
* a fast setup (without calculation) using the SET_TIMER2_PRESCALER.
*
* @return BOOL
Returns FALSE if period is too large, TRUE otherwise.
*
******************************************************************************/
BOOL halSetTimer2Period(UINT32 period, UINT8* cnt, UINT8* presc);
#define TIMER2_INIT() \
do { \
T2CTL = 0x00; \
T2CT = 0x00; \
T2PR = 0x00; \
} while (0)
#define TIMER2_SET_COUNTER(counter) do{ T2CT = counter; }while(0)
#define TIMER2_SET_PRESCALER(prescaler) do{ T2PR = prescaler; }while(0)
#define TIMER2_SET_TICK_PERIOD(tick) do{ T2CTL = ((T2CTL & ~0x03) | tick); }while(0)
#define TIMER2_ENABLE_INTERRUPT() do{ T2CTL |= 0x10; }while(0)
#define TIMER2_DISABLE_INTERRUPT() do{ T2CTL &= ~0x10; }while(0)
#define TIMER2_CLEAR_EXPIRED() do{ T2CTL &= ~0x40; }while(0)
#define TIMER2_EXPIRED (T2CTL & 0x40)
#define TIMER2_SET_MODE(mode) (T2CTL = (mode) ? T2CTL|0x04 : T2CTL&~0x04)
#define TIMER2_USE_REG FALSE
#define TIMER2_FREE TRUE
/******************************************************************************
* @fn halSetTimer34Period
*
* @brief
* This function sets the period of timer 3 or 4 according to the value of
* _timer_. The two timers are identical. Clock division is used to fit the
* desired period within the timer range. If the period is too short or too
* long the function returns 0. If the period is successfully set, the
* function returns the BYTE value written to the timer register. This
* value can be used to set the pulse length if the timer is used for PWM.
* If _period_ is set to 0, maximum timeout value will be used.
*
* Parameters:
*
* @param BYTE timer
* Indicates which timer to configure. Must be either 3 or 4
* (0x03 or 0x04).
* @param DWORD period - Describe value.
* The desired period in microseconds.
*
* @return BYTE
* The value written to the TxCC0 register. The timer is incremented up
* to this value before the timer is reset. This value may be used to
* set the pulse length in PWM mode.
*
******************************************************************************/
BYTE halSetTimer34Period(BYTE timer, DWORD period);
// Where _timer_ must be either 3 or 4
// Macro for initialising timer 3 or 4
#define TIMER34_INIT(timer) \
do { \
T##timer##CTL = 0x06; \
T##timer##CCTL0 = 0x00; \
T##timer##CC0 = 0x00; \
T##timer##CCTL1 = 0x00; \
T##timer##CC1 = 0x00; \
} while (0)
//Macro for enabling overflow interrupt
#define TIMER34_ENABLE_OVERFLOW_INT(timer,val) \
(T##timer##CTL = (val) ? T##timer##CTL | 0x08 : T##timer##CTL & ~0x08)
// Macro for configuring channel 1 of timer 3 or 4 for PWM mode.
#define TIMER34_PWM_CONFIG(timer) \
do{ \
T##timer##CCTL1 = 0x24; \
if(timer == 3){ \
if(PERCFG & 0x20) { \
IO_FUNC_PORT_PIN(1,7,IO_FUNC_PERIPH); \
} \
else { \
IO_FUNC_PORT_PIN(1,4,IO_FUNC_PERIPH); \
} \
} \
else { \
if(PERCFG & 0x10) { \
IO_FUNC_PORT_PIN(2,3,IO_FUNC_PERIPH);\
} \
else { \
IO_FUNC_PORT_PIN(1,1,IO_FUNC_PERIPH); \
} \
} \
} while(0)
// Macro for setting pulse length of the timer in PWM mode
#define TIMER34_SET_PWM_PULSE_LENGTH(timer, value) \
do { \
T##timer##CC1 = (BYTE)value; \
} while (0)
// Macro for setting timer 3 or 4 as a capture timer
#define TIMER34_CAPTURE_TIMER(timer,edge) \
do{ \
T##timer##CCTL1 = edge; \
if(timer == 3){ \
if(PERCFG & 0x20) { \
IO_FUNC_PORT_PIN(1,7,IO_FUNC_PERIPH); \
} \
else { \
IO_FUNC_PORT_PIN(1,4,IO_FUNC_PERIPH); \
} \
} \
else { \
if(PERCFG & 0x10) { \
IO_FUNC_PORT_PIN(2,3,IO_FUNC_PERIPH); \
} \
else { \
IO_FUNC_PORT_PIN(1,1,IO_FUNC_PERIPH); \
} \
} \
}while(0)
// Macros for turning timers on or off
#define TIMER1_RUN(value) (T1CTL = (value) ? T1CTL|0x02 : T1CTL&~0x03)
#define TIMER3_RUN(value) (T3CTL = (value) ? T3CTL|0x10 : T3CTL&~0x10)
#define TIMER4_RUN(value) (T4CTL = (value) ? T4CTL|0x10 : T4CTL&~0x10)
// Macro for enabling/ disabling interrupts from the channels of timer 1, 3 or 4.
#define TIMER_CHANNEL_INTERRUPT_ENABLE(timer, channel, value) \
do{ \
if(value){ \
T##timer##CCTL##channel## |= 0x40; \
} else { \
T##timer##CCTL##channel## &= ~0x40; \
} \
} while(0)
// Sleep Timer / Wake On Radio (WOR) Timer
//Macro for initialising the sleep timer / WOR timer.
#define SLEEP_TIMER_INIT() \
do{ \
WOREVT1 = 0x87; \
WOREVT0 = 0x6B; \
WORCTL = 0x74; \
WORIRQ = 0x00; \
} while(0)
// Macros for enabling / disabling interrupt for event 0 and 1.
#define SLEEP_TIMER_ENABLE_EVENT0_INT(val) do{ WORIRQ = (val) ? WORIRQ | 0x10 : WORIRQ & ~0x10; }while(0)
#define SLEEP_TIMER_ENABLE_EVENT1_INT(val) do{ WORIRQ = (val) ? WORIRQ | 0x20 : WORIRQ & ~0x20; }while(0)
// Macro for resetting the Sleep / WOR timer
#define SLEEP_TIMER_RESET() WORCTL |= 0x04
/******************************************************************************
******************* Watch Dog Timer (WDT) *******************
*******************************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -