Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: SimpleTimer SimpleUART SimpleTimer Stoppuhr1
Diff: serial.h
- Revision:
- 7:8443cecf62d1
- Parent:
- 6:9e1310782abf
- Child:
- 8:f8b47457fdcf
diff -r 9e1310782abf -r 8443cecf62d1 serial.h
--- 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) {