Serial.hpp
Page last updated 11 Jan 2011, by
1 reply
.
/* * Serial.h * * Created on: Dec 4, 2010 * Author: dejagerd */ #ifndef SERIAL_H_ #define SERIAL_H_ #include <LPC17xx.h> #include <stdio.h> #include <errno.h> #include "newlibMinimal.h" /* dtab for an example stream device called "com1" */ //const devoptab_t devoptab_tty0 = { // "tty0", // NULL,//com1_open_r, // NULL,//com1_close_r, // NULL,//com1_write_r, // NULL//com1_read_r //}; ///Enumeration listing port configurations. typedef enum { ///Primary configuration of uart0 ///Transmitting on p0.2 ///Receiving on p0.3 UART0 = 0, ///Primary configuration of uart1 ///Transmitting on p0.15 ///Receiving on p0.16 UART1 = 1, ///Primary configuration of uart2 ///Transmitting on p0.10 ///Receiving on p0.11 UART2 = 2, ///Primary configuration of uart3 ///Transmitting on p0.0 ///Receiving on p0.1 UART3 = 3, ///Secondary configuration of uart1 ///Transmitting on p2.0 ///Receiving on p2.1 UART1_ALT1 = 5, ///Secondary configuration of uart2 ///Transmitting on p2.8 ///Receiving on p2.9 UART2_ALT1 = 6, ///Secondary configuration of uart3 ///Transmitting on p0.25 ///Receiving on p0.26 UART3_ALT1 = 7, ///Tertiary configuration of uart3 ///Transmitting on p4.28 ///Receiving on p4.29 UART3_ALT2 = 11 } UART_PortConfig; /** * Changes the configuration of the current port. * @param config Chooses the configuration for this port * @param baudrate Baudrate to use on this port * @return True if successful, FALSE if failed */ int SerialInit(UART_PortConfig config, uint32_t baudrate) { uint32_t Fdiv; uint32_t pclkdiv, pclk; uint32_t UART; switch (config % 4) { case 0: UART = (uint32_t) LPC_UART0; break; case 1: UART = (uint32_t) LPC_UART1; break; case 2: UART = (uint32_t) LPC_UART2; break; case 3: UART = (uint32_t) LPC_UART3; break; default: return 0; } pclkdiv = (LPC_SC->PCLKSEL0 >> 6) & 0x03; switch (pclkdiv) { case 0x00: default: pclk = SystemCoreClock / 4; break; case 0x01: pclk = SystemCoreClock; break; case 0x02: pclk = SystemCoreClock / 2; break; case 0x03: pclk = SystemCoreClock / 8; } Fdiv = (pclk / 16) / baudrate; /*baud rate */ switch (config) { case 0: LPC_PINCON->PINSEL0 &= ~((3 << 4) | (3 << 6)); LPC_PINCON->PINSEL0 |= ((1 << 4) | (1 << 6)); /* RxD0 is P0.3 and TxD0 is P0.2 */ NVIC_EnableIRQ(UART0_IRQn); break; case 1: LPC_PINCON->PINSEL0 &= ~((3 << 30)); LPC_PINCON->PINSEL0 |= ((1 << 30)); LPC_PINCON->PINSEL1 &= ~((3 << 0)); LPC_PINCON->PINSEL1 |= ((1 << 0)); /* Enable RxD1 P2.1, TxD1 P2.0 */ NVIC_EnableIRQ(UART1_IRQn); break; case 2: LPC_PINCON->PINSEL0 &= ~((3 << 20) | (3 << 22)); LPC_PINCON->PINSEL0 |= ((1 << 20) | (1 << 22)); /* Enable RxD1 P2.1, TxD1 P2.0 */ NVIC_EnableIRQ(UART2_IRQn); break; case 3: LPC_PINCON->PINSEL0 &= ~((3 << 0) | (3 << 2)); LPC_PINCON->PINSEL0 |= ((2 << 0) | (2 << 2)); /* RxD3 is P0.1 and TxD0 is P0.1 */ NVIC_EnableIRQ(UART3_IRQn); break; case 5: LPC_PINCON->PINSEL4 &= ~((3 << 4) | (3 << 6)); LPC_PINCON->PINSEL4 |= ((2 << 4) | (2 << 6)); /* RxD0 is P0.3 and TxD0 is P0.2 */ NVIC_EnableIRQ(UART1_IRQn); break; case 6: LPC_PINCON->PINSEL4 &= ~((3 << 16) | (3 << 18)); LPC_PINCON->PINSEL4 |= ((2 << 16) | (2 << 18)); /* RxD0 is P0.3 and TxD0 is P0.2 */ NVIC_EnableIRQ(UART2_IRQn); break; case 7: LPC_PINCON->PINSEL1 &= ~((3 << 18) | (3 << 20)); LPC_PINCON->PINSEL1 |= ((3 << 18) | (3 << 20)); /* RxD0 is P0.3 and TxD0 is P0.2 */ NVIC_EnableIRQ(UART3_IRQn); break; case 11: LPC_PINCON->PINSEL9 &= ~((3 << 24) | (3 << 26)); LPC_PINCON->PINSEL9 |= ((3 << 24) | (3 << 26)); /* RxD0 is P0.3 and TxD0 is P0.2 */ NVIC_EnableIRQ(UART3_IRQn); break; default: return (0); } switch (config % 4) { case 0: ((LPC_UART0_TypeDef*) UART)->LCR = 0x83; /* 8 bits, no Parity, 1 Stop bit */ ((LPC_UART0_TypeDef*) UART)->DLM = Fdiv / 256; ((LPC_UART0_TypeDef*) UART)->DLL = Fdiv % 256; ((LPC_UART0_TypeDef*) UART)->LCR = 0x03; /* DLAB = 0 */ ((LPC_UART0_TypeDef*) UART)->FCR = 0x07; /* Enable and reset TX and RX FIFO. */ case 1: ((LPC_UART1_TypeDef*) UART)->LCR = 0x83; /* 8 bits, no Parity, 1 Stop bit */ ((LPC_UART1_TypeDef*) UART)->DLM = Fdiv / 256; ((LPC_UART1_TypeDef*) UART)->DLL = Fdiv % 256; ((LPC_UART1_TypeDef*) UART)->LCR = 0x03; /* DLAB = 0 */ ((LPC_UART1_TypeDef*) UART)->FCR = 0x07; /* Enable and reset TX and RX FIFO. */ case 2: case 3: ((LPC_UART_TypeDef*) UART)->LCR = 0x83; /* 8 bits, no Parity, 1 Stop bit */ ((LPC_UART_TypeDef*) UART)->DLM = Fdiv / 256; ((LPC_UART_TypeDef*) UART)->DLL = Fdiv % 256; ((LPC_UART_TypeDef*) UART)->LCR = 0x03; /* DLAB = 0 */ ((LPC_UART_TypeDef*) UART)->FCR = 0x07; /* Enable and reset TX and RX FIFO. */ } // uart_buf = bufmake(80); /* switch(config%4){ case 0: ((LPC_UART0_TypeDef*)UART)->IER = IER_RBR | IER_THRE | IER_RLS; case 1: ((LPC_UART1_TypeDef*)UART)->IER = IER_RBR | IER_THRE | IER_RLS; case 2: case 3: ((LPC_UART_TypeDef*)UART)->IER = IER_RBR | IER_THRE | IER_RLS; }*/ return (-1); } int uart_putchar(char c, FILE *stream) { if (c == '\n') uart_putchar('\r', stream); LPC_UART0->THR = c; while (!(LPC_UART0->LSR & (1 << 6))) ;//TSR && THR are not empty return 0; } int putst(char* s) { while (*s) { uart_putchar(*s, NULL); s++; } return 0; } #endif /* SERIAL_H_ */
1 comment
#
15 Apr 2011 . Edited: 15 Apr 2011
You need to log in to post a comment