Simple mbed library with macros

Dependents:   SimpleTimer SimpleUART SimpleTimer Stoppuhr1

Files at this revision

API Documentation at this revision

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) {