📄 hal.h
字号:
do{ \
asm("NOP"); \
asm("NOP"); \
asm("NOP"); \
asm("NOP"); \
asm("NOP"); \
asm("NOP"); \
asm("NOP"); \
asm("NOP"); \
DMAARM = ((0x01 << ch) & 0x1F); \
asm("NOP"); \
asm("NOP"); \
asm("NOP"); \
asm("NOP"); \
asm("NOP"); \
asm("NOP"); \
asm("NOP"); \
} while(0)
#endif
#define DMA_ABORT_CHANNEL(ch) DMAARM = (0x80 | ( BM( ch ) & 0x1F) )
#define DMA_MAN_TRIGGER(ch) DMAREQ = BM( ch )
#define DMA_START_CHANNEL(ch) DMA_MAN_TRIGGER( ch )
// Macro for quickly setting the destination address of a DMA structure
#define SET_DMA_DEST(pDmaDesc, dest) \
do{ \
pDmaDesc->DESTADDRH = HIBYTE( dest ); \
pDmaDesc->DESTADDRL = LOBYTE( dest ); \
} while (0)
// Macro for quickly setting the source address of a DMA structure
#define SET_DMA_SOURCE(pDmaDesc, source) \
do{ \
pDmaDesc->SRCADDRH = HIBYTE( source ); \
pDmaDesc->SRCADDRL = LOBYTE( source ); \
} while (0)
// Macro for quickly setting the number of bytes to be transferred by the DMA.
// Max lenght is 0x1FFF
#define SET_DMA_LENGTH(pDmaDesc, length) \
do{ \
pDmaDesc->LENH = HIBYTE( length ); \
pDmaDesc->LENL = LOBYTE( length ); \
} while (0)
// Macro for getting the destination address of a DMA channel
#define GET_DMA_DEST(pDmaDesc) \
( (word)pDmaDesc->DESTADDRL | ( (word)pDmaDesc->DESTADDRH << 8 ))
// Macro for getting the source address of a DMA channel
#define GET_DMA_SOURCE(pDmaDesc) \
( (word)pDmaDesc->SRCADDRL | ( (word)pDmaDesc->SRCADDRH << 8 ))
/******************************************************************************
******************* Common USART functions/macros *******************
*******************************************************************************
The macros in this section are available for both SPI and UART operation.
******************************************************************************/
// Example usage:
// USART0_FLUSH();
#define USART_FLUSH(num) (U##num##UCR |= 0x80)
#define USART0_FLUSH() USART_FLUSH(0)
#define USART1_FLUSH() USART_FLUSH(1)
// Example usage:
// if (USART0_BUSY())
// ...
#define USART_BUSY(num) (U##num##CSR & 0x01)
#define USART0_BUSY() USART_BUSY(0)
#define USART1_BUSY() USART_BUSY(1)
// Example usage:
// while(!USART1_BYTE_RECEIVED())
// ...
#define USART_BYTE_RECEIVED(num) (U##num##CSR & 0x04)
#define USART0_BYTE_RECEIVED() USART_BYTE_RECEIVED(0)
#define USART1_BYTE_RECEIVED() USART_BYTE_RECEIVED(1)
// Example usage:
// if(USART1_BYTE_TRANSMITTED())
// ...
#define USART_BYTE_TRANSMITTED(num) (U##num##CSR & 0x02)
#define USART0_BYTE_TRANSMITTED() USART_BYTE_TRANSMITTED(0)
#define USART1_BYTE_TRANSMITTED() USART_BYTE_TRANSMITTED(1)
/******************************************************************************
******************* USART-UART specific functions/macros *******************
******************************************************************************/
#if (chip == 2430 || chip == 2431)
// The macros in this section simplify UART operation.
#define BAUD_E(baud, clkDivPow) ( \
(baud==2400) ? 6 +clkDivPow : \
(baud==4800) ? 7 +clkDivPow : \
(baud==9600) ? 8 +clkDivPow : \
(baud==14400) ? 8 +clkDivPow : \
(baud==19200) ? 9 +clkDivPow : \
(baud==28800) ? 9 +clkDivPow : \
(baud==38400) ? 10 +clkDivPow : \
(baud==57600) ? 10 +clkDivPow : \
(baud==76800) ? 11 +clkDivPow : \
(baud==115200) ? 11 +clkDivPow : \
(baud==153600) ? 12 +clkDivPow : \
(baud==230400) ? 12 +clkDivPow : \
(baud==307200) ? 13 +clkDivPow : \
0 )
#define BAUD_M(baud) ( \
(baud==2400) ? 59 : \
(baud==4800) ? 59 : \
(baud==9600) ? 59 : \
(baud==14400) ? 216 : \
(baud==19200) ? 59 : \
(baud==28800) ? 216 : \
(baud==38400) ? 59 : \
(baud==57600) ? 216 : \
(baud==76800) ? 59 : \
(baud==115200) ? 216 : \
(baud==153600) ? 59 : \
(baud==230400) ? 216 : \
(baud==307200) ? 59 : \
0)
#endif
#if (chip == 1110 || chip == 2510)
#define BAUD_E(baud, clkDivPow)( \
(baud == 2400) ? 6 +clkDivPow : \
(baud == 4800) ? 7 +clkDivPow : \
(baud == 9600) ? 8 +clkDivPow : \
(baud == 14400) ? 9 +clkDivPow : \
(baud == 19200) ? 9 +clkDivPow : \
(baud == 28800) ? 10 +clkDivPow : \
(baud == 38400) ? 10 +clkDivPow : \
(baud == 57600) ? 11 +clkDivPow : \
(baud == 76800) ? 11 +clkDivPow : \
(baud == 115200) ? 12 +clkDivPow : \
(baud == 230400) ? 13 +clkDivPow : \
(baud == 307200) ? 13 +clkDivPow : \
(baud == 460800) ? 14 +clkDivPow : \
0)
#define BAUD_M(baud) ( \
(baud == 2400) ? 131 : \
(baud == 4800) ? 131 : \
(baud == 9600) ? 131 : \
(baud == 14400) ? 34 : \
(baud == 19200) ? 131 : \
(baud == 28800) ? 34 : \
(baud == 38400) ? 131 : \
(baud == 57600) ? 34 : \
(baud == 76800) ? 131 : \
(baud == 115200) ? 34 : \
(baud == 230400) ? 34 : \
(baud == 307200) ? 131 : \
(baud == 460800) ? 34 : \
0)
#endif
#if (chip == 1111 || chip == 2511)
#define BAUD_E(baud, clkDivPow)( \
(baud == 2400) ? 6 +clkDivPow : \
(baud == 4800) ? 7 +clkDivPow : \
(baud == 9600) ? 8 +clkDivPow : \
(baud == 14400) ? 9 +clkDivPow : \
(baud == 19200) ? 9 +clkDivPow : \
(baud == 28800) ? 10 +clkDivPow : \
(baud == 38400) ? 10 +clkDivPow : \
(baud == 57600) ? 11 +clkDivPow : \
(baud == 76800) ? 11 +clkDivPow : \
(baud == 115200) ? 12 +clkDivPow : \
(baud == 230400) ? 13 +clkDivPow : \
(baud == 307200) ? 13 +clkDivPow : \
(baud == 460800) ? 14 +clkDivPow : \
0)
#define BAUD_M(baud) ( \
(baud == 2400) ? 163 : \
(baud == 4800) ? 163 : \
(baud == 9600) ? 163 : \
(baud == 14400) ? 59 : \
(baud == 19200) ? 163 : \
(baud == 28800) ? 59 : \
(baud == 38400) ? 163 : \
(baud == 57600) ? 59 : \
(baud == 76800) ? 163 : \
(baud == 115200) ? 59 : \
(baud == 230400) ? 59 : \
(baud == 307200) ? 163 : \
(baud == 460800) ? 59 : \
0)
#endif
// Macro for setting up a UART transfer channel. The macro sets the appropriate
// pins for peripheral operation, sets the baudrate, and the desired options of
// the selected uart. _uart_ indicates which uart to configure and must be
// either 0 or 1. _baudRate_ must be one of 2400, 4800, 9600, 14400, 19200,
// 28800, 38400, 57600, 76800, 115200, 153600, 230400 or 307200. Possible
// options are defined below.
//
// Example usage:
//
// UART_SETUP(0,115200,HIGH_STOP);
//
// This configures uart 0 for contact with "hyperTerminal", setting:
// Baudrate: 115200
// Data bits: 8
// Parity: None
// Stop bits: 1
// Flow control: None
//
#define UART_SETUP(uart, baudRate, options) \
do { \
if ((options) & FLOW_CONTROL_ENABLE){ \
if((uart) == 0){ /* USART0 */\
if(PERCFG & 0x01){ /* Alt 2 */\
P1SEL |= 0x3C; \
} else { /* Alt 1 */\
P0SEL |= 0x3C; \
} \
} \
else { /* USART1 */\
if(PERCFG & 0x02){ /* Alt 2 */\
P1SEL |= 0xF0; \
} else { /* Alt 1 */\
P0SEL |= 0x3C; \
} \
} \
} \
else{ /* Flow Ctrl Dis*/\
if((uart) == 0){ /* USART0 */\
if(PERCFG & 0x01){ /* Alt 2 */\
P1SEL |= 0x30; \
} else { /* Alt 1 */\
P0SEL |= 0x0C; \
} \
} \
else { /* USART1 */\
if(PERCFG & 0x02){ /* Alt 2 */\
P1SEL |= 0xC0; \
} else { /* Alt 1 */\
P0SEL |= 0x30; \
} \
} \
} \
\
U##uart##GCR = BAUD_E((baudRate), CLKSPD); \
U##uart##BAUD = BAUD_M(baudRate); \
\
U##uart##CSR |= 0x80; \
\
U##uart##UCR |= ((options) | 0x80); \
\
if((options) & TRANSFER_MSB_FIRST){ \
U##uart##GCR |= 0x20; \
} \
} while(0)
// Options for UART_SETUP macro
#define FLOW_CONTROL_ENABLE 0x40
#define FLOW_CONTROL_DISABLE 0x00
#define EVEN_PARITY 0x20
#define ODD_PARITY 0x00
#define NINE_BIT_TRANSFER 0x10
#define EIGHT_BIT_TRANSFER 0x00
#define PARITY_ENABLE 0x08
#define PARITY_DISABLE 0x00
#define TWO_STOP_BITS 0x04
#define ONE_STOP_BITS 0x00
#define HIGH_STOP 0x02
#define LOW_STOP 0x00
#define HIGH_START 0x01
#define TRANSFER_MSB_FIRST 0x80
#define TRANSFER_MSB_LAST 0x00
// Example usage:
// if(UART0_PARERR())
// ...
#define UART_PARERR(num) (U##num##CSR & 0x08)
#define UART0_PARERR() UART_PARERR(0)
#define UART1_PARERR() UART_PARERR(1)
// Example usage:
// if(UART1_FRAMEERR())
// ...
#define UART_FRAMEERR(num) (U ##num## CSR & 0x10)
#define UART0_FRAMEERR() UART_FRAMEERR(0)
#define UART1_FRAMEERR() UART_FRAMEERR(1)
// Example usage:
// char ch = 'A';
// UART1_SEND(ch);
// ...
// UART1_RECEIVE(ch);
#define UART_SEND(num, x) U##num##DBUF = x
#define UART0_SEND(x) UART_SEND(0, x)
#define UART1_SEND(x) UART_SEND(1, x)
#define UART_RECEIVE(num, x) x = U##num##DBUF
#define UART0_RECEIVE(x) UART_RECEIVE(0, x)
#define UART1_RECEIVE(x) UART_RECEIVE(1, x)
// Example usage:
// UART_RX_ENABLE(0);
// ...
#define UART_RX_ENABLE(uart) (U##uart##CSR |= 0x40)
/******************************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -