📄 config.h
字号:
// 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 == 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) == 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) == 0x02)
#define USART0_BYTE_TRANSMITTED() USART_BYTE_TRANSMITTED(0)
#define USART1_BYTE_TRANSMITTED() USART_BYTE_TRANSMITTED(1)
/******************************************************************************
******************* USART-UART specific functions/macros *******************
******************************************************************************/
#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)
//*****************************************************************************
// 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) == 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) == 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)
/******************************************************************************
******************* Power and clock management ********************
*******************************************************************************
These macros are used to set power-mode, clock source and clock speed.
******************************************************************************/
// Macro for getting the clock division factor
#define CLKSPD (CLKCON & 0x07)
// Macro for getting the timer tick division factor.
#define TICKSPD ((CLKCON & 0x38) >> 3)
// Macro for checking status of the crystal oscillator
#define XOSC_STABLE (SLEEP & 0x40)
// Macro for checking status of the high frequency RC oscillator.
#define HIGH_FREQUENCY_RC_OSC_STABLE (SLEEP & 0x20)
// Macro for setting power mode
#define SET_POWER_MODE(mode) \
if(mode == 0) { SLEEP &= ~0x03; } \
else if (mode == 3) { SLEEP |= 0x03; } \
else { SLEEP &= ~0x03; SLEEP |= mode; } \
PCON |= 0x01; \
// asm("NOP"); \
// Where _mode_ is one of
#define POWER_MODE_0 0x00 // Clock oscillators on, voltage regulator on
#define POWER_MODE_1 0x01 // 32.768 KHz oscillator on, voltage regulator on
#define POWER_MODE_2 0x02 // 32.768 KHz oscillator on, voltage regulator off
#define POWER_MODE_3 0x03 // All clock oscillators off, voltage regulator off
// Macro for setting the 32 KHz clock source
#define SET_32KHZ_CLOCK_SOURCE(source) \
do { \
if( source ) { \
CLKCON |= 0x80; \
} else { \
CLKCON &= ~0x80; \
} \
} while (0)
// Where _source_ is one of
#define CRYSTAL 0x00
#define RC 0x01
// Macro for setting the main clock oscillator source,
//turns off the clock source not used
//changing to XOSC will take approx 150 us
// 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
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -