📄 board.h
字号:
#include "ioCC2430.h"
#ifndef BOARD_H
#define BOARD_H
#define INT_ON 1
#define INT_OFF 0
#define INT_SET 1
#define INT_CLR 0
//全局中断使能
#define GLOBAL_INT_ENABLE(a) EA=a
#define DISABLE_ALL_INTERRUPTS() (IEN0 = IEN1 = IEN2 = 0x00)
#define INUM_RFERR 0
#define INUM_ADC 1
#define INUM_URX0 2
#define INUM_URX1 3
#define INUM_ENC 4
#define INUM_ST 5
#define INUM_P2INT 6
#define INUM_UTX0 7
#define INUM_DMA 8
#define INUM_T1 9
#define INUM_T2 10
#define INUM_T3 11
#define INUM_T4 12
#define INUM_P0INT 13
#define INUM_UTX1 14
#define INUM_P1INT 15
#define INUM_RF 16
#define INUM_WDT 17
#define NBR_OF_INTERRUPTS 18
#define CLKSPD (CLKCON & 0x07)
// Macro used together with the INUM_* constants
// to enable or disable certain interrupts.
// Example usage:
// INT_ENABLE(INUM_RFERR, INT_ON);
// INT_ENABLE(INUM_URX0, INT_OFF);
// INT_ENABLE(INUM_T1, INT_ON);
// INT_ENABLE(INUM_T2, INT_OFF);
#define INT_ENABLE(inum, on) \
do { \
if (inum==INUM_RFERR) { RFERRIE = on; } \
else if (inum==INUM_ADC) { ADCIE = on; } \
else if (inum==INUM_URX0) { URX0IE = on; } \
else if (inum==INUM_URX1) { URX1IE = on; } \
else if (inum==INUM_ENC) { ENCIE = on; } \
else if (inum==INUM_ST) { STIE = on; } \
else if (inum==INUM_P2INT) { (on) ? (IEN2 |= 0x02) : (IEN2 &= ~0x02); } \
else if (inum==INUM_UTX0) { (on) ? (IEN2 |= 0x04) : (IEN2 &= ~0x04); } \
else if (inum==INUM_DMA) { DMAIE = on; } \
else if (inum==INUM_T1) { T1IE = on; } \
else if (inum==INUM_T2) { T2IE = on; } \
else if (inum==INUM_T3) { T3IE = on; } \
else if (inum==INUM_T4) { T4IE = on; } \
else if (inum==INUM_P0INT) { P0IE = on; } \
else if (inum==INUM_UTX1) { (on) ? (IEN2 |= 0x08) : (IEN2 &= ~0x08); } \
else if (inum==INUM_P1INT) { (on) ? (IEN2 |= 0x10) : (IEN2 &= ~0x10); } \
else if (inum==INUM_RF) { (on) ? (IEN2 |= 0x01) : (IEN2 &= ~0x01); } \
else if (inum==INUM_WDT) { (on) ? (IEN2 |= 0x20) : (IEN2 &= ~0x20); } \
} while (0)
// Macro for setting interrupt group priority
// Example usage:
// INT_PRIORITY(RFERR_RF_DMA, 3);
#define INT_PRIORITY(group, pri) \
do { \
if (pri == 0) { IP0 &= ~group; IP1 &= ~group; } \
if (pri == 1) { IP0 |= group; IP1 &= ~group; } \
if (pri == 2) { IP0 &= ~group; IP1 |= group; } \
if (pri == 3) { IP0 |= group; IP1 |= group; } \
} while (0)
// Where pri is one of:
// 0 = Level 0 (lowest priority)
// 1 = Level 1
// 2 = Level 2
// 3 = Level 3 (highest priority)
// Where group is one of
#define RFERR_RF_DMA 0x01 // Group IP0
#define ADC_P2INT_T1 0x02 // Group IP1
#define URX0_UTX0_T2 0x04 // Group IP2
#define URX1_UTX1_T3 0x08 // Group IP3
#define ENC_P1INT_T4 0x10 // Group IP4
#define ST_WDT_P0INT 0x20 // Group IP5
// Macro used together with the INUM_* constants
// to read the interrupt flags.
// Example usage:
// if (INT_GETFLAG(INUM_URX0))
// ...
// while (!INT_GETFLAG(INUM_URX0));
#define INT_GETFLAG(inum) ( \
(inum==INUM_RFERR) ? RFERRIF : \
(inum==INUM_ADC) ? ADCIF : \
(inum==INUM_URX0) ? URX0IF : \
(inum==INUM_URX1) ? URX1IF : \
(inum==INUM_ENC) ? ENCIF_0 : \
(inum==INUM_ST) ? STIF : \
(inum==INUM_P2INT) ? P2IF : \
(inum==INUM_UTX0) ? UTX0IF : \
(inum==INUM_DMA) ? DMAIF : \
(inum==INUM_T1) ? T1IF : \
(inum==INUM_T2) ? T2IF : \
(inum==INUM_T3) ? T3IF : \
(inum==INUM_T4) ? T4IF : \
(inum==INUM_P0INT) ? P0IF : \
(inum==INUM_UTX1) ? UTX1IF : \
(inum==INUM_P1INT) ? P1IF : \
(inum==INUM_RF) ? S1CON &= ~0x03 : \
(inum==INUM_WDT) ? WDTIF : \
0 \
)
// Macro used to set or clear certain interrupt flags.
// Example usage:
// INT_SETFLAG(INUM_URX0, INT_SET;
// INT_SETFLAG(INUM_T3, INT_CLR);
#define INT_SETFLAG(inum, f) \
do { \
if (inum==INUM_RFERR) { RFERRIF= f; } \
else if (inum==INUM_ADC) { ADCIF = f; } \
else if (inum==INUM_URX0) { URX0IF = f; } \
else if (inum==INUM_URX1) { URX1IF = f; } \
else if (inum==INUM_ENC) { ENCIF_1 = ENCIF_0 = f; } \
else if (inum==INUM_ST) { STIF = f; } \
else if (inum==INUM_P2INT) { P2IF = f; } \
else if (inum==INUM_UTX0) { UTX0IF= f; } \
else if (inum==INUM_DMA) { DMAIF = f; } \
else if (inum==INUM_T1) { T1IF = f; } \
else if (inum==INUM_T2) { T2IF = f; } \
else if (inum==INUM_T3) { T3IF = f; } \
else if (inum==INUM_T4) { T4IF = f; } \
else if (inum==INUM_P0INT) { P0IF = f; } \
else if (inum==INUM_UTX1) { UTX1IF= f; } \
else if (inum==INUM_P1INT) { P1IF = f; } \
else if (inum==INUM_RF) { (f) ? (S1CON |= 0x03) : (S1CON &= ~0x03); } \
else if (inum==INUM_WDT) { WDTIF = f; } \
} while (0)
#ifndef FALSE
#define FALSE 0
#endif
#ifndef TRUE
#define TRUE 1
#endif
#ifndef NULL
#define NULL 0
#endif
// 得到定时器计数器时钟周期
#define TICKSPD ((CLKCON & 0x38) >> 3)
#define CRYSTAL 0x00
#define RC 0x01
//查看XOSC晶振是否工作
#define XOSC_STABLE (SLEEP & 0x40)
//查看RC晶振是否工作
#define HIGH_FREQUENCY_RC_OSC_STABLE (SLEEP & 0x20)
//设置工作晶振
#define SET_MAIN_CLOCK_SOURCE(source) \
do { \
if(source) { \
CLKCON |= 0x40; \
while(!HIGH_FREQUENCY_RC_OSC_STABLE); \
if(TICKSPD == 0){ \
CLKCON |= 0x08; \
} \
SLEEP |= 0x04; \
} \
else { \
SLEEP &= ~0x04; \
while(!XOSC_STABLE); \
asm("NOP"); \
CLKCON &= ~0x47; \
SLEEP |= 0x04; \
} \
}while (0)
#define LED1ON P1_0=0
#define LED1OFF P1_0=1
#define LED1F P1_0=~P1_0
#define LED2ON P1_1=0
#define LED2OFF P1_1=1
#define LED2F P1_1=~P1_1
#define IO_DIR_PORT_PIN(port, pin, dir) \
do { \
if (dir == IO_OUT) \
P##port##DIR |= (0x01<<(pin)); \
else \
P##port##DIR &= ~(0x01<<(pin)); \
}while(0)
#define IO_IN 0
#define IO_OUT 1
#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_SPI1_AT_PORT0_PIN2345() do { PERCFG = (PERCFG&~0x08)|0x00; } while (0)
#define IO_PER_LOC_SPI1_AT_PORT1_PIN4567() do { PERCFG = (PERCFG&~0x08)|0x08; } while (0)
#define IO_PER_LOC_SPI0_AT_PORT0_PIN2345() do { PERCFG = (PERCFG&~0x04)|0x00; } while (0)
#define IO_PER_LOC_SPI0_AT_PORT1_PIN2345() do { PERCFG = (PERCFG&~0x04)|0x04; } while (0)
#define IO_PER_LOC_UART1_AT_PORT0_PIN2345() do { PERCFG = (PERCFG&~0x02)|0x00; } while (0)
#define IO_PER_LOC_UART1_AT_PORT1_PIN4567() do { PERCFG = (PERCFG&~0x02)|0x02; } while (0)
#define IO_PER_LOC_UART0_AT_PORT0_PIN2345() do { PERCFG = (PERCFG&~0x01)|0x00; } while (0)
#define IO_PER_LOC_UART0_AT_PORT1_PIN2345() do { PERCFG = (PERCFG&~0x01)|0x01; } while (0)
#define UPPER_BYTE(a) ((BYTE) (((WORD)(a)) >> 8))
#define HIBYTE(a) UPPER_BYTE(a)
#define LOWER_BYTE(a) ((BYTE) ( (WORD)(a)) )
#define LOBYTE(a) LOWER_BYTE(a)
#define SET_WORD(regH, regL, word) \
do{ \
(regH) = UPPER_BYTE((word)); \
(regL) = LOWER_BYTE((word)); \
}while(0)
typedef unsigned char BOOL;
//
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;
typedef struct{
BYTE payloadLength; //与收定义的payloadLength不同,这里是净负载长度,也就是MSDU
struct{
BYTE low;
BYTE high;
}fcf;
BYTE dsn;
struct{
BYTE low;
BYTE high;
}destpanid;
struct{
BYTE lowaddress;
BYTE highaddress;
} destAddress;
struct{
BYTE low;
BYTE high;
}srcpanid;
struct{
BYTE lowaddress;
BYTE highaddress;
} srcAddress;
BYTE *payload;
}TX_PACKET_STRUCT;
typedef struct{ //use dma,so the struct must define with the frame
BYTE payloadLength; //是整个帧的长度PSDU
BYTE payload[126]; //RSSI与CRC结果也在里面
}RX_PACKET_STRUCT;
void InitBoard(void);
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -