mbed library sources

Dependents:   Nucleo_blink_led

Fork of mbed-src by mbed official

Committer:
mbed_official
Date:
Tue Feb 03 13:15:07 2015 +0000
Revision:
462:e03396e14338
Synchronized with git revision ae7e2e76ed57b9ca11dc05f51f097df1de144fe2

Full URL: https://github.com/mbedmicro/mbed/commit/ae7e2e76ed57b9ca11dc05f51f097df1de144fe2/

Add support for EA LPC4088_DM

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 462:e03396e14338 1 /* mbed Microcontroller Library
mbed_official 462:e03396e14338 2 * Copyright (c) 2006-2013 ARM Limited
mbed_official 462:e03396e14338 3 *
mbed_official 462:e03396e14338 4 * Licensed under the Apache License, Version 2.0 (the "License");
mbed_official 462:e03396e14338 5 * you may not use this file except in compliance with the License.
mbed_official 462:e03396e14338 6 * You may obtain a copy of the License at
mbed_official 462:e03396e14338 7 *
mbed_official 462:e03396e14338 8 * http://www.apache.org/licenses/LICENSE-2.0
mbed_official 462:e03396e14338 9 *
mbed_official 462:e03396e14338 10 * Unless required by applicable law or agreed to in writing, software
mbed_official 462:e03396e14338 11 * distributed under the License is distributed on an "AS IS" BASIS,
mbed_official 462:e03396e14338 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
mbed_official 462:e03396e14338 13 * See the License for the specific language governing permissions and
mbed_official 462:e03396e14338 14 * limitations under the License.
mbed_official 462:e03396e14338 15 */
mbed_official 462:e03396e14338 16 // math.h required for floating point operations for baud rate calculation
mbed_official 462:e03396e14338 17 #include <math.h>
mbed_official 462:e03396e14338 18 #include <string.h>
mbed_official 462:e03396e14338 19 #include <stdlib.h>
mbed_official 462:e03396e14338 20
mbed_official 462:e03396e14338 21 #include "serial_api.h"
mbed_official 462:e03396e14338 22 #include "cmsis.h"
mbed_official 462:e03396e14338 23 #include "pinmap.h"
mbed_official 462:e03396e14338 24 #include "mbed_error.h"
mbed_official 462:e03396e14338 25
mbed_official 462:e03396e14338 26 /******************************************************************************
mbed_official 462:e03396e14338 27 * INITIALIZATION
mbed_official 462:e03396e14338 28 ******************************************************************************/
mbed_official 462:e03396e14338 29 static const PinMap PinMap_UART_TX[] = {
mbed_official 462:e03396e14338 30 {P0_0, UART_3, 2},
mbed_official 462:e03396e14338 31 {P0_2, UART_0, 1},
mbed_official 462:e03396e14338 32 {P0_25, UART_3, 3},
mbed_official 462:e03396e14338 33 {P4_22, UART_2, 2},
mbed_official 462:e03396e14338 34 {P5_4, UART_4, 4},
mbed_official 462:e03396e14338 35 {NC , NC , 0}
mbed_official 462:e03396e14338 36 };
mbed_official 462:e03396e14338 37
mbed_official 462:e03396e14338 38 static const PinMap PinMap_UART_RX[] = {
mbed_official 462:e03396e14338 39 {P0_1 , UART_3, 2},
mbed_official 462:e03396e14338 40 {P0_3 , UART_0, 1},
mbed_official 462:e03396e14338 41 {P0_26, UART_3, 3},
mbed_official 462:e03396e14338 42 {P4_23, UART_2, 2},
mbed_official 462:e03396e14338 43 {P5_3, UART_4, 4},
mbed_official 462:e03396e14338 44 {NC , NC , 0}
mbed_official 462:e03396e14338 45 };
mbed_official 462:e03396e14338 46
mbed_official 462:e03396e14338 47 #define UART_NUM 5
mbed_official 462:e03396e14338 48
mbed_official 462:e03396e14338 49 static uint32_t serial_irq_ids[UART_NUM] = {0};
mbed_official 462:e03396e14338 50 static uart_irq_handler irq_handler;
mbed_official 462:e03396e14338 51
mbed_official 462:e03396e14338 52 int stdio_uart_inited = 0;
mbed_official 462:e03396e14338 53 serial_t stdio_uart;
mbed_official 462:e03396e14338 54
mbed_official 462:e03396e14338 55 void serial_init(serial_t *obj, PinName tx, PinName rx) {
mbed_official 462:e03396e14338 56 int is_stdio_uart = 0;
mbed_official 462:e03396e14338 57
mbed_official 462:e03396e14338 58 // determine the UART to use
mbed_official 462:e03396e14338 59 UARTName uart_tx = (UARTName)pinmap_peripheral(tx, PinMap_UART_TX);
mbed_official 462:e03396e14338 60 UARTName uart_rx = (UARTName)pinmap_peripheral(rx, PinMap_UART_RX);
mbed_official 462:e03396e14338 61 UARTName uart = (UARTName)pinmap_merge(uart_tx, uart_rx);
mbed_official 462:e03396e14338 62 MBED_ASSERT((int)uart != NC);
mbed_official 462:e03396e14338 63
mbed_official 462:e03396e14338 64 obj->uart = (LPC_UART_TypeDef *)uart;
mbed_official 462:e03396e14338 65 // enable power
mbed_official 462:e03396e14338 66 switch (uart) {
mbed_official 462:e03396e14338 67 case UART_0: LPC_SC->PCONP |= 1 << 3; break;
mbed_official 462:e03396e14338 68 case UART_1: LPC_SC->PCONP |= 1 << 4; break;
mbed_official 462:e03396e14338 69 case UART_2: LPC_SC->PCONP |= 1 << 24; break;
mbed_official 462:e03396e14338 70 case UART_3: LPC_SC->PCONP |= 1 << 25; break;
mbed_official 462:e03396e14338 71 case UART_4: LPC_SC->PCONP |= 1 << 8; break;
mbed_official 462:e03396e14338 72 }
mbed_official 462:e03396e14338 73
mbed_official 462:e03396e14338 74 // enable fifos and default rx trigger level
mbed_official 462:e03396e14338 75 obj->uart->FCR = 1 << 0 // FIFO Enable - 0 = Disables, 1 = Enabled
mbed_official 462:e03396e14338 76 | 0 << 1 // Rx Fifo Reset
mbed_official 462:e03396e14338 77 | 0 << 2 // Tx Fifo Reset
mbed_official 462:e03396e14338 78 | 0 << 6; // Rx irq trigger level - 0 = 1 char, 1 = 4 chars, 2 = 8 chars, 3 = 14 chars
mbed_official 462:e03396e14338 79
mbed_official 462:e03396e14338 80 // disable irqs
mbed_official 462:e03396e14338 81 obj->uart->IER = 0 << 0 // Rx Data available irq enable
mbed_official 462:e03396e14338 82 | 0 << 1 // Tx Fifo empty irq enable
mbed_official 462:e03396e14338 83 | 0 << 2; // Rx Line Status irq enable
mbed_official 462:e03396e14338 84
mbed_official 462:e03396e14338 85 // set default baud rate and format
mbed_official 462:e03396e14338 86 serial_baud (obj, 9600);
mbed_official 462:e03396e14338 87 serial_format(obj, 8, ParityNone, 1);
mbed_official 462:e03396e14338 88
mbed_official 462:e03396e14338 89 // pinout the chosen uart
mbed_official 462:e03396e14338 90 pinmap_pinout(tx, PinMap_UART_TX);
mbed_official 462:e03396e14338 91 pinmap_pinout(rx, PinMap_UART_RX);
mbed_official 462:e03396e14338 92
mbed_official 462:e03396e14338 93 // set rx/tx pins in PullUp mode
mbed_official 462:e03396e14338 94 if (tx != NC) {
mbed_official 462:e03396e14338 95 pin_mode(tx, PullUp);
mbed_official 462:e03396e14338 96 }
mbed_official 462:e03396e14338 97 if (rx != NC) {
mbed_official 462:e03396e14338 98 pin_mode(rx, PullUp);
mbed_official 462:e03396e14338 99 }
mbed_official 462:e03396e14338 100
mbed_official 462:e03396e14338 101 switch (uart) {
mbed_official 462:e03396e14338 102 case UART_0: obj->index = 0; break;
mbed_official 462:e03396e14338 103 case UART_1: obj->index = 1; break;
mbed_official 462:e03396e14338 104 case UART_2: obj->index = 2; break;
mbed_official 462:e03396e14338 105 case UART_3: obj->index = 3; break;
mbed_official 462:e03396e14338 106 case UART_4: obj->index = 4; break;
mbed_official 462:e03396e14338 107 }
mbed_official 462:e03396e14338 108
mbed_official 462:e03396e14338 109 is_stdio_uart = (uart == STDIO_UART) ? (1) : (0);
mbed_official 462:e03396e14338 110
mbed_official 462:e03396e14338 111 if (is_stdio_uart) {
mbed_official 462:e03396e14338 112 stdio_uart_inited = 1;
mbed_official 462:e03396e14338 113 memcpy(&stdio_uart, obj, sizeof(serial_t));
mbed_official 462:e03396e14338 114 }
mbed_official 462:e03396e14338 115 }
mbed_official 462:e03396e14338 116
mbed_official 462:e03396e14338 117 void serial_free(serial_t *obj) {
mbed_official 462:e03396e14338 118 serial_irq_ids[obj->index] = 0;
mbed_official 462:e03396e14338 119 }
mbed_official 462:e03396e14338 120
mbed_official 462:e03396e14338 121 // serial_baud
mbed_official 462:e03396e14338 122 // set the baud rate, taking in to account the current SystemFrequency
mbed_official 462:e03396e14338 123 void serial_baud(serial_t *obj, int baudrate) {
mbed_official 462:e03396e14338 124 uint32_t PCLK = PeripheralClock;
mbed_official 462:e03396e14338 125
mbed_official 462:e03396e14338 126 // First we check to see if the basic divide with no DivAddVal/MulVal
mbed_official 462:e03396e14338 127 // ratio gives us an integer result. If it does, we set DivAddVal = 0,
mbed_official 462:e03396e14338 128 // MulVal = 1. Otherwise, we search the valid ratio value range to find
mbed_official 462:e03396e14338 129 // the closest match. This could be more elegant, using search methods
mbed_official 462:e03396e14338 130 // and/or lookup tables, but the brute force method is not that much
mbed_official 462:e03396e14338 131 // slower, and is more maintainable.
mbed_official 462:e03396e14338 132 uint16_t DL = PCLK / (16 * baudrate);
mbed_official 462:e03396e14338 133
mbed_official 462:e03396e14338 134 uint8_t DivAddVal = 0;
mbed_official 462:e03396e14338 135 uint8_t MulVal = 1;
mbed_official 462:e03396e14338 136 int hit = 0;
mbed_official 462:e03396e14338 137 uint16_t dlv;
mbed_official 462:e03396e14338 138 uint8_t mv, dav;
mbed_official 462:e03396e14338 139 if ((PCLK % (16 * baudrate)) != 0) { // Checking for zero remainder
mbed_official 462:e03396e14338 140 int err_best = baudrate, b;
mbed_official 462:e03396e14338 141 for (mv = 1; mv < 16 && !hit; mv++)
mbed_official 462:e03396e14338 142 {
mbed_official 462:e03396e14338 143 for (dav = 0; dav < mv; dav++)
mbed_official 462:e03396e14338 144 {
mbed_official 462:e03396e14338 145 // baudrate = PCLK / (16 * dlv * (1 + (DivAdd / Mul))
mbed_official 462:e03396e14338 146 // solving for dlv, we get dlv = mul * PCLK / (16 * baudrate * (divadd + mul))
mbed_official 462:e03396e14338 147 // mul has 4 bits, PCLK has 27 so we have 1 bit headroom which can be used for rounding
mbed_official 462:e03396e14338 148 // for many values of mul and PCLK we have 2 or more bits of headroom which can be used to improve precision
mbed_official 462:e03396e14338 149 // note: X / 32 doesn't round correctly. Instead, we use ((X / 16) + 1) / 2 for correct rounding
mbed_official 462:e03396e14338 150
mbed_official 462:e03396e14338 151 if ((mv * PCLK * 2) & 0x80000000) // 1 bit headroom
mbed_official 462:e03396e14338 152 dlv = ((((2 * mv * PCLK) / (baudrate * (dav + mv))) / 16) + 1) / 2;
mbed_official 462:e03396e14338 153 else // 2 bits headroom, use more precision
mbed_official 462:e03396e14338 154 dlv = ((((4 * mv * PCLK) / (baudrate * (dav + mv))) / 32) + 1) / 2;
mbed_official 462:e03396e14338 155
mbed_official 462:e03396e14338 156 // datasheet says if DLL==DLM==0, then 1 is used instead since divide by zero is ungood
mbed_official 462:e03396e14338 157 if (dlv == 0)
mbed_official 462:e03396e14338 158 dlv = 1;
mbed_official 462:e03396e14338 159
mbed_official 462:e03396e14338 160 // datasheet says if dav > 0 then DL must be >= 2
mbed_official 462:e03396e14338 161 if ((dav > 0) && (dlv < 2))
mbed_official 462:e03396e14338 162 dlv = 2;
mbed_official 462:e03396e14338 163
mbed_official 462:e03396e14338 164 // integer rearrangement of the baudrate equation (with rounding)
mbed_official 462:e03396e14338 165 b = ((PCLK * mv / (dlv * (dav + mv) * 8)) + 1) / 2;
mbed_official 462:e03396e14338 166
mbed_official 462:e03396e14338 167 // check to see how we went
mbed_official 462:e03396e14338 168 b = abs(b - baudrate);
mbed_official 462:e03396e14338 169 if (b < err_best)
mbed_official 462:e03396e14338 170 {
mbed_official 462:e03396e14338 171 err_best = b;
mbed_official 462:e03396e14338 172
mbed_official 462:e03396e14338 173 DL = dlv;
mbed_official 462:e03396e14338 174 MulVal = mv;
mbed_official 462:e03396e14338 175 DivAddVal = dav;
mbed_official 462:e03396e14338 176
mbed_official 462:e03396e14338 177 if (b == baudrate)
mbed_official 462:e03396e14338 178 {
mbed_official 462:e03396e14338 179 hit = 1;
mbed_official 462:e03396e14338 180 break;
mbed_official 462:e03396e14338 181 }
mbed_official 462:e03396e14338 182 }
mbed_official 462:e03396e14338 183 }
mbed_official 462:e03396e14338 184 }
mbed_official 462:e03396e14338 185 }
mbed_official 462:e03396e14338 186
mbed_official 462:e03396e14338 187 // set LCR[DLAB] to enable writing to divider registers
mbed_official 462:e03396e14338 188 obj->uart->LCR |= (1 << 7);
mbed_official 462:e03396e14338 189
mbed_official 462:e03396e14338 190 // set divider values
mbed_official 462:e03396e14338 191 obj->uart->DLM = (DL >> 8) & 0xFF;
mbed_official 462:e03396e14338 192 obj->uart->DLL = (DL >> 0) & 0xFF;
mbed_official 462:e03396e14338 193 obj->uart->FDR = (uint32_t) DivAddVal << 0
mbed_official 462:e03396e14338 194 | (uint32_t) MulVal << 4;
mbed_official 462:e03396e14338 195
mbed_official 462:e03396e14338 196 // clear LCR[DLAB]
mbed_official 462:e03396e14338 197 obj->uart->LCR &= ~(1 << 7);
mbed_official 462:e03396e14338 198 }
mbed_official 462:e03396e14338 199
mbed_official 462:e03396e14338 200 void serial_format(serial_t *obj, int data_bits, SerialParity parity, int stop_bits) {
mbed_official 462:e03396e14338 201 MBED_ASSERT((stop_bits == 1) || (stop_bits == 2)); // 0: 1 stop bits, 1: 2 stop bits
mbed_official 462:e03396e14338 202 MBED_ASSERT((data_bits > 4) && (data_bits < 9)); // 0: 5 data bits ... 3: 8 data bits
mbed_official 462:e03396e14338 203 MBED_ASSERT((parity == ParityNone) || (parity == ParityOdd) || (parity == ParityEven) ||
mbed_official 462:e03396e14338 204 (parity == ParityForced1) || (parity == ParityForced0));
mbed_official 462:e03396e14338 205
mbed_official 462:e03396e14338 206 stop_bits -= 1;
mbed_official 462:e03396e14338 207 data_bits -= 5;
mbed_official 462:e03396e14338 208
mbed_official 462:e03396e14338 209 int parity_enable, parity_select;
mbed_official 462:e03396e14338 210 switch (parity) {
mbed_official 462:e03396e14338 211 case ParityNone: parity_enable = 0; parity_select = 0; break;
mbed_official 462:e03396e14338 212 case ParityOdd : parity_enable = 1; parity_select = 0; break;
mbed_official 462:e03396e14338 213 case ParityEven: parity_enable = 1; parity_select = 1; break;
mbed_official 462:e03396e14338 214 case ParityForced1: parity_enable = 1; parity_select = 2; break;
mbed_official 462:e03396e14338 215 case ParityForced0: parity_enable = 1; parity_select = 3; break;
mbed_official 462:e03396e14338 216 default:
mbed_official 462:e03396e14338 217 break;
mbed_official 462:e03396e14338 218 }
mbed_official 462:e03396e14338 219
mbed_official 462:e03396e14338 220 obj->uart->LCR = data_bits << 0
mbed_official 462:e03396e14338 221 | stop_bits << 2
mbed_official 462:e03396e14338 222 | parity_enable << 3
mbed_official 462:e03396e14338 223 | parity_select << 4;
mbed_official 462:e03396e14338 224 }
mbed_official 462:e03396e14338 225
mbed_official 462:e03396e14338 226 /******************************************************************************
mbed_official 462:e03396e14338 227 * INTERRUPTS HANDLING
mbed_official 462:e03396e14338 228 ******************************************************************************/
mbed_official 462:e03396e14338 229 static inline void uart_irq(uint32_t iir, uint32_t index) {
mbed_official 462:e03396e14338 230 // [Chapter 14] LPC17xx UART0/2/3: UARTn Interrupt Handling
mbed_official 462:e03396e14338 231 SerialIrq irq_type;
mbed_official 462:e03396e14338 232 switch (iir) {
mbed_official 462:e03396e14338 233 case 1: irq_type = TxIrq; break;
mbed_official 462:e03396e14338 234 case 2: irq_type = RxIrq; break;
mbed_official 462:e03396e14338 235 default: return;
mbed_official 462:e03396e14338 236 }
mbed_official 462:e03396e14338 237
mbed_official 462:e03396e14338 238 if (serial_irq_ids[index] != 0)
mbed_official 462:e03396e14338 239 irq_handler(serial_irq_ids[index], irq_type);
mbed_official 462:e03396e14338 240 }
mbed_official 462:e03396e14338 241
mbed_official 462:e03396e14338 242 void uart0_irq() {uart_irq((LPC_UART0->IIR >> 1) & 0x7, 0);}
mbed_official 462:e03396e14338 243 void uart1_irq() {uart_irq((LPC_UART1->IIR >> 1) & 0x7, 1);}
mbed_official 462:e03396e14338 244 void uart2_irq() {uart_irq((LPC_UART2->IIR >> 1) & 0x7, 2);}
mbed_official 462:e03396e14338 245 void uart3_irq() {uart_irq((LPC_UART3->IIR >> 1) & 0x7, 3);}
mbed_official 462:e03396e14338 246 void uart4_irq() {uart_irq((LPC_UART4->IIR >> 1) & 0x7, 4);}
mbed_official 462:e03396e14338 247
mbed_official 462:e03396e14338 248 void serial_irq_handler(serial_t *obj, uart_irq_handler handler, uint32_t id) {
mbed_official 462:e03396e14338 249 irq_handler = handler;
mbed_official 462:e03396e14338 250 serial_irq_ids[obj->index] = id;
mbed_official 462:e03396e14338 251 }
mbed_official 462:e03396e14338 252
mbed_official 462:e03396e14338 253 void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable) {
mbed_official 462:e03396e14338 254 IRQn_Type irq_n = (IRQn_Type)0;
mbed_official 462:e03396e14338 255 uint32_t vector = 0;
mbed_official 462:e03396e14338 256 switch ((int)obj->uart) {
mbed_official 462:e03396e14338 257 case UART_0: irq_n=UART0_IRQn; vector = (uint32_t)&uart0_irq; break;
mbed_official 462:e03396e14338 258 case UART_1: irq_n=UART1_IRQn; vector = (uint32_t)&uart1_irq; break;
mbed_official 462:e03396e14338 259 case UART_2: irq_n=UART2_IRQn; vector = (uint32_t)&uart2_irq; break;
mbed_official 462:e03396e14338 260 case UART_3: irq_n=UART3_IRQn; vector = (uint32_t)&uart3_irq; break;
mbed_official 462:e03396e14338 261 case UART_4: irq_n=UART4_IRQn; vector = (uint32_t)&uart4_irq; break;
mbed_official 462:e03396e14338 262 }
mbed_official 462:e03396e14338 263
mbed_official 462:e03396e14338 264 if (enable) {
mbed_official 462:e03396e14338 265 obj->uart->IER |= 1 << irq;
mbed_official 462:e03396e14338 266 NVIC_SetVector(irq_n, vector);
mbed_official 462:e03396e14338 267 NVIC_EnableIRQ(irq_n);
mbed_official 462:e03396e14338 268 } else { // disable
mbed_official 462:e03396e14338 269 int all_disabled = 0;
mbed_official 462:e03396e14338 270 SerialIrq other_irq = (irq == RxIrq) ? (TxIrq) : (RxIrq);
mbed_official 462:e03396e14338 271 obj->uart->IER &= ~(1 << irq);
mbed_official 462:e03396e14338 272 all_disabled = (obj->uart->IER & (1 << other_irq)) == 0;
mbed_official 462:e03396e14338 273 if (all_disabled)
mbed_official 462:e03396e14338 274 NVIC_DisableIRQ(irq_n);
mbed_official 462:e03396e14338 275 }
mbed_official 462:e03396e14338 276 }
mbed_official 462:e03396e14338 277
mbed_official 462:e03396e14338 278 /******************************************************************************
mbed_official 462:e03396e14338 279 * READ/WRITE
mbed_official 462:e03396e14338 280 ******************************************************************************/
mbed_official 462:e03396e14338 281 int serial_getc(serial_t *obj) {
mbed_official 462:e03396e14338 282 while (!serial_readable(obj));
mbed_official 462:e03396e14338 283 return obj->uart->RBR;
mbed_official 462:e03396e14338 284 }
mbed_official 462:e03396e14338 285
mbed_official 462:e03396e14338 286 void serial_putc(serial_t *obj, int c) {
mbed_official 462:e03396e14338 287 while (!serial_writable(obj));
mbed_official 462:e03396e14338 288 obj->uart->THR = c;
mbed_official 462:e03396e14338 289 }
mbed_official 462:e03396e14338 290
mbed_official 462:e03396e14338 291 int serial_readable(serial_t *obj) {
mbed_official 462:e03396e14338 292 return obj->uart->LSR & 0x01;
mbed_official 462:e03396e14338 293 }
mbed_official 462:e03396e14338 294
mbed_official 462:e03396e14338 295 int serial_writable(serial_t *obj) {
mbed_official 462:e03396e14338 296 return obj->uart->LSR & 0x20;
mbed_official 462:e03396e14338 297 }
mbed_official 462:e03396e14338 298
mbed_official 462:e03396e14338 299 void serial_clear(serial_t *obj) {
mbed_official 462:e03396e14338 300 obj->uart->FCR = 1 << 0 // FIFO Enable - 0 = Disables, 1 = Enabled
mbed_official 462:e03396e14338 301 | 1 << 1 // rx FIFO reset
mbed_official 462:e03396e14338 302 | 1 << 2 // tx FIFO reset
mbed_official 462:e03396e14338 303 | 0 << 6; // interrupt depth
mbed_official 462:e03396e14338 304 }
mbed_official 462:e03396e14338 305
mbed_official 462:e03396e14338 306 void serial_pinout_tx(PinName tx) {
mbed_official 462:e03396e14338 307 pinmap_pinout(tx, PinMap_UART_TX);
mbed_official 462:e03396e14338 308 }
mbed_official 462:e03396e14338 309
mbed_official 462:e03396e14338 310 void serial_break_set(serial_t *obj) {
mbed_official 462:e03396e14338 311 obj->uart->LCR |= (1 << 6);
mbed_official 462:e03396e14338 312 }
mbed_official 462:e03396e14338 313
mbed_official 462:e03396e14338 314 void serial_break_clear(serial_t *obj) {
mbed_official 462:e03396e14338 315 obj->uart->LCR &= ~(1 << 6);
mbed_official 462:e03396e14338 316 }
mbed_official 462:e03396e14338 317