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:
Tue Nov 05 21:45:05 2013 +0000
Revision:
44:2ce89a25b635
Parent:
33:e214068ab66c
Synchronized with git revision 887fd2ba3aa83c1c285196ff1cae1341a3e00bec

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