Dependencies:   mbed

Files at this revision

API Documentation at this revision

Comitter:
hugozijlmans
Date:
Thu Dec 02 20:55:45 2010 +0000
Parent:
1:2c52307d223f
Commit message:
Added UART0 support over USB mBed1768

Changed in this revision

LPC1768.h Show annotated file Show diff for this revision Revisions of this file
MCPWM.c Show annotated file Show diff for this revision Revisions of this file
UART0.c Show annotated file Show diff for this revision Revisions of this file
UART0.h Show annotated file Show diff for this revision Revisions of this file
main.c Show annotated file Show diff for this revision Revisions of this file
main.h Show annotated file Show diff for this revision Revisions of this file
--- a/LPC1768.h	Thu Dec 02 12:32:18 2010 +0000
+++ b/LPC1768.h	Thu Dec 02 20:55:45 2010 +0000
@@ -10,8 +10,16 @@
 
 // Perhiperal clock select
 #define PCLKSEL0 LPC_SC->PCLKSEL0
+#define PCLK_UART1_1 1 << 9
+#define PCLK_UART1_0 1 << 8
+#define PCLK_UART0_1 1 << 7
+#define PCLK_UART0_0 1 << 6
+#define PCLK_TIMER1_1 1 << 5
+#define PCLK_TIMER1_0 1 << 4
 #define PCLK_TIMER0_1 1 << 3
 #define PCLK_TIMER0_0 1 << 2
+#define PCLK_WDT_1 1 << 1
+#define PCLK_WDT_0 1 << 0
 #define PCLKSEL1 LPC_SC->PCLKSEL1
 #define PCLK_RIT_1 1 << 27
 #define PCLK_RIT_0 1 << 26
@@ -20,12 +28,17 @@
 #define PCONP LPC_SC->PCONP
 #define PCTIM0 1 << 1
 #define PCTIM1 1 << 2
+#define PCUART0 1 << 3
+#define PCUART1 1 << 4
 #define PCRIT 1 << 16
 
 // CLKOUT
 #define CLKSRCSEL LPC_SC->CLKSRCSEL
 #define CCLKCFG LPC_SC->CCLKCFG
 
+// Pin output/input function selection
+#define PINSEL0 LPC_PINCON->PINSEL0
+
 // FI0
 #define FIOSET LPC_GPIO1->FIOSET
 #define FIOCLR LPC_GPIO1->FIOCLR
@@ -52,8 +65,18 @@
 #define T0IR_CR0 1 << 4
 #define T0IR_CR1 1 << 5
 
+// UART0
+#define U0LCR LPC_UART0->LCR
+#define U0DLL LPC_UART0->DLL
+#define U0DLM LPC_UART0->DLM
+#define U0FDR LPC_UART0->FDR
+#define U0FCR LPC_UART0->FCR
+#define U0THR LPC_UART0->THR
+#define U0RBR LPC_UART0->RBR
+#define U0IER LPC_UART0->IER
+#define U0IIR LPC_UART0->IIR
+
 // RIT
-
 #define RICOMPVAL LPC_RIT->RICOMPVAL
 #define RICTRL LPC_RIT->RICTRL
 #define RITINT 1 << 0
--- a/MCPWM.c	Thu Dec 02 12:32:18 2010 +0000
+++ b/MCPWM.c	Thu Dec 02 20:55:45 2010 +0000
@@ -3,13 +3,14 @@
 #include "cmsis_nvic.h"
 #include "MCPWM.h"
 #include "LPC1768.h"
