Johannes Stratmann / mbed-dev

Fork of mbed-dev by mbed official

Committer:
JojoS
Date:
Sat Sep 10 15:32:04 2016 +0000
Revision:
147:ba84b7dc41a7
Parent:
144:ef7eb2e8f9f7
added prescaler for 16 bit timers (solution as in LPC11xx), default prescaler 31 for max 28 ms period time

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