// The macros in this section simplify UART operation. // BAUD_E和BAUD_M共同决定了波特率,参见波特率计算公式 // BAUD_E=Baud rate exponent value 指数值 BAUD_E[4:0]在U0/1GCR寄存器中 // BAUD_M=Baud rate mantissa value 尾数值 BAUD_M[7:0]在U0/1BAUD寄存器中 #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)
// 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){ /* if U0CFG=1,chose location 2 Alt 2 */\ P1SEL |= 0x3C; \ //选择RX TX } 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##GCR:普通控制寄存器 U##uart##BAUD = BAUD_M(baudRate); \ //设置波特率尾数值,U##uart##BAUD:波特率控制寄存器 \ U##uart##CSR |= 0x80; \//USART设为UART模式 /chose UART stop bit level and set FLUSH bit \ U##uart##UCR |= ((options) | 0x80); \ //U##uart##UCR :UART控制寄存器 \ if((options) & TRANSFER_MSB_FIRST){ \//options=0x02:High stop bit 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)
|