mbed SDK library sources

Fork of mbed-src by mbed official

Development branch of the mbed library sources. This library is kept in synch with the latest changes from the mbed SDK and it is not guaranteed to work.

If you are looking for a stable and tested release, please import one of the official mbed library releases:

Import librarymbed

The official Mbed 2 C/C++ SDK provides the software platform and libraries to build your applications.

Committer:
mbed_official
Date:
Wed Sep 25 11:30:05 2013 +0100
Revision:
31:42176bc3c368
Child:
33:e214068ab66c
Synchronized with git revision f580c008b139a952d38ac5c7c53bbae375739c67

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 31:42176bc3c368 1 /* mbed Microcontroller Library
mbed_official 31:42176bc3c368 2 * Copyright (c) 2006-2013 ARM Limited
mbed_official 31:42176bc3c368 3 *
mbed_official 31:42176bc3c368 4 * Licensed under the Apache License, Version 2.0 (the "License");
mbed_official 31:42176bc3c368 5 * you may not use this file except in compliance with the License.
mbed_official 31:42176bc3c368 6 * You may obtain a copy of the License at
mbed_official 31:42176bc3c368 7 *
mbed_official 31:42176bc3c368 8 * http://www.apache.org/licenses/LICENSE-2.0
mbed_official 31:42176bc3c368 9 *
mbed_official 31:42176bc3c368 10 * Unless required by applicable law or agreed to in writing, software
mbed_official 31:42176bc3c368 11 * distributed under the License is distributed on an "AS IS" BASIS,
mbed_official 31:42176bc3c368 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
mbed_official 31:42176bc3c368 13 * See the License for the specific language governing permissions and
mbed_official 31:42176bc3c368 14 * limitations under the License.
mbed_official 31:42176bc3c368 15 */
mbed_official 31:42176bc3c368 16 #include "serial_api.h"
mbed_official 31:42176bc3c368 17
mbed_official 31:42176bc3c368 18 // math.h required for floating point operations for baud rate calculation
mbed_official 31:42176bc3c368 19 #include <math.h>
mbed_official 31:42176bc3c368 20
mbed_official 31:42176bc3c368 21 #include <string.h>
mbed_official 31:42176bc3c368 22
mbed_official 31:42176bc3c368 23 #include "cmsis.h"
mbed_official 31:42176bc3c368 24 #include "pinmap.h"
mbed_official 31:42176bc3c368 25 #include "error.h"
mbed_official 31:42176bc3c368 26
mbed_official 31:42176bc3c368 27 /******************************************************************************
mbed_official 31:42176bc3c368 28 * INITIALIZATION
mbed_official 31:42176bc3c368 29 ******************************************************************************/
mbed_official 31:42176bc3c368 30 static const PinMap PinMap_UART_TX[] = {
mbed_official 31:42176bc3c368 31 {PTC4, UART_1, 3},
mbed_official 31:42176bc3c368 32 {PTA2, UART_0, 2},
mbed_official 31:42176bc3c368 33 {PTD5, UART_2, 3},
mbed_official 31:42176bc3c368 34 {PTD3, UART_2, 3},
mbed_official 31:42176bc3c368 35 {PTD7, UART_0, 3},
mbed_official 31:42176bc3c368 36 {PTE20, UART_0, 4},
mbed_official 31:42176bc3c368 37 {PTE22, UART_2, 4},
mbed_official 31:42176bc3c368 38 {PTE0, UART_1, 3},
mbed_official 31:42176bc3c368 39 {NC , NC , 0}
mbed_official 31:42176bc3c368 40 };
mbed_official 31:42176bc3c368 41
mbed_official 31:42176bc3c368 42 static const PinMap PinMap_UART_RX[] = {
mbed_official 31:42176bc3c368 43 {PTC3, UART_1, 3},
mbed_official 31:42176bc3c368 44 {PTA1, UART_0, 2},
mbed_official 31:42176bc3c368 45 {PTD4, UART_2, 3},
mbed_official 31:42176bc3c368 46 {PTD2, UART_2, 3},
mbed_official 31:42176bc3c368 47 {PTD6, UART_0, 3},
mbed_official 31:42176bc3c368 48 {PTE23, UART_2, 4},
mbed_official 31:42176bc3c368 49 {PTE21, UART_0, 4},
mbed_official 31:42176bc3c368 50 {PTE1, UART_1, 3},
mbed_official 31:42176bc3c368 51 {NC , NC , 0}
mbed_official 31:42176bc3c368 52 };
mbed_official 31:42176bc3c368 53
mbed_official 31:42176bc3c368 54 #define UART_NUM 3
mbed_official 31:42176bc3c368 55 static uint32_t serial_irq_ids[UART_NUM] = {0};
mbed_official 31:42176bc3c368 56 static uart_irq_handler irq_handler;
mbed_official 31:42176bc3c368 57
mbed_official 31:42176bc3c368 58 int stdio_uart_inited = 0;
mbed_official 31:42176bc3c368 59 serial_t stdio_uart;
mbed_official 31:42176bc3c368 60
mbed_official 31:42176bc3c368 61 void serial_init(serial_t *obj, PinName tx, PinName rx) {
mbed_official 31:42176bc3c368 62 // determine the UART to use
mbed_official 31:42176bc3c368 63 UARTName uart_tx = (UARTName)pinmap_peripheral(tx, PinMap_UART_TX);
mbed_official 31:42176bc3c368 64 UARTName uart_rx = (UARTName)pinmap_peripheral(rx, PinMap_UART_RX);
mbed_official 31:42176bc3c368 65 UARTName uart = (UARTName)pinmap_merge(uart_tx, uart_rx);
mbed_official 31:42176bc3c368 66 if ((int)uart == NC) {
mbed_official 31:42176bc3c368 67 error("Serial pinout mapping failed");
mbed_official 31:42176bc3c368 68 }
mbed_official 31:42176bc3c368 69
mbed_official 31:42176bc3c368 70 obj->uart = (UARTLP_Type *)uart;
mbed_official 31:42176bc3c368 71 // enable clk
mbed_official 31:42176bc3c368 72 switch (uart) {
mbed_official 31:42176bc3c368 73 case UART_0: SIM->SOPT2 |= SIM_SOPT2_PLLFLLSEL_MASK | (1<<SIM_SOPT2_UART0SRC_SHIFT);
mbed_official 31:42176bc3c368 74 SIM->SCGC5 |= SIM_SCGC5_PORTA_MASK; SIM->SCGC4 |= SIM_SCGC4_UART0_MASK; break;
mbed_official 31:42176bc3c368 75 case UART_1: SIM->SCGC5 |= SIM_SCGC5_PORTC_MASK; SIM->SCGC4 |= SIM_SCGC4_UART1_MASK; break;
mbed_official 31:42176bc3c368 76 case UART_2: SIM->SCGC5 |= SIM_SCGC5_PORTD_MASK; SIM->SCGC4 |= SIM_SCGC4_UART2_MASK; break;
mbed_official 31:42176bc3c368 77 }
mbed_official 31:42176bc3c368 78 // Disable UART before changing registers
mbed_official 31:42176bc3c368 79 obj->uart->C2 &= ~(UART_C2_RE_MASK | UART_C2_TE_MASK);
mbed_official 31:42176bc3c368 80
mbed_official 31:42176bc3c368 81 switch (uart) {
mbed_official 31:42176bc3c368 82 case UART_0: obj->index = 0; break;
mbed_official 31:42176bc3c368 83 case UART_1: obj->index = 1; break;
mbed_official 31:42176bc3c368 84 case UART_2: obj->index = 2; break;
mbed_official 31:42176bc3c368 85 }
mbed_official 31:42176bc3c368 86
mbed_official 31:42176bc3c368 87 // set default baud rate and format
mbed_official 31:42176bc3c368 88 serial_baud (obj, 9600);
mbed_official 31:42176bc3c368 89 serial_format(obj, 8, ParityNone, 1);
mbed_official 31:42176bc3c368 90
mbed_official 31:42176bc3c368 91 // pinout the chosen uart
mbed_official 31:42176bc3c368 92 pinmap_pinout(tx, PinMap_UART_TX);
mbed_official 31:42176bc3c368 93 pinmap_pinout(rx, PinMap_UART_RX);
mbed_official 31:42176bc3c368 94
mbed_official 31:42176bc3c368 95 // set rx/tx pins in PullUp mode
mbed_official 31:42176bc3c368 96 pin_mode(tx, PullUp);
mbed_official 31:42176bc3c368 97 pin_mode(rx, PullUp);
mbed_official 31:42176bc3c368 98
mbed_official 31:42176bc3c368 99 obj->uart->C2 |= (UART_C2_RE_MASK | UART_C2_TE_MASK);
mbed_official 31:42176bc3c368 100
mbed_official 31:42176bc3c368 101 if (uart == STDIO_UART) {
mbed_official 31:42176bc3c368 102 stdio_uart_inited = 1;
mbed_official 31:42176bc3c368 103 memcpy(&stdio_uart, obj, sizeof(serial_t));
mbed_official 31:42176bc3c368 104 }
mbed_official 31:42176bc3c368 105 }
mbed_official 31:42176bc3c368 106
mbed_official 31:42176bc3c368 107 void serial_free(serial_t *obj) {
mbed_official 31:42176bc3c368 108 serial_irq_ids[obj->index] = 0;
mbed_official 31:42176bc3c368 109 }
mbed_official 31:42176bc3c368 110
mbed_official 31:42176bc3c368 111 // serial_baud
mbed_official 31:42176bc3c368 112 //
mbed_official 31:42176bc3c368 113 // set the baud rate, taking in to account the current SystemFrequency
mbed_official 31:42176bc3c368 114 //
mbed_official 31:42176bc3c368 115 // The LPC2300 and LPC1700 have a divider and a fractional divider to control the
mbed_official 31:42176bc3c368 116 // baud rate. The formula is:
mbed_official 31:42176bc3c368 117 //
mbed_official 31:42176bc3c368 118 // Baudrate = (1 / PCLK) * 16 * DL * (1 + DivAddVal / MulVal)
mbed_official 31:42176bc3c368 119 // where:
mbed_official 31:42176bc3c368 120 // 1 < MulVal <= 15
mbed_official 31:42176bc3c368 121 // 0 <= DivAddVal < 14
mbed_official 31:42176bc3c368 122 // DivAddVal < MulVal
mbed_official 31:42176bc3c368 123 //
mbed_official 31:42176bc3c368 124 void serial_baud(serial_t *obj, int baudrate) {
mbed_official 31:42176bc3c368 125
mbed_official 31:42176bc3c368 126 // save C2 state
mbed_official 31:42176bc3c368 127 uint8_t c2_state = (obj->uart->C2 & (UART_C2_RE_MASK | UART_C2_TE_MASK));
mbed_official 31:42176bc3c368 128
mbed_official 31:42176bc3c368 129 // Disable UART before changing registers
mbed_official 31:42176bc3c368 130 obj->uart->C2 &= ~(UART_C2_RE_MASK | UART_C2_TE_MASK);
mbed_official 31:42176bc3c368 131
mbed_official 31:42176bc3c368 132 // [TODO] not hardcode this value
mbed_official 31:42176bc3c368 133 uint32_t PCLK = (obj->uart == UART0) ? 48000000u : 24000000u;
mbed_official 31:42176bc3c368 134
mbed_official 31:42176bc3c368 135 // First we check to see if the basic divide with no DivAddVal/MulVal
mbed_official 31:42176bc3c368 136 // ratio gives us an integer result. If it does, we set DivAddVal = 0,
mbed_official 31:42176bc3c368 137 // MulVal = 1. Otherwise, we search the valid ratio value range to find
mbed_official 31:42176bc3c368 138 // the closest match. This could be more elegant, using search methods
mbed_official 31:42176bc3c368 139 // and/or lookup tables, but the brute force method is not that much
mbed_official 31:42176bc3c368 140 // slower, and is more maintainable.
mbed_official 31:42176bc3c368 141 uint16_t DL = PCLK / (16 * baudrate);
mbed_official 31:42176bc3c368 142
mbed_official 31:42176bc3c368 143 // set BDH and BDL
mbed_official 31:42176bc3c368 144 obj->uart->BDH = (obj->uart->BDH & ~(0x1f)) | ((DL >> 8) & 0x1f);
mbed_official 31:42176bc3c368 145 obj->uart->BDL = (obj->uart->BDL & ~(0xff)) | ((DL >> 0) & 0xff);
mbed_official 31:42176bc3c368 146
mbed_official 31:42176bc3c368 147 // restore C2 state
mbed_official 31:42176bc3c368 148 obj->uart->C2 |= c2_state;
mbed_official 31:42176bc3c368 149 }
mbed_official 31:42176bc3c368 150
mbed_official 31:42176bc3c368 151 void serial_format(serial_t *obj, int data_bits, SerialParity parity, int stop_bits) {
mbed_official 31:42176bc3c368 152 uint8_t m10 = 0;
mbed_official 31:42176bc3c368 153
mbed_official 31:42176bc3c368 154 // save C2 state
mbed_official 31:42176bc3c368 155 uint8_t c2_state = (obj->uart->C2 & (UART_C2_RE_MASK | UART_C2_TE_MASK));
mbed_official 31:42176bc3c368 156
mbed_official 31:42176bc3c368 157 // Disable UART before changing registers
mbed_official 31:42176bc3c368 158 obj->uart->C2 &= ~(UART_C2_RE_MASK | UART_C2_TE_MASK);
mbed_official 31:42176bc3c368 159
mbed_official 31:42176bc3c368 160 // 8 data bits = 0 ... 9 data bits = 1
mbed_official 31:42176bc3c368 161 if ((data_bits < 8) || (data_bits > 9)) {
mbed_official 31:42176bc3c368 162 error("Invalid number of bits (%d) in serial format, should be 8..9\r\n", data_bits);
mbed_official 31:42176bc3c368 163 }
mbed_official 31:42176bc3c368 164 data_bits -= 8;
mbed_official 31:42176bc3c368 165
mbed_official 31:42176bc3c368 166 uint8_t parity_enable, parity_select;
mbed_official 31:42176bc3c368 167 switch (parity) {
mbed_official 31:42176bc3c368 168 case ParityNone: parity_enable = 0; parity_select = 0; break;
mbed_official 31:42176bc3c368 169 case ParityOdd : parity_enable = 1; parity_select = 1; data_bits++; break;
mbed_official 31:42176bc3c368 170 case ParityEven: parity_enable = 1; parity_select = 0; data_bits++; break;
mbed_official 31:42176bc3c368 171 default:
mbed_official 31:42176bc3c368 172 error("Invalid serial parity setting\r\n");
mbed_official 31:42176bc3c368 173 return;
mbed_official 31:42176bc3c368 174 }
mbed_official 31:42176bc3c368 175
mbed_official 31:42176bc3c368 176 // 1 stop bits = 0, 2 stop bits = 1
mbed_official 31:42176bc3c368 177 if ((stop_bits != 1) && (stop_bits != 2)) {
mbed_official 31:42176bc3c368 178 error("Invalid stop bits specified\r\n");
mbed_official 31:42176bc3c368 179 }
mbed_official 31:42176bc3c368 180 stop_bits -= 1;
mbed_official 31:42176bc3c368 181
mbed_official 31:42176bc3c368 182 // 9 data bits + parity
mbed_official 31:42176bc3c368 183 if (data_bits == 2) {
mbed_official 31:42176bc3c368 184 // only uart0 supports 10 bit communication
mbed_official 31:42176bc3c368 185 if (obj->index != 0) {
mbed_official 31:42176bc3c368 186 error("Invalid number of bits (9) to be used with parity\r\n");
mbed_official 31:42176bc3c368 187 }
mbed_official 31:42176bc3c368 188 data_bits = 0;
mbed_official 31:42176bc3c368 189 m10 = 1;
mbed_official 31:42176bc3c368 190 }
mbed_official 31:42176bc3c368 191
mbed_official 31:42176bc3c368 192 // data bits, parity and parity mode
mbed_official 31:42176bc3c368 193 obj->uart->C1 = ((data_bits << 4)
mbed_official 31:42176bc3c368 194 | (parity_enable << 1)
mbed_official 31:42176bc3c368 195 | (parity_select << 0));
mbed_official 31:42176bc3c368 196
mbed_official 31:42176bc3c368 197 // enable 10bit mode if needed
mbed_official 31:42176bc3c368 198 if (obj->index == 0) {
mbed_official 31:42176bc3c368 199 obj->uart->C4 &= ~UARTLP_C4_M10_MASK;
mbed_official 31:42176bc3c368 200 obj->uart->C4 |= (m10 << UARTLP_C4_M10_SHIFT);
mbed_official 31:42176bc3c368 201 }
mbed_official 31:42176bc3c368 202
mbed_official 31:42176bc3c368 203 // stop bits
mbed_official 31:42176bc3c368 204 obj->uart->BDH &= ~UART_BDH_SBNS_MASK;
mbed_official 31:42176bc3c368 205 obj->uart->BDH |= (stop_bits << UART_BDH_SBNS_SHIFT);
mbed_official 31:42176bc3c368 206
mbed_official 31:42176bc3c368 207 // restore C2 state
mbed_official 31:42176bc3c368 208 obj->uart->C2 |= c2_state;
mbed_official 31:42176bc3c368 209 }
mbed_official 31:42176bc3c368 210
mbed_official 31:42176bc3c368 211 /******************************************************************************
mbed_official 31:42176bc3c368 212 * INTERRUPTS HANDLING
mbed_official 31:42176bc3c368 213 ******************************************************************************/
mbed_official 31:42176bc3c368 214 static inline void uart_irq(uint8_t status, uint32_t index) {
mbed_official 31:42176bc3c368 215 if (serial_irq_ids[index] != 0) {
mbed_official 31:42176bc3c368 216 if (status & UART_S1_TDRE_MASK)
mbed_official 31:42176bc3c368 217 irq_handler(serial_irq_ids[index], TxIrq);
mbed_official 31:42176bc3c368 218
mbed_official 31:42176bc3c368 219 if (status & UART_S1_RDRF_MASK)
mbed_official 31:42176bc3c368 220 irq_handler(serial_irq_ids[index], RxIrq);
mbed_official 31:42176bc3c368 221 }
mbed_official 31:42176bc3c368 222 }
mbed_official 31:42176bc3c368 223
mbed_official 31:42176bc3c368 224 void uart0_irq() {
mbed_official 31:42176bc3c368 225 uart_irq(UART0->S1, 0);
mbed_official 31:42176bc3c368 226 if (UART0->S1 & UART_S1_OR_MASK)
mbed_official 31:42176bc3c368 227 UART0->S1 |= UART_S1_OR_MASK;
mbed_official 31:42176bc3c368 228 }
mbed_official 31:42176bc3c368 229 void uart1_irq() {uart_irq(UART1->S1, 1);}
mbed_official 31:42176bc3c368 230 void uart2_irq() {uart_irq(UART2->S1, 2);}
mbed_official 31:42176bc3c368 231
mbed_official 31:42176bc3c368 232 void serial_irq_handler(serial_t *obj, uart_irq_handler handler, uint32_t id) {
mbed_official 31:42176bc3c368 233 irq_handler = handler;
mbed_official 31:42176bc3c368 234 serial_irq_ids[obj->index] = id;
mbed_official 31:42176bc3c368 235 }
mbed_official 31:42176bc3c368 236
mbed_official 31:42176bc3c368 237 void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable) {
mbed_official 31:42176bc3c368 238 IRQn_Type irq_n = (IRQn_Type)0;
mbed_official 31:42176bc3c368 239 uint32_t vector = 0;
mbed_official 31:42176bc3c368 240 switch ((int)obj->uart) {
mbed_official 31:42176bc3c368 241 case UART_0: irq_n=UART0_IRQn; vector = (uint32_t)&uart0_irq; break;
mbed_official 31:42176bc3c368 242 case UART_1: irq_n=UART1_IRQn; vector = (uint32_t)&uart1_irq; break;
mbed_official 31:42176bc3c368 243 case UART_2: irq_n=UART2_IRQn; vector = (uint32_t)&uart2_irq; break;
mbed_official 31:42176bc3c368 244 }
mbed_official 31:42176bc3c368 245
mbed_official 31:42176bc3c368 246 if (enable) {
mbed_official 31:42176bc3c368 247 switch (irq) {
mbed_official 31:42176bc3c368 248 case RxIrq: obj->uart->C2 |= (UART_C2_RIE_MASK); break;
mbed_official 31:42176bc3c368 249 case TxIrq: obj->uart->C2 |= (UART_C2_TIE_MASK); break;
mbed_official 31:42176bc3c368 250 }
mbed_official 31:42176bc3c368 251 NVIC_SetVector(irq_n, vector);
mbed_official 31:42176bc3c368 252 NVIC_EnableIRQ(irq_n);
mbed_official 31:42176bc3c368 253
mbed_official 31:42176bc3c368 254 } else { // disable
mbed_official 31:42176bc3c368 255 int all_disabled = 0;
mbed_official 31:42176bc3c368 256 SerialIrq other_irq = (irq == RxIrq) ? (TxIrq) : (RxIrq);
mbed_official 31:42176bc3c368 257 switch (irq) {
mbed_official 31:42176bc3c368 258 case RxIrq: obj->uart->C2 &= ~(UART_C2_RIE_MASK); break;
mbed_official 31:42176bc3c368 259 case TxIrq: obj->uart->C2 &= ~(UART_C2_TIE_MASK); break;
mbed_official 31:42176bc3c368 260 }
mbed_official 31:42176bc3c368 261 switch (other_irq) {
mbed_official 31:42176bc3c368 262 case RxIrq: all_disabled = (obj->uart->C2 & (UART_C2_RIE_MASK)) == 0; break;
mbed_official 31:42176bc3c368 263 case TxIrq: all_disabled = (obj->uart->C2 & (UART_C2_TIE_MASK)) == 0; break;
mbed_official 31:42176bc3c368 264 }
mbed_official 31:42176bc3c368 265 if (all_disabled)
mbed_official 31:42176bc3c368 266 NVIC_DisableIRQ(irq_n);
mbed_official 31:42176bc3c368 267 }
mbed_official 31:42176bc3c368 268 }
mbed_official 31:42176bc3c368 269
mbed_official 31:42176bc3c368 270 /******************************************************************************
mbed_official 31:42176bc3c368 271 * READ/WRITE
mbed_official 31:42176bc3c368 272 ******************************************************************************/
mbed_official 31:42176bc3c368 273 int serial_getc(serial_t *obj) {
mbed_official 31:42176bc3c368 274 while (!serial_readable(obj));
mbed_official 31:42176bc3c368 275 return obj->uart->D;
mbed_official 31:42176bc3c368 276 }
mbed_official 31:42176bc3c368 277
mbed_official 31:42176bc3c368 278 void serial_putc(serial_t *obj, int c) {
mbed_official 31:42176bc3c368 279 while (!serial_writable(obj));
mbed_official 31:42176bc3c368 280 obj->uart->D = c;
mbed_official 31:42176bc3c368 281 }
mbed_official 31:42176bc3c368 282
mbed_official 31:42176bc3c368 283 int serial_readable(serial_t *obj) {
mbed_official 31:42176bc3c368 284 // check overrun
mbed_official 31:42176bc3c368 285 if (obj->uart->S1 & UART_S1_OR_MASK) {
mbed_official 31:42176bc3c368 286 obj->uart->S1 |= UART_S1_OR_MASK;
mbed_official 31:42176bc3c368 287 }
mbed_official 31:42176bc3c368 288 return (obj->uart->S1 & UART_S1_RDRF_MASK);
mbed_official 31:42176bc3c368 289 }
mbed_official 31:42176bc3c368 290
mbed_official 31:42176bc3c368 291 int serial_writable(serial_t *obj) {
mbed_official 31:42176bc3c368 292 // check overrun
mbed_official 31:42176bc3c368 293 if (obj->uart->S1 & UART_S1_OR_MASK) {
mbed_official 31:42176bc3c368 294 obj->uart->S1 |= UART_S1_OR_MASK;
mbed_official 31:42176bc3c368 295 }
mbed_official 31:42176bc3c368 296 return (obj->uart->S1 & UART_S1_TDRE_MASK);
mbed_official 31:42176bc3c368 297 }
mbed_official 31:42176bc3c368 298
mbed_official 31:42176bc3c368 299 void serial_clear(serial_t *obj) {
mbed_official 31:42176bc3c368 300 }
mbed_official 31:42176bc3c368 301
mbed_official 31:42176bc3c368 302 void serial_pinout_tx(PinName tx) {
mbed_official 31:42176bc3c368 303 pinmap_pinout(tx, PinMap_UART_TX);
mbed_official 31:42176bc3c368 304 }
mbed_official 31:42176bc3c368 305
mbed_official 31:42176bc3c368 306 void serial_break_set(serial_t *obj) {
mbed_official 31:42176bc3c368 307 obj->uart->C2 |= UART_C2_SBK_MASK;
mbed_official 31:42176bc3c368 308 }
mbed_official 31:42176bc3c368 309
mbed_official 31:42176bc3c368 310 void serial_break_clear(serial_t *obj) {
mbed_official 31:42176bc3c368 311 obj->uart->C2 &= ~UART_C2_SBK_MASK;
mbed_official 31:42176bc3c368 312 }
mbed_official 31:42176bc3c368 313