mbed library sources. Supersedes mbed-src.

Dependents:   Nucleo_Hello_Encoder BLE_iBeaconScan AM1805_DEMO DISCO-F429ZI_ExportTemplate1 ... more

Committer:
AnnaBridge
Date:
Thu Nov 08 11:46:34 2018 +0000
Revision:
188:bcfe06ba3d64
Parent:
187:0387e8f68319
Child:
189:f392fc9709a3
mbed-dev library. Release version 164

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AnnaBridge 167:e84263d55307 1 /* mbed Microcontroller Library
AnnaBridge 167:e84263d55307 2 *******************************************************************************
Anna Bridge 180:96ed750bd169 3 * Copyright (c) 2017, STMicroelectronics
AnnaBridge 167:e84263d55307 4 * All rights reserved.
AnnaBridge 167:e84263d55307 5 *
AnnaBridge 167:e84263d55307 6 * Redistribution and use in source and binary forms, with or without
AnnaBridge 167:e84263d55307 7 * modification, are permitted provided that the following conditions are met:
AnnaBridge 167:e84263d55307 8 *
AnnaBridge 167:e84263d55307 9 * 1. Redistributions of source code must retain the above copyright notice,
AnnaBridge 167:e84263d55307 10 * this list of conditions and the following disclaimer.
AnnaBridge 167:e84263d55307 11 * 2. Redistributions in binary form must reproduce the above copyright notice,
AnnaBridge 167:e84263d55307 12 * this list of conditions and the following disclaimer in the documentation
AnnaBridge 167:e84263d55307 13 * and/or other materials provided with the distribution.
AnnaBridge 167:e84263d55307 14 * 3. Neither the name of STMicroelectronics nor the names of its contributors
AnnaBridge 167:e84263d55307 15 * may be used to endorse or promote products derived from this software
AnnaBridge 167:e84263d55307 16 * without specific prior written permission.
AnnaBridge 167:e84263d55307 17 *
AnnaBridge 167:e84263d55307 18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AnnaBridge 167:e84263d55307 19 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
AnnaBridge 167:e84263d55307 20 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
AnnaBridge 167:e84263d55307 21 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
AnnaBridge 167:e84263d55307 22 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
AnnaBridge 167:e84263d55307 23 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
AnnaBridge 167:e84263d55307 24 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
AnnaBridge 167:e84263d55307 25 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
AnnaBridge 167:e84263d55307 26 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
AnnaBridge 167:e84263d55307 27 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
AnnaBridge 167:e84263d55307 28 *******************************************************************************
AnnaBridge 167:e84263d55307 29 */
AnnaBridge 167:e84263d55307 30
AnnaBridge 167:e84263d55307 31 #if DEVICE_SERIAL
AnnaBridge 167:e84263d55307 32
Anna Bridge 180:96ed750bd169 33 #include "serial_api_hal.h"
Anna Bridge 180:96ed750bd169 34
AnnaBridge 187:0387e8f68319 35 // Possible choices of the LPUART_CLOCK_SOURCE configuration set in json file
AnnaBridge 187:0387e8f68319 36 #define USE_LPUART_CLK_LSE 0x01
AnnaBridge 187:0387e8f68319 37 #define USE_LPUART_CLK_PCLK1 0x02
AnnaBridge 187:0387e8f68319 38 #define USE_LPUART_CLK_HSI 0x04
AnnaBridge 187:0387e8f68319 39
Anna Bridge 180:96ed750bd169 40 int stdio_uart_inited = 0; // used in platform/mbed_board.c and platform/mbed_retarget.cpp
Anna Bridge 180:96ed750bd169 41 serial_t stdio_uart;
Anna Bridge 180:96ed750bd169 42
Anna Bridge 180:96ed750bd169 43 extern UART_HandleTypeDef uart_handlers[];
Anna Bridge 180:96ed750bd169 44 extern uint32_t serial_irq_ids[];
Anna Bridge 180:96ed750bd169 45
AnnaBridge 181:57724642e740 46 // Utility functions
AnnaBridge 181:57724642e740 47 HAL_StatusTypeDef init_uart(serial_t *obj);
AnnaBridge 181:57724642e740 48 int8_t get_uart_index(UARTName uart_name);
AnnaBridge 181:57724642e740 49
Anna Bridge 180:96ed750bd169 50 void serial_init(serial_t *obj, PinName tx, PinName rx)
Anna Bridge 180:96ed750bd169 51 {
Anna Bridge 180:96ed750bd169 52 struct serial_s *obj_s = SERIAL_S(obj);
AnnaBridge 181:57724642e740 53 uint8_t stdio_config = 0;
Anna Bridge 180:96ed750bd169 54
Anna Bridge 180:96ed750bd169 55 // Determine the UART to use (UART_1, UART_2, ...)
Anna Bridge 180:96ed750bd169 56 UARTName uart_tx = (UARTName)pinmap_peripheral(tx, PinMap_UART_TX);
Anna Bridge 180:96ed750bd169 57 UARTName uart_rx = (UARTName)pinmap_peripheral(rx, PinMap_UART_RX);
Anna Bridge 180:96ed750bd169 58
Anna Bridge 180:96ed750bd169 59 // Get the peripheral name (UART_1, UART_2, ...) from the pin and assign it to the object
Anna Bridge 180:96ed750bd169 60 obj_s->uart = (UARTName)pinmap_merge(uart_tx, uart_rx);
Anna Bridge 180:96ed750bd169 61 MBED_ASSERT(obj_s->uart != (UARTName)NC);
Anna Bridge 180:96ed750bd169 62
AnnaBridge 181:57724642e740 63 if ((tx == STDIO_UART_TX) || (rx == STDIO_UART_RX)) {
AnnaBridge 181:57724642e740 64 stdio_config = 1;
AnnaBridge 187:0387e8f68319 65 } else {
AnnaBridge 181:57724642e740 66 if (uart_tx == pinmap_peripheral(STDIO_UART_TX, PinMap_UART_TX)) {
AnnaBridge 181:57724642e740 67 error("Error: new serial object is using same UART as STDIO");
AnnaBridge 181:57724642e740 68 }
AnnaBridge 181:57724642e740 69 }
AnnaBridge 181:57724642e740 70
AnnaBridge 181:57724642e740 71 // Reset and enable clock
Anna Bridge 180:96ed750bd169 72 #if defined(USART1_BASE)
Anna Bridge 180:96ed750bd169 73 if (obj_s->uart == UART_1) {
Anna Bridge 180:96ed750bd169 74 __HAL_RCC_USART1_CLK_ENABLE();
Anna Bridge 180:96ed750bd169 75 }
Anna Bridge 180:96ed750bd169 76 #endif
Anna Bridge 180:96ed750bd169 77
Anna Bridge 180:96ed750bd169 78 #if defined (USART2_BASE)
Anna Bridge 180:96ed750bd169 79 if (obj_s->uart == UART_2) {
Anna Bridge 180:96ed750bd169 80 __HAL_RCC_USART2_CLK_ENABLE();
Anna Bridge 180:96ed750bd169 81 }
Anna Bridge 180:96ed750bd169 82 #endif
Anna Bridge 180:96ed750bd169 83
Anna Bridge 180:96ed750bd169 84 #if defined(USART3_BASE)
Anna Bridge 180:96ed750bd169 85 if (obj_s->uart == UART_3) {
Anna Bridge 180:96ed750bd169 86 __HAL_RCC_USART3_CLK_ENABLE();
Anna Bridge 180:96ed750bd169 87 }
Anna Bridge 180:96ed750bd169 88 #endif
Anna Bridge 180:96ed750bd169 89
Anna Bridge 180:96ed750bd169 90 #if defined(UART4_BASE)
Anna Bridge 180:96ed750bd169 91 if (obj_s->uart == UART_4) {
Anna Bridge 180:96ed750bd169 92 __HAL_RCC_UART4_CLK_ENABLE();
Anna Bridge 180:96ed750bd169 93 }
Anna Bridge 180:96ed750bd169 94 #endif
Anna Bridge 180:96ed750bd169 95
Anna Bridge 180:96ed750bd169 96 #if defined(USART4_BASE)
Anna Bridge 180:96ed750bd169 97 if (obj_s->uart == UART_4) {
Anna Bridge 180:96ed750bd169 98 __HAL_RCC_USART4_CLK_ENABLE();
Anna Bridge 180:96ed750bd169 99 }
Anna Bridge 180:96ed750bd169 100 #endif
Anna Bridge 180:96ed750bd169 101
Anna Bridge 180:96ed750bd169 102 #if defined(UART5_BASE)
Anna Bridge 180:96ed750bd169 103 if (obj_s->uart == UART_5) {
Anna Bridge 180:96ed750bd169 104 __HAL_RCC_UART5_CLK_ENABLE();
Anna Bridge 180:96ed750bd169 105 }
Anna Bridge 180:96ed750bd169 106 #endif
Anna Bridge 180:96ed750bd169 107
Anna Bridge 180:96ed750bd169 108 #if defined(USART5_BASE)
Anna Bridge 180:96ed750bd169 109 if (obj_s->uart == UART_5) {
Anna Bridge 180:96ed750bd169 110 __HAL_RCC_USART5_CLK_ENABLE();
Anna Bridge 180:96ed750bd169 111 }
Anna Bridge 180:96ed750bd169 112 #endif
Anna Bridge 180:96ed750bd169 113
Anna Bridge 180:96ed750bd169 114 #if defined(USART6_BASE)
Anna Bridge 180:96ed750bd169 115 if (obj_s->uart == UART_6) {
Anna Bridge 180:96ed750bd169 116 __HAL_RCC_USART6_CLK_ENABLE();
Anna Bridge 180:96ed750bd169 117 }
Anna Bridge 180:96ed750bd169 118 #endif
Anna Bridge 180:96ed750bd169 119
Anna Bridge 180:96ed750bd169 120 #if defined(UART7_BASE)
Anna Bridge 180:96ed750bd169 121 if (obj_s->uart == UART_7) {
Anna Bridge 180:96ed750bd169 122 __HAL_RCC_UART7_CLK_ENABLE();
Anna Bridge 180:96ed750bd169 123 }
Anna Bridge 180:96ed750bd169 124 #endif
Anna Bridge 180:96ed750bd169 125
Anna Bridge 180:96ed750bd169 126 #if defined(USART7_BASE)
Anna Bridge 180:96ed750bd169 127 if (obj_s->uart == UART_7) {
Anna Bridge 180:96ed750bd169 128 __HAL_RCC_USART7_CLK_ENABLE();
Anna Bridge 180:96ed750bd169 129 }
Anna Bridge 180:96ed750bd169 130 #endif
Anna Bridge 180:96ed750bd169 131
Anna Bridge 180:96ed750bd169 132 #if defined(UART8_BASE)
Anna Bridge 180:96ed750bd169 133 if (obj_s->uart == UART_8) {
Anna Bridge 180:96ed750bd169 134 __HAL_RCC_UART8_CLK_ENABLE();
Anna Bridge 180:96ed750bd169 135 }
Anna Bridge 180:96ed750bd169 136 #endif
Anna Bridge 180:96ed750bd169 137
Anna Bridge 180:96ed750bd169 138 #if defined(USART8_BASE)
Anna Bridge 180:96ed750bd169 139 if (obj_s->uart == UART_8) {
Anna Bridge 180:96ed750bd169 140 __HAL_RCC_USART8_CLK_ENABLE();
Anna Bridge 180:96ed750bd169 141 }
Anna Bridge 180:96ed750bd169 142 #endif
Anna Bridge 180:96ed750bd169 143
Anna Bridge 180:96ed750bd169 144 #if defined(UART9_BASE)
Anna Bridge 180:96ed750bd169 145 if (obj_s->uart == UART_9) {
Anna Bridge 180:96ed750bd169 146 __HAL_RCC_UART9_CLK_ENABLE();
Anna Bridge 180:96ed750bd169 147 }
Anna Bridge 180:96ed750bd169 148 #endif
Anna Bridge 180:96ed750bd169 149
Anna Bridge 180:96ed750bd169 150 #if defined(UART10_BASE)
Anna Bridge 180:96ed750bd169 151 if (obj_s->uart == UART_10) {
Anna Bridge 180:96ed750bd169 152 __HAL_RCC_UART10_CLK_ENABLE();
Anna Bridge 180:96ed750bd169 153 }
Anna Bridge 180:96ed750bd169 154 #endif
Anna Bridge 180:96ed750bd169 155
Anna Bridge 180:96ed750bd169 156 #if defined(LPUART1_BASE)
Anna Bridge 180:96ed750bd169 157 if (obj_s->uart == LPUART_1) {
Anna Bridge 180:96ed750bd169 158 __HAL_RCC_LPUART1_CLK_ENABLE();
Anna Bridge 180:96ed750bd169 159 }
Anna Bridge 180:96ed750bd169 160 #endif
Anna Bridge 180:96ed750bd169 161
AnnaBridge 181:57724642e740 162 // Assign serial object index
AnnaBridge 181:57724642e740 163 obj_s->index = get_uart_index(obj_s->uart);
AnnaBridge 181:57724642e740 164 MBED_ASSERT(obj_s->index >= 0);
AnnaBridge 181:57724642e740 165
Anna Bridge 180:96ed750bd169 166 // Configure UART pins
Anna Bridge 180:96ed750bd169 167 pinmap_pinout(tx, PinMap_UART_TX);
Anna Bridge 180:96ed750bd169 168 pinmap_pinout(rx, PinMap_UART_RX);
Anna Bridge 180:96ed750bd169 169
Anna Bridge 180:96ed750bd169 170 if (tx != NC) {
Anna Bridge 180:96ed750bd169 171 pin_mode(tx, PullUp);
Anna Bridge 180:96ed750bd169 172 }
Anna Bridge 180:96ed750bd169 173 if (rx != NC) {
Anna Bridge 180:96ed750bd169 174 pin_mode(rx, PullUp);
Anna Bridge 180:96ed750bd169 175 }
Anna Bridge 180:96ed750bd169 176
Anna Bridge 180:96ed750bd169 177 // Configure UART
Anna Bridge 180:96ed750bd169 178 obj_s->baudrate = 9600; // baudrate default value
AnnaBridge 181:57724642e740 179 if (stdio_config) {
Anna Bridge 180:96ed750bd169 180 #if MBED_CONF_PLATFORM_STDIO_BAUD_RATE
Anna Bridge 180:96ed750bd169 181 obj_s->baudrate = MBED_CONF_PLATFORM_STDIO_BAUD_RATE; // baudrate takes value from platform/mbed_lib.json
Anna Bridge 180:96ed750bd169 182 #endif /* MBED_CONF_PLATFORM_STDIO_BAUD_RATE */
AnnaBridge 187:0387e8f68319 183 } else {
Anna Bridge 180:96ed750bd169 184 #if MBED_CONF_PLATFORM_DEFAULT_SERIAL_BAUD_RATE
Anna Bridge 180:96ed750bd169 185 obj_s->baudrate = MBED_CONF_PLATFORM_DEFAULT_SERIAL_BAUD_RATE; // baudrate takes value from platform/mbed_lib.json
Anna Bridge 180:96ed750bd169 186 #endif /* MBED_CONF_PLATFORM_DEFAULT_SERIAL_BAUD_RATE */
Anna Bridge 180:96ed750bd169 187 }
Anna Bridge 180:96ed750bd169 188 obj_s->databits = UART_WORDLENGTH_8B;
Anna Bridge 180:96ed750bd169 189 obj_s->stopbits = UART_STOPBITS_1;
Anna Bridge 180:96ed750bd169 190 obj_s->parity = UART_PARITY_NONE;
Anna Bridge 180:96ed750bd169 191
Anna Bridge 180:96ed750bd169 192 #if DEVICE_SERIAL_FC
Anna Bridge 180:96ed750bd169 193 obj_s->hw_flow_ctl = UART_HWCONTROL_NONE;
Anna Bridge 180:96ed750bd169 194 #endif
Anna Bridge 180:96ed750bd169 195
Anna Bridge 180:96ed750bd169 196 obj_s->pin_tx = tx;
Anna Bridge 180:96ed750bd169 197 obj_s->pin_rx = rx;
Anna Bridge 180:96ed750bd169 198
Anna Bridge 180:96ed750bd169 199 init_uart(obj); /* init_uart will be called again in serial_baud function, so don't worry if init_uart returns HAL_ERROR */
Anna Bridge 180:96ed750bd169 200
AnnaBridge 181:57724642e740 201 // For stdio management in platform/mbed_board.c and platform/mbed_retarget.cpp
AnnaBridge 181:57724642e740 202 if (stdio_config) {
Anna Bridge 180:96ed750bd169 203 stdio_uart_inited = 1;
Anna Bridge 180:96ed750bd169 204 memcpy(&stdio_uart, obj, sizeof(serial_t));
Anna Bridge 180:96ed750bd169 205 }
Anna Bridge 180:96ed750bd169 206 }
Anna Bridge 180:96ed750bd169 207
Anna Bridge 180:96ed750bd169 208 void serial_free(serial_t *obj)
Anna Bridge 180:96ed750bd169 209 {
Anna Bridge 180:96ed750bd169 210 struct serial_s *obj_s = SERIAL_S(obj);
Anna Bridge 180:96ed750bd169 211
Anna Bridge 180:96ed750bd169 212 // Reset UART and disable clock
Anna Bridge 180:96ed750bd169 213 #if defined(USART1_BASE)
Anna Bridge 180:96ed750bd169 214 if (obj_s->uart == UART_1) {
Anna Bridge 180:96ed750bd169 215 __HAL_RCC_USART1_FORCE_RESET();
Anna Bridge 180:96ed750bd169 216 __HAL_RCC_USART1_RELEASE_RESET();
Anna Bridge 180:96ed750bd169 217 __HAL_RCC_USART1_CLK_DISABLE();
Anna Bridge 180:96ed750bd169 218 }
Anna Bridge 180:96ed750bd169 219 #endif
Anna Bridge 180:96ed750bd169 220
Anna Bridge 180:96ed750bd169 221 #if defined(USART2_BASE)
Anna Bridge 180:96ed750bd169 222 if (obj_s->uart == UART_2) {
Anna Bridge 180:96ed750bd169 223 __HAL_RCC_USART2_FORCE_RESET();
Anna Bridge 180:96ed750bd169 224 __HAL_RCC_USART2_RELEASE_RESET();
Anna Bridge 180:96ed750bd169 225 __HAL_RCC_USART2_CLK_DISABLE();
Anna Bridge 180:96ed750bd169 226 }
Anna Bridge 180:96ed750bd169 227 #endif
Anna Bridge 180:96ed750bd169 228
Anna Bridge 180:96ed750bd169 229 #if defined(USART3_BASE)
Anna Bridge 180:96ed750bd169 230 if (obj_s->uart == UART_3) {
Anna Bridge 180:96ed750bd169 231 __HAL_RCC_USART3_FORCE_RESET();
Anna Bridge 180:96ed750bd169 232 __HAL_RCC_USART3_RELEASE_RESET();
Anna Bridge 180:96ed750bd169 233 __HAL_RCC_USART3_CLK_DISABLE();
Anna Bridge 180:96ed750bd169 234 }
Anna Bridge 180:96ed750bd169 235 #endif
Anna Bridge 180:96ed750bd169 236
Anna Bridge 180:96ed750bd169 237 #if defined(UART4_BASE)
Anna Bridge 180:96ed750bd169 238 if (obj_s->uart == UART_4) {
Anna Bridge 180:96ed750bd169 239 __HAL_RCC_UART4_FORCE_RESET();
Anna Bridge 180:96ed750bd169 240 __HAL_RCC_UART4_RELEASE_RESET();
Anna Bridge 180:96ed750bd169 241 __HAL_RCC_UART4_CLK_DISABLE();
Anna Bridge 180:96ed750bd169 242 }
Anna Bridge 180:96ed750bd169 243 #endif
Anna Bridge 180:96ed750bd169 244
Anna Bridge 180:96ed750bd169 245 #if defined(USART4_BASE)
Anna Bridge 180:96ed750bd169 246 if (obj_s->uart == UART_4) {
Anna Bridge 180:96ed750bd169 247 __HAL_RCC_USART4_FORCE_RESET();
Anna Bridge 180:96ed750bd169 248 __HAL_RCC_USART4_RELEASE_RESET();
Anna Bridge 180:96ed750bd169 249 __HAL_RCC_USART4_CLK_DISABLE();
Anna Bridge 180:96ed750bd169 250 }
Anna Bridge 180:96ed750bd169 251 #endif
Anna Bridge 180:96ed750bd169 252
Anna Bridge 180:96ed750bd169 253 #if defined(UART5_BASE)
Anna Bridge 180:96ed750bd169 254 if (obj_s->uart == UART_5) {
Anna Bridge 180:96ed750bd169 255 __HAL_RCC_UART5_FORCE_RESET();
Anna Bridge 180:96ed750bd169 256 __HAL_RCC_UART5_RELEASE_RESET();
Anna Bridge 180:96ed750bd169 257 __HAL_RCC_UART5_CLK_DISABLE();
Anna Bridge 180:96ed750bd169 258 }
Anna Bridge 180:96ed750bd169 259 #endif
Anna Bridge 180:96ed750bd169 260
Anna Bridge 180:96ed750bd169 261 #if defined(USART5_BASE)
Anna Bridge 180:96ed750bd169 262 if (obj_s->uart == UART_5) {
Anna Bridge 180:96ed750bd169 263 __HAL_RCC_USART5_FORCE_RESET();
Anna Bridge 180:96ed750bd169 264 __HAL_RCC_USART5_RELEASE_RESET();
Anna Bridge 180:96ed750bd169 265 __HAL_RCC_USART5_CLK_DISABLE();
Anna Bridge 180:96ed750bd169 266 }
Anna Bridge 180:96ed750bd169 267 #endif
Anna Bridge 180:96ed750bd169 268
Anna Bridge 180:96ed750bd169 269 #if defined(USART6_BASE)
Anna Bridge 180:96ed750bd169 270 if (obj_s->uart == UART_6) {
Anna Bridge 180:96ed750bd169 271 __HAL_RCC_USART6_FORCE_RESET();
Anna Bridge 180:96ed750bd169 272 __HAL_RCC_USART6_RELEASE_RESET();
Anna Bridge 180:96ed750bd169 273 __HAL_RCC_USART6_CLK_DISABLE();
Anna Bridge 180:96ed750bd169 274 }
Anna Bridge 180:96ed750bd169 275 #endif
Anna Bridge 180:96ed750bd169 276
Anna Bridge 180:96ed750bd169 277 #if defined(UART7_BASE)
Anna Bridge 180:96ed750bd169 278 if (obj_s->uart == UART_7) {
Anna Bridge 180:96ed750bd169 279 __HAL_RCC_UART7_FORCE_RESET();
Anna Bridge 180:96ed750bd169 280 __HAL_RCC_UART7_RELEASE_RESET();
Anna Bridge 180:96ed750bd169 281 __HAL_RCC_UART7_CLK_DISABLE();
Anna Bridge 180:96ed750bd169 282 }
Anna Bridge 180:96ed750bd169 283 #endif
Anna Bridge 180:96ed750bd169 284
Anna Bridge 180:96ed750bd169 285 #if defined(USART7_BASE)
Anna Bridge 180:96ed750bd169 286 if (obj_s->uart == UART_7) {
Anna Bridge 180:96ed750bd169 287 __HAL_RCC_USART7_FORCE_RESET();
Anna Bridge 180:96ed750bd169 288 __HAL_RCC_USART7_RELEASE_RESET();
Anna Bridge 180:96ed750bd169 289 __HAL_RCC_USART7_CLK_DISABLE();
Anna Bridge 180:96ed750bd169 290 }
Anna Bridge 180:96ed750bd169 291 #endif
Anna Bridge 180:96ed750bd169 292
Anna Bridge 180:96ed750bd169 293 #if defined(UART8_BASE)
Anna Bridge 180:96ed750bd169 294 if (obj_s->uart == UART_8) {
Anna Bridge 180:96ed750bd169 295 __HAL_RCC_UART8_FORCE_RESET();
Anna Bridge 180:96ed750bd169 296 __HAL_RCC_UART8_RELEASE_RESET();
Anna Bridge 180:96ed750bd169 297 __HAL_RCC_UART8_CLK_DISABLE();
Anna Bridge 180:96ed750bd169 298 }
Anna Bridge 180:96ed750bd169 299 #endif
Anna Bridge 180:96ed750bd169 300
Anna Bridge 180:96ed750bd169 301 #if defined(USART8_BASE)
Anna Bridge 180:96ed750bd169 302 if (obj_s->uart == UART_8) {
Anna Bridge 180:96ed750bd169 303 __HAL_RCC_USART8_FORCE_RESET();
Anna Bridge 180:96ed750bd169 304 __HAL_RCC_USART8_RELEASE_RESET();
Anna Bridge 180:96ed750bd169 305 __HAL_RCC_USART8_CLK_DISABLE();
Anna Bridge 180:96ed750bd169 306 }
Anna Bridge 180:96ed750bd169 307 #endif
Anna Bridge 180:96ed750bd169 308
Anna Bridge 180:96ed750bd169 309 #if defined(UART9_BASE)
Anna Bridge 180:96ed750bd169 310 if (obj_s->uart == UART_9) {
Anna Bridge 180:96ed750bd169 311 __HAL_RCC_UART9_FORCE_RESET();
Anna Bridge 180:96ed750bd169 312 __HAL_RCC_UART9_RELEASE_RESET();
Anna Bridge 180:96ed750bd169 313 __HAL_RCC_UART9_CLK_DISABLE();
Anna Bridge 180:96ed750bd169 314 }
Anna Bridge 180:96ed750bd169 315 #endif
Anna Bridge 180:96ed750bd169 316
Anna Bridge 180:96ed750bd169 317 #if defined(UART10_BASE)
Anna Bridge 180:96ed750bd169 318 if (obj_s->uart == UART_10) {
Anna Bridge 180:96ed750bd169 319 __HAL_RCC_UART10_FORCE_RESET();
Anna Bridge 180:96ed750bd169 320 __HAL_RCC_UART10_RELEASE_RESET();
Anna Bridge 180:96ed750bd169 321 __HAL_RCC_UART10_CLK_DISABLE();
Anna Bridge 180:96ed750bd169 322 }
Anna Bridge 180:96ed750bd169 323 #endif
Anna Bridge 180:96ed750bd169 324
Anna Bridge 180:96ed750bd169 325 #if defined(LPUART1_BASE)
Anna Bridge 180:96ed750bd169 326 if (obj_s->uart == LPUART_1) {
Anna Bridge 180:96ed750bd169 327 __HAL_RCC_LPUART1_FORCE_RESET();
Anna Bridge 180:96ed750bd169 328 __HAL_RCC_LPUART1_RELEASE_RESET();
Anna Bridge 180:96ed750bd169 329 __HAL_RCC_LPUART1_CLK_DISABLE();
Anna Bridge 180:96ed750bd169 330 }
Anna Bridge 180:96ed750bd169 331 #endif
Anna Bridge 180:96ed750bd169 332
Anna Bridge 180:96ed750bd169 333 // Configure GPIOs
Anna Bridge 180:96ed750bd169 334 pin_function(obj_s->pin_tx, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 0));
Anna Bridge 180:96ed750bd169 335 pin_function(obj_s->pin_rx, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 0));
Anna Bridge 180:96ed750bd169 336
Anna Bridge 180:96ed750bd169 337 serial_irq_ids[obj_s->index] = 0;
Anna Bridge 180:96ed750bd169 338 }
Anna Bridge 180:96ed750bd169 339
Anna Bridge 180:96ed750bd169 340 void serial_baud(serial_t *obj, int baudrate)
Anna Bridge 180:96ed750bd169 341 {
Anna Bridge 180:96ed750bd169 342 struct serial_s *obj_s = SERIAL_S(obj);
Anna Bridge 180:96ed750bd169 343
Anna Bridge 180:96ed750bd169 344 obj_s->baudrate = baudrate;
AnnaBridge 187:0387e8f68319 345
Anna Bridge 180:96ed750bd169 346 #if defined(LPUART1_BASE)
AnnaBridge 187:0387e8f68319 347 /* Note that LPUART clock source must be in the range [3 x baud rate, 4096 x baud rate], check Ref Manual */
AnnaBridge 182:a56a73fd2a6f 348 if (obj_s->uart == LPUART_1) {
AnnaBridge 182:a56a73fd2a6f 349 RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
AnnaBridge 187:0387e8f68319 350 PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_LPUART1;
AnnaBridge 187:0387e8f68319 351 #if ((MBED_CONF_TARGET_LPUART_CLOCK_SOURCE) & USE_LPUART_CLK_LSE)
AnnaBridge 187:0387e8f68319 352 if (baudrate <= 9600) {
AnnaBridge 187:0387e8f68319 353 // Enable LSE in case it is not already done
AnnaBridge 187:0387e8f68319 354 if (!__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY)) {
AnnaBridge 187:0387e8f68319 355 RCC_OscInitTypeDef RCC_OscInitStruct = {0};
AnnaBridge 187:0387e8f68319 356 RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSE;
AnnaBridge 188:bcfe06ba3d64 357 RCC_OscInitStruct.LSEState = RCC_LSE_ON;
AnnaBridge 187:0387e8f68319 358 RCC_OscInitStruct.PLL.PLLState = RCC_PLL_OFF;
AnnaBridge 187:0387e8f68319 359 HAL_RCC_OscConfig(&RCC_OscInitStruct);
AnnaBridge 187:0387e8f68319 360 }
AnnaBridge 187:0387e8f68319 361 // Keep it to verify if HAL_RCC_OscConfig didn't exit with a timeout
AnnaBridge 187:0387e8f68319 362 if (__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY)) {
AnnaBridge 187:0387e8f68319 363 PeriphClkInitStruct.Lpuart1ClockSelection = RCC_LPUART1CLKSOURCE_LSE;
AnnaBridge 187:0387e8f68319 364 HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct);
AnnaBridge 187:0387e8f68319 365 if (init_uart(obj) == HAL_OK) {
AnnaBridge 187:0387e8f68319 366 return;
AnnaBridge 187:0387e8f68319 367 }
AnnaBridge 187:0387e8f68319 368 }
AnnaBridge 187:0387e8f68319 369 }
AnnaBridge 187:0387e8f68319 370 #endif
AnnaBridge 187:0387e8f68319 371 #if ((MBED_CONF_TARGET_LPUART_CLOCK_SOURCE) & USE_LPUART_CLK_PCLK1)
AnnaBridge 187:0387e8f68319 372 PeriphClkInitStruct.Lpuart1ClockSelection = RCC_LPUART1CLKSOURCE_PCLK1;
AnnaBridge 187:0387e8f68319 373 HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct);
AnnaBridge 187:0387e8f68319 374 if (init_uart(obj) == HAL_OK) {
AnnaBridge 187:0387e8f68319 375 return;
AnnaBridge 187:0387e8f68319 376 }
AnnaBridge 187:0387e8f68319 377 #endif
AnnaBridge 187:0387e8f68319 378 #if ((MBED_CONF_TARGET_LPUART_CLOCK_SOURCE) & USE_LPUART_CLK_HSI)
AnnaBridge 187:0387e8f68319 379 // Enable HSI in case it is not already done
AnnaBridge 187:0387e8f68319 380 if (!__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY)) {
AnnaBridge 187:0387e8f68319 381 RCC_OscInitTypeDef RCC_OscInitStruct = {0};
AnnaBridge 187:0387e8f68319 382 RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
AnnaBridge 187:0387e8f68319 383 RCC_OscInitStruct.HSIState = RCC_HSI_ON;
AnnaBridge 187:0387e8f68319 384 RCC_OscInitStruct.PLL.PLLState = RCC_PLL_OFF;
AnnaBridge 187:0387e8f68319 385 RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
AnnaBridge 187:0387e8f68319 386 HAL_RCC_OscConfig(&RCC_OscInitStruct);
AnnaBridge 187:0387e8f68319 387 }
AnnaBridge 187:0387e8f68319 388 // Keep it to verify if HAL_RCC_OscConfig didn't exit with a timeout
AnnaBridge 187:0387e8f68319 389 if (__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY)) {
AnnaBridge 187:0387e8f68319 390 PeriphClkInitStruct.Lpuart1ClockSelection = RCC_LPUART1CLKSOURCE_HSI;
AnnaBridge 182:a56a73fd2a6f 391 HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct);
AnnaBridge 187:0387e8f68319 392 if (init_uart(obj) == HAL_OK) {
AnnaBridge 187:0387e8f68319 393 return;
AnnaBridge 187:0387e8f68319 394 }
Anna Bridge 180:96ed750bd169 395 }
AnnaBridge 187:0387e8f68319 396 #endif
AnnaBridge 187:0387e8f68319 397 // Last chance using SYSCLK
AnnaBridge 182:a56a73fd2a6f 398 PeriphClkInitStruct.Lpuart1ClockSelection = RCC_LPUART1CLKSOURCE_SYSCLK;
AnnaBridge 182:a56a73fd2a6f 399 HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct);
AnnaBridge 182:a56a73fd2a6f 400 }
Anna Bridge 180:96ed750bd169 401 #endif /* LPUART1_BASE */
AnnaBridge 187:0387e8f68319 402
AnnaBridge 182:a56a73fd2a6f 403 if (init_uart(obj) != HAL_OK) {
Anna Bridge 180:96ed750bd169 404 debug("Cannot initialize UART with baud rate %u\n", baudrate);
Anna Bridge 180:96ed750bd169 405 }
Anna Bridge 180:96ed750bd169 406 }
Anna Bridge 180:96ed750bd169 407
AnnaBridge 167:e84263d55307 408 void serial_format(serial_t *obj, int data_bits, SerialParity parity, int stop_bits)
AnnaBridge 167:e84263d55307 409 {
AnnaBridge 167:e84263d55307 410 struct serial_s *obj_s = SERIAL_S(obj);
AnnaBridge 167:e84263d55307 411
AnnaBridge 167:e84263d55307 412 switch (parity) {
AnnaBridge 167:e84263d55307 413 case ParityOdd:
AnnaBridge 167:e84263d55307 414 obj_s->parity = UART_PARITY_ODD;
AnnaBridge 167:e84263d55307 415 break;
AnnaBridge 167:e84263d55307 416 case ParityEven:
AnnaBridge 167:e84263d55307 417 obj_s->parity = UART_PARITY_EVEN;
AnnaBridge 167:e84263d55307 418 break;
AnnaBridge 167:e84263d55307 419 default: // ParityNone
AnnaBridge 167:e84263d55307 420 case ParityForced0: // unsupported!
AnnaBridge 167:e84263d55307 421 case ParityForced1: // unsupported!
AnnaBridge 167:e84263d55307 422 obj_s->parity = UART_PARITY_NONE;
AnnaBridge 167:e84263d55307 423 break;
AnnaBridge 167:e84263d55307 424 }
AnnaBridge 167:e84263d55307 425
AnnaBridge 167:e84263d55307 426 switch (data_bits) {
AnnaBridge 181:57724642e740 427 case 7:
AnnaBridge 181:57724642e740 428 if (parity != UART_PARITY_NONE) {
AnnaBridge 181:57724642e740 429 obj_s->databits = UART_WORDLENGTH_8B;
AnnaBridge 181:57724642e740 430 } else {
AnnaBridge 181:57724642e740 431 #if defined UART_WORDLENGTH_7B
AnnaBridge 181:57724642e740 432 obj_s->databits = UART_WORDLENGTH_7B;
AnnaBridge 181:57724642e740 433 #else
AnnaBridge 181:57724642e740 434 error("7-bit data format without parity is not supported");
AnnaBridge 181:57724642e740 435 #endif
AnnaBridge 181:57724642e740 436 }
AnnaBridge 167:e84263d55307 437 break;
AnnaBridge 167:e84263d55307 438 case 8:
AnnaBridge 167:e84263d55307 439 if (parity != UART_PARITY_NONE) {
AnnaBridge 167:e84263d55307 440 obj_s->databits = UART_WORDLENGTH_9B;
AnnaBridge 167:e84263d55307 441 } else {
AnnaBridge 167:e84263d55307 442 obj_s->databits = UART_WORDLENGTH_8B;
AnnaBridge 167:e84263d55307 443 }
AnnaBridge 167:e84263d55307 444 break;
AnnaBridge 181:57724642e740 445 case 9:
AnnaBridge 167:e84263d55307 446 if (parity != UART_PARITY_NONE) {
AnnaBridge 181:57724642e740 447 error("Parity is not supported with 9-bit data format");
AnnaBridge 167:e84263d55307 448 } else {
AnnaBridge 181:57724642e740 449 obj_s->databits = UART_WORDLENGTH_9B;
AnnaBridge 167:e84263d55307 450 }
AnnaBridge 167:e84263d55307 451 break;
AnnaBridge 181:57724642e740 452 default:
AnnaBridge 181:57724642e740 453 error("Only 7, 8 or 9-bit data formats are supported");
AnnaBridge 181:57724642e740 454 break;
AnnaBridge 167:e84263d55307 455 }
AnnaBridge 167:e84263d55307 456
AnnaBridge 167:e84263d55307 457 if (stop_bits == 2) {
AnnaBridge 167:e84263d55307 458 obj_s->stopbits = UART_STOPBITS_2;
AnnaBridge 167:e84263d55307 459 } else {
AnnaBridge 167:e84263d55307 460 obj_s->stopbits = UART_STOPBITS_1;
AnnaBridge 167:e84263d55307 461 }
AnnaBridge 167:e84263d55307 462
AnnaBridge 167:e84263d55307 463 init_uart(obj);
AnnaBridge 167:e84263d55307 464 }
AnnaBridge 167:e84263d55307 465
AnnaBridge 167:e84263d55307 466 /******************************************************************************
AnnaBridge 167:e84263d55307 467 * READ/WRITE
AnnaBridge 167:e84263d55307 468 ******************************************************************************/
AnnaBridge 167:e84263d55307 469
AnnaBridge 167:e84263d55307 470 int serial_readable(serial_t *obj)
AnnaBridge 167:e84263d55307 471 {
AnnaBridge 167:e84263d55307 472 struct serial_s *obj_s = SERIAL_S(obj);
AnnaBridge 167:e84263d55307 473 UART_HandleTypeDef *huart = &uart_handlers[obj_s->index];
AnnaBridge 167:e84263d55307 474 /* To avoid a target blocking case, let's check for
AnnaBridge 167:e84263d55307 475 * possible OVERRUN error and discard it
AnnaBridge 167:e84263d55307 476 */
AnnaBridge 187:0387e8f68319 477 if (__HAL_UART_GET_FLAG(huart, UART_FLAG_ORE)) {
AnnaBridge 167:e84263d55307 478 __HAL_UART_CLEAR_OREFLAG(huart);
AnnaBridge 167:e84263d55307 479 }
AnnaBridge 167:e84263d55307 480 // Check if data is received
AnnaBridge 167:e84263d55307 481 return (__HAL_UART_GET_FLAG(huart, UART_FLAG_RXNE) != RESET) ? 1 : 0;
AnnaBridge 167:e84263d55307 482 }
AnnaBridge 167:e84263d55307 483
AnnaBridge 167:e84263d55307 484 int serial_writable(serial_t *obj)
AnnaBridge 167:e84263d55307 485 {
AnnaBridge 167:e84263d55307 486 struct serial_s *obj_s = SERIAL_S(obj);
AnnaBridge 167:e84263d55307 487 UART_HandleTypeDef *huart = &uart_handlers[obj_s->index];
AnnaBridge 167:e84263d55307 488
AnnaBridge 167:e84263d55307 489 // Check if data is transmitted
AnnaBridge 167:e84263d55307 490 return (__HAL_UART_GET_FLAG(huart, UART_FLAG_TXE) != RESET) ? 1 : 0;
AnnaBridge 167:e84263d55307 491 }
AnnaBridge 167:e84263d55307 492
AnnaBridge 167:e84263d55307 493 void serial_pinout_tx(PinName tx)
AnnaBridge 167:e84263d55307 494 {
AnnaBridge 167:e84263d55307 495 pinmap_pinout(tx, PinMap_UART_TX);
AnnaBridge 167:e84263d55307 496 }
AnnaBridge 167:e84263d55307 497
AnnaBridge 167:e84263d55307 498 void serial_break_clear(serial_t *obj)
AnnaBridge 167:e84263d55307 499 {
AnnaBridge 167:e84263d55307 500 (void)obj;
AnnaBridge 167:e84263d55307 501 }
AnnaBridge 167:e84263d55307 502
AnnaBridge 181:57724642e740 503 /******************************************************************************
AnnaBridge 181:57724642e740 504 * UTILITY FUNCTIONS
AnnaBridge 181:57724642e740 505 ******************************************************************************/
AnnaBridge 181:57724642e740 506
AnnaBridge 181:57724642e740 507 HAL_StatusTypeDef init_uart(serial_t *obj)
AnnaBridge 181:57724642e740 508 {
AnnaBridge 181:57724642e740 509 struct serial_s *obj_s = SERIAL_S(obj);
AnnaBridge 181:57724642e740 510 UART_HandleTypeDef *huart = &uart_handlers[obj_s->index];
AnnaBridge 181:57724642e740 511 huart->Instance = (USART_TypeDef *)(obj_s->uart);
AnnaBridge 181:57724642e740 512
AnnaBridge 181:57724642e740 513 huart->Init.BaudRate = obj_s->baudrate;
AnnaBridge 181:57724642e740 514 huart->Init.WordLength = obj_s->databits;
AnnaBridge 181:57724642e740 515 huart->Init.StopBits = obj_s->stopbits;
AnnaBridge 181:57724642e740 516 huart->Init.Parity = obj_s->parity;
AnnaBridge 181:57724642e740 517 #if DEVICE_SERIAL_FC
AnnaBridge 181:57724642e740 518 huart->Init.HwFlowCtl = obj_s->hw_flow_ctl;
AnnaBridge 181:57724642e740 519 #else
AnnaBridge 181:57724642e740 520 huart->Init.HwFlowCtl = UART_HWCONTROL_NONE;
AnnaBridge 181:57724642e740 521 #endif
AnnaBridge 181:57724642e740 522 huart->Init.OverSampling = UART_OVERSAMPLING_16;
AnnaBridge 181:57724642e740 523 huart->TxXferCount = 0;
AnnaBridge 181:57724642e740 524 huart->TxXferSize = 0;
AnnaBridge 181:57724642e740 525 huart->RxXferCount = 0;
AnnaBridge 181:57724642e740 526 huart->RxXferSize = 0;
AnnaBridge 181:57724642e740 527
AnnaBridge 181:57724642e740 528 if (obj_s->pin_rx == NC) {
AnnaBridge 181:57724642e740 529 huart->Init.Mode = UART_MODE_TX;
AnnaBridge 181:57724642e740 530 } else if (obj_s->pin_tx == NC) {
AnnaBridge 181:57724642e740 531 huart->Init.Mode = UART_MODE_RX;
AnnaBridge 181:57724642e740 532 } else {
AnnaBridge 181:57724642e740 533 huart->Init.Mode = UART_MODE_TX_RX;
AnnaBridge 181:57724642e740 534 }
AnnaBridge 181:57724642e740 535
AnnaBridge 182:a56a73fd2a6f 536 #if defined(LPUART1_BASE)
AnnaBridge 182:a56a73fd2a6f 537 if (huart->Instance == LPUART1) {
AnnaBridge 182:a56a73fd2a6f 538 if (obj_s->baudrate <= 9600) {
AnnaBridge 188:bcfe06ba3d64 539 #if ((MBED_CONF_TARGET_LPUART_CLOCK_SOURCE) & USE_LPUART_CLK_LSE)
AnnaBridge 182:a56a73fd2a6f 540 HAL_UARTEx_EnableClockStopMode(huart);
AnnaBridge 188:bcfe06ba3d64 541 #endif
AnnaBridge 182:a56a73fd2a6f 542 HAL_UARTEx_EnableStopMode(huart);
AnnaBridge 182:a56a73fd2a6f 543 } else {
AnnaBridge 182:a56a73fd2a6f 544 HAL_UARTEx_DisableClockStopMode(huart);
AnnaBridge 182:a56a73fd2a6f 545 HAL_UARTEx_DisableStopMode(huart);
AnnaBridge 182:a56a73fd2a6f 546 }
AnnaBridge 182:a56a73fd2a6f 547 }
AnnaBridge 182:a56a73fd2a6f 548 #endif
AnnaBridge 182:a56a73fd2a6f 549
AnnaBridge 181:57724642e740 550 return HAL_UART_Init(huart);
AnnaBridge 181:57724642e740 551 }
AnnaBridge 181:57724642e740 552
AnnaBridge 181:57724642e740 553 int8_t get_uart_index(UARTName uart_name)
AnnaBridge 181:57724642e740 554 {
AnnaBridge 181:57724642e740 555 uint8_t index = 0;
AnnaBridge 181:57724642e740 556
AnnaBridge 181:57724642e740 557 #if defined(USART1_BASE)
AnnaBridge 181:57724642e740 558 if (uart_name == UART_1) {
AnnaBridge 181:57724642e740 559 return index;
AnnaBridge 181:57724642e740 560 }
AnnaBridge 181:57724642e740 561 index++;
AnnaBridge 181:57724642e740 562 #endif
AnnaBridge 181:57724642e740 563
AnnaBridge 181:57724642e740 564 #if defined(USART2_BASE)
AnnaBridge 181:57724642e740 565 if (uart_name == UART_2) {
AnnaBridge 181:57724642e740 566 return index;
AnnaBridge 181:57724642e740 567 }
AnnaBridge 181:57724642e740 568 index++;
AnnaBridge 181:57724642e740 569 #endif
AnnaBridge 181:57724642e740 570
AnnaBridge 181:57724642e740 571 #if defined(USART3_BASE)
AnnaBridge 181:57724642e740 572 if (uart_name == UART_3) {
AnnaBridge 181:57724642e740 573 return index;
AnnaBridge 181:57724642e740 574 }
AnnaBridge 181:57724642e740 575 index++;
AnnaBridge 181:57724642e740 576 #endif
AnnaBridge 181:57724642e740 577
AnnaBridge 181:57724642e740 578 #if defined(UART4_BASE)
AnnaBridge 181:57724642e740 579 if (uart_name == UART_4) {
AnnaBridge 181:57724642e740 580 return index;
AnnaBridge 181:57724642e740 581 }
AnnaBridge 181:57724642e740 582 index++;
AnnaBridge 181:57724642e740 583 #endif
AnnaBridge 181:57724642e740 584
AnnaBridge 181:57724642e740 585 #if defined(USART4_BASE)
AnnaBridge 181:57724642e740 586 if (uart_name == UART_4) {
AnnaBridge 181:57724642e740 587 return index;
AnnaBridge 181:57724642e740 588 }
AnnaBridge 181:57724642e740 589 index++;
AnnaBridge 181:57724642e740 590 #endif
AnnaBridge 181:57724642e740 591
AnnaBridge 181:57724642e740 592 #if defined(UART5_BASE)
AnnaBridge 181:57724642e740 593 if (uart_name == UART_5) {
AnnaBridge 181:57724642e740 594 return index;
AnnaBridge 181:57724642e740 595 }
AnnaBridge 181:57724642e740 596 index++;
AnnaBridge 181:57724642e740 597 #endif
AnnaBridge 181:57724642e740 598
AnnaBridge 181:57724642e740 599 #if defined(USART5_BASE)
AnnaBridge 181:57724642e740 600 if (uart_name == UART_5) {
AnnaBridge 181:57724642e740 601 return index;
AnnaBridge 181:57724642e740 602 }
AnnaBridge 181:57724642e740 603 index++;
AnnaBridge 181:57724642e740 604 #endif
AnnaBridge 181:57724642e740 605
AnnaBridge 181:57724642e740 606 #if defined(USART6_BASE)
AnnaBridge 181:57724642e740 607 if (uart_name == UART_6) {
AnnaBridge 181:57724642e740 608 return index;
AnnaBridge 181:57724642e740 609 }
AnnaBridge 181:57724642e740 610 index++;
AnnaBridge 181:57724642e740 611 #endif
AnnaBridge 181:57724642e740 612
AnnaBridge 181:57724642e740 613 #if defined(UART7_BASE)
AnnaBridge 181:57724642e740 614 if (uart_name == UART_7) {
AnnaBridge 181:57724642e740 615 return index;
AnnaBridge 181:57724642e740 616 }
AnnaBridge 181:57724642e740 617 index++;
AnnaBridge 181:57724642e740 618 #endif
AnnaBridge 181:57724642e740 619
AnnaBridge 181:57724642e740 620 #if defined(USART7_BASE)
AnnaBridge 181:57724642e740 621 if (uart_name == UART_7) {
AnnaBridge 181:57724642e740 622 return index;
AnnaBridge 181:57724642e740 623 }
AnnaBridge 181:57724642e740 624 index++;
AnnaBridge 181:57724642e740 625 #endif
AnnaBridge 181:57724642e740 626
AnnaBridge 181:57724642e740 627 #if defined(UART8_BASE)
AnnaBridge 181:57724642e740 628 if (uart_name == UART_8) {
AnnaBridge 181:57724642e740 629 return index;
AnnaBridge 181:57724642e740 630 }
AnnaBridge 181:57724642e740 631 index++;
AnnaBridge 181:57724642e740 632 #endif
AnnaBridge 181:57724642e740 633
AnnaBridge 181:57724642e740 634 #if defined(USART8_BASE)
AnnaBridge 181:57724642e740 635 if (uart_name == UART_8) {
AnnaBridge 181:57724642e740 636 return index;
AnnaBridge 181:57724642e740 637 }
AnnaBridge 181:57724642e740 638 index++;
AnnaBridge 181:57724642e740 639 #endif
AnnaBridge 181:57724642e740 640
AnnaBridge 181:57724642e740 641 #if defined(UART9_BASE)
AnnaBridge 181:57724642e740 642 if (uart_name == UART_9) {
AnnaBridge 181:57724642e740 643 return index;
AnnaBridge 181:57724642e740 644 }
AnnaBridge 181:57724642e740 645 index++;
AnnaBridge 181:57724642e740 646 #endif
AnnaBridge 181:57724642e740 647
AnnaBridge 181:57724642e740 648 #if defined(UART10_BASE)
AnnaBridge 181:57724642e740 649 if (uart_name == UART_10) {
AnnaBridge 181:57724642e740 650 return index;
AnnaBridge 181:57724642e740 651 }
AnnaBridge 181:57724642e740 652 index++;
AnnaBridge 181:57724642e740 653 #endif
AnnaBridge 181:57724642e740 654
AnnaBridge 181:57724642e740 655 #if defined(LPUART1_BASE)
AnnaBridge 181:57724642e740 656 if (uart_name == LPUART_1) {
AnnaBridge 181:57724642e740 657 return index;
AnnaBridge 181:57724642e740 658 }
AnnaBridge 181:57724642e740 659 index++;
AnnaBridge 181:57724642e740 660 #endif
AnnaBridge 181:57724642e740 661
AnnaBridge 181:57724642e740 662 return -1;
AnnaBridge 181:57724642e740 663 }
AnnaBridge 181:57724642e740 664
AnnaBridge 188:bcfe06ba3d64 665 /* Function used to protect deep sleep while a serial transmission is on-going.
AnnaBridge 188:bcfe06ba3d64 666 .* Returns 1 if there is at least 1 serial instance with an on-going transfer
AnnaBridge 188:bcfe06ba3d64 667 * and 0 otherwise.
AnnaBridge 188:bcfe06ba3d64 668 */
AnnaBridge 187:0387e8f68319 669 int serial_is_tx_ongoing(void) {
AnnaBridge 187:0387e8f68319 670 int TxOngoing = 0;
AnnaBridge 187:0387e8f68319 671
AnnaBridge 187:0387e8f68319 672 #if defined(USART1_BASE)
AnnaBridge 187:0387e8f68319 673 if (LL_USART_IsEnabled(USART1) && !LL_USART_IsActiveFlag_TC(USART1)) {
AnnaBridge 187:0387e8f68319 674 TxOngoing |= 1;
AnnaBridge 187:0387e8f68319 675 }
AnnaBridge 187:0387e8f68319 676 #endif
AnnaBridge 187:0387e8f68319 677
AnnaBridge 187:0387e8f68319 678 #if defined(USART2_BASE)
AnnaBridge 187:0387e8f68319 679 if (LL_USART_IsEnabled(USART2) && !LL_USART_IsActiveFlag_TC(USART2)) {
AnnaBridge 187:0387e8f68319 680 TxOngoing |= 1;
AnnaBridge 187:0387e8f68319 681 }
AnnaBridge 187:0387e8f68319 682 #endif
AnnaBridge 187:0387e8f68319 683
AnnaBridge 187:0387e8f68319 684 #if defined(USART3_BASE)
AnnaBridge 187:0387e8f68319 685 if (LL_USART_IsEnabled(USART3) && !LL_USART_IsActiveFlag_TC(USART3)) {
AnnaBridge 187:0387e8f68319 686 TxOngoing |= 1;
AnnaBridge 187:0387e8f68319 687 }
AnnaBridge 187:0387e8f68319 688 #endif
AnnaBridge 187:0387e8f68319 689
AnnaBridge 187:0387e8f68319 690 #if defined(UART4_BASE)
AnnaBridge 187:0387e8f68319 691 if (LL_USART_IsEnabled(UART4) && !LL_USART_IsActiveFlag_TC(UART4)) {
AnnaBridge 187:0387e8f68319 692 TxOngoing |= 1;
AnnaBridge 187:0387e8f68319 693 }
AnnaBridge 187:0387e8f68319 694 #endif
AnnaBridge 187:0387e8f68319 695
AnnaBridge 187:0387e8f68319 696 #if defined(USART4_BASE)
AnnaBridge 187:0387e8f68319 697 if (LL_USART_IsEnabled(USART4) && !LL_USART_IsActiveFlag_TC(USART4)) {
AnnaBridge 187:0387e8f68319 698 TxOngoing |= 1;
AnnaBridge 187:0387e8f68319 699 }
AnnaBridge 187:0387e8f68319 700 #endif
AnnaBridge 187:0387e8f68319 701
AnnaBridge 187:0387e8f68319 702 #if defined(UART5_BASE)
AnnaBridge 187:0387e8f68319 703 if (LL_USART_IsEnabled(UART5) && !LL_USART_IsActiveFlag_TC(UART5)) {
AnnaBridge 187:0387e8f68319 704 TxOngoing |= 1;
AnnaBridge 187:0387e8f68319 705 }
AnnaBridge 187:0387e8f68319 706 #endif
AnnaBridge 187:0387e8f68319 707
AnnaBridge 187:0387e8f68319 708 #if defined(USART5_BASE)
AnnaBridge 187:0387e8f68319 709 if (LL_USART_IsEnabled(USART5) && !LL_USART_IsActiveFlag_TC(USART5)) {
AnnaBridge 187:0387e8f68319 710 TxOngoing |= 1;
AnnaBridge 187:0387e8f68319 711 }
AnnaBridge 187:0387e8f68319 712 #endif
AnnaBridge 187:0387e8f68319 713
AnnaBridge 187:0387e8f68319 714 #if defined(USART6_BASE)
AnnaBridge 187:0387e8f68319 715 if (LL_USART_IsEnabled(USART6) && !LL_USART_IsActiveFlag_TC(USART6)) {
AnnaBridge 187:0387e8f68319 716 TxOngoing |= 1;
AnnaBridge 187:0387e8f68319 717 }
AnnaBridge 187:0387e8f68319 718 #endif
AnnaBridge 187:0387e8f68319 719
AnnaBridge 187:0387e8f68319 720 #if defined(UART7_BASE)
AnnaBridge 187:0387e8f68319 721 if (LL_USART_IsEnabled(UART7) && !LL_USART_IsActiveFlag_TC(UART7)) {
AnnaBridge 187:0387e8f68319 722 TxOngoing |= 1;
AnnaBridge 187:0387e8f68319 723 }
AnnaBridge 187:0387e8f68319 724 #endif
AnnaBridge 187:0387e8f68319 725
AnnaBridge 187:0387e8f68319 726 #if defined(USART7_BASE)
AnnaBridge 187:0387e8f68319 727 if (LL_USART_IsEnabled(USART7) && !LL_USART_IsActiveFlag_TC(USART7)) {
AnnaBridge 187:0387e8f68319 728 TxOngoing |= 1;
AnnaBridge 187:0387e8f68319 729 }
AnnaBridge 187:0387e8f68319 730 #endif
AnnaBridge 187:0387e8f68319 731
AnnaBridge 187:0387e8f68319 732 #if defined(UART8_BASE)
AnnaBridge 187:0387e8f68319 733 if (LL_USART_IsEnabled(UART8) && !LL_USART_IsActiveFlag_TC(UART8)) {
AnnaBridge 187:0387e8f68319 734 TxOngoing |= 1;
AnnaBridge 187:0387e8f68319 735 }
AnnaBridge 187:0387e8f68319 736 #endif
AnnaBridge 187:0387e8f68319 737
AnnaBridge 187:0387e8f68319 738 #if defined(USART8_BASE)
AnnaBridge 187:0387e8f68319 739 if (LL_USART_IsEnabled(USART8) && !LL_USART_IsActiveFlag_TC(USART8)) {
AnnaBridge 187:0387e8f68319 740 TxOngoing |= 1;
AnnaBridge 187:0387e8f68319 741 }
AnnaBridge 187:0387e8f68319 742 #endif
AnnaBridge 187:0387e8f68319 743
AnnaBridge 187:0387e8f68319 744 #if defined(UART9_BASE)
AnnaBridge 187:0387e8f68319 745 if (LL_USART_IsEnabled(UART9) && !LL_USART_IsActiveFlag_TC(UART9)) {
AnnaBridge 187:0387e8f68319 746 TxOngoing |= 1;
AnnaBridge 187:0387e8f68319 747 }
AnnaBridge 187:0387e8f68319 748 #endif
AnnaBridge 187:0387e8f68319 749
AnnaBridge 187:0387e8f68319 750 #if defined(UART10_BASE)
AnnaBridge 187:0387e8f68319 751 if (LL_USART_IsEnabled(UART10) && !LL_USART_IsActiveFlag_TC(UART10)) {
AnnaBridge 187:0387e8f68319 752 TxOngoing |= 1;
AnnaBridge 187:0387e8f68319 753 }
AnnaBridge 187:0387e8f68319 754 #endif
AnnaBridge 187:0387e8f68319 755
AnnaBridge 187:0387e8f68319 756 #if defined(LPUART1_BASE)
AnnaBridge 187:0387e8f68319 757 if (LL_USART_IsEnabled(LPUART1) && !LL_USART_IsActiveFlag_TC(LPUART1)) {
AnnaBridge 187:0387e8f68319 758 TxOngoing |= 1;
AnnaBridge 187:0387e8f68319 759 }
AnnaBridge 187:0387e8f68319 760 #endif
AnnaBridge 187:0387e8f68319 761
AnnaBridge 187:0387e8f68319 762 return TxOngoing;
AnnaBridge 187:0387e8f68319 763 }
AnnaBridge 187:0387e8f68319 764
AnnaBridge 188:bcfe06ba3d64 765 #else
AnnaBridge 188:bcfe06ba3d64 766
AnnaBridge 188:bcfe06ba3d64 767 int serial_is_tx_ongoing(void) {
AnnaBridge 188:bcfe06ba3d64 768 return 0;
AnnaBridge 188:bcfe06ba3d64 769 }
AnnaBridge 188:bcfe06ba3d64 770
AnnaBridge 167:e84263d55307 771 #endif /* DEVICE_SERIAL */