+#include "main.h"
 
 void MCPWM_init(void) {
 
     // Make the timer overload at 2000 (96MHz / 2000 = 48kHz)
     // Set the value to 1999 --> hex 7CF
-    MCLIM0 = 0x000007CF;
-    MCLIM1 = 0x000007CF;
-    MCLIM2 = 0x000007CF;
+    MCLIM0 = MCPWM_DIV;
+    MCLIM1 = MCPWM_DIV;
+    MCLIM2 = MCPWM_DIV;
 
 }
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UART0.c	Thu Dec 02 20:55:45 2010 +0000
@@ -0,0 +1,143 @@
+#include "LPC17xx.h"
+#include "core_cm3.h"
+#include "cmsis_nvic.h"
+#include "UART0.h"
+#include "main.h"
+#include "LPC1768.h"
+
+void UART0_interrupt_enable(void) {
+
+    // Enable UART0 interrupt
+    NVIC_EnableIRQ(UART0_IRQn);
+}
+
+void UART0_interrupt_disable(void) {
+
+    // Disable UART0 interrupt
+    NVIC_DisableIRQ(UART0_IRQn);
+}
+
+void UART0_IRQHandler(void) {
+
+    // Determine the cause of the interrupt
+
+    // If THRE then buffer is empty
+    if ((U0IIR & 0x2) == 0x2)
+        i_flags.UART0_tx_idle = 1;
+
+    // If receive buffer contains a byte
+    if ((U0IIR & 0x8) == 0x8) {
+        i_flags.UART0_rx_idle = 0;
+        UART0_rx_interrupt_disable();
+    }
+
+    // Clear the UART0 interrupt
+    NVIC_ClearPendingIRQ(UART0_IRQn);
+
+}
+
+void UART0_init(void) {
+
+    // Set UART0 interrupt priority
+    NVIC_SetPriority(UART0_IRQn, 12);
+
+    // Set RXD0/TXD0 to function UART0
+    PINSEL0 &= ~(0xF0);
+    PINSEL0 |= 0x50;
+
+    // Select the UART0 clk
+    UART0_select_clk();
+
+    // Power the UART0
+    PCONP |= PCUART0;
+
+    // Set the UART0 Line Control Register
+    U0LCR &= 0;
+    U0LCR |= (1 << 1) | (1 << 0) // 8 bit
+             | (1 << 2)            // 1 stop bit
+             | (0 << 3)            // disable parity
+             | (1 << 5) | (0 << 4) // force 1 stick parity
+             | (0 << 6)            // disable break control
+             | (1 << 7);           // divisor access bit enable
+
+    // Set Baudrate 115200
+    // DIVADDVAL 3
+    // MULVAL 10
+    // DLL 40
+    // DLM 0
+    // Error 0.1603%
+
+    // Set Fractional Divider Register
+    U0FDR = 0xA3;
+
+    // Set Baudrate divisor
+    U0DLL = 40;
+    U0DLM = 0;
+
+    // Set divisor access bit 0
+    U0LCR &= ~(1 << 7);
+
+    // Set Fifo control register
+    U0FCR &= 0;
+    U0FCR |= (1 << 7) | (1 << 6) // RX Fifo DMA @ 14 bytes
+             | (1 << 3)            // 1 stop bit
+             | (1 << 2)            // disable parity
+             | (1 << 1)            // disable break control
+             | (1 << 0);           // divisor access bit enable
+
+    // Set interrupt enable sources THRE & RBR
+    U0IER |= 3;
+
+    // Set that the TX is idle
+    i_flags.UART0_tx_idle = 1;
+    // Set that the RX is idle
+    i_flags.UART0_rx_idle = 1;
+
+    // Connect the UART0 interrupt to the interrupt handler
+    NVIC_SetVector(UART0_IRQn, (uint32_t)&UART0_IRQHandler);
+
+    UART0_interrupt_enable();
+
+}
+
+void UART0_select_clk(void) {
+
+    // Including work-around described in errata.lpc1768.pdf R04
+
+    PLL0_disconnect();
+
+    PLL0_disable();
+
+    // Timer0 perhiperal clock select (01 = CCLK)
+    PCLKSEL0 &= ~(PCLK_UART0_1 | PCLK_UART0_0);
+    PCLKSEL0 |= PCLK_UART0_0;
+
+    PLL0_enable();
+
+    PLL0_connect();
+
+}
+
+void UART0_write(uint8_t byte) {
+
+    // Send byte to writebuffer
+    U0THR = byte;
+}
+
+uint8_t UART0_read(void) {
+
+    // Read the RX FIFO
+    uint8_t byte = U0RBR;
+    
+    UART0_rx_interrupt_enable();
+    
+    return byte;
+}
+
+void UART0_rx_interrupt_disable(void) {
+    U0IER &= ~(1);
+}
+
+void UART0_rx_interrupt_enable(void) {
+    U0IER |= 1;
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UART0.h	Thu Dec 02 20:55:45 2010 +0000
@@ -0,0 +1,14 @@
+#ifndef __UART0_h
+#define __UART0_h
+
+extern void UART0_interrupt_enable(void);
+extern void UART0_interrupt_disable(void);
+extern void UART0_IRQHandler(void);
+extern void UART0_init(void);
+extern void UART0_select_clk(void);
+extern void UART0_write(uint8_t byte);
+extern uint8_t UART0_read(void);
+extern void UART0_rx_interrupt_disable(void);
+extern void UART0_rx_interrupt_enable(void);
+
+#endif
\ No newline at end of file
--- a/main.c	Thu Dec 02 12:32:18 2010 +0000
+++ b/main.c	Thu Dec 02 20:55:45 2010 +0000
@@ -6,6 +6,7 @@
 #include "LPC1768.h"
 #include "MCPWM.h"
 #include "RIT.h"
+#include "UART0.h"
 
 // BSP defines see main.h
 
@@ -24,13 +25,16 @@
 
     // Set the timer0, enable it and connect to ISR
     Timer0_init();
-    
+
     // Set the RIT, enable it and connect to ISR
     RIT_init();
 
     // Initialize MCPWM
     //MCPWM_init();
 
+    // Initialize UART0
+    UART0_init();
+
     // Start the dispatcher
     dispatcher();
 
@@ -38,27 +42,35 @@
 
 void dispatcher(void) {
 
+    int byte;
+
     while (1) {
 
         // When the timer0 interrupt occurred
         if (i_flags.Timer0_int == 1) {
-            if ((FIOPIN & LED1)==LED1)
-                FIOCLR |= LED1;
-            else
-                FIOSET |= LED1;
+            i_flags.Timer0_int = 0;
+        }
 
-            i_flags.Timer0_int = 0;
+        // When the RIT interrupt occurred
+        if (i_flags.RIT_int == 1) {
+            i_flags.RIT_int = 0;
+        }
+
+        // When UART0 TX is idle
+        if (i_flags.UART0_tx_idle == 1) {
+            i_flags.UART0_tx_idle = 0;
         }
         
-        // When the RIT interrupt occurred
-        if (i_flags.RIT_int == 1) {
-            if ((FIOPIN & LED2)==LED2)
-                FIOCLR |= LED2;
+        // When UART0 RX isn't idle
+        if (i_flags.UART0_rx_idle == 0) {
+            i_flags.UART0_rx_idle = 1;
+            byte = UART0_read();
+            if(byte == 'a')
+              FIOSET |= LED1;
             else
-                FIOSET |= LED2;
-
-            i_flags.RIT_int = 0;
-        }
+              FIOCLR |= LED1;
+            UART0_write(byte);
+        }        
     }
 
 }
\ No newline at end of file
--- a/main.h	Thu Dec 02 12:32:18 2010 +0000
+++ b/main.h	Thu Dec 02 20:55:45 2010 +0000
@@ -8,8 +8,10 @@
 #define PLLMULT (PLLCLK/2/EXTCLK)-1
 #define TIMER0_FREQ 2
 #define TIMER0_DIV (SYSCLK/TIMER0_FREQ)-1
-#define RIT_FREQ 2
+#define RIT_FREQ 10
 #define RIT_DIV (SYSCLK/RIT_FREQ)-1
+#define MCPWM_FREQ 48000
+#define MCPWM_DIV (SYSCLK/MCPWM_FREQ)-1
 #define LED_MASK 0x00B40000
 #define LED1 0x00040000
 #define LED2 0x00100000
@@ -22,6 +24,8 @@
   {
     unsigned Timer0_int:1;
     unsigned RIT_int:1;
+    unsigned UART0_tx_idle:1;
+    unsigned UART0_rx_idle:1;
   };
   unsigned char All_Flags;
 } Tinterrupt_flags;