📄 hal.h
字号:
/******************************************************************************
* *
* ********** *
* ************ *
* *** *** *
* *** ++ *** *
* *** + + *** CHIPCON *
* *** + *
* *** + + *** *
* *** ++ *** *
* *** *** *
* ************ *
* ********** *
* *
*******************************************************************************
Filename: hal.h
Target: cc2430
Author: cuiqingwei [modify]
Revised: 1/3-2007
Revision: 1.1
Description:
Hardware Abstraction Layer, Utility Library.
******************************************************************************/
#ifndef HAL_H
#define HAL_H
#include "ioCC2430.h"
#include <stdbool.h>
/******************************************************************************
******************* Chip revisions *******************
******************************************************************************/
#define REV_A 0x00
#define REV_B 0x01
#define REV_C 0x02
#define REV_D 0x03
#define REV_E 0x04
/******************************************************************************
******************* Commonly used types *******************
******************************************************************************/
// Data
typedef unsigned char byte;
typedef unsigned short word;
typedef unsigned long dword;
// Unsigned numbers
typedef unsigned char uint8;
typedef unsigned short uint16;
typedef unsigned long uint32;
// Signed numbers
typedef signed char int8;
typedef signed short int16;
typedef signed long int32;
// Common values
#ifndef FALSE
#define FALSE 0
#endif
#ifndef TRUE
#define TRUE 1
#endif
#ifndef NULL
#define NULL 0
#endif
#ifndef HIGH
#define HIGH 1
#endif
#ifndef LOW
#define LOW 0
#endif
/******************************************************************************
******************* Bit, byte and word macros *******************
******************************************************************************/
// bit mask
#define BM( b ) ( 0x01 << ( b ))
#define HIBYTE(a) (byte) ((word)(a) >> 8 )
#define LOBYTE(a) (byte) (word)(a)
#define SET_WORD(regH, regL, WORD) \
do{ \
(regH) = HIBYTE( WORD ); \
(regL) = LOBYTE( WORD ); \
}while(0)
#define GET_WORD(regH, regL, WORD) \
do{ \
WORD = (word)regH << 8; \
WORD |= regL; \
}while(0)
/*
* This macro is for use by other macros to form a fully valid C statement.
* Without this, the if/else conditionals could show unexpected behavior.
*
* For example, use...
* #define SET_REGS() st( ioreg1 = 0; ioreg2 = 0; )
* instead of ...
* #define SET_REGS() { ioreg1 = 0; ioreg2 = 0; }
* or
* #define SET_REGS() ioreg1 = 0; ioreg2 = 0;
* The last macro would not behave as expected in the if/else construct.
* The second to last macro will cause a compiler error in certain uses
* of if/else construct
*
* It is not necessary, or recommended, to use this macro where there is
* already a valid C statement. For example, the following is redundant...
* #define CALL_FUNC() st( func(); )
* This should simply be...
* #define CALL_FUNC() func()
*
* (The while condition below evaluates false without generating a
* constant-controlling-loop type of warning on most compilers.)
*/
#define st(x) do { x } while (__LINE__ == -1)
/******************************************************************************
******************* Port functions/macros *******************
*******************************************************************************
Macros for simplifying access to I/O pin setup and usage.
MCU pin configuration:
---------------------------------------------
| Peripheral I/O signal | Alt1 | Alt2 |
---------------------------------------------
| Timer1 channel0 | P0.2 | P1.2 |
| Timer1 channel1 | P0.3 | P1.1 |
| Timer1 channel2 | P0.4 | P1.0 |
| Timer3 channel0 | P1.3 | P1.6 |
| Timer3 channel1 | P1.4 | P1.7 |
| Timer4 channel0 | P1.0 | P2.0 |
| Timer4 channel1 | P1.1 | P2.3 |
| USART0 TXD/MOSI | P0.3 | P1.5 |
| USART0 RXD/MISO | P0.2 | P1.4 |
| USART0 RTS/SCK | P0.5 | P1.3 |
| USART0 CTS/SS_N | P0.4 | P1.2 |
| USART1 TXD/MOSI | P0.4 | P1.6 |
| USART1 RXD/MISO | P0.5 | P1.7 |
| USART1 RTS/SCK | P0.3 | P1.5 |
| USART1 CTS/SS_N | P0.2 | P1.4 |
---------------------------------------------
******************************************************************************/
// Macros for configuring IO peripheral location:
// Example usage:
// IO_PER_LOC_TIMER1_AT_PORT0_PIN234();
// IO_PER_LOC_TIMER4_AT_PORT2_PIN03();
// IO_PER_LOC_USART1_AT_PORT0_PIN2345();
#define IO_PER_LOC_TIMER1_AT_PORT0_PIN234() do { PERCFG = (PERCFG&~0x40)|0x00; } while (0)
#define IO_PER_LOC_TIMER1_AT_PORT1_PIN012() do { PERCFG = (PERCFG&~0x40)|0x40; } while (0)
#define IO_PER_LOC_TIMER3_AT_PORT1_PIN34() do { PERCFG = (PERCFG&~0x20)|0x00; } while (0)
#define IO_PER_LOC_TIMER3_AT_PORT1_PIN67() do { PERCFG = (PERCFG&~0x20)|0x20; } while (0)
#define IO_PER_LOC_TIMER4_AT_PORT1_PIN01() do { PERCFG = (PERCFG&~0x10)|0x00; } while (0)
#define IO_PER_LOC_TIMER4_AT_PORT2_PIN03() do { PERCFG = (PERCFG&~0x10)|0x10; } while (0)
#define IO_PER_LOC_USART1_AT_PORT0_PIN2345() do { PERCFG = (PERCFG&~0x02)|0x00; } while (0)
#define IO_PER_LOC_USART1_AT_PORT1_PIN4567() do { PERCFG = (PERCFG&~0x02)|0x02; } while (0)
#define IO_PER_LOC_USART0_AT_PORT0_PIN2345() do { PERCFG = (PERCFG&~0x01)|0x00; } while (0)
#define IO_PER_LOC_USART0_AT_PORT1_PIN2345() do { PERCFG = (PERCFG&~0x01)|0x01; } while (0)
// Macros for configuring IO direction:
// Example usage:
// IO_DIR_PORT_PIN(0, 3, IO_IN); // Set P0_3 to input
// IO_DIR_PORT_PIN(2, 1, IO_OUT); // Set P2_1 to output
#define IO_DIR_PORT_PIN(port, pin, dir) \
do { \
if (dir == IO_OUT) \
P##port##DIR |= BM( pin ); \
else \
P##port##DIR &= ~BM( pin ); \
}while(0)
// Where port={0,1,2}, pin={0,..,7} and dir is one of:
#define IO_IN 0
#define IO_OUT 1
// Macros for configuring IO input mode:
// Example usage:
// IO_IMODE_PORT_PIN(0, 0, IO_IMODE_PUD);
// IO_IMODE_PORT_PIN(2, 0, IO_IMODE_TRI);
// IO_IMODE_PORT_PIN(1, 3, IO_IMODE_PUD);
#define IO_IMODE_PORT_PIN(port, pin, imode) \
do { \
if (imode == IO_IMODE_TRI) \
P##port##INP |= BM( pin ); \
else \
P##port##INP &= ~BM( pin ); \
} while (0)
// where imode is one of:
#define IO_IMODE_PUD 0 // Pull-up/pull-down
#define IO_IMODE_TRI 1 // Tristate
// Macro for configuring IO drive mode:
// Example usage:
// IIO_PUD_PORT(0, IO_PULLUP);
// IIO_PUD_PORT(1, IO_PULLDOWN);
// IIO_PUD_PORT(2, IO_PULLUP);
#define IO_PUD_PORT(port, pud) \
do { \
if (pud == IO_PULLDOWN) \
P2INP |= BM( port + 5 ); \
else \
P2INP &= ~BM( port + 5 ); \
} while (0)
#define IO_PULLUP 0
#define IO_PULLDOWN 1
// Macros for function select (General purpose I/O / Peripheral function):
// Example usage:
// IO_FUNC_PORT0_PIN0(0, 0, IO_FUNC_PERIPH);
// IO_FUNC_PORT0_PIN1(0, 1, IO_FUNC_GIO);
// IO_FUNC_PORT2_PIN3(2, 3, IO_FUNC_PERIPH);
#define IO_FUNC_PORT_PIN(port, pin, func) \
do { \
if((port == 2) && (pin == 3)){ \
if (func) { \
P2SEL |= 0x02; \
} else { \
P2SEL &= ~0x02; \
} \
} \
else if((port == 2) && (pin == 4)){ \
if (func) { \
P2SEL |= 0x04; \
} else { \
P2SEL &= ~0x04; \
} \
} \
else{ \
if (func) { \
P##port##SEL |= BM( pin ); \
} else { \
P##port##SEL &= ~BM( pin ); \
} \
} \
} while (0)
// where func is one of:
#define IO_FUNC_GIO 0 // General purpose I/O
#define IO_FUNC_PERIPH 1 // Peripheral function
// Macros for configuring the ADC input:
// Example usage:
// IO_ADC_PORT0_PIN(0, IO_ADC_EN);
// IO_ADC_PORT0_PIN(4, IO_ADC_DIS);
// IO_ADC_PORT0_PIN(6, IO_ADC_EN);
#define IO_ADC_PORT0_PIN(pin, adcEn) \
do { \
if (adcEn) \
ADCCFG |= BM( pin ); \
else \
ADCCFG &= ~BM( pin ); \
}while (0)
// where adcEn is one of:
#define IO_ADC_EN 1 // ADC input enabled
#define IO_ADC_DIS 0 // ADC input disab
/******************************************************************************
******************* Interrupt functions/macros *******************
*******************************************************************************
Macros which simplify access to interrupt enables, interrupt flags and
interrupt priorities. Increases code legibility.
******************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -