Simple mbed library with macros
Dependents: SimpleTimer SimpleUART SimpleTimer Stoppuhr1
Revision 7:8443cecf62d1, committed 2010-11-13
- Comitter:
- Alkorin
- Date:
- Sat Nov 13 21:33:11 2010 +0000
- Parent:
- 6:9e1310782abf
- Child:
- 8:f8b47457fdcf
- Commit message:
- All UARTs should now work
Changed in this revision
serial.h | Show annotated file Show diff for this revision Revisions of this file |
--- a/serial.h Sat Nov 13 14:47:51 2010 +0000 +++ b/serial.h Sat Nov 13 21:33:11 2010 +0000 @@ -6,18 +6,66 @@ /* Simple Serial Managment * * The interrupt handler is : * - * SERIAL_INTERRUPT_HANDLER(void) */ + * SERIAL_INTERRUPT_HANDLER(void) * + * UART0 : Serial over USB * + * UART1 : TX p13, RX p14 * + * UART2 : TX p28, RX p27 * + * UART3 : TX p9, RX p10 */ -// Serial port (Choose UARTn (0,2,3)) +// Serial port (Choose UARTn (0,1,2,3)) #define UART_NUMBER UART0 #define UART_BASE TOKENPASTE2(LPC_,UART_NUMBER) // Peripheral Clock Selection registers (See 4.7.3 p56) +#define UART0_PCLK_REG (LPC_SC->PCLKSEL0) +#define UART1_PCLK_REG (LPC_SC->PCLKSEL0) +#define UART2_PCLK_REG (LPC_SC->PCLKSEL1) +#define UART3_PCLK_REG (LPC_SC->PCLKSEL1) +#define UART_PCLK_REG TOKENPASTE2(UART_NUMBER,_PCLK_REG) + +#define UART0_PCLK_OFFSET 6 +#define UART1_PCLK_OFFSET 8 +#define UART2_PCLK_OFFSET 16 +#define UART3_PCLK_OFFSET 18 +#define UART_PCLK_OFFSET TOKENPASTE2(UART_NUMBER,_PCLK_OFFSET) + #define UART0_PCLK ((LPC_SC->PCLKSEL0 >> 6) & 0x03) +#define UART1_PCLK ((LPC_SC->PCLKSEL0 >> 8) & 0x03) #define UART2_PCLK ((LPC_SC->PCLKSEL1 >> 16) & 0x03) #define UART3_PCLK ((LPC_SC->PCLKSEL1 >> 18) & 0x03) #define UART_PCLK TOKENPASTE2(UART_NUMBER,_PCLK) +// Pin Function Select register (See 8.5.1-8 p108) +#define UART0RX_PINSEL_REG (LPC_PINCON->PINSEL0) +#define UART1RX_PINSEL_REG (LPC_PINCON->PINSEL1) +#define UART2RX_PINSEL_REG (LPC_PINCON->PINSEL0) +#define UART3RX_PINSEL_REG (LPC_PINCON->PINSEL0) +#define UARTRX_PINSEL_REG TOKENPASTE2(UART_NUMBER,RX_PINSEL_REG) + +#define UART0TX_PINSEL_REG (LPC_PINCON->PINSEL0) +#define UART1TX_PINSEL_REG (LPC_PINCON->PINSEL0) +#define UART2TX_PINSEL_REG (LPC_PINCON->PINSEL0) +#define UART3TX_PINSEL_REG (LPC_PINCON->PINSEL0) +#define UARTTX_PINSEL_REG TOKENPASTE2(UART_NUMBER,TX_PINSEL_REG) + +#define UART0RX_PINSEL_OFFSET 6 +#define UART1RX_PINSEL_OFFSET 0 +#define UART2RX_PINSEL_OFFSET 22 +#define UART3RX_PINSEL_OFFSET 2 +#define UARTRX_PINSEL_OFFSET TOKENPASTE2(UART_NUMBER,RX_PINSEL_OFFSET) + +#define UART0TX_PINSEL_OFFSET 4 +#define UART1TX_PINSEL_OFFSET 30 +#define UART2TX_PINSEL_OFFSET 20 +#define UART3TX_PINSEL_OFFSET 0 +#define UARTTX_PINSEL_OFFSET TOKENPASTE2(UART_NUMBER,TX_PINSEL_OFFSET) + +#define UART0_PINSEL_VALUE 1UL +#define UART1_PINSEL_VALUE 1UL +#define UART2_PINSEL_VALUE 1UL +#define UART3_PINSEL_VALUE 2UL +#define UART_PINSEL_VALUE TOKENPASTE2(UART_NUMBER,_PINSEL_VALUE) + // Interrupt handlers #define SERIAL_INTERRUPT_HANDLER extern "C" void __irq TOKENPASTE2(UART_NUMBER,_IRQHandler) @@ -34,6 +82,11 @@ #define SERIAL_INT_TX 2 // Divisor Latch Access Bit (UnLCR, 14.4.7 p306) #define DLA_BIT 7 +// Power Control for Peripherals (PCONP, 4.8.7.1 p63) +#define UART0_PCONP_BIT 3 +#define UART1_PCONP_BIT 4 +#define UART2_PCONP_BIT 24 +#define UART3_PCONP_BIT 25 /** Macros **/ #define SERIAL_PUTCHAR(c) while (GET_BIT_VALUE(UART_BASE->LSR, THRE_BIT) == 0); \ @@ -47,16 +100,20 @@ #define SERIAL_ENABLE_INTERRUPT(value) UART_BASE->IER = value; \ ENABLE_INTERRUPT(TOKENPASTE2(UART_NUMBER,_IRQn)); -// UART0 is enabled by default ? -#define SERIAL_INIT() LPC_SC->PCONP |= (1UL << 3); \ - UART_BASE->FCR = 0x07; \ - UART_BASE->LCR = 0x03; \ - LPC_SC->PCLKSEL0 &= ~(3UL << 6); \ - LPC_SC->PCLKSEL0 |= (1UL << 6); \ - LPC_PINCON->PINSEL0 &= ~(1UL << 4); \ - LPC_PINCON->PINSEL0 |= (1UL << 4); \ - LPC_PINCON->PINSEL0 &= ~(1UL << 6); \ - LPC_PINCON->PINSEL0 |= (1UL << 6); +inline void SERIAL_INIT() +{ + // Enable UARTn + SET_BIT_VALUE(LPC_SC->PCONP, TOKENPASTE2(UART_NUMBER,_PCONP_BIT) , 1); + // Enable FIFO and reset RX/TX FIFO (See 14.4.6 p305) + UART_BASE->FCR = 0x07; + // 8-bits, No Parity, 1 stop bit (See 14.4.7 p306) + UART_BASE->LCR = 0x03; + // Set CCLK as Peripheral Clock for UART (96MHz with mbed library) + UART_PCLK_REG = UART_PCLK_REG & ~(3UL << UART_PCLK_OFFSET) | (1UL << UART_PCLK_OFFSET); + // Define Pin's functions as UART + UARTRX_PINSEL_REG = UARTRX_PINSEL_REG & ~(3UL << UARTRX_PINSEL_OFFSET) | (UART_PINSEL_VALUE << UARTRX_PINSEL_OFFSET); + UARTTX_PINSEL_REG = UARTTX_PINSEL_REG & ~(3UL << UARTTX_PINSEL_OFFSET) | (UART_PINSEL_VALUE << UARTTX_PINSEL_OFFSET); +} // See 14.4.5 p303 inline int SERIAL_CHECK_INTERRUPT(void) {