📄 hal.h
字号:
while(!XOSC_STABLE); \
asm("NOP"); \
CLKCON &= ~0x47; \
SLEEP |= 0x04; \
} \
}while (0)
/******************************************************************************
******************* 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 and overflow counter value of the MAC timer
* (timer 2). The timer can be set up with 320 u-second periods according to
* IEEE 802.15.4 or as a normal counter with 1 m-second period by using the
* option TIMER2_MAC_TIMER or TIMER2_NORMAL_TIMER respectively. The value of
* _period_ gives the number of periods (320 u-seconds or 1 m-seconds) to
* generate a compare event. The timer is set up to compensate for any clock
* division. The timer is also set up to be synchronised with the 32.768 KHz
* clock when entering or leaving power mode 0. When starting synchronously
* from power mode 1 or 2, the timer value is updated by adding the time
* passed since PM 0 was left. This time is kept by the 32.768 KHz clock.
* This way the time is kept as if the chip had been in power mode 0 the
* whole time. The timer must be started with the macro
* TIMER2_RUN(TRUE) or MAC_TIMER_RUN(TRUE). The macro TIMER2_INIT() should be
* run in advance to reset all register values.
*
* Parameters:
*
* @param BYTE mode
* Determines which time period Timer 2 is to use. The period of Timer 2
* is either 320 u-seconds (TIMER2_MAC_TIMER) or 1 m-second
* (TIMER2_NORMAL_TIMER).
* @param DWORD period
* This value indicates how many periods (320 u-second or 1 m-second) to
* pass before an overflow compare event is generated.
*
* @return BOOL
Returns 0 if period is too large, 1 otherwise.
*
******************************************************************************/
BOOL halSetTimer2Period(BYTE mode, DWORD period);
// _options_ may be of the following:
#define TIMER2_MAC_TIMER 0x01 // Counts 320 u-second periods
#define TIMER2_NORMAL_TIMER 0x02 // Uses the timer as a normal timer with 1 m-second period.
// Macro for initialising timer 2
#define TIMER2_INIT() \
do { \
T2THD = 0x00; \
T2TLD = 0x00; \
T2CMP = 0x00; \
T2OF0 = 0x00; \
T2OF1 = 0x00; \
T2OF2 = 0x00; \
T2CAPHPH = 0x00; \
T2CAPLPL = 0x00; \
T2PEROF0 = 0x00; \
T2PEROF1 = 0x00; \
T2PEROF2 = 0x00; \
T2CNF = 0x06; \
} while (0)
#define TIMER2_ENABLE_OVERFLOW_COMP_INT(val) (T2PEROF2 = (val) ? T2PEROF2 | 0x20 : T2PEROF2 & ~0x20)
/******************************************************************************
* @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 TIMER2_RUN(value) (T2CNF = (value) ? T2CNF|0x01 : T2CNF&~0x01)
#define MAC_TIMER_RUN(value) do{ TIMER2_RUN(value); }while(0) //MAC-timer == timer 2
#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)
/******************************************************************************
******************* Watch Dog Timer (WDT) *******************
*******************************************************************************
The WDT may be used to prevent the unit from being trapped in a system
stalemate, i.e. an endless waiting state. The WDT must be reset before it times
out. If a timeout occurs, the system is reset.
The WDT can also be configured as a normal timer which generates interrupt at
each timeout. This must be configured manually.
******************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -