Bob Seque / mbed-dev

Fork of mbed-dev by mbed official

Committer:
Splith
Date:
Sat Jan 30 16:48:54 2016 +0000
Revision:
57:dd901dec6bd0
Parent:
0:9b334a45a8ff
Add USART3 pin mapping to Seeed arch max

Who changed what in which revision?

UserRevisionLine numberNew contents of line
bogdanm 0:9b334a45a8ff 1 /* mbed Microcontroller Library
bogdanm 0:9b334a45a8ff 2 *******************************************************************************
bogdanm 0:9b334a45a8ff 3 * Copyright (c) 2014, STMicroelectronics
bogdanm 0:9b334a45a8ff 4 * All rights reserved.
bogdanm 0:9b334a45a8ff 5 *
bogdanm 0:9b334a45a8ff 6 * Redistribution and use in source and binary forms, with or without
bogdanm 0:9b334a45a8ff 7 * modification, are permitted provided that the following conditions are met:
bogdanm 0:9b334a45a8ff 8 *
bogdanm 0:9b334a45a8ff 9 * 1. Redistributions of source code must retain the above copyright notice,
bogdanm 0:9b334a45a8ff 10 * this list of conditions and the following disclaimer.
bogdanm 0:9b334a45a8ff 11 * 2. Redistributions in binary form must reproduce the above copyright notice,
bogdanm 0:9b334a45a8ff 12 * this list of conditions and the following disclaimer in the documentation
bogdanm 0:9b334a45a8ff 13 * and/or other materials provided with the distribution.
bogdanm 0:9b334a45a8ff 14 * 3. Neither the name of STMicroelectronics nor the names of its contributors
bogdanm 0:9b334a45a8ff 15 * may be used to endorse or promote products derived from this software
bogdanm 0:9b334a45a8ff 16 * without specific prior written permission.
bogdanm 0:9b334a45a8ff 17 *
bogdanm 0:9b334a45a8ff 18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
bogdanm 0:9b334a45a8ff 19 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
bogdanm 0:9b334a45a8ff 20 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
bogdanm 0:9b334a45a8ff 21 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
bogdanm 0:9b334a45a8ff 22 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
bogdanm 0:9b334a45a8ff 23 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
bogdanm 0:9b334a45a8ff 24 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
bogdanm 0:9b334a45a8ff 25 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
bogdanm 0:9b334a45a8ff 26 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
bogdanm 0:9b334a45a8ff 27 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
bogdanm 0:9b334a45a8ff 28 *******************************************************************************
bogdanm 0:9b334a45a8ff 29 */
bogdanm 0:9b334a45a8ff 30 #include "mbed_assert.h"
bogdanm 0:9b334a45a8ff 31 #include "serial_api.h"
bogdanm 0:9b334a45a8ff 32 #include "cmsis.h"
bogdanm 0:9b334a45a8ff 33 #include "pinmap.h"
bogdanm 0:9b334a45a8ff 34 #include <string.h>
bogdanm 0:9b334a45a8ff 35
bogdanm 0:9b334a45a8ff 36 static const PinMap PinMap_UART_TX[] = {
bogdanm 0:9b334a45a8ff 37 {PA_2, UART_2, STM_PIN_DATA(GPIO_Mode_AF, GPIO_OType_PP, GPIO_PuPd_UP, GPIO_AF_7)},
bogdanm 0:9b334a45a8ff 38 {PA_9, UART_1, STM_PIN_DATA(GPIO_Mode_AF, GPIO_OType_PP, GPIO_PuPd_UP, GPIO_AF_7)},
bogdanm 0:9b334a45a8ff 39 {PA_14, UART_2, STM_PIN_DATA(GPIO_Mode_AF, GPIO_OType_PP, GPIO_PuPd_UP, GPIO_AF_7)},
bogdanm 0:9b334a45a8ff 40 {PB_3, UART_2, STM_PIN_DATA(GPIO_Mode_AF, GPIO_OType_PP, GPIO_PuPd_UP, GPIO_AF_7)},
bogdanm 0:9b334a45a8ff 41 {PB_6, UART_1, STM_PIN_DATA(GPIO_Mode_AF, GPIO_OType_PP, GPIO_PuPd_UP, GPIO_AF_7)},
bogdanm 0:9b334a45a8ff 42 {PB_9, UART_3, STM_PIN_DATA(GPIO_Mode_AF, GPIO_OType_PP, GPIO_PuPd_UP, GPIO_AF_7)},
bogdanm 0:9b334a45a8ff 43 {PB_10, UART_3, STM_PIN_DATA(GPIO_Mode_AF, GPIO_OType_PP, GPIO_PuPd_UP, GPIO_AF_7)},
bogdanm 0:9b334a45a8ff 44 {PC_4, UART_1, STM_PIN_DATA(GPIO_Mode_AF, GPIO_OType_PP, GPIO_PuPd_UP, GPIO_AF_7)},
bogdanm 0:9b334a45a8ff 45 {PC_10, UART_3, STM_PIN_DATA(GPIO_Mode_AF, GPIO_OType_PP, GPIO_PuPd_UP, GPIO_AF_7)},
bogdanm 0:9b334a45a8ff 46 {NC, NC, 0}
bogdanm 0:9b334a45a8ff 47 };
bogdanm 0:9b334a45a8ff 48
bogdanm 0:9b334a45a8ff 49 static const PinMap PinMap_UART_RX[] = {
bogdanm 0:9b334a45a8ff 50 {PA_3, UART_2, STM_PIN_DATA(GPIO_Mode_AF, GPIO_OType_PP, GPIO_PuPd_UP, GPIO_AF_7)},
bogdanm 0:9b334a45a8ff 51 {PA_10, UART_1, STM_PIN_DATA(GPIO_Mode_AF, GPIO_OType_PP, GPIO_PuPd_UP, GPIO_AF_7)},
bogdanm 0:9b334a45a8ff 52 {PA_15, UART_2, STM_PIN_DATA(GPIO_Mode_AF, GPIO_OType_PP, GPIO_PuPd_UP, GPIO_AF_7)},
bogdanm 0:9b334a45a8ff 53 {PB_4, UART_2, STM_PIN_DATA(GPIO_Mode_AF, GPIO_OType_PP, GPIO_PuPd_UP, GPIO_AF_7)},
bogdanm 0:9b334a45a8ff 54 {PB_7, UART_1, STM_PIN_DATA(GPIO_Mode_AF, GPIO_OType_PP, GPIO_PuPd_UP, GPIO_AF_7)},
bogdanm 0:9b334a45a8ff 55 {PB_8, UART_3, STM_PIN_DATA(GPIO_Mode_AF, GPIO_OType_PP, GPIO_PuPd_UP, GPIO_AF_7)},
bogdanm 0:9b334a45a8ff 56 {PB_11, UART_3, STM_PIN_DATA(GPIO_Mode_AF, GPIO_OType_PP, GPIO_PuPd_UP, GPIO_AF_7)},
bogdanm 0:9b334a45a8ff 57 {PC_5, UART_1, STM_PIN_DATA(GPIO_Mode_AF, GPIO_OType_PP, GPIO_PuPd_UP, GPIO_AF_7)},
bogdanm 0:9b334a45a8ff 58 {PC_11, UART_3, STM_PIN_DATA(GPIO_Mode_AF, GPIO_OType_PP, GPIO_PuPd_UP, GPIO_AF_7)},
bogdanm 0:9b334a45a8ff 59 {NC, NC, 0}
bogdanm 0:9b334a45a8ff 60 };
bogdanm 0:9b334a45a8ff 61
bogdanm 0:9b334a45a8ff 62 #define UART_NUM (2)
bogdanm 0:9b334a45a8ff 63
bogdanm 0:9b334a45a8ff 64 static uint32_t serial_irq_ids[UART_NUM] = {0};
bogdanm 0:9b334a45a8ff 65
bogdanm 0:9b334a45a8ff 66 static uart_irq_handler irq_handler;
bogdanm 0:9b334a45a8ff 67
bogdanm 0:9b334a45a8ff 68 int stdio_uart_inited = 0;
bogdanm 0:9b334a45a8ff 69 serial_t stdio_uart;
bogdanm 0:9b334a45a8ff 70
bogdanm 0:9b334a45a8ff 71 static void init_usart(serial_t *obj) {
bogdanm 0:9b334a45a8ff 72 USART_TypeDef *usart = (USART_TypeDef *)(obj->uart);
bogdanm 0:9b334a45a8ff 73 USART_InitTypeDef USART_InitStructure;
bogdanm 0:9b334a45a8ff 74
bogdanm 0:9b334a45a8ff 75 USART_Cmd(usart, DISABLE);
bogdanm 0:9b334a45a8ff 76
bogdanm 0:9b334a45a8ff 77 USART_InitStructure.USART_BaudRate = obj->baudrate;
bogdanm 0:9b334a45a8ff 78 USART_InitStructure.USART_WordLength = obj->databits;
bogdanm 0:9b334a45a8ff 79 USART_InitStructure.USART_StopBits = obj->stopbits;
bogdanm 0:9b334a45a8ff 80 USART_InitStructure.USART_Parity = obj->parity;
bogdanm 0:9b334a45a8ff 81 USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
bogdanm 0:9b334a45a8ff 82 USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
bogdanm 0:9b334a45a8ff 83 USART_Init(usart, &USART_InitStructure);
bogdanm 0:9b334a45a8ff 84
bogdanm 0:9b334a45a8ff 85 USART_Cmd(usart, ENABLE);
bogdanm 0:9b334a45a8ff 86 }
bogdanm 0:9b334a45a8ff 87
bogdanm 0:9b334a45a8ff 88 void serial_init(serial_t *obj, PinName tx, PinName rx) {
bogdanm 0:9b334a45a8ff 89 // Determine the UART to use
bogdanm 0:9b334a45a8ff 90 UARTName uart_tx = (UARTName)pinmap_peripheral(tx, PinMap_UART_TX);
bogdanm 0:9b334a45a8ff 91 UARTName uart_rx = (UARTName)pinmap_peripheral(rx, PinMap_UART_RX);
bogdanm 0:9b334a45a8ff 92
bogdanm 0:9b334a45a8ff 93 // Get the peripheral name from the pin and assign it to the object
bogdanm 0:9b334a45a8ff 94 obj->uart = (UARTName)pinmap_merge(uart_tx, uart_rx);
bogdanm 0:9b334a45a8ff 95 MBED_ASSERT(obj->uart != (UARTName)NC);
bogdanm 0:9b334a45a8ff 96
bogdanm 0:9b334a45a8ff 97 // Enable USART clock
bogdanm 0:9b334a45a8ff 98 if (obj->uart == UART_1) {
bogdanm 0:9b334a45a8ff 99 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
bogdanm 0:9b334a45a8ff 100 }
bogdanm 0:9b334a45a8ff 101 if (obj->uart == UART_2) {
bogdanm 0:9b334a45a8ff 102 RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
bogdanm 0:9b334a45a8ff 103 }
bogdanm 0:9b334a45a8ff 104 if (obj->uart == UART_3) {
bogdanm 0:9b334a45a8ff 105 RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
bogdanm 0:9b334a45a8ff 106 }
bogdanm 0:9b334a45a8ff 107
bogdanm 0:9b334a45a8ff 108 // Configure the UART pins
bogdanm 0:9b334a45a8ff 109 pinmap_pinout(tx, PinMap_UART_TX);
bogdanm 0:9b334a45a8ff 110 pinmap_pinout(rx, PinMap_UART_RX);
bogdanm 0:9b334a45a8ff 111 if (tx != NC) {
bogdanm 0:9b334a45a8ff 112 pin_mode(tx, PullUp);
bogdanm 0:9b334a45a8ff 113 }
bogdanm 0:9b334a45a8ff 114 if (rx != NC) {
bogdanm 0:9b334a45a8ff 115 pin_mode(rx, PullUp);
bogdanm 0:9b334a45a8ff 116 }
bogdanm 0:9b334a45a8ff 117
bogdanm 0:9b334a45a8ff 118 // Configure UART
bogdanm 0:9b334a45a8ff 119 obj->baudrate = 9600;
bogdanm 0:9b334a45a8ff 120 obj->databits = USART_WordLength_8b;
bogdanm 0:9b334a45a8ff 121 obj->stopbits = USART_StopBits_1;
bogdanm 0:9b334a45a8ff 122 obj->parity = USART_Parity_No;
bogdanm 0:9b334a45a8ff 123
bogdanm 0:9b334a45a8ff 124 init_usart(obj);
bogdanm 0:9b334a45a8ff 125
bogdanm 0:9b334a45a8ff 126 // The index is used by irq
bogdanm 0:9b334a45a8ff 127 if (obj->uart == UART_1) obj->index = 0;
bogdanm 0:9b334a45a8ff 128 if (obj->uart == UART_2) obj->index = 1;
bogdanm 0:9b334a45a8ff 129 if (obj->uart == UART_3) obj->index = 2;
bogdanm 0:9b334a45a8ff 130
bogdanm 0:9b334a45a8ff 131 // For stdio management
bogdanm 0:9b334a45a8ff 132 if (obj->uart == STDIO_UART) {
bogdanm 0:9b334a45a8ff 133 stdio_uart_inited = 1;
bogdanm 0:9b334a45a8ff 134 memcpy(&stdio_uart, obj, sizeof(serial_t));
bogdanm 0:9b334a45a8ff 135 }
bogdanm 0:9b334a45a8ff 136
bogdanm 0:9b334a45a8ff 137 }
bogdanm 0:9b334a45a8ff 138
bogdanm 0:9b334a45a8ff 139 void serial_free(serial_t *obj) {
bogdanm 0:9b334a45a8ff 140 serial_irq_ids[obj->index] = 0;
bogdanm 0:9b334a45a8ff 141 }
bogdanm 0:9b334a45a8ff 142
bogdanm 0:9b334a45a8ff 143 void serial_baud(serial_t *obj, int baudrate) {
bogdanm 0:9b334a45a8ff 144 obj->baudrate = baudrate;
bogdanm 0:9b334a45a8ff 145 init_usart(obj);
bogdanm 0:9b334a45a8ff 146 }
bogdanm 0:9b334a45a8ff 147
bogdanm 0:9b334a45a8ff 148 void serial_format(serial_t *obj, int data_bits, SerialParity parity, int stop_bits) {
bogdanm 0:9b334a45a8ff 149 if (data_bits == 8) {
bogdanm 0:9b334a45a8ff 150 obj->databits = USART_WordLength_8b;
bogdanm 0:9b334a45a8ff 151 } else {
bogdanm 0:9b334a45a8ff 152 obj->databits = USART_WordLength_9b;
bogdanm 0:9b334a45a8ff 153 }
bogdanm 0:9b334a45a8ff 154
bogdanm 0:9b334a45a8ff 155 switch (parity) {
bogdanm 0:9b334a45a8ff 156 case ParityOdd:
bogdanm 0:9b334a45a8ff 157 case ParityForced0:
bogdanm 0:9b334a45a8ff 158 obj->parity = USART_Parity_Odd;
bogdanm 0:9b334a45a8ff 159 break;
bogdanm 0:9b334a45a8ff 160 case ParityEven:
bogdanm 0:9b334a45a8ff 161 case ParityForced1:
bogdanm 0:9b334a45a8ff 162 obj->parity = USART_Parity_Even;
bogdanm 0:9b334a45a8ff 163 break;
bogdanm 0:9b334a45a8ff 164 default: // ParityNone
bogdanm 0:9b334a45a8ff 165 obj->parity = USART_Parity_No;
bogdanm 0:9b334a45a8ff 166 break;
bogdanm 0:9b334a45a8ff 167 }
bogdanm 0:9b334a45a8ff 168
bogdanm 0:9b334a45a8ff 169 if (stop_bits == 2) {
bogdanm 0:9b334a45a8ff 170 obj->stopbits = USART_StopBits_2;
bogdanm 0:9b334a45a8ff 171 } else {
bogdanm 0:9b334a45a8ff 172 obj->stopbits = USART_StopBits_1;
bogdanm 0:9b334a45a8ff 173 }
bogdanm 0:9b334a45a8ff 174
bogdanm 0:9b334a45a8ff 175 init_usart(obj);
bogdanm 0:9b334a45a8ff 176 }
bogdanm 0:9b334a45a8ff 177
bogdanm 0:9b334a45a8ff 178 /******************************************************************************
bogdanm 0:9b334a45a8ff 179 * INTERRUPTS HANDLING
bogdanm 0:9b334a45a8ff 180 ******************************************************************************/
bogdanm 0:9b334a45a8ff 181
bogdanm 0:9b334a45a8ff 182 // not api
bogdanm 0:9b334a45a8ff 183 static void uart_irq(USART_TypeDef* usart, int id) {
bogdanm 0:9b334a45a8ff 184 if (serial_irq_ids[id] != 0) {
bogdanm 0:9b334a45a8ff 185 if (USART_GetITStatus(usart, USART_IT_TC) != RESET) {
bogdanm 0:9b334a45a8ff 186 irq_handler(serial_irq_ids[id], TxIrq);
bogdanm 0:9b334a45a8ff 187 USART_ClearITPendingBit(usart, USART_IT_TC);
bogdanm 0:9b334a45a8ff 188 }
bogdanm 0:9b334a45a8ff 189 if (USART_GetITStatus(usart, USART_IT_RXNE) != RESET) {
bogdanm 0:9b334a45a8ff 190 irq_handler(serial_irq_ids[id], RxIrq);
bogdanm 0:9b334a45a8ff 191 USART_ClearITPendingBit(usart, USART_IT_RXNE);
bogdanm 0:9b334a45a8ff 192 }
bogdanm 0:9b334a45a8ff 193 }
bogdanm 0:9b334a45a8ff 194 }
bogdanm 0:9b334a45a8ff 195
bogdanm 0:9b334a45a8ff 196 static void uart1_irq(void) {
bogdanm 0:9b334a45a8ff 197 uart_irq((USART_TypeDef*)UART_1, 0);
bogdanm 0:9b334a45a8ff 198 }
bogdanm 0:9b334a45a8ff 199 static void uart2_irq(void) {
bogdanm 0:9b334a45a8ff 200 uart_irq((USART_TypeDef*)UART_2, 1);
bogdanm 0:9b334a45a8ff 201 }
bogdanm 0:9b334a45a8ff 202 static void uart3_irq(void) {
bogdanm 0:9b334a45a8ff 203 uart_irq((USART_TypeDef*)UART_3, 2);
bogdanm 0:9b334a45a8ff 204 }
bogdanm 0:9b334a45a8ff 205
bogdanm 0:9b334a45a8ff 206 void serial_irq_handler(serial_t *obj, uart_irq_handler handler, uint32_t id) {
bogdanm 0:9b334a45a8ff 207 irq_handler = handler;
bogdanm 0:9b334a45a8ff 208 serial_irq_ids[obj->index] = id;
bogdanm 0:9b334a45a8ff 209 }
bogdanm 0:9b334a45a8ff 210
bogdanm 0:9b334a45a8ff 211 void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable) {
bogdanm 0:9b334a45a8ff 212 IRQn_Type irq_n = (IRQn_Type)0;
bogdanm 0:9b334a45a8ff 213 uint32_t vector = 0;
bogdanm 0:9b334a45a8ff 214 USART_TypeDef *usart = (USART_TypeDef *)(obj->uart);
bogdanm 0:9b334a45a8ff 215
bogdanm 0:9b334a45a8ff 216 if (obj->uart == UART_1) {
bogdanm 0:9b334a45a8ff 217 irq_n = USART1_IRQn;
bogdanm 0:9b334a45a8ff 218 vector = (uint32_t)&uart1_irq;
bogdanm 0:9b334a45a8ff 219 }
bogdanm 0:9b334a45a8ff 220
bogdanm 0:9b334a45a8ff 221 if (obj->uart == UART_2) {
bogdanm 0:9b334a45a8ff 222 irq_n = USART2_IRQn;
bogdanm 0:9b334a45a8ff 223 vector = (uint32_t)&uart2_irq;
bogdanm 0:9b334a45a8ff 224 }
bogdanm 0:9b334a45a8ff 225
bogdanm 0:9b334a45a8ff 226 if (obj->uart == UART_3) {
bogdanm 0:9b334a45a8ff 227 irq_n = USART3_IRQn;
bogdanm 0:9b334a45a8ff 228 vector = (uint32_t)&uart3_irq;
bogdanm 0:9b334a45a8ff 229 }
bogdanm 0:9b334a45a8ff 230
bogdanm 0:9b334a45a8ff 231 if (enable) {
bogdanm 0:9b334a45a8ff 232
bogdanm 0:9b334a45a8ff 233 if (irq == RxIrq) {
bogdanm 0:9b334a45a8ff 234 USART_ITConfig(usart, USART_IT_RXNE, ENABLE);
bogdanm 0:9b334a45a8ff 235 } else { // TxIrq
bogdanm 0:9b334a45a8ff 236 USART_ITConfig(usart, USART_IT_TC, ENABLE);
bogdanm 0:9b334a45a8ff 237 }
bogdanm 0:9b334a45a8ff 238
bogdanm 0:9b334a45a8ff 239 NVIC_SetVector(irq_n, vector);
bogdanm 0:9b334a45a8ff 240 NVIC_EnableIRQ(irq_n);
bogdanm 0:9b334a45a8ff 241
bogdanm 0:9b334a45a8ff 242 } else { // disable
bogdanm 0:9b334a45a8ff 243
bogdanm 0:9b334a45a8ff 244 int all_disabled = 0;
bogdanm 0:9b334a45a8ff 245
bogdanm 0:9b334a45a8ff 246 if (irq == RxIrq) {
bogdanm 0:9b334a45a8ff 247 USART_ITConfig(usart, USART_IT_RXNE, DISABLE);
bogdanm 0:9b334a45a8ff 248 // Check if TxIrq is disabled too
bogdanm 0:9b334a45a8ff 249 if ((usart->CR1 & USART_CR1_TXEIE) == 0) all_disabled = 1;
bogdanm 0:9b334a45a8ff 250 } else { // TxIrq
bogdanm 0:9b334a45a8ff 251 USART_ITConfig(usart, USART_IT_TXE, DISABLE);
bogdanm 0:9b334a45a8ff 252 // Check if RxIrq is disabled too
bogdanm 0:9b334a45a8ff 253 if ((usart->CR1 & USART_CR1_RXNEIE) == 0) all_disabled = 1;
bogdanm 0:9b334a45a8ff 254 }
bogdanm 0:9b334a45a8ff 255
bogdanm 0:9b334a45a8ff 256 if (all_disabled) NVIC_DisableIRQ(irq_n);
bogdanm 0:9b334a45a8ff 257
bogdanm 0:9b334a45a8ff 258 }
bogdanm 0:9b334a45a8ff 259 }
bogdanm 0:9b334a45a8ff 260
bogdanm 0:9b334a45a8ff 261 /******************************************************************************
bogdanm 0:9b334a45a8ff 262 * READ/WRITE
bogdanm 0:9b334a45a8ff 263 ******************************************************************************/
bogdanm 0:9b334a45a8ff 264
bogdanm 0:9b334a45a8ff 265 int serial_getc(serial_t *obj) {
bogdanm 0:9b334a45a8ff 266 USART_TypeDef *usart = (USART_TypeDef *)(obj->uart);
bogdanm 0:9b334a45a8ff 267 while (!serial_readable(obj));
bogdanm 0:9b334a45a8ff 268 return (int)(USART_ReceiveData(usart));
bogdanm 0:9b334a45a8ff 269 }
bogdanm 0:9b334a45a8ff 270
bogdanm 0:9b334a45a8ff 271 void serial_putc(serial_t *obj, int c) {
bogdanm 0:9b334a45a8ff 272 USART_TypeDef *usart = (USART_TypeDef *)(obj->uart);
bogdanm 0:9b334a45a8ff 273 while (!serial_writable(obj));
bogdanm 0:9b334a45a8ff 274 USART_SendData(usart, (uint16_t)c);
bogdanm 0:9b334a45a8ff 275 }
bogdanm 0:9b334a45a8ff 276
bogdanm 0:9b334a45a8ff 277 int serial_readable(serial_t *obj) {
bogdanm 0:9b334a45a8ff 278 int status;
bogdanm 0:9b334a45a8ff 279 USART_TypeDef *usart = (USART_TypeDef *)(obj->uart);
bogdanm 0:9b334a45a8ff 280 // Check if data is received
bogdanm 0:9b334a45a8ff 281 status = ((USART_GetFlagStatus(usart, USART_FLAG_RXNE) != RESET) ? 1 : 0);
bogdanm 0:9b334a45a8ff 282 return status;
bogdanm 0:9b334a45a8ff 283 }
bogdanm 0:9b334a45a8ff 284
bogdanm 0:9b334a45a8ff 285 int serial_writable(serial_t *obj) {
bogdanm 0:9b334a45a8ff 286 int status;
bogdanm 0:9b334a45a8ff 287 USART_TypeDef *usart = (USART_TypeDef *)(obj->uart);
bogdanm 0:9b334a45a8ff 288 // Check if data is transmitted
bogdanm 0:9b334a45a8ff 289 status = ((USART_GetFlagStatus(usart, USART_FLAG_TXE) != RESET) ? 1 : 0);
bogdanm 0:9b334a45a8ff 290 return status;
bogdanm 0:9b334a45a8ff 291 }
bogdanm 0:9b334a45a8ff 292
bogdanm 0:9b334a45a8ff 293 void serial_clear(serial_t *obj) {
bogdanm 0:9b334a45a8ff 294 USART_TypeDef *usart = (USART_TypeDef *)(obj->uart);
bogdanm 0:9b334a45a8ff 295 USART_ClearFlag(usart, USART_FLAG_TXE);
bogdanm 0:9b334a45a8ff 296 USART_ClearFlag(usart, USART_FLAG_RXNE);
bogdanm 0:9b334a45a8ff 297 }
bogdanm 0:9b334a45a8ff 298
bogdanm 0:9b334a45a8ff 299 void serial_pinout_tx(PinName tx) {
bogdanm 0:9b334a45a8ff 300 pinmap_pinout(tx, PinMap_UART_TX);
bogdanm 0:9b334a45a8ff 301 }
bogdanm 0:9b334a45a8ff 302
bogdanm 0:9b334a45a8ff 303 void serial_break_set(serial_t *obj) {
bogdanm 0:9b334a45a8ff 304 USART_TypeDef *usart = (USART_TypeDef *)(obj->uart);
bogdanm 0:9b334a45a8ff 305 USART_RequestCmd(usart, USART_Request_SBKRQ, ENABLE);
bogdanm 0:9b334a45a8ff 306 }
bogdanm 0:9b334a45a8ff 307
bogdanm 0:9b334a45a8ff 308 void serial_break_clear(serial_t *obj) {
bogdanm 0:9b334a45a8ff 309 USART_TypeDef *usart = (USART_TypeDef *)(obj->uart);
bogdanm 0:9b334a45a8ff 310 USART_RequestCmd(usart, USART_Request_SBKRQ, DISABLE);
bogdanm 0:9b334a45a8ff 311 USART_ClearFlag(usart, USART_FLAG_SBK);
bogdanm 0:9b334a45a8ff 312 }