Johannes Stratmann / mbed-dev

Fork of mbed-dev by mbed official

Committer:
<>
Date:
Fri Sep 02 15:07:44 2016 +0100
Revision:
144:ef7eb2e8f9f7
Parent:
32:58d485b73390
This updates the lib to the mbed lib v125

Who changed what in which revision?

UserRevisionLine numberNew contents of line
<> 144:ef7eb2e8f9f7 1 /* mbed Microcontroller Library
<> 144:ef7eb2e8f9f7 2 *******************************************************************************
<> 144:ef7eb2e8f9f7 3 * Copyright (c) 2014, STMicroelectronics
<> 144:ef7eb2e8f9f7 4 * All rights reserved.
<> 144:ef7eb2e8f9f7 5 *
<> 144:ef7eb2e8f9f7 6 * Redistribution and use in source and binary forms, with or without
<> 144:ef7eb2e8f9f7 7 * modification, are permitted provided that the following conditions are met:
<> 144:ef7eb2e8f9f7 8 *
<> 144:ef7eb2e8f9f7 9 * 1. Redistributions of source code must retain the above copyright notice,
<> 144:ef7eb2e8f9f7 10 * this list of conditions and the following disclaimer.
<> 144:ef7eb2e8f9f7 11 * 2. Redistributions in binary form must reproduce the above copyright notice,
<> 144:ef7eb2e8f9f7 12 * this list of conditions and the following disclaimer in the documentation
<> 144:ef7eb2e8f9f7 13 * and/or other materials provided with the distribution.
<> 144:ef7eb2e8f9f7 14 * 3. Neither the name of STMicroelectronics nor the names of its contributors
<> 144:ef7eb2e8f9f7 15 * may be used to endorse or promote products derived from this software
<> 144:ef7eb2e8f9f7 16 * without specific prior written permission.
<> 144:ef7eb2e8f9f7 17 *
<> 144:ef7eb2e8f9f7 18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
<> 144:ef7eb2e8f9f7 19 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
<> 144:ef7eb2e8f9f7 20 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
<> 144:ef7eb2e8f9f7 21 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
<> 144:ef7eb2e8f9f7 22 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
<> 144:ef7eb2e8f9f7 23 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
<> 144:ef7eb2e8f9f7 24 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
<> 144:ef7eb2e8f9f7 25 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
<> 144:ef7eb2e8f9f7 26 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
<> 144:ef7eb2e8f9f7 27 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
<> 144:ef7eb2e8f9f7 28 *******************************************************************************
<> 144:ef7eb2e8f9f7 29 */
<> 144:ef7eb2e8f9f7 30 #include "mbed_assert.h"
<> 144:ef7eb2e8f9f7 31 #include "serial_api.h"
<> 144:ef7eb2e8f9f7 32
<> 144:ef7eb2e8f9f7 33 #if DEVICE_SERIAL
<> 144:ef7eb2e8f9f7 34
<> 144:ef7eb2e8f9f7 35 #include "cmsis.h"
<> 144:ef7eb2e8f9f7 36 #include "pinmap.h"
<> 144:ef7eb2e8f9f7 37 #include "mbed_error.h"
<> 144:ef7eb2e8f9f7 38 #include <string.h>
<> 144:ef7eb2e8f9f7 39 #include "PeripheralPins.h"
<> 144:ef7eb2e8f9f7 40
<> 144:ef7eb2e8f9f7 41 #define UART_NUM (5)
<> 144:ef7eb2e8f9f7 42
<> 144:ef7eb2e8f9f7 43 static uint32_t serial_irq_ids[UART_NUM] = {0};
<> 144:ef7eb2e8f9f7 44 static UART_HandleTypeDef uart_handlers[UART_NUM];
<> 144:ef7eb2e8f9f7 45
<> 144:ef7eb2e8f9f7 46 static uart_irq_handler irq_handler;
<> 144:ef7eb2e8f9f7 47
<> 144:ef7eb2e8f9f7 48 int stdio_uart_inited = 0;
<> 144:ef7eb2e8f9f7 49 serial_t stdio_uart;
<> 144:ef7eb2e8f9f7 50
<> 144:ef7eb2e8f9f7 51 #if DEVICE_SERIAL_ASYNCH
<> 144:ef7eb2e8f9f7 52 #define SERIAL_S(obj) (&((obj)->serial))
<> 144:ef7eb2e8f9f7 53 #else
<> 144:ef7eb2e8f9f7 54 #define SERIAL_S(obj) (obj)
<> 144:ef7eb2e8f9f7 55 #endif
<> 144:ef7eb2e8f9f7 56
<> 144:ef7eb2e8f9f7 57 static void init_uart(serial_t *obj)
<> 144:ef7eb2e8f9f7 58 {
<> 144:ef7eb2e8f9f7 59 struct serial_s *obj_s = SERIAL_S(obj);
<> 144:ef7eb2e8f9f7 60 UART_HandleTypeDef *huart = &uart_handlers[obj_s->index];
<> 144:ef7eb2e8f9f7 61 huart->Instance = (USART_TypeDef *)(obj_s->uart);
<> 144:ef7eb2e8f9f7 62
<> 144:ef7eb2e8f9f7 63 huart->Init.BaudRate = obj_s->baudrate;
<> 144:ef7eb2e8f9f7 64 huart->Init.WordLength = obj_s->databits;
<> 144:ef7eb2e8f9f7 65 huart->Init.StopBits = obj_s->stopbits;
<> 144:ef7eb2e8f9f7 66 huart->Init.Parity = obj_s->parity;
<> 144:ef7eb2e8f9f7 67 #if DEVICE_SERIAL_FC
<> 144:ef7eb2e8f9f7 68 huart->Init.HwFlowCtl = obj_s->hw_flow_ctl;
<> 144:ef7eb2e8f9f7 69 #else
<> 144:ef7eb2e8f9f7 70 huart->Init.HwFlowCtl = UART_HWCONTROL_NONE;
<> 144:ef7eb2e8f9f7 71 #endif
<> 144:ef7eb2e8f9f7 72 huart->TxXferCount = 0;
<> 144:ef7eb2e8f9f7 73 huart->TxXferSize = 0;
<> 144:ef7eb2e8f9f7 74 huart->RxXferCount = 0;
<> 144:ef7eb2e8f9f7 75 huart->RxXferSize = 0;
<> 144:ef7eb2e8f9f7 76
<> 144:ef7eb2e8f9f7 77 if (obj_s->pin_rx == NC) {
<> 144:ef7eb2e8f9f7 78 huart->Init.Mode = UART_MODE_TX;
<> 144:ef7eb2e8f9f7 79 } else if (obj_s->pin_tx == NC) {
<> 144:ef7eb2e8f9f7 80 huart->Init.Mode = UART_MODE_RX;
<> 144:ef7eb2e8f9f7 81 } else {
<> 144:ef7eb2e8f9f7 82 huart->Init.Mode = UART_MODE_TX_RX;
<> 144:ef7eb2e8f9f7 83 }
<> 144:ef7eb2e8f9f7 84
<> 144:ef7eb2e8f9f7 85 /* uAMR & ARM: Call to UART init is done between reset of pre-initialized variables */
<> 144:ef7eb2e8f9f7 86 /* and before HAL Init. SystemCoreClock init required here */
<> 144:ef7eb2e8f9f7 87 SystemCoreClockUpdate();
<> 144:ef7eb2e8f9f7 88
<> 144:ef7eb2e8f9f7 89 if (HAL_UART_Init(huart) != HAL_OK) {
<> 144:ef7eb2e8f9f7 90 error("Cannot initialize UART\n");
<> 144:ef7eb2e8f9f7 91 }
<> 144:ef7eb2e8f9f7 92 }
<> 144:ef7eb2e8f9f7 93
<> 144:ef7eb2e8f9f7 94 void serial_init(serial_t *obj, PinName tx, PinName rx)
<> 144:ef7eb2e8f9f7 95 {
<> 144:ef7eb2e8f9f7 96 struct serial_s *obj_s = SERIAL_S(obj);
<> 144:ef7eb2e8f9f7 97
<> 144:ef7eb2e8f9f7 98 // Determine the UART to use (UART_1, UART_2, ...)
<> 144:ef7eb2e8f9f7 99 UARTName uart_tx = (UARTName)pinmap_peripheral(tx, PinMap_UART_TX);
<> 144:ef7eb2e8f9f7 100 UARTName uart_rx = (UARTName)pinmap_peripheral(rx, PinMap_UART_RX);
<> 144:ef7eb2e8f9f7 101
<> 144:ef7eb2e8f9f7 102 // Get the peripheral name (UART_1, UART_2, ...) from the pin and assign it to the object
<> 144:ef7eb2e8f9f7 103 obj_s->uart = (UARTName)pinmap_merge(uart_tx, uart_rx);
<> 144:ef7eb2e8f9f7 104 MBED_ASSERT(obj_s->uart != (UARTName)NC);
<> 144:ef7eb2e8f9f7 105
<> 144:ef7eb2e8f9f7 106 // Enable USART clock
<> 144:ef7eb2e8f9f7 107 if (obj_s->uart == UART_1) {
<> 144:ef7eb2e8f9f7 108 __HAL_RCC_USART1_FORCE_RESET();
<> 144:ef7eb2e8f9f7 109 __HAL_RCC_USART1_RELEASE_RESET();
<> 144:ef7eb2e8f9f7 110 __HAL_RCC_USART1_CLK_ENABLE();
<> 144:ef7eb2e8f9f7 111 obj_s->index = 0;
<> 144:ef7eb2e8f9f7 112 }
<> 144:ef7eb2e8f9f7 113 if (obj_s->uart == UART_2) {
<> 144:ef7eb2e8f9f7 114 __HAL_RCC_USART2_FORCE_RESET();
<> 144:ef7eb2e8f9f7 115 __HAL_RCC_USART2_RELEASE_RESET();
<> 144:ef7eb2e8f9f7 116 __HAL_RCC_USART2_CLK_ENABLE();
<> 144:ef7eb2e8f9f7 117 obj_s->index = 1;
<> 144:ef7eb2e8f9f7 118 }
<> 144:ef7eb2e8f9f7 119 if (obj_s->uart == UART_3) {
<> 144:ef7eb2e8f9f7 120 __HAL_RCC_USART3_FORCE_RESET();
<> 144:ef7eb2e8f9f7 121 __HAL_RCC_USART3_RELEASE_RESET();
<> 144:ef7eb2e8f9f7 122 __HAL_RCC_USART3_CLK_ENABLE();
<> 144:ef7eb2e8f9f7 123 obj_s->index = 2;
<> 144:ef7eb2e8f9f7 124 }
<> 144:ef7eb2e8f9f7 125 #if defined(UART4_BASE)
<> 144:ef7eb2e8f9f7 126 if (obj_s->uart == UART_4) {
<> 144:ef7eb2e8f9f7 127 __HAL_RCC_UART4_FORCE_RESET();
<> 144:ef7eb2e8f9f7 128 __HAL_RCC_UART4_RELEASE_RESET();
<> 144:ef7eb2e8f9f7 129 __HAL_RCC_UART4_CLK_ENABLE();
<> 144:ef7eb2e8f9f7 130 obj_s->index = 3;
<> 144:ef7eb2e8f9f7 131 }
<> 144:ef7eb2e8f9f7 132 #endif
<> 144:ef7eb2e8f9f7 133 #if defined(UART5_BASE)
<> 144:ef7eb2e8f9f7 134 if (obj_s->uart == UART_5) {
<> 144:ef7eb2e8f9f7 135 __HAL_RCC_UART5_FORCE_RESET();
<> 144:ef7eb2e8f9f7 136 __HAL_RCC_UART5_RELEASE_RESET();
<> 144:ef7eb2e8f9f7 137 __HAL_RCC_UART5_CLK_ENABLE();
<> 144:ef7eb2e8f9f7 138 obj_s->index = 4;
<> 144:ef7eb2e8f9f7 139 }
<> 144:ef7eb2e8f9f7 140 #endif
<> 144:ef7eb2e8f9f7 141
<> 144:ef7eb2e8f9f7 142 // Configure UART pins
<> 144:ef7eb2e8f9f7 143 pinmap_pinout(tx, PinMap_UART_TX);
<> 144:ef7eb2e8f9f7 144 pinmap_pinout(rx, PinMap_UART_RX);
<> 144:ef7eb2e8f9f7 145
<> 144:ef7eb2e8f9f7 146 if (tx != NC) {
<> 144:ef7eb2e8f9f7 147 pin_mode(tx, PullUp);
<> 144:ef7eb2e8f9f7 148 }
<> 144:ef7eb2e8f9f7 149 if (rx != NC) {
<> 144:ef7eb2e8f9f7 150 pin_mode(rx, PullUp);
<> 144:ef7eb2e8f9f7 151 }
<> 144:ef7eb2e8f9f7 152
<> 144:ef7eb2e8f9f7 153 // Configure UART
<> 144:ef7eb2e8f9f7 154 obj_s->baudrate = 9600;
<> 144:ef7eb2e8f9f7 155 obj_s->databits = UART_WORDLENGTH_8B;
<> 144:ef7eb2e8f9f7 156 obj_s->stopbits = UART_STOPBITS_1;
<> 144:ef7eb2e8f9f7 157 obj_s->parity = UART_PARITY_NONE;
<> 144:ef7eb2e8f9f7 158
<> 144:ef7eb2e8f9f7 159 #if DEVICE_SERIAL_FC
<> 144:ef7eb2e8f9f7 160 obj_s->hw_flow_ctl = UART_HWCONTROL_NONE;
<> 144:ef7eb2e8f9f7 161 #endif
<> 144:ef7eb2e8f9f7 162
<> 144:ef7eb2e8f9f7 163 obj_s->pin_tx = tx;
<> 144:ef7eb2e8f9f7 164 obj_s->pin_rx = rx;
<> 144:ef7eb2e8f9f7 165
<> 144:ef7eb2e8f9f7 166 init_uart(obj);
<> 144:ef7eb2e8f9f7 167
<> 144:ef7eb2e8f9f7 168 // For stdio management
<> 144:ef7eb2e8f9f7 169 if (obj_s->uart == STDIO_UART) {
<> 144:ef7eb2e8f9f7 170 stdio_uart_inited = 1;
<> 144:ef7eb2e8f9f7 171 memcpy(&stdio_uart, obj, sizeof(serial_t));
<> 144:ef7eb2e8f9f7 172 }
<> 144:ef7eb2e8f9f7 173 }
<> 144:ef7eb2e8f9f7 174
<> 144:ef7eb2e8f9f7 175 void serial_free(serial_t *obj)
<> 144:ef7eb2e8f9f7 176 {
<> 144:ef7eb2e8f9f7 177 struct serial_s *obj_s = SERIAL_S(obj);
<> 144:ef7eb2e8f9f7 178
<> 144:ef7eb2e8f9f7 179 // Reset UART and disable clock
<> 144:ef7eb2e8f9f7 180 if (obj_s->uart == UART_1) {
<> 144:ef7eb2e8f9f7 181 __USART1_FORCE_RESET();
<> 144:ef7eb2e8f9f7 182 __USART1_RELEASE_RESET();
<> 144:ef7eb2e8f9f7 183 __USART1_CLK_DISABLE();
<> 144:ef7eb2e8f9f7 184 }
<> 144:ef7eb2e8f9f7 185 if (obj_s->uart == UART_2) {
<> 144:ef7eb2e8f9f7 186 __USART2_FORCE_RESET();
<> 144:ef7eb2e8f9f7 187 __USART2_RELEASE_RESET();
<> 144:ef7eb2e8f9f7 188 __USART2_CLK_DISABLE();
<> 144:ef7eb2e8f9f7 189 }
<> 144:ef7eb2e8f9f7 190 if (obj_s->uart == UART_3) {
<> 144:ef7eb2e8f9f7 191 __USART3_FORCE_RESET();
<> 144:ef7eb2e8f9f7 192 __USART3_RELEASE_RESET();
<> 144:ef7eb2e8f9f7 193 __USART3_CLK_DISABLE();
<> 144:ef7eb2e8f9f7 194 }
<> 144:ef7eb2e8f9f7 195
<> 144:ef7eb2e8f9f7 196 #if defined(UART4_BASE)
<> 144:ef7eb2e8f9f7 197 if (obj_s->uart == UART_4) {
<> 144:ef7eb2e8f9f7 198 __UART4_FORCE_RESET();
<> 144:ef7eb2e8f9f7 199 __UART4_RELEASE_RESET();
<> 144:ef7eb2e8f9f7 200 __UART4_CLK_DISABLE();
<> 144:ef7eb2e8f9f7 201 }
<> 144:ef7eb2e8f9f7 202 #endif
<> 144:ef7eb2e8f9f7 203 #if defined(UART5_BASE)
<> 144:ef7eb2e8f9f7 204 if (obj_s->uart == UART_5) {
<> 144:ef7eb2e8f9f7 205 __UART5_FORCE_RESET();
<> 144:ef7eb2e8f9f7 206 __UART5_RELEASE_RESET();
<> 144:ef7eb2e8f9f7 207 __UART5_CLK_DISABLE();
<> 144:ef7eb2e8f9f7 208 }
<> 144:ef7eb2e8f9f7 209 #endif
<> 144:ef7eb2e8f9f7 210
<> 144:ef7eb2e8f9f7 211 // Configure GPIOs
<> 144:ef7eb2e8f9f7 212 pin_function(obj_s->pin_tx, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 0));
<> 144:ef7eb2e8f9f7 213 pin_function(obj_s->pin_rx, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 0));
<> 144:ef7eb2e8f9f7 214
<> 144:ef7eb2e8f9f7 215 serial_irq_ids[obj_s->index] = 0;
<> 144:ef7eb2e8f9f7 216 }
<> 144:ef7eb2e8f9f7 217
<> 144:ef7eb2e8f9f7 218 void serial_baud(serial_t *obj, int baudrate)
<> 144:ef7eb2e8f9f7 219 {
<> 144:ef7eb2e8f9f7 220 struct serial_s *obj_s = SERIAL_S(obj);
<> 144:ef7eb2e8f9f7 221
<> 144:ef7eb2e8f9f7 222 obj_s->baudrate = baudrate;
<> 144:ef7eb2e8f9f7 223 init_uart(obj);
<> 144:ef7eb2e8f9f7 224 }
<> 144:ef7eb2e8f9f7 225
<> 144:ef7eb2e8f9f7 226 void serial_format(serial_t *obj, int data_bits, SerialParity parity, int stop_bits)
<> 144:ef7eb2e8f9f7 227 {
<> 144:ef7eb2e8f9f7 228 struct serial_s *obj_s = SERIAL_S(obj);
<> 144:ef7eb2e8f9f7 229
<> 144:ef7eb2e8f9f7 230 if (data_bits == 9) {
<> 144:ef7eb2e8f9f7 231 obj_s->databits = UART_WORDLENGTH_9B;
<> 144:ef7eb2e8f9f7 232 } else {
<> 144:ef7eb2e8f9f7 233 obj_s->databits = UART_WORDLENGTH_8B;
<> 144:ef7eb2e8f9f7 234 }
<> 144:ef7eb2e8f9f7 235
<> 144:ef7eb2e8f9f7 236 switch (parity) {
<> 144:ef7eb2e8f9f7 237 case ParityOdd:
<> 144:ef7eb2e8f9f7 238 obj_s->parity = UART_PARITY_ODD;
<> 144:ef7eb2e8f9f7 239 break;
<> 144:ef7eb2e8f9f7 240 case ParityEven:
<> 144:ef7eb2e8f9f7 241 obj_s->parity = UART_PARITY_EVEN;
<> 144:ef7eb2e8f9f7 242 break;
<> 144:ef7eb2e8f9f7 243 default: // ParityNone
<> 144:ef7eb2e8f9f7 244 case ParityForced0: // unsupported!
<> 144:ef7eb2e8f9f7 245 case ParityForced1: // unsupported!
<> 144:ef7eb2e8f9f7 246 obj_s->parity = UART_PARITY_NONE;
<> 144:ef7eb2e8f9f7 247 break;
<> 144:ef7eb2e8f9f7 248 }
<> 144:ef7eb2e8f9f7 249
<> 144:ef7eb2e8f9f7 250 if (stop_bits == 2) {
<> 144:ef7eb2e8f9f7 251 obj_s->stopbits = UART_STOPBITS_2;
<> 144:ef7eb2e8f9f7 252 } else {
<> 144:ef7eb2e8f9f7 253 obj_s->stopbits = UART_STOPBITS_1;
<> 144:ef7eb2e8f9f7 254 }
<> 144:ef7eb2e8f9f7 255
<> 144:ef7eb2e8f9f7 256 init_uart(obj);
<> 144:ef7eb2e8f9f7 257 }
<> 144:ef7eb2e8f9f7 258
<> 144:ef7eb2e8f9f7 259 /******************************************************************************
<> 144:ef7eb2e8f9f7 260 * INTERRUPTS HANDLING
<> 144:ef7eb2e8f9f7 261 ******************************************************************************/
<> 144:ef7eb2e8f9f7 262
<> 144:ef7eb2e8f9f7 263 static void uart_irq(int id)
<> 144:ef7eb2e8f9f7 264 {
<> 144:ef7eb2e8f9f7 265 UART_HandleTypeDef * huart = &uart_handlers[id];
<> 144:ef7eb2e8f9f7 266
<> 144:ef7eb2e8f9f7 267 if (serial_irq_ids[id] != 0) {
<> 144:ef7eb2e8f9f7 268 if (__HAL_UART_GET_FLAG(huart, UART_FLAG_TC) != RESET) {
<> 144:ef7eb2e8f9f7 269 if (__HAL_UART_GET_IT_SOURCE(huart, UART_IT_TC) != RESET) {
<> 144:ef7eb2e8f9f7 270 irq_handler(serial_irq_ids[id], TxIrq);
<> 144:ef7eb2e8f9f7 271 __HAL_UART_CLEAR_FLAG(huart, UART_FLAG_TC);
<> 144:ef7eb2e8f9f7 272 }
<> 144:ef7eb2e8f9f7 273 }
<> 144:ef7eb2e8f9f7 274 if (__HAL_UART_GET_FLAG(huart, UART_FLAG_RXNE) != RESET) {
<> 144:ef7eb2e8f9f7 275 if (__HAL_UART_GET_IT_SOURCE(huart, UART_IT_RXNE) != RESET) {
<> 144:ef7eb2e8f9f7 276 irq_handler(serial_irq_ids[id], RxIrq);
<> 144:ef7eb2e8f9f7 277 __HAL_UART_CLEAR_FLAG(huart, UART_FLAG_RXNE);
<> 144:ef7eb2e8f9f7 278 }
<> 144:ef7eb2e8f9f7 279 }
<> 144:ef7eb2e8f9f7 280 if (__HAL_UART_GET_FLAG(huart, UART_FLAG_ORE) != RESET) {
<> 144:ef7eb2e8f9f7 281 if (__HAL_UART_GET_IT_SOURCE(huart, UART_IT_ERR) != RESET) {
<> 144:ef7eb2e8f9f7 282 volatile uint32_t tmpval = huart->Instance->DR; // Clear ORE flag
<> 144:ef7eb2e8f9f7 283 }
<> 144:ef7eb2e8f9f7 284 }
<> 144:ef7eb2e8f9f7 285 }
<> 144:ef7eb2e8f9f7 286 }
<> 144:ef7eb2e8f9f7 287
<> 144:ef7eb2e8f9f7 288 static void uart1_irq(void)
<> 144:ef7eb2e8f9f7 289 {
<> 144:ef7eb2e8f9f7 290 uart_irq(0);
<> 144:ef7eb2e8f9f7 291 }
<> 144:ef7eb2e8f9f7 292
<> 144:ef7eb2e8f9f7 293 static void uart2_irq(void)
<> 144:ef7eb2e8f9f7 294 {
<> 144:ef7eb2e8f9f7 295 uart_irq(1);
<> 144:ef7eb2e8f9f7 296 }
<> 144:ef7eb2e8f9f7 297
<> 144:ef7eb2e8f9f7 298 static void uart3_irq(void)
<> 144:ef7eb2e8f9f7 299 {
<> 144:ef7eb2e8f9f7 300 uart_irq(2);
<> 144:ef7eb2e8f9f7 301 }
<> 144:ef7eb2e8f9f7 302
<> 144:ef7eb2e8f9f7 303 #if defined(UART4_BASE)
<> 144:ef7eb2e8f9f7 304 static void uart4_irq(void)
<> 144:ef7eb2e8f9f7 305 {
<> 144:ef7eb2e8f9f7 306 uart_irq(3);
<> 144:ef7eb2e8f9f7 307 }
<> 144:ef7eb2e8f9f7 308 #endif
<> 144:ef7eb2e8f9f7 309 #if defined(UART5_BASE)
<> 144:ef7eb2e8f9f7 310 static void uart5_irq(void)
<> 144:ef7eb2e8f9f7 311 {
<> 144:ef7eb2e8f9f7 312 uart_irq(4);
<> 144:ef7eb2e8f9f7 313 }
<> 144:ef7eb2e8f9f7 314 #endif
<> 144:ef7eb2e8f9f7 315
<> 144:ef7eb2e8f9f7 316 void serial_irq_handler(serial_t *obj, uart_irq_handler handler, uint32_t id)
<> 144:ef7eb2e8f9f7 317 {
<> 144:ef7eb2e8f9f7 318 struct serial_s *obj_s = SERIAL_S(obj);
<> 144:ef7eb2e8f9f7 319
<> 144:ef7eb2e8f9f7 320 irq_handler = handler;
<> 144:ef7eb2e8f9f7 321 serial_irq_ids[obj_s->index] = id;
<> 144:ef7eb2e8f9f7 322 }
<> 144:ef7eb2e8f9f7 323
<> 144:ef7eb2e8f9f7 324 void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable)
<> 144:ef7eb2e8f9f7 325 {
<> 144:ef7eb2e8f9f7 326 struct serial_s *obj_s = SERIAL_S(obj);
<> 144:ef7eb2e8f9f7 327 UART_HandleTypeDef *huart = &uart_handlers[obj_s->index];
<> 144:ef7eb2e8f9f7 328 IRQn_Type irq_n = (IRQn_Type)0;
<> 144:ef7eb2e8f9f7 329 uint32_t vector = 0;
<> 144:ef7eb2e8f9f7 330
<> 144:ef7eb2e8f9f7 331 if (obj_s->uart == UART_1) {
<> 144:ef7eb2e8f9f7 332 irq_n = USART1_IRQn;
<> 144:ef7eb2e8f9f7 333 vector = (uint32_t)&uart1_irq;
<> 144:ef7eb2e8f9f7 334 }
<> 144:ef7eb2e8f9f7 335
<> 144:ef7eb2e8f9f7 336 if (obj_s->uart == UART_2) {
<> 144:ef7eb2e8f9f7 337 irq_n = USART2_IRQn;
<> 144:ef7eb2e8f9f7 338 vector = (uint32_t)&uart2_irq;
<> 144:ef7eb2e8f9f7 339 }
<> 144:ef7eb2e8f9f7 340
<> 144:ef7eb2e8f9f7 341 if (obj_s->uart == UART_3) {
<> 144:ef7eb2e8f9f7 342 irq_n = USART3_IRQn;
<> 144:ef7eb2e8f9f7 343 vector = (uint32_t)&uart3_irq;
<> 144:ef7eb2e8f9f7 344 }
<> 144:ef7eb2e8f9f7 345 #if defined(UART4_BASE)
<> 144:ef7eb2e8f9f7 346 if (obj_s->uart == UART_4) {
<> 144:ef7eb2e8f9f7 347 irq_n = UART4_IRQn;
<> 144:ef7eb2e8f9f7 348 vector = (uint32_t)&uart4_irq;
<> 144:ef7eb2e8f9f7 349 }
<> 144:ef7eb2e8f9f7 350 #endif
<> 144:ef7eb2e8f9f7 351 #if defined(UART5_BASE)
<> 144:ef7eb2e8f9f7 352 if (obj_s->uart == UART_5) {
<> 144:ef7eb2e8f9f7 353 irq_n = UART5_IRQn;
<> 144:ef7eb2e8f9f7 354 vector = (uint32_t)&uart5_irq;
<> 144:ef7eb2e8f9f7 355 }
<> 144:ef7eb2e8f9f7 356 #endif
<> 144:ef7eb2e8f9f7 357
<> 144:ef7eb2e8f9f7 358 if (enable) {
<> 144:ef7eb2e8f9f7 359 if (irq == RxIrq) {
<> 144:ef7eb2e8f9f7 360 __HAL_UART_ENABLE_IT(huart, UART_IT_RXNE);
<> 144:ef7eb2e8f9f7 361 } else { // TxIrq
<> 144:ef7eb2e8f9f7 362 __HAL_UART_ENABLE_IT(huart, UART_IT_TC);
<> 144:ef7eb2e8f9f7 363 }
<> 144:ef7eb2e8f9f7 364 NVIC_SetVector(irq_n, vector);
<> 144:ef7eb2e8f9f7 365 NVIC_EnableIRQ(irq_n);
<> 144:ef7eb2e8f9f7 366
<> 144:ef7eb2e8f9f7 367 } else { // disable
<> 144:ef7eb2e8f9f7 368 int all_disabled = 0;
<> 144:ef7eb2e8f9f7 369 if (irq == RxIrq) {
<> 144:ef7eb2e8f9f7 370 __HAL_UART_DISABLE_IT(huart, UART_IT_RXNE);
<> 144:ef7eb2e8f9f7 371 // Check if TxIrq is disabled too
<> 144:ef7eb2e8f9f7 372 if ((huart->Instance->CR1 & USART_CR1_TXEIE) == 0) {
<> 144:ef7eb2e8f9f7 373 all_disabled = 1;
<> 144:ef7eb2e8f9f7 374 }
<> 144:ef7eb2e8f9f7 375 } else { // TxIrq
<> 144:ef7eb2e8f9f7 376 __HAL_UART_DISABLE_IT(huart, UART_IT_TC);
<> 144:ef7eb2e8f9f7 377 // Check if RxIrq is disabled too
<> 144:ef7eb2e8f9f7 378 if ((huart->Instance->CR1 & USART_CR1_RXNEIE) == 0) {
<> 144:ef7eb2e8f9f7 379 all_disabled = 1;
<> 144:ef7eb2e8f9f7 380 }
<> 144:ef7eb2e8f9f7 381 }
<> 144:ef7eb2e8f9f7 382
<> 144:ef7eb2e8f9f7 383 if (all_disabled) {
<> 144:ef7eb2e8f9f7 384 NVIC_DisableIRQ(irq_n);
<> 144:ef7eb2e8f9f7 385 }
<> 144:ef7eb2e8f9f7 386 }
<> 144:ef7eb2e8f9f7 387 }
<> 144:ef7eb2e8f9f7 388
<> 144:ef7eb2e8f9f7 389 /******************************************************************************
<> 144:ef7eb2e8f9f7 390 * READ/WRITE
<> 144:ef7eb2e8f9f7 391 ******************************************************************************/
<> 144:ef7eb2e8f9f7 392
<> 144:ef7eb2e8f9f7 393 int serial_getc(serial_t *obj)
<> 144:ef7eb2e8f9f7 394 {
<> 144:ef7eb2e8f9f7 395 struct serial_s *obj_s = SERIAL_S(obj);
<> 144:ef7eb2e8f9f7 396 UART_HandleTypeDef *huart = &uart_handlers[obj_s->index];
<> 144:ef7eb2e8f9f7 397
<> 144:ef7eb2e8f9f7 398 while (!serial_readable(obj));
<> 144:ef7eb2e8f9f7 399 if (obj_s->databits == UART_WORDLENGTH_8B) {
<> 144:ef7eb2e8f9f7 400 return (int)(huart->Instance->DR & (uint8_t)0xFF);
<> 144:ef7eb2e8f9f7 401 } else {
<> 144:ef7eb2e8f9f7 402 return (int)(huart->Instance->DR & (uint16_t)0x1FF);
<> 144:ef7eb2e8f9f7 403 }
<> 144:ef7eb2e8f9f7 404 }
<> 144:ef7eb2e8f9f7 405
<> 144:ef7eb2e8f9f7 406 void serial_putc(serial_t *obj, int c)
<> 144:ef7eb2e8f9f7 407 {
<> 144:ef7eb2e8f9f7 408 struct serial_s *obj_s = SERIAL_S(obj);
<> 144:ef7eb2e8f9f7 409 UART_HandleTypeDef *huart = &uart_handlers[obj_s->index];
<> 144:ef7eb2e8f9f7 410
<> 144:ef7eb2e8f9f7 411 while (!serial_writable(obj));
<> 144:ef7eb2e8f9f7 412 if (obj_s->databits == UART_WORDLENGTH_8B) {
<> 144:ef7eb2e8f9f7 413 huart->Instance->DR = (uint8_t)(c & (uint8_t)0xFF);
<> 144:ef7eb2e8f9f7 414 } else {
<> 144:ef7eb2e8f9f7 415 huart->Instance->DR = (uint16_t)(c & (uint16_t)0x1FF);
<> 144:ef7eb2e8f9f7 416 }
<> 144:ef7eb2e8f9f7 417 }
<> 144:ef7eb2e8f9f7 418
<> 144:ef7eb2e8f9f7 419 int serial_readable(serial_t *obj)
<> 144:ef7eb2e8f9f7 420 {
<> 144:ef7eb2e8f9f7 421 struct serial_s *obj_s = SERIAL_S(obj);
<> 144:ef7eb2e8f9f7 422 UART_HandleTypeDef *huart = &uart_handlers[obj_s->index];
<> 144:ef7eb2e8f9f7 423
<> 144:ef7eb2e8f9f7 424 // Check if data is received
<> 144:ef7eb2e8f9f7 425 return (__HAL_UART_GET_FLAG(huart, UART_FLAG_RXNE) != RESET) ? 1 : 0;
<> 144:ef7eb2e8f9f7 426 }
<> 144:ef7eb2e8f9f7 427
<> 144:ef7eb2e8f9f7 428 int serial_writable(serial_t *obj)
<> 144:ef7eb2e8f9f7 429 {
<> 144:ef7eb2e8f9f7 430 struct serial_s *obj_s = SERIAL_S(obj);
<> 144:ef7eb2e8f9f7 431 UART_HandleTypeDef *huart = &uart_handlers[obj_s->index];
<> 144:ef7eb2e8f9f7 432
<> 144:ef7eb2e8f9f7 433 // Check if data is transmitted
<> 144:ef7eb2e8f9f7 434 return (__HAL_UART_GET_FLAG(huart, UART_FLAG_TXE) != RESET) ? 1 : 0;
<> 144:ef7eb2e8f9f7 435 }
<> 144:ef7eb2e8f9f7 436
<> 144:ef7eb2e8f9f7 437 void serial_clear(serial_t *obj)
<> 144:ef7eb2e8f9f7 438 {
<> 144:ef7eb2e8f9f7 439 struct serial_s *obj_s = SERIAL_S(obj);
<> 144:ef7eb2e8f9f7 440 UART_HandleTypeDef *huart = &uart_handlers[obj_s->index];
<> 144:ef7eb2e8f9f7 441
<> 144:ef7eb2e8f9f7 442 huart->TxXferCount = 0;
<> 144:ef7eb2e8f9f7 443 huart->RxXferCount = 0;
<> 144:ef7eb2e8f9f7 444 }
<> 144:ef7eb2e8f9f7 445
<> 144:ef7eb2e8f9f7 446 void serial_pinout_tx(PinName tx)
<> 144:ef7eb2e8f9f7 447 {
<> 144:ef7eb2e8f9f7 448 pinmap_pinout(tx, PinMap_UART_TX);
<> 144:ef7eb2e8f9f7 449 }
<> 144:ef7eb2e8f9f7 450
<> 144:ef7eb2e8f9f7 451 void serial_break_set(serial_t *obj)
<> 144:ef7eb2e8f9f7 452 {
<> 144:ef7eb2e8f9f7 453 struct serial_s *obj_s = SERIAL_S(obj);
<> 144:ef7eb2e8f9f7 454 UART_HandleTypeDef *huart = &uart_handlers[obj_s->index];
<> 144:ef7eb2e8f9f7 455
<> 144:ef7eb2e8f9f7 456 HAL_LIN_SendBreak(huart);
<> 144:ef7eb2e8f9f7 457 }
<> 144:ef7eb2e8f9f7 458
<> 144:ef7eb2e8f9f7 459 void serial_break_clear(serial_t *obj)
<> 144:ef7eb2e8f9f7 460 {
<> 144:ef7eb2e8f9f7 461 (void)obj;
<> 144:ef7eb2e8f9f7 462 }
<> 144:ef7eb2e8f9f7 463
<> 144:ef7eb2e8f9f7 464 #if DEVICE_SERIAL_ASYNCH
<> 144:ef7eb2e8f9f7 465
<> 144:ef7eb2e8f9f7 466 /******************************************************************************
<> 144:ef7eb2e8f9f7 467 * LOCAL HELPER FUNCTIONS
<> 144:ef7eb2e8f9f7 468 ******************************************************************************/
<> 144:ef7eb2e8f9f7 469
<> 144:ef7eb2e8f9f7 470 /**
<> 144:ef7eb2e8f9f7 471 * Configure the TX buffer for an asynchronous write serial transaction
<> 144:ef7eb2e8f9f7 472 *
<> 144:ef7eb2e8f9f7 473 * @param obj The serial object.
<> 144:ef7eb2e8f9f7 474 * @param tx The buffer for sending.
<> 144:ef7eb2e8f9f7 475 * @param tx_length The number of words to transmit.
<> 144:ef7eb2e8f9f7 476 */
<> 144:ef7eb2e8f9f7 477 static void serial_tx_buffer_set(serial_t *obj, void *tx, int tx_length, uint8_t width)
<> 144:ef7eb2e8f9f7 478 {
<> 144:ef7eb2e8f9f7 479 (void)width;
<> 144:ef7eb2e8f9f7 480
<> 144:ef7eb2e8f9f7 481 // Exit if a transmit is already on-going
<> 144:ef7eb2e8f9f7 482 if (serial_tx_active(obj)) {
<> 144:ef7eb2e8f9f7 483 return;
<> 144:ef7eb2e8f9f7 484 }
<> 144:ef7eb2e8f9f7 485
<> 144:ef7eb2e8f9f7 486 obj->tx_buff.buffer = tx;
<> 144:ef7eb2e8f9f7 487 obj->tx_buff.length = tx_length;
<> 144:ef7eb2e8f9f7 488 obj->tx_buff.pos = 0;
<> 144:ef7eb2e8f9f7 489 }
<> 144:ef7eb2e8f9f7 490
<> 144:ef7eb2e8f9f7 491 /**
<> 144:ef7eb2e8f9f7 492 * Configure the RX buffer for an asynchronous write serial transaction
<> 144:ef7eb2e8f9f7 493 *
<> 144:ef7eb2e8f9f7 494 * @param obj The serial object.
<> 144:ef7eb2e8f9f7 495 * @param tx The buffer for sending.
<> 144:ef7eb2e8f9f7 496 * @param tx_length The number of words to transmit.
<> 144:ef7eb2e8f9f7 497 */
<> 144:ef7eb2e8f9f7 498 static void serial_rx_buffer_set(serial_t *obj, void *rx, int rx_length, uint8_t width)
<> 144:ef7eb2e8f9f7 499 {
<> 144:ef7eb2e8f9f7 500 (void)width;
<> 144:ef7eb2e8f9f7 501
<> 144:ef7eb2e8f9f7 502 // Exit if a reception is already on-going
<> 144:ef7eb2e8f9f7 503 if (serial_rx_active(obj)) {
<> 144:ef7eb2e8f9f7 504 return;
<> 144:ef7eb2e8f9f7 505 }
<> 144:ef7eb2e8f9f7 506
<> 144:ef7eb2e8f9f7 507 obj->rx_buff.buffer = rx;
<> 144:ef7eb2e8f9f7 508 obj->rx_buff.length = rx_length;
<> 144:ef7eb2e8f9f7 509 obj->rx_buff.pos = 0;
<> 144:ef7eb2e8f9f7 510 }
<> 144:ef7eb2e8f9f7 511
<> 144:ef7eb2e8f9f7 512 /**
<> 144:ef7eb2e8f9f7 513 * Configure events
<> 144:ef7eb2e8f9f7 514 *
<> 144:ef7eb2e8f9f7 515 * @param obj The serial object
<> 144:ef7eb2e8f9f7 516 * @param event The logical OR of the events to configure
<> 144:ef7eb2e8f9f7 517 * @param enable Set to non-zero to enable events, or zero to disable them
<> 144:ef7eb2e8f9f7 518 */
<> 144:ef7eb2e8f9f7 519 static void serial_enable_event(serial_t *obj, int event, uint8_t enable)
<> 144:ef7eb2e8f9f7 520 {
<> 144:ef7eb2e8f9f7 521 struct serial_s *obj_s = SERIAL_S(obj);
<> 144:ef7eb2e8f9f7 522
<> 144:ef7eb2e8f9f7 523 // Shouldn't have to enable interrupt here, just need to keep track of the requested events.
<> 144:ef7eb2e8f9f7 524 if (enable) {
<> 144:ef7eb2e8f9f7 525 obj_s->events |= event;
<> 144:ef7eb2e8f9f7 526 } else {
<> 144:ef7eb2e8f9f7 527 obj_s->events &= ~event;
<> 144:ef7eb2e8f9f7 528 }
<> 144:ef7eb2e8f9f7 529 }
<> 144:ef7eb2e8f9f7 530
<> 144:ef7eb2e8f9f7 531
<> 144:ef7eb2e8f9f7 532 /**
<> 144:ef7eb2e8f9f7 533 * Get index of serial object TX IRQ, relating it to the physical peripheral.
<> 144:ef7eb2e8f9f7 534 *
<> 144:ef7eb2e8f9f7 535 * @param obj pointer to serial object
<> 144:ef7eb2e8f9f7 536 * @return internal NVIC TX IRQ index of U(S)ART peripheral
<> 144:ef7eb2e8f9f7 537 */
<> 144:ef7eb2e8f9f7 538 static IRQn_Type serial_get_irq_n(serial_t *obj)
<> 144:ef7eb2e8f9f7 539 {
<> 144:ef7eb2e8f9f7 540 struct serial_s *obj_s = SERIAL_S(obj);
<> 144:ef7eb2e8f9f7 541 IRQn_Type irq_n;
<> 144:ef7eb2e8f9f7 542
<> 144:ef7eb2e8f9f7 543 switch (obj_s->index) {
<> 144:ef7eb2e8f9f7 544 case 0:
<> 144:ef7eb2e8f9f7 545 irq_n = USART1_IRQn;
<> 144:ef7eb2e8f9f7 546 break;
<> 144:ef7eb2e8f9f7 547
<> 144:ef7eb2e8f9f7 548 case 1:
<> 144:ef7eb2e8f9f7 549 irq_n = USART2_IRQn;
<> 144:ef7eb2e8f9f7 550 break;
<> 144:ef7eb2e8f9f7 551
<> 144:ef7eb2e8f9f7 552 case 2:
<> 144:ef7eb2e8f9f7 553 irq_n = USART3_IRQn;
<> 144:ef7eb2e8f9f7 554 break;
<> 144:ef7eb2e8f9f7 555 #if defined(UART4_BASE)
<> 144:ef7eb2e8f9f7 556 case 3:
<> 144:ef7eb2e8f9f7 557 irq_n = UART4_IRQn;
<> 144:ef7eb2e8f9f7 558 break;
<> 144:ef7eb2e8f9f7 559 #endif
<> 144:ef7eb2e8f9f7 560 #if defined(UART5_BASE)
<> 144:ef7eb2e8f9f7 561 case 4:
<> 144:ef7eb2e8f9f7 562 irq_n = UART5_IRQn;
<> 144:ef7eb2e8f9f7 563 break;
<> 144:ef7eb2e8f9f7 564 #endif
<> 144:ef7eb2e8f9f7 565 default:
<> 144:ef7eb2e8f9f7 566 irq_n = (IRQn_Type)0;
<> 144:ef7eb2e8f9f7 567 }
<> 144:ef7eb2e8f9f7 568
<> 144:ef7eb2e8f9f7 569 return irq_n;
<> 144:ef7eb2e8f9f7 570 }
<> 144:ef7eb2e8f9f7 571
<> 144:ef7eb2e8f9f7 572 /******************************************************************************
<> 144:ef7eb2e8f9f7 573 * MBED API FUNCTIONS
<> 144:ef7eb2e8f9f7 574 ******************************************************************************/
<> 144:ef7eb2e8f9f7 575
<> 144:ef7eb2e8f9f7 576 /**
<> 144:ef7eb2e8f9f7 577 * Begin asynchronous TX transfer. The used buffer is specified in the serial
<> 144:ef7eb2e8f9f7 578 * object, tx_buff
<> 144:ef7eb2e8f9f7 579 *
<> 144:ef7eb2e8f9f7 580 * @param obj The serial object
<> 144:ef7eb2e8f9f7 581 * @param tx The buffer for sending
<> 144:ef7eb2e8f9f7 582 * @param tx_length The number of words to transmit
<> 144:ef7eb2e8f9f7 583 * @param tx_width The bit width of buffer word
<> 144:ef7eb2e8f9f7 584 * @param handler The serial handler
<> 144:ef7eb2e8f9f7 585 * @param event The logical OR of events to be registered
<> 144:ef7eb2e8f9f7 586 * @param hint A suggestion for how to use DMA with this transfer
<> 144:ef7eb2e8f9f7 587 * @return Returns number of data transfered, or 0 otherwise
<> 144:ef7eb2e8f9f7 588 */
<> 144:ef7eb2e8f9f7 589 int serial_tx_asynch(serial_t *obj, const void *tx, size_t tx_length, uint8_t tx_width, uint32_t handler, uint32_t event, DMAUsage hint)
<> 144:ef7eb2e8f9f7 590 {
<> 144:ef7eb2e8f9f7 591 // TODO: DMA usage is currently ignored
<> 144:ef7eb2e8f9f7 592 (void) hint;
<> 144:ef7eb2e8f9f7 593
<> 144:ef7eb2e8f9f7 594 // Check buffer is ok
<> 144:ef7eb2e8f9f7 595 MBED_ASSERT(tx != (void*)0);
<> 144:ef7eb2e8f9f7 596 MBED_ASSERT(tx_width == 8); // support only 8b width
<> 144:ef7eb2e8f9f7 597
<> 144:ef7eb2e8f9f7 598 struct serial_s *obj_s = SERIAL_S(obj);
<> 144:ef7eb2e8f9f7 599 UART_HandleTypeDef * huart = &uart_handlers[obj_s->index];
<> 144:ef7eb2e8f9f7 600
<> 144:ef7eb2e8f9f7 601 if (tx_length == 0) {
<> 144:ef7eb2e8f9f7 602 return 0;
<> 144:ef7eb2e8f9f7 603 }
<> 144:ef7eb2e8f9f7 604
<> 144:ef7eb2e8f9f7 605 // Set up buffer
<> 144:ef7eb2e8f9f7 606 serial_tx_buffer_set(obj, (void *)tx, tx_length, tx_width);
<> 144:ef7eb2e8f9f7 607
<> 144:ef7eb2e8f9f7 608 // Set up events
<> 144:ef7eb2e8f9f7 609 serial_enable_event(obj, SERIAL_EVENT_TX_ALL, 0); // Clear all events
<> 144:ef7eb2e8f9f7 610 serial_enable_event(obj, event, 1); // Set only the wanted events
<> 144:ef7eb2e8f9f7 611
<> 144:ef7eb2e8f9f7 612 // Enable interrupt
<> 144:ef7eb2e8f9f7 613 IRQn_Type irq_n = serial_get_irq_n(obj);
<> 144:ef7eb2e8f9f7 614 NVIC_ClearPendingIRQ(irq_n);
<> 144:ef7eb2e8f9f7 615 NVIC_DisableIRQ(irq_n);
<> 144:ef7eb2e8f9f7 616 NVIC_SetPriority(irq_n, 1);
<> 144:ef7eb2e8f9f7 617 NVIC_SetVector(irq_n, (uint32_t)handler);
<> 144:ef7eb2e8f9f7 618 NVIC_EnableIRQ(irq_n);
<> 144:ef7eb2e8f9f7 619
<> 144:ef7eb2e8f9f7 620 // the following function will enable UART_IT_TXE and error interrupts
<> 144:ef7eb2e8f9f7 621 if (HAL_UART_Transmit_IT(huart, (uint8_t*)tx, tx_length) != HAL_OK) {
<> 144:ef7eb2e8f9f7 622 return 0;
<> 144:ef7eb2e8f9f7 623 }
<> 144:ef7eb2e8f9f7 624
<> 144:ef7eb2e8f9f7 625 return tx_length;
<> 144:ef7eb2e8f9f7 626 }
<> 144:ef7eb2e8f9f7 627
<> 144:ef7eb2e8f9f7 628 /**
<> 144:ef7eb2e8f9f7 629 * Begin asynchronous RX transfer (enable interrupt for data collecting)
<> 144:ef7eb2e8f9f7 630 * The used buffer is specified in the serial object, rx_buff
<> 144:ef7eb2e8f9f7 631 *
<> 144:ef7eb2e8f9f7 632 * @param obj The serial object
<> 144:ef7eb2e8f9f7 633 * @param rx The buffer for sending
<> 144:ef7eb2e8f9f7 634 * @param rx_length The number of words to transmit
<> 144:ef7eb2e8f9f7 635 * @param rx_width The bit width of buffer word
<> 144:ef7eb2e8f9f7 636 * @param handler The serial handler
<> 144:ef7eb2e8f9f7 637 * @param event The logical OR of events to be registered
<> 144:ef7eb2e8f9f7 638 * @param handler The serial handler
<> 144:ef7eb2e8f9f7 639 * @param char_match A character in range 0-254 to be matched
<> 144:ef7eb2e8f9f7 640 * @param hint A suggestion for how to use DMA with this transfer
<> 144:ef7eb2e8f9f7 641 */
<> 144:ef7eb2e8f9f7 642 void serial_rx_asynch(serial_t *obj, void *rx, size_t rx_length, uint8_t rx_width, uint32_t handler, uint32_t event, uint8_t char_match, DMAUsage hint)
<> 144:ef7eb2e8f9f7 643 {
<> 144:ef7eb2e8f9f7 644 // TODO: DMA usage is currently ignored
<> 144:ef7eb2e8f9f7 645 (void) hint;
<> 144:ef7eb2e8f9f7 646
<> 144:ef7eb2e8f9f7 647 /* Sanity check arguments */
<> 144:ef7eb2e8f9f7 648 MBED_ASSERT(obj);
<> 144:ef7eb2e8f9f7 649 MBED_ASSERT(rx != (void*)0);
<> 144:ef7eb2e8f9f7 650 MBED_ASSERT(rx_width == 8); // support only 8b width
<> 144:ef7eb2e8f9f7 651
<> 144:ef7eb2e8f9f7 652 struct serial_s *obj_s = SERIAL_S(obj);
<> 144:ef7eb2e8f9f7 653 UART_HandleTypeDef *huart = &uart_handlers[obj_s->index];
<> 144:ef7eb2e8f9f7 654
<> 144:ef7eb2e8f9f7 655 serial_enable_event(obj, SERIAL_EVENT_RX_ALL, 0);
<> 144:ef7eb2e8f9f7 656 serial_enable_event(obj, event, 1);
<> 144:ef7eb2e8f9f7 657
<> 144:ef7eb2e8f9f7 658 // set CharMatch
<> 144:ef7eb2e8f9f7 659 obj->char_match = char_match;
<> 144:ef7eb2e8f9f7 660
<> 144:ef7eb2e8f9f7 661 serial_rx_buffer_set(obj, rx, rx_length, rx_width);
<> 144:ef7eb2e8f9f7 662
<> 144:ef7eb2e8f9f7 663 IRQn_Type irq_n = serial_get_irq_n(obj);
<> 144:ef7eb2e8f9f7 664 NVIC_ClearPendingIRQ(irq_n);
<> 144:ef7eb2e8f9f7 665 NVIC_DisableIRQ(irq_n);
<> 144:ef7eb2e8f9f7 666 NVIC_SetPriority(irq_n, 0);
<> 144:ef7eb2e8f9f7 667 NVIC_SetVector(irq_n, (uint32_t)handler);
<> 144:ef7eb2e8f9f7 668 NVIC_EnableIRQ(irq_n);
<> 144:ef7eb2e8f9f7 669
<> 144:ef7eb2e8f9f7 670 // following HAL function will enable the RXNE interrupt + error interrupts
<> 144:ef7eb2e8f9f7 671 HAL_UART_Receive_IT(huart, (uint8_t*)rx, rx_length);
<> 144:ef7eb2e8f9f7 672 }
<> 144:ef7eb2e8f9f7 673
<> 144:ef7eb2e8f9f7 674 /**
<> 144:ef7eb2e8f9f7 675 * Attempts to determine if the serial peripheral is already in use for TX
<> 144:ef7eb2e8f9f7 676 *
<> 144:ef7eb2e8f9f7 677 * @param obj The serial object
<> 144:ef7eb2e8f9f7 678 * @return Non-zero if the TX transaction is ongoing, 0 otherwise
<> 144:ef7eb2e8f9f7 679 */
<> 144:ef7eb2e8f9f7 680 uint8_t serial_tx_active(serial_t *obj)
<> 144:ef7eb2e8f9f7 681 {
<> 144:ef7eb2e8f9f7 682 MBED_ASSERT(obj);
<> 144:ef7eb2e8f9f7 683
<> 144:ef7eb2e8f9f7 684 struct serial_s *obj_s = SERIAL_S(obj);
<> 144:ef7eb2e8f9f7 685 UART_HandleTypeDef *huart = &uart_handlers[obj_s->index];
<> 144:ef7eb2e8f9f7 686
<> 144:ef7eb2e8f9f7 687 return ((HAL_UART_GetState(huart) == HAL_UART_STATE_BUSY_TX) ? 1 : 0);
<> 144:ef7eb2e8f9f7 688 }
<> 144:ef7eb2e8f9f7 689
<> 144:ef7eb2e8f9f7 690 /**
<> 144:ef7eb2e8f9f7 691 * Attempts to determine if the serial peripheral is already in use for RX
<> 144:ef7eb2e8f9f7 692 *
<> 144:ef7eb2e8f9f7 693 * @param obj The serial object
<> 144:ef7eb2e8f9f7 694 * @return Non-zero if the RX transaction is ongoing, 0 otherwise
<> 144:ef7eb2e8f9f7 695 */
<> 144:ef7eb2e8f9f7 696 uint8_t serial_rx_active(serial_t *obj)
<> 144:ef7eb2e8f9f7 697 {
<> 144:ef7eb2e8f9f7 698 MBED_ASSERT(obj);
<> 144:ef7eb2e8f9f7 699
<> 144:ef7eb2e8f9f7 700 struct serial_s *obj_s = SERIAL_S(obj);
<> 144:ef7eb2e8f9f7 701 UART_HandleTypeDef *huart = &uart_handlers[obj_s->index];
<> 144:ef7eb2e8f9f7 702
<> 144:ef7eb2e8f9f7 703 return ((HAL_UART_GetState(huart) == HAL_UART_STATE_BUSY_RX) ? 1 : 0);
<> 144:ef7eb2e8f9f7 704 }
<> 144:ef7eb2e8f9f7 705
<> 144:ef7eb2e8f9f7 706 void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) {
<> 144:ef7eb2e8f9f7 707 if (__HAL_UART_GET_FLAG(huart, UART_FLAG_TC) != RESET) {
<> 144:ef7eb2e8f9f7 708 __HAL_UART_CLEAR_FLAG(huart, UART_FLAG_TC);
<> 144:ef7eb2e8f9f7 709 }
<> 144:ef7eb2e8f9f7 710 }
<> 144:ef7eb2e8f9f7 711
<> 144:ef7eb2e8f9f7 712 void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart) {
<> 144:ef7eb2e8f9f7 713 if (__HAL_UART_GET_FLAG(huart, UART_FLAG_PE) != RESET) {
<> 144:ef7eb2e8f9f7 714 volatile uint32_t tmpval = huart->Instance->DR; // Clear PE flag
<> 144:ef7eb2e8f9f7 715 } else if (__HAL_UART_GET_FLAG(huart, UART_FLAG_FE) != RESET) {
<> 144:ef7eb2e8f9f7 716 volatile uint32_t tmpval = huart->Instance->DR; // Clear FE flag
<> 144:ef7eb2e8f9f7 717 } else if (__HAL_UART_GET_FLAG(huart, UART_FLAG_NE) != RESET) {
<> 144:ef7eb2e8f9f7 718 volatile uint32_t tmpval = huart->Instance->DR; // Clear NE flag
<> 144:ef7eb2e8f9f7 719 } else if (__HAL_UART_GET_FLAG(huart, UART_FLAG_ORE) != RESET) {
<> 144:ef7eb2e8f9f7 720 volatile uint32_t tmpval = huart->Instance->DR; // Clear ORE flag
<> 144:ef7eb2e8f9f7 721 }
<> 144:ef7eb2e8f9f7 722 }
<> 144:ef7eb2e8f9f7 723
<> 144:ef7eb2e8f9f7 724 /**
<> 144:ef7eb2e8f9f7 725 * The asynchronous TX and RX handler.
<> 144:ef7eb2e8f9f7 726 *
<> 144:ef7eb2e8f9f7 727 * @param obj The serial object
<> 144:ef7eb2e8f9f7 728 * @return Returns event flags if a TX/RX transfer termination condition was met or 0 otherwise
<> 144:ef7eb2e8f9f7 729 */
<> 144:ef7eb2e8f9f7 730 int serial_irq_handler_asynch(serial_t *obj)
<> 144:ef7eb2e8f9f7 731 {
<> 144:ef7eb2e8f9f7 732 struct serial_s *obj_s = SERIAL_S(obj);
<> 144:ef7eb2e8f9f7 733 UART_HandleTypeDef *huart = &uart_handlers[obj_s->index];
<> 144:ef7eb2e8f9f7 734
<> 144:ef7eb2e8f9f7 735 volatile int return_event = 0;
<> 144:ef7eb2e8f9f7 736 uint8_t *buf = (uint8_t*)(obj->rx_buff.buffer);
<> 144:ef7eb2e8f9f7 737 uint8_t i = 0;
<> 144:ef7eb2e8f9f7 738
<> 144:ef7eb2e8f9f7 739 // TX PART:
<> 144:ef7eb2e8f9f7 740 if (__HAL_UART_GET_FLAG(huart, UART_FLAG_TC) != RESET) {
<> 144:ef7eb2e8f9f7 741 if (__HAL_UART_GET_IT_SOURCE(huart, UART_IT_TC) != RESET) {
<> 144:ef7eb2e8f9f7 742 // Return event SERIAL_EVENT_TX_COMPLETE if requested
<> 144:ef7eb2e8f9f7 743 if ((obj_s->events & SERIAL_EVENT_TX_COMPLETE ) != 0) {
<> 144:ef7eb2e8f9f7 744 return_event |= (SERIAL_EVENT_TX_COMPLETE & obj_s->events);
<> 144:ef7eb2e8f9f7 745 }
<> 144:ef7eb2e8f9f7 746 }
<> 144:ef7eb2e8f9f7 747 }
<> 144:ef7eb2e8f9f7 748
<> 144:ef7eb2e8f9f7 749 // Handle error events
<> 144:ef7eb2e8f9f7 750 if (__HAL_UART_GET_FLAG(huart, UART_FLAG_PE) != RESET) {
<> 144:ef7eb2e8f9f7 751 if (__HAL_UART_GET_IT_SOURCE(huart, USART_IT_ERR) != RESET) {
<> 144:ef7eb2e8f9f7 752 return_event |= (SERIAL_EVENT_RX_PARITY_ERROR & obj_s->events);
<> 144:ef7eb2e8f9f7 753 }
<> 144:ef7eb2e8f9f7 754 }
<> 144:ef7eb2e8f9f7 755
<> 144:ef7eb2e8f9f7 756 if (__HAL_UART_GET_FLAG(huart, UART_FLAG_FE) != RESET) {
<> 144:ef7eb2e8f9f7 757 if (__HAL_UART_GET_IT_SOURCE(huart, USART_IT_ERR) != RESET) {
<> 144:ef7eb2e8f9f7 758 return_event |= (SERIAL_EVENT_RX_FRAMING_ERROR & obj_s->events);
<> 144:ef7eb2e8f9f7 759 }
<> 144:ef7eb2e8f9f7 760 }
<> 144:ef7eb2e8f9f7 761
<> 144:ef7eb2e8f9f7 762 if (__HAL_UART_GET_FLAG(huart, UART_FLAG_ORE) != RESET) {
<> 144:ef7eb2e8f9f7 763 if (__HAL_UART_GET_IT_SOURCE(huart, USART_IT_ERR) != RESET) {
<> 144:ef7eb2e8f9f7 764 return_event |= (SERIAL_EVENT_RX_OVERRUN_ERROR & obj_s->events);
<> 144:ef7eb2e8f9f7 765 }
<> 144:ef7eb2e8f9f7 766 }
<> 144:ef7eb2e8f9f7 767
<> 144:ef7eb2e8f9f7 768 HAL_UART_IRQHandler(huart);
<> 144:ef7eb2e8f9f7 769
<> 144:ef7eb2e8f9f7 770 // Abort if an error occurs
<> 144:ef7eb2e8f9f7 771 if (return_event & SERIAL_EVENT_RX_PARITY_ERROR ||
<> 144:ef7eb2e8f9f7 772 return_event & SERIAL_EVENT_RX_FRAMING_ERROR ||
<> 144:ef7eb2e8f9f7 773 return_event & SERIAL_EVENT_RX_OVERRUN_ERROR) {
<> 144:ef7eb2e8f9f7 774 return return_event;
<> 144:ef7eb2e8f9f7 775 }
<> 144:ef7eb2e8f9f7 776
<> 144:ef7eb2e8f9f7 777 //RX PART
<> 144:ef7eb2e8f9f7 778 if (huart->RxXferSize != 0) {
<> 144:ef7eb2e8f9f7 779 obj->rx_buff.pos = huart->RxXferSize - huart->RxXferCount;
<> 144:ef7eb2e8f9f7 780 }
<> 144:ef7eb2e8f9f7 781 if ((huart->RxXferCount == 0) && (obj->rx_buff.pos >= (obj->rx_buff.length - 1))) {
<> 144:ef7eb2e8f9f7 782 return_event |= (SERIAL_EVENT_RX_COMPLETE & obj_s->events);
<> 144:ef7eb2e8f9f7 783 }
<> 144:ef7eb2e8f9f7 784
<> 144:ef7eb2e8f9f7 785 // Check if char_match is present
<> 144:ef7eb2e8f9f7 786 if (obj_s->events & SERIAL_EVENT_RX_CHARACTER_MATCH) {
<> 144:ef7eb2e8f9f7 787 if (buf != NULL) {
<> 144:ef7eb2e8f9f7 788 for (i = 0; i < obj->rx_buff.pos; i++) {
<> 144:ef7eb2e8f9f7 789 if (buf[i] == obj->char_match) {
<> 144:ef7eb2e8f9f7 790 obj->rx_buff.pos = i;
<> 144:ef7eb2e8f9f7 791 return_event |= (SERIAL_EVENT_RX_CHARACTER_MATCH & obj_s->events);
<> 144:ef7eb2e8f9f7 792 serial_rx_abort_asynch(obj);
<> 144:ef7eb2e8f9f7 793 break;
<> 144:ef7eb2e8f9f7 794 }
<> 144:ef7eb2e8f9f7 795 }
<> 144:ef7eb2e8f9f7 796 }
<> 144:ef7eb2e8f9f7 797 }
<> 144:ef7eb2e8f9f7 798
<> 144:ef7eb2e8f9f7 799 return return_event;
<> 144:ef7eb2e8f9f7 800 }
<> 144:ef7eb2e8f9f7 801
<> 144:ef7eb2e8f9f7 802 /**
<> 144:ef7eb2e8f9f7 803 * Abort the ongoing TX transaction. It disables the enabled interupt for TX and
<> 144:ef7eb2e8f9f7 804 * flush TX hardware buffer if TX FIFO is used
<> 144:ef7eb2e8f9f7 805 *
<> 144:ef7eb2e8f9f7 806 * @param obj The serial object
<> 144:ef7eb2e8f9f7 807 */
<> 144:ef7eb2e8f9f7 808 void serial_tx_abort_asynch(serial_t *obj)
<> 144:ef7eb2e8f9f7 809 {
<> 144:ef7eb2e8f9f7 810 struct serial_s *obj_s = SERIAL_S(obj);
<> 144:ef7eb2e8f9f7 811 UART_HandleTypeDef *huart = &uart_handlers[obj_s->index];
<> 144:ef7eb2e8f9f7 812
<> 144:ef7eb2e8f9f7 813 __HAL_UART_DISABLE_IT(huart, UART_IT_TC);
<> 144:ef7eb2e8f9f7 814 __HAL_UART_DISABLE_IT(huart, UART_IT_TXE);
<> 144:ef7eb2e8f9f7 815
<> 144:ef7eb2e8f9f7 816 // clear flags
<> 144:ef7eb2e8f9f7 817 __HAL_UART_CLEAR_FLAG(huart, UART_FLAG_TC);
<> 144:ef7eb2e8f9f7 818
<> 144:ef7eb2e8f9f7 819 // reset states
<> 144:ef7eb2e8f9f7 820 huart->TxXferCount = 0;
<> 144:ef7eb2e8f9f7 821 // update handle state
<> 144:ef7eb2e8f9f7 822 if(huart->State == HAL_UART_STATE_BUSY_TX_RX) {
<> 144:ef7eb2e8f9f7 823 huart->State = HAL_UART_STATE_BUSY_RX;
<> 144:ef7eb2e8f9f7 824 } else {
<> 144:ef7eb2e8f9f7 825 huart->State = HAL_UART_STATE_READY;
<> 144:ef7eb2e8f9f7 826 }
<> 144:ef7eb2e8f9f7 827 }
<> 144:ef7eb2e8f9f7 828
<> 144:ef7eb2e8f9f7 829 /**
<> 144:ef7eb2e8f9f7 830 * Abort the ongoing RX transaction It disables the enabled interrupt for RX and
<> 144:ef7eb2e8f9f7 831 * flush RX hardware buffer if RX FIFO is used
<> 144:ef7eb2e8f9f7 832 *
<> 144:ef7eb2e8f9f7 833 * @param obj The serial object
<> 144:ef7eb2e8f9f7 834 */
<> 144:ef7eb2e8f9f7 835 void serial_rx_abort_asynch(serial_t *obj)
<> 144:ef7eb2e8f9f7 836 {
<> 144:ef7eb2e8f9f7 837 struct serial_s *obj_s = SERIAL_S(obj);
<> 144:ef7eb2e8f9f7 838 UART_HandleTypeDef *huart = &uart_handlers[obj_s->index];
<> 144:ef7eb2e8f9f7 839
<> 144:ef7eb2e8f9f7 840 // disable interrupts
<> 144:ef7eb2e8f9f7 841 __HAL_UART_DISABLE_IT(huart, UART_IT_RXNE);
<> 144:ef7eb2e8f9f7 842 __HAL_UART_DISABLE_IT(huart, UART_IT_PE);
<> 144:ef7eb2e8f9f7 843 __HAL_UART_DISABLE_IT(huart, UART_IT_ERR);
<> 144:ef7eb2e8f9f7 844
<> 144:ef7eb2e8f9f7 845 // clear flags
<> 144:ef7eb2e8f9f7 846 __HAL_UART_CLEAR_FLAG(huart, UART_FLAG_RXNE);
<> 144:ef7eb2e8f9f7 847 volatile uint32_t tmpval = huart->Instance->DR; // Clear errors flag
<> 144:ef7eb2e8f9f7 848
<> 144:ef7eb2e8f9f7 849 // reset states
<> 144:ef7eb2e8f9f7 850 huart->RxXferCount = 0;
<> 144:ef7eb2e8f9f7 851 // update handle state
<> 144:ef7eb2e8f9f7 852 if(huart->State == HAL_UART_STATE_BUSY_TX_RX) {
<> 144:ef7eb2e8f9f7 853 huart->State = HAL_UART_STATE_BUSY_TX;
<> 144:ef7eb2e8f9f7 854 } else {
<> 144:ef7eb2e8f9f7 855 huart->State = HAL_UART_STATE_READY;
<> 144:ef7eb2e8f9f7 856 }
<> 144:ef7eb2e8f9f7 857 }
<> 144:ef7eb2e8f9f7 858
<> 144:ef7eb2e8f9f7 859 #endif
<> 144:ef7eb2e8f9f7 860
<> 144:ef7eb2e8f9f7 861 #if DEVICE_SERIAL_FC
<> 144:ef7eb2e8f9f7 862
<> 144:ef7eb2e8f9f7 863 /**
<> 144:ef7eb2e8f9f7 864 * Set HW Control Flow
<> 144:ef7eb2e8f9f7 865 * @param obj The serial object
<> 144:ef7eb2e8f9f7 866 * @param type The Control Flow type (FlowControlNone, FlowControlRTS, FlowControlCTS, FlowControlRTSCTS)
<> 144:ef7eb2e8f9f7 867 * @param rxflow Pin for the rxflow
<> 144:ef7eb2e8f9f7 868 * @param txflow Pin for the txflow
<> 144:ef7eb2e8f9f7 869 */
<> 144:ef7eb2e8f9f7 870 void serial_set_flow_control(serial_t *obj, FlowControl type, PinName rxflow, PinName txflow)
<> 144:ef7eb2e8f9f7 871 {
<> 144:ef7eb2e8f9f7 872 struct serial_s *obj_s = SERIAL_S(obj);
<> 144:ef7eb2e8f9f7 873
<> 144:ef7eb2e8f9f7 874 // Determine the UART to use (UART_1, UART_2, ...)
<> 144:ef7eb2e8f9f7 875 UARTName uart_rts = (UARTName)pinmap_peripheral(rxflow, PinMap_UART_RTS);
<> 144:ef7eb2e8f9f7 876 UARTName uart_cts = (UARTName)pinmap_peripheral(txflow, PinMap_UART_CTS);
<> 144:ef7eb2e8f9f7 877
<> 144:ef7eb2e8f9f7 878 // Get the peripheral name (UART_1, UART_2, ...) from the pin and assign it to the object
<> 144:ef7eb2e8f9f7 879 obj_s->uart = (UARTName)pinmap_merge(uart_cts, uart_rts);
<> 144:ef7eb2e8f9f7 880 MBED_ASSERT(obj_s->uart != (UARTName)NC);
<> 144:ef7eb2e8f9f7 881
<> 144:ef7eb2e8f9f7 882 if(type == FlowControlNone) {
<> 144:ef7eb2e8f9f7 883 // Disable hardware flow control
<> 144:ef7eb2e8f9f7 884 obj_s->hw_flow_ctl = UART_HWCONTROL_NONE;
<> 144:ef7eb2e8f9f7 885 }
<> 144:ef7eb2e8f9f7 886 if (type == FlowControlRTS) {
<> 144:ef7eb2e8f9f7 887 // Enable RTS
<> 144:ef7eb2e8f9f7 888 MBED_ASSERT(uart_rts != (UARTName)NC);
<> 144:ef7eb2e8f9f7 889 obj_s->hw_flow_ctl = UART_HWCONTROL_RTS;
<> 144:ef7eb2e8f9f7 890 obj_s->pin_rts = rxflow;
<> 144:ef7eb2e8f9f7 891 // Enable the pin for RTS function
<> 144:ef7eb2e8f9f7 892 pinmap_pinout(rxflow, PinMap_UART_RTS);
<> 144:ef7eb2e8f9f7 893 }
<> 144:ef7eb2e8f9f7 894 if (type == FlowControlCTS) {
<> 144:ef7eb2e8f9f7 895 // Enable CTS
<> 144:ef7eb2e8f9f7 896 MBED_ASSERT(uart_cts != (UARTName)NC);
<> 144:ef7eb2e8f9f7 897 obj_s->hw_flow_ctl = UART_HWCONTROL_CTS;
<> 144:ef7eb2e8f9f7 898 obj_s->pin_cts = txflow;
<> 144:ef7eb2e8f9f7 899 // Enable the pin for CTS function
<> 144:ef7eb2e8f9f7 900 pinmap_pinout(txflow, PinMap_UART_CTS);
<> 144:ef7eb2e8f9f7 901 }
<> 144:ef7eb2e8f9f7 902 if (type == FlowControlRTSCTS) {
<> 144:ef7eb2e8f9f7 903 // Enable CTS & RTS
<> 144:ef7eb2e8f9f7 904 MBED_ASSERT(uart_rts != (UARTName)NC);
<> 144:ef7eb2e8f9f7 905 MBED_ASSERT(uart_cts != (UARTName)NC);
<> 144:ef7eb2e8f9f7 906 obj_s->hw_flow_ctl = UART_HWCONTROL_RTS_CTS;
<> 144:ef7eb2e8f9f7 907 obj_s->pin_rts = rxflow;
<> 144:ef7eb2e8f9f7 908 obj_s->pin_cts = txflow;
<> 144:ef7eb2e8f9f7 909 // Enable the pin for CTS function
<> 144:ef7eb2e8f9f7 910 pinmap_pinout(txflow, PinMap_UART_CTS);
<> 144:ef7eb2e8f9f7 911 // Enable the pin for RTS function
<> 144:ef7eb2e8f9f7 912 pinmap_pinout(rxflow, PinMap_UART_RTS);
<> 144:ef7eb2e8f9f7 913 }
<> 144:ef7eb2e8f9f7 914
<> 144:ef7eb2e8f9f7 915 init_uart(obj);
<> 144:ef7eb2e8f9f7 916 }
<> 144:ef7eb2e8f9f7 917
<> 144:ef7eb2e8f9f7 918 #endif
<> 144:ef7eb2e8f9f7 919
<> 144:ef7eb2e8f9f7 920 #endif