mbed library sources

Dependents:   Encrypted my_mbed lklk CyaSSL_DTLS_Cellular ... more

Superseded

This library was superseded by mbed-dev - https://os.mbed.com/users/mbed_official/code/mbed-dev/.

Development branch of the mbed library sources. This library is kept in synch with the latest changes from the mbed SDK and it is not guaranteed to work.

If you are looking for a stable and tested release, please import one of the official mbed library releases:

Import librarymbed

The official Mbed 2 C/C++ SDK provides the software platform and libraries to build your applications.

Committer:
mbed_official
Date:
Mon Sep 28 10:45:10 2015 +0100
Revision:
630:825f75ca301e
Parent:
469:fc4922e0c183
Synchronized with git revision 54fbe4144faf309c37205a5d39fa665daa919f10

Full URL: https://github.com/mbedmicro/mbed/commit/54fbe4144faf309c37205a5d39fa665daa919f10/

NUCLEO_F031K6 : Add new target

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 469:fc4922e0c183 1 /* mbed Microcontroller Library
mbed_official 469:fc4922e0c183 2 *******************************************************************************
mbed_official 630:825f75ca301e 3 * Copyright (c) 2015, STMicroelectronics
mbed_official 469:fc4922e0c183 4 * All rights reserved.
mbed_official 469:fc4922e0c183 5 *
mbed_official 469:fc4922e0c183 6 * Redistribution and use in source and binary forms, with or without
mbed_official 469:fc4922e0c183 7 * modification, are permitted provided that the following conditions are met:
mbed_official 469:fc4922e0c183 8 *
mbed_official 469:fc4922e0c183 9 * 1. Redistributions of source code must retain the above copyright notice,
mbed_official 469:fc4922e0c183 10 * this list of conditions and the following disclaimer.
mbed_official 469:fc4922e0c183 11 * 2. Redistributions in binary form must reproduce the above copyright notice,
mbed_official 469:fc4922e0c183 12 * this list of conditions and the following disclaimer in the documentation
mbed_official 469:fc4922e0c183 13 * and/or other materials provided with the distribution.
mbed_official 469:fc4922e0c183 14 * 3. Neither the name of STMicroelectronics nor the names of its contributors
mbed_official 469:fc4922e0c183 15 * may be used to endorse or promote products derived from this software
mbed_official 469:fc4922e0c183 16 * without specific prior written permission.
mbed_official 469:fc4922e0c183 17 *
mbed_official 469:fc4922e0c183 18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
mbed_official 469:fc4922e0c183 19 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
mbed_official 469:fc4922e0c183 20 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
mbed_official 469:fc4922e0c183 21 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
mbed_official 469:fc4922e0c183 22 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
mbed_official 469:fc4922e0c183 23 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
mbed_official 469:fc4922e0c183 24 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
mbed_official 469:fc4922e0c183 25 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
mbed_official 469:fc4922e0c183 26 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
mbed_official 469:fc4922e0c183 27 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
mbed_official 469:fc4922e0c183 28 *******************************************************************************
mbed_official 469:fc4922e0c183 29 */
mbed_official 469:fc4922e0c183 30 #include "mbed_assert.h"
mbed_official 469:fc4922e0c183 31 #include "serial_api.h"
mbed_official 469:fc4922e0c183 32
mbed_official 469:fc4922e0c183 33 #if DEVICE_SERIAL
mbed_official 469:fc4922e0c183 34
mbed_official 469:fc4922e0c183 35 #include "cmsis.h"
mbed_official 469:fc4922e0c183 36 #include "pinmap.h"
mbed_official 469:fc4922e0c183 37 #include <string.h>
mbed_official 469:fc4922e0c183 38 #include "PeripheralPins.h"
mbed_official 469:fc4922e0c183 39
mbed_official 469:fc4922e0c183 40 #if defined (TARGET_STM32F091RC)
mbed_official 469:fc4922e0c183 41 #define UART_NUM (8)
mbed_official 469:fc4922e0c183 42
mbed_official 469:fc4922e0c183 43 static uint32_t serial_irq_ids[UART_NUM] = {0, 0, 0, 0, 0, 0, 0, 0};
mbed_official 469:fc4922e0c183 44
mbed_official 469:fc4922e0c183 45 #elif defined (TARGET_STM32F030R8) || defined (TARGET_STM32F051R8)
mbed_official 469:fc4922e0c183 46 #define UART_NUM (2)
mbed_official 469:fc4922e0c183 47
mbed_official 469:fc4922e0c183 48 static uint32_t serial_irq_ids[UART_NUM] = {0, 0};
mbed_official 469:fc4922e0c183 49
mbed_official 630:825f75ca301e 50 #elif defined (TARGET_STM32F031K6)
mbed_official 630:825f75ca301e 51 #define UART_NUM (1)
mbed_official 630:825f75ca301e 52
mbed_official 630:825f75ca301e 53 static uint32_t serial_irq_ids[UART_NUM] = {0};
mbed_official 630:825f75ca301e 54
mbed_official 469:fc4922e0c183 55 #else
mbed_official 469:fc4922e0c183 56 #define UART_NUM (4)
mbed_official 469:fc4922e0c183 57
mbed_official 469:fc4922e0c183 58 static uint32_t serial_irq_ids[UART_NUM] = {0, 0, 0, 0};
mbed_official 469:fc4922e0c183 59
mbed_official 469:fc4922e0c183 60 #endif
mbed_official 469:fc4922e0c183 61
mbed_official 469:fc4922e0c183 62 static uart_irq_handler irq_handler;
mbed_official 469:fc4922e0c183 63
mbed_official 469:fc4922e0c183 64 UART_HandleTypeDef UartHandle;
mbed_official 469:fc4922e0c183 65
mbed_official 469:fc4922e0c183 66 int stdio_uart_inited = 0;
mbed_official 469:fc4922e0c183 67 serial_t stdio_uart;
mbed_official 469:fc4922e0c183 68
mbed_official 630:825f75ca301e 69 static void init_uart(serial_t *obj) {
mbed_official 469:fc4922e0c183 70 UartHandle.Instance = (USART_TypeDef *)(obj->uart);
mbed_official 469:fc4922e0c183 71
mbed_official 469:fc4922e0c183 72 UartHandle.Init.BaudRate = obj->baudrate;
mbed_official 469:fc4922e0c183 73 UartHandle.Init.WordLength = obj->databits;
mbed_official 469:fc4922e0c183 74 UartHandle.Init.StopBits = obj->stopbits;
mbed_official 469:fc4922e0c183 75 UartHandle.Init.Parity = obj->parity;
mbed_official 469:fc4922e0c183 76 UartHandle.Init.HwFlowCtl = UART_HWCONTROL_NONE;
mbed_official 469:fc4922e0c183 77
mbed_official 469:fc4922e0c183 78 if (obj->pin_rx == NC) {
mbed_official 469:fc4922e0c183 79 UartHandle.Init.Mode = UART_MODE_TX;
mbed_official 469:fc4922e0c183 80 } else if (obj->pin_tx == NC) {
mbed_official 469:fc4922e0c183 81 UartHandle.Init.Mode = UART_MODE_RX;
mbed_official 469:fc4922e0c183 82 } else {
mbed_official 469:fc4922e0c183 83 UartHandle.Init.Mode = UART_MODE_TX_RX;
mbed_official 469:fc4922e0c183 84 }
mbed_official 469:fc4922e0c183 85
mbed_official 469:fc4922e0c183 86 // Disable the reception overrun detection
mbed_official 469:fc4922e0c183 87 UartHandle.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_RXOVERRUNDISABLE_INIT;
mbed_official 469:fc4922e0c183 88 UartHandle.AdvancedInit.OverrunDisable = UART_ADVFEATURE_OVERRUN_DISABLE;
mbed_official 469:fc4922e0c183 89
mbed_official 469:fc4922e0c183 90 HAL_UART_Init(&UartHandle);
mbed_official 469:fc4922e0c183 91 }
mbed_official 469:fc4922e0c183 92
mbed_official 630:825f75ca301e 93 void serial_init(serial_t *obj, PinName tx, PinName rx) {
mbed_official 469:fc4922e0c183 94 // Determine the UART to use (UART_1, UART_2, ...)
mbed_official 469:fc4922e0c183 95 UARTName uart_tx = (UARTName)pinmap_peripheral(tx, PinMap_UART_TX);
mbed_official 469:fc4922e0c183 96 UARTName uart_rx = (UARTName)pinmap_peripheral(rx, PinMap_UART_RX);
mbed_official 469:fc4922e0c183 97
mbed_official 469:fc4922e0c183 98 // Get the peripheral name (UART_1, UART_2, ...) from the pin and assign it to the object
mbed_official 469:fc4922e0c183 99 obj->uart = (UARTName)pinmap_merge(uart_tx, uart_rx);
mbed_official 469:fc4922e0c183 100 MBED_ASSERT(obj->uart != (UARTName)NC);
mbed_official 469:fc4922e0c183 101
mbed_official 469:fc4922e0c183 102 // Enable USART clock
mbed_official 469:fc4922e0c183 103 if (obj->uart == UART_1) {
mbed_official 469:fc4922e0c183 104 __USART1_CLK_ENABLE();
mbed_official 469:fc4922e0c183 105 obj->index = 0;
mbed_official 469:fc4922e0c183 106 }
mbed_official 469:fc4922e0c183 107
mbed_official 630:825f75ca301e 108 #if defined USART2_BASE
mbed_official 469:fc4922e0c183 109 if (obj->uart == UART_2) {
mbed_official 469:fc4922e0c183 110 __USART2_CLK_ENABLE();
mbed_official 469:fc4922e0c183 111 obj->index = 1;
mbed_official 469:fc4922e0c183 112 }
mbed_official 630:825f75ca301e 113 #endif
mbed_official 469:fc4922e0c183 114
mbed_official 469:fc4922e0c183 115 #if defined USART3_BASE
mbed_official 469:fc4922e0c183 116 if (obj->uart == UART_3) {
mbed_official 469:fc4922e0c183 117 __USART3_CLK_ENABLE();
mbed_official 469:fc4922e0c183 118 obj->index = 2;
mbed_official 469:fc4922e0c183 119 }
mbed_official 469:fc4922e0c183 120 #endif
mbed_official 469:fc4922e0c183 121
mbed_official 469:fc4922e0c183 122 #if defined USART4_BASE
mbed_official 469:fc4922e0c183 123 if (obj->uart == UART_4) {
mbed_official 469:fc4922e0c183 124 __USART4_CLK_ENABLE();
mbed_official 469:fc4922e0c183 125 obj->index = 3;
mbed_official 469:fc4922e0c183 126 }
mbed_official 469:fc4922e0c183 127 #endif
mbed_official 469:fc4922e0c183 128
mbed_official 469:fc4922e0c183 129 #if defined USART5_BASE
mbed_official 469:fc4922e0c183 130 if (obj->uart == UART_5) {
mbed_official 469:fc4922e0c183 131 __USART5_CLK_ENABLE();
mbed_official 469:fc4922e0c183 132 obj->index = 4;
mbed_official 469:fc4922e0c183 133 }
mbed_official 469:fc4922e0c183 134 #endif
mbed_official 469:fc4922e0c183 135
mbed_official 469:fc4922e0c183 136 #if defined USART6_BASE
mbed_official 469:fc4922e0c183 137 if (obj->uart == UART_6) {
mbed_official 469:fc4922e0c183 138 __USART6_CLK_ENABLE();
mbed_official 469:fc4922e0c183 139 obj->index = 5;
mbed_official 469:fc4922e0c183 140 }
mbed_official 469:fc4922e0c183 141 #endif
mbed_official 469:fc4922e0c183 142
mbed_official 469:fc4922e0c183 143 #if defined USART7_BASE
mbed_official 469:fc4922e0c183 144 if (obj->uart == UART_7) {
mbed_official 469:fc4922e0c183 145 __USART7_CLK_ENABLE();
mbed_official 469:fc4922e0c183 146 obj->index = 6;
mbed_official 469:fc4922e0c183 147 }
mbed_official 469:fc4922e0c183 148 #endif
mbed_official 469:fc4922e0c183 149
mbed_official 469:fc4922e0c183 150 #if defined USART8_BASE
mbed_official 469:fc4922e0c183 151 if (obj->uart == UART_8) {
mbed_official 469:fc4922e0c183 152 __USART8_CLK_ENABLE();
mbed_official 469:fc4922e0c183 153 obj->index = 7;
mbed_official 469:fc4922e0c183 154 }
mbed_official 469:fc4922e0c183 155 #endif
mbed_official 469:fc4922e0c183 156
mbed_official 469:fc4922e0c183 157 // Configure the UART pins
mbed_official 469:fc4922e0c183 158 pinmap_pinout(tx, PinMap_UART_TX);
mbed_official 469:fc4922e0c183 159 pinmap_pinout(rx, PinMap_UART_RX);
mbed_official 469:fc4922e0c183 160 if (tx != NC) {
mbed_official 469:fc4922e0c183 161 pin_mode(tx, PullUp);
mbed_official 469:fc4922e0c183 162 }
mbed_official 469:fc4922e0c183 163 if (rx != NC) {
mbed_official 469:fc4922e0c183 164 pin_mode(rx, PullUp);
mbed_official 469:fc4922e0c183 165 }
mbed_official 469:fc4922e0c183 166
mbed_official 469:fc4922e0c183 167 // Configure UART
mbed_official 469:fc4922e0c183 168 obj->baudrate = 9600;
mbed_official 469:fc4922e0c183 169 obj->databits = UART_WORDLENGTH_8B;
mbed_official 469:fc4922e0c183 170 obj->stopbits = UART_STOPBITS_1;
mbed_official 469:fc4922e0c183 171 obj->parity = UART_PARITY_NONE;
mbed_official 469:fc4922e0c183 172
mbed_official 469:fc4922e0c183 173 obj->pin_tx = tx;
mbed_official 469:fc4922e0c183 174 obj->pin_rx = rx;
mbed_official 469:fc4922e0c183 175
mbed_official 469:fc4922e0c183 176 init_uart(obj);
mbed_official 469:fc4922e0c183 177
mbed_official 469:fc4922e0c183 178 // For stdio management
mbed_official 469:fc4922e0c183 179 if (obj->uart == STDIO_UART) {
mbed_official 469:fc4922e0c183 180 stdio_uart_inited = 1;
mbed_official 469:fc4922e0c183 181 memcpy(&stdio_uart, obj, sizeof(serial_t));
mbed_official 469:fc4922e0c183 182 }
mbed_official 469:fc4922e0c183 183 }
mbed_official 469:fc4922e0c183 184
mbed_official 630:825f75ca301e 185 void serial_free(serial_t *obj) {
mbed_official 469:fc4922e0c183 186 // Reset UART and disable clock
mbed_official 469:fc4922e0c183 187 if (obj->uart == UART_1) {
mbed_official 469:fc4922e0c183 188 __USART1_FORCE_RESET();
mbed_official 469:fc4922e0c183 189 __USART1_RELEASE_RESET();
mbed_official 469:fc4922e0c183 190 __USART1_CLK_DISABLE();
mbed_official 469:fc4922e0c183 191 }
mbed_official 469:fc4922e0c183 192
mbed_official 630:825f75ca301e 193 #if defined(USART2_BASE)
mbed_official 469:fc4922e0c183 194 if (obj->uart == UART_2) {
mbed_official 469:fc4922e0c183 195 __USART2_FORCE_RESET();
mbed_official 469:fc4922e0c183 196 __USART2_RELEASE_RESET();
mbed_official 469:fc4922e0c183 197 __USART2_CLK_DISABLE();
mbed_official 469:fc4922e0c183 198 }
mbed_official 630:825f75ca301e 199 #endif
mbed_official 469:fc4922e0c183 200
mbed_official 469:fc4922e0c183 201 #if defined USART3_BASE
mbed_official 469:fc4922e0c183 202 if (obj->uart == UART_3) {
mbed_official 469:fc4922e0c183 203 __USART3_FORCE_RESET();
mbed_official 469:fc4922e0c183 204 __USART3_RELEASE_RESET();
mbed_official 469:fc4922e0c183 205 __USART3_CLK_DISABLE();
mbed_official 469:fc4922e0c183 206 }
mbed_official 469:fc4922e0c183 207 #endif
mbed_official 469:fc4922e0c183 208
mbed_official 469:fc4922e0c183 209 #if defined USART4_BASE
mbed_official 469:fc4922e0c183 210 if (obj->uart == UART_4) {
mbed_official 469:fc4922e0c183 211 __USART4_FORCE_RESET();
mbed_official 469:fc4922e0c183 212 __USART4_RELEASE_RESET();
mbed_official 469:fc4922e0c183 213 __USART4_CLK_DISABLE();
mbed_official 469:fc4922e0c183 214 }
mbed_official 469:fc4922e0c183 215 #endif
mbed_official 469:fc4922e0c183 216
mbed_official 469:fc4922e0c183 217 #if defined USART5_BASE
mbed_official 469:fc4922e0c183 218 if (obj->uart == UART_5) {
mbed_official 469:fc4922e0c183 219 __USART5_FORCE_RESET();
mbed_official 469:fc4922e0c183 220 __USART5_RELEASE_RESET();
mbed_official 469:fc4922e0c183 221 __USART5_CLK_DISABLE();
mbed_official 469:fc4922e0c183 222 }
mbed_official 469:fc4922e0c183 223 #endif
mbed_official 469:fc4922e0c183 224
mbed_official 469:fc4922e0c183 225 #if defined USART6_BASE
mbed_official 469:fc4922e0c183 226 if (obj->uart == UART_6) {
mbed_official 469:fc4922e0c183 227 __USART6_FORCE_RESET();
mbed_official 469:fc4922e0c183 228 __USART6_RELEASE_RESET();
mbed_official 469:fc4922e0c183 229 __USART6_CLK_DISABLE();
mbed_official 469:fc4922e0c183 230 }
mbed_official 469:fc4922e0c183 231 #endif
mbed_official 469:fc4922e0c183 232
mbed_official 469:fc4922e0c183 233 #if defined USART7_BASE
mbed_official 469:fc4922e0c183 234 if (obj->uart == UART_7) {
mbed_official 469:fc4922e0c183 235 __USART7_FORCE_RESET();
mbed_official 469:fc4922e0c183 236 __USART7_RELEASE_RESET();
mbed_official 469:fc4922e0c183 237 __USART7_CLK_DISABLE();
mbed_official 469:fc4922e0c183 238 }
mbed_official 469:fc4922e0c183 239 #endif
mbed_official 469:fc4922e0c183 240
mbed_official 469:fc4922e0c183 241 #if defined USART8_BASE
mbed_official 469:fc4922e0c183 242 if (obj->uart == UART_8) {
mbed_official 469:fc4922e0c183 243 __USART8_FORCE_RESET();
mbed_official 469:fc4922e0c183 244 __USART8_RELEASE_RESET();
mbed_official 469:fc4922e0c183 245 __USART8_CLK_DISABLE();
mbed_official 469:fc4922e0c183 246 }
mbed_official 469:fc4922e0c183 247 #endif
mbed_official 469:fc4922e0c183 248
mbed_official 469:fc4922e0c183 249
mbed_official 469:fc4922e0c183 250 // Configure GPIOs
mbed_official 469:fc4922e0c183 251 pin_function(obj->pin_tx, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 0));
mbed_official 469:fc4922e0c183 252 pin_function(obj->pin_rx, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 0));
mbed_official 469:fc4922e0c183 253
mbed_official 469:fc4922e0c183 254 serial_irq_ids[obj->index] = 0;
mbed_official 469:fc4922e0c183 255 }
mbed_official 469:fc4922e0c183 256
mbed_official 630:825f75ca301e 257 void serial_baud(serial_t *obj, int baudrate) {
mbed_official 469:fc4922e0c183 258 obj->baudrate = baudrate;
mbed_official 469:fc4922e0c183 259 init_uart(obj);
mbed_official 469:fc4922e0c183 260 }
mbed_official 469:fc4922e0c183 261
mbed_official 630:825f75ca301e 262 void serial_format(serial_t *obj, int data_bits, SerialParity parity, int stop_bits) {
mbed_official 469:fc4922e0c183 263 if (data_bits == 9) {
mbed_official 469:fc4922e0c183 264 obj->databits = UART_WORDLENGTH_9B;
mbed_official 469:fc4922e0c183 265 } else {
mbed_official 469:fc4922e0c183 266 obj->databits = UART_WORDLENGTH_8B;
mbed_official 469:fc4922e0c183 267 }
mbed_official 469:fc4922e0c183 268
mbed_official 469:fc4922e0c183 269 switch (parity) {
mbed_official 469:fc4922e0c183 270 case ParityOdd:
mbed_official 469:fc4922e0c183 271 case ParityForced0:
mbed_official 469:fc4922e0c183 272 obj->parity = UART_PARITY_ODD;
mbed_official 469:fc4922e0c183 273 break;
mbed_official 469:fc4922e0c183 274 case ParityEven:
mbed_official 469:fc4922e0c183 275 case ParityForced1:
mbed_official 469:fc4922e0c183 276 obj->parity = UART_PARITY_EVEN;
mbed_official 469:fc4922e0c183 277 break;
mbed_official 469:fc4922e0c183 278 default: // ParityNone
mbed_official 469:fc4922e0c183 279 obj->parity = UART_PARITY_NONE;
mbed_official 469:fc4922e0c183 280 break;
mbed_official 469:fc4922e0c183 281 }
mbed_official 469:fc4922e0c183 282
mbed_official 469:fc4922e0c183 283 if (stop_bits == 2) {
mbed_official 469:fc4922e0c183 284 obj->stopbits = UART_STOPBITS_2;
mbed_official 469:fc4922e0c183 285 } else {
mbed_official 469:fc4922e0c183 286 obj->stopbits = UART_STOPBITS_1;
mbed_official 469:fc4922e0c183 287 }
mbed_official 469:fc4922e0c183 288
mbed_official 469:fc4922e0c183 289 init_uart(obj);
mbed_official 469:fc4922e0c183 290 }
mbed_official 469:fc4922e0c183 291
mbed_official 469:fc4922e0c183 292 /******************************************************************************
mbed_official 469:fc4922e0c183 293 * INTERRUPTS HANDLING
mbed_official 469:fc4922e0c183 294 ******************************************************************************/
mbed_official 469:fc4922e0c183 295
mbed_official 630:825f75ca301e 296 static void uart_irq(UARTName name, int id) {
mbed_official 469:fc4922e0c183 297 UartHandle.Instance = (USART_TypeDef *)name;
mbed_official 469:fc4922e0c183 298 if (serial_irq_ids[id] != 0) {
mbed_official 469:fc4922e0c183 299 if (__HAL_UART_GET_FLAG(&UartHandle, UART_FLAG_TC) != RESET) {
mbed_official 469:fc4922e0c183 300 irq_handler(serial_irq_ids[id], TxIrq);
mbed_official 469:fc4922e0c183 301 __HAL_UART_CLEAR_IT(&UartHandle, UART_FLAG_TC);
mbed_official 469:fc4922e0c183 302 }
mbed_official 469:fc4922e0c183 303 if (__HAL_UART_GET_FLAG(&UartHandle, UART_FLAG_RXNE) != RESET) {
mbed_official 469:fc4922e0c183 304 irq_handler(serial_irq_ids[id], RxIrq);
mbed_official 469:fc4922e0c183 305 volatile uint32_t tmpval = UartHandle.Instance->RDR; // Clear RXNE bit
mbed_official 469:fc4922e0c183 306 }
mbed_official 469:fc4922e0c183 307 }
mbed_official 469:fc4922e0c183 308 }
mbed_official 469:fc4922e0c183 309
mbed_official 630:825f75ca301e 310 static void uart1_irq(void) {
mbed_official 469:fc4922e0c183 311 uart_irq(UART_1, 0);
mbed_official 469:fc4922e0c183 312 }
mbed_official 469:fc4922e0c183 313
mbed_official 630:825f75ca301e 314 #if defined(USART2_BASE)
mbed_official 630:825f75ca301e 315 static void uart2_irq(void) {
mbed_official 469:fc4922e0c183 316 uart_irq(UART_2, 1);
mbed_official 469:fc4922e0c183 317 }
mbed_official 630:825f75ca301e 318 #endif
mbed_official 469:fc4922e0c183 319
mbed_official 469:fc4922e0c183 320 #if defined USART3_BASE
mbed_official 630:825f75ca301e 321 static void uart3_irq(void) {
mbed_official 469:fc4922e0c183 322 uart_irq(UART_3, 2);
mbed_official 469:fc4922e0c183 323 }
mbed_official 469:fc4922e0c183 324 #endif
mbed_official 469:fc4922e0c183 325
mbed_official 469:fc4922e0c183 326 #if defined USART4_BASE
mbed_official 630:825f75ca301e 327 static void uart4_irq(void) {
mbed_official 469:fc4922e0c183 328 uart_irq(UART_4, 3);
mbed_official 469:fc4922e0c183 329 }
mbed_official 469:fc4922e0c183 330 #endif
mbed_official 469:fc4922e0c183 331
mbed_official 469:fc4922e0c183 332 #if defined USART5_BASE
mbed_official 630:825f75ca301e 333 static void uart5_irq(void) {
mbed_official 469:fc4922e0c183 334 uart_irq(UART_5, 4);
mbed_official 469:fc4922e0c183 335 }
mbed_official 469:fc4922e0c183 336 #endif
mbed_official 469:fc4922e0c183 337
mbed_official 469:fc4922e0c183 338 #if defined USART6_BASE
mbed_official 630:825f75ca301e 339 static void uart6_irq(void) {
mbed_official 469:fc4922e0c183 340 uart_irq(UART_6, 5);
mbed_official 469:fc4922e0c183 341 }
mbed_official 469:fc4922e0c183 342 #endif
mbed_official 469:fc4922e0c183 343
mbed_official 469:fc4922e0c183 344 #if defined USART7_BASE
mbed_official 630:825f75ca301e 345 static void uart7_irq(void) {
mbed_official 469:fc4922e0c183 346 uart_irq(UART_7, 6);
mbed_official 469:fc4922e0c183 347 }
mbed_official 469:fc4922e0c183 348 #endif
mbed_official 469:fc4922e0c183 349
mbed_official 469:fc4922e0c183 350 #if defined USART8_BASE
mbed_official 630:825f75ca301e 351 static void uart8_irq(void) {
mbed_official 469:fc4922e0c183 352 uart_irq(UART_8, 7);
mbed_official 469:fc4922e0c183 353 }
mbed_official 469:fc4922e0c183 354 #endif
mbed_official 469:fc4922e0c183 355
mbed_official 630:825f75ca301e 356 void serial_irq_handler(serial_t *obj, uart_irq_handler handler, uint32_t id) {
mbed_official 469:fc4922e0c183 357 irq_handler = handler;
mbed_official 469:fc4922e0c183 358 serial_irq_ids[obj->index] = id;
mbed_official 469:fc4922e0c183 359 }
mbed_official 469:fc4922e0c183 360
mbed_official 630:825f75ca301e 361 void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable) {
mbed_official 469:fc4922e0c183 362 IRQn_Type irq_n = (IRQn_Type)0;
mbed_official 469:fc4922e0c183 363 uint32_t vector = 0;
mbed_official 469:fc4922e0c183 364
mbed_official 469:fc4922e0c183 365 UartHandle.Instance = (USART_TypeDef *)(obj->uart);
mbed_official 469:fc4922e0c183 366
mbed_official 469:fc4922e0c183 367 if (obj->uart == UART_1) {
mbed_official 469:fc4922e0c183 368 irq_n = USART1_IRQn;
mbed_official 469:fc4922e0c183 369 vector = (uint32_t)&uart1_irq;
mbed_official 469:fc4922e0c183 370 }
mbed_official 469:fc4922e0c183 371
mbed_official 630:825f75ca301e 372 #if defined(USART2_BASE)
mbed_official 469:fc4922e0c183 373 if (obj->uart == UART_2) {
mbed_official 469:fc4922e0c183 374 irq_n = USART2_IRQn;
mbed_official 469:fc4922e0c183 375 vector = (uint32_t)&uart2_irq;
mbed_official 469:fc4922e0c183 376 }
mbed_official 630:825f75ca301e 377 #endif
mbed_official 469:fc4922e0c183 378
mbed_official 469:fc4922e0c183 379 #if defined (TARGET_STM32F091RC)
mbed_official 469:fc4922e0c183 380 if (obj->uart == UART_3) {
mbed_official 469:fc4922e0c183 381 irq_n = USART3_8_IRQn;
mbed_official 469:fc4922e0c183 382 vector = (uint32_t)&uart3_irq;
mbed_official 469:fc4922e0c183 383 }
mbed_official 469:fc4922e0c183 384
mbed_official 469:fc4922e0c183 385 if (obj->uart == UART_4) {
mbed_official 469:fc4922e0c183 386 irq_n = USART3_8_IRQn;
mbed_official 469:fc4922e0c183 387 vector = (uint32_t)&uart4_irq;
mbed_official 469:fc4922e0c183 388 }
mbed_official 469:fc4922e0c183 389
mbed_official 469:fc4922e0c183 390 if (obj->uart == UART_5) {
mbed_official 469:fc4922e0c183 391 irq_n = USART3_8_IRQn;
mbed_official 469:fc4922e0c183 392 vector = (uint32_t)&uart5_irq;
mbed_official 469:fc4922e0c183 393 }
mbed_official 469:fc4922e0c183 394
mbed_official 469:fc4922e0c183 395 if (obj->uart == UART_6) {
mbed_official 469:fc4922e0c183 396 irq_n = USART3_8_IRQn;
mbed_official 469:fc4922e0c183 397 vector = (uint32_t)&uart6_irq;
mbed_official 469:fc4922e0c183 398 }
mbed_official 469:fc4922e0c183 399
mbed_official 469:fc4922e0c183 400 if (obj->uart == UART_7) {
mbed_official 469:fc4922e0c183 401 irq_n = USART3_8_IRQn;
mbed_official 469:fc4922e0c183 402 vector = (uint32_t)&uart7_irq;
mbed_official 469:fc4922e0c183 403 }
mbed_official 469:fc4922e0c183 404
mbed_official 469:fc4922e0c183 405 if (obj->uart == UART_8) {
mbed_official 469:fc4922e0c183 406 irq_n = USART3_8_IRQn;
mbed_official 469:fc4922e0c183 407 vector = (uint32_t)&uart8_irq;
mbed_official 469:fc4922e0c183 408 }
mbed_official 469:fc4922e0c183 409
mbed_official 469:fc4922e0c183 410 #elif defined (TARGET_STM32F030R8) || defined (TARGET_STM32F051R8)
mbed_official 469:fc4922e0c183 411
mbed_official 469:fc4922e0c183 412 #else
mbed_official 630:825f75ca301e 413 #if defined(USART3_BASE)
mbed_official 469:fc4922e0c183 414 if (obj->uart == UART_3) {
mbed_official 469:fc4922e0c183 415 irq_n = USART3_4_IRQn;
mbed_official 469:fc4922e0c183 416 vector = (uint32_t)&uart3_irq;
mbed_official 469:fc4922e0c183 417 }
mbed_official 630:825f75ca301e 418 #endif
mbed_official 469:fc4922e0c183 419
mbed_official 630:825f75ca301e 420 #if defined(USART4_BASE)
mbed_official 469:fc4922e0c183 421 if (obj->uart == UART_4) {
mbed_official 469:fc4922e0c183 422 irq_n = USART3_4_IRQn;
mbed_official 469:fc4922e0c183 423 vector = (uint32_t)&uart4_irq;
mbed_official 469:fc4922e0c183 424 }
mbed_official 469:fc4922e0c183 425 #endif
mbed_official 630:825f75ca301e 426 #endif
mbed_official 469:fc4922e0c183 427
mbed_official 469:fc4922e0c183 428 if (enable) {
mbed_official 469:fc4922e0c183 429
mbed_official 469:fc4922e0c183 430 if (irq == RxIrq) {
mbed_official 469:fc4922e0c183 431 __HAL_UART_ENABLE_IT(&UartHandle, UART_IT_RXNE);
mbed_official 469:fc4922e0c183 432 } else { // TxIrq
mbed_official 469:fc4922e0c183 433 __HAL_UART_ENABLE_IT(&UartHandle, UART_IT_TC);
mbed_official 469:fc4922e0c183 434 }
mbed_official 469:fc4922e0c183 435
mbed_official 469:fc4922e0c183 436 NVIC_SetVector(irq_n, vector);
mbed_official 469:fc4922e0c183 437 NVIC_EnableIRQ(irq_n);
mbed_official 469:fc4922e0c183 438
mbed_official 469:fc4922e0c183 439 } else { // disable
mbed_official 469:fc4922e0c183 440
mbed_official 469:fc4922e0c183 441 int all_disabled = 0;
mbed_official 469:fc4922e0c183 442
mbed_official 469:fc4922e0c183 443 if (irq == RxIrq) {
mbed_official 469:fc4922e0c183 444 __HAL_UART_DISABLE_IT(&UartHandle, UART_IT_RXNE);
mbed_official 469:fc4922e0c183 445 // Check if TxIrq is disabled too
mbed_official 469:fc4922e0c183 446 if ((UartHandle.Instance->CR1 & USART_CR1_TCIE) == 0) all_disabled = 1;
mbed_official 469:fc4922e0c183 447 } else { // TxIrq
mbed_official 469:fc4922e0c183 448 __HAL_UART_DISABLE_IT(&UartHandle, UART_IT_TC);
mbed_official 469:fc4922e0c183 449 // Check if RxIrq is disabled too
mbed_official 469:fc4922e0c183 450 if ((UartHandle.Instance->CR1 & USART_CR1_RXNEIE) == 0) all_disabled = 1;
mbed_official 469:fc4922e0c183 451 }
mbed_official 469:fc4922e0c183 452
mbed_official 469:fc4922e0c183 453 if (all_disabled) NVIC_DisableIRQ(irq_n);
mbed_official 469:fc4922e0c183 454
mbed_official 469:fc4922e0c183 455 }
mbed_official 469:fc4922e0c183 456 }
mbed_official 469:fc4922e0c183 457
mbed_official 469:fc4922e0c183 458 /******************************************************************************
mbed_official 469:fc4922e0c183 459 * READ/WRITE
mbed_official 469:fc4922e0c183 460 ******************************************************************************/
mbed_official 469:fc4922e0c183 461
mbed_official 630:825f75ca301e 462 int serial_getc(serial_t *obj) {
mbed_official 469:fc4922e0c183 463 USART_TypeDef *uart = (USART_TypeDef *)(obj->uart);
mbed_official 469:fc4922e0c183 464 while (!serial_readable(obj));
mbed_official 469:fc4922e0c183 465 return (int)(uart->RDR & (uint16_t)0xFF);
mbed_official 469:fc4922e0c183 466 }
mbed_official 469:fc4922e0c183 467
mbed_official 630:825f75ca301e 468 void serial_putc(serial_t *obj, int c) {
mbed_official 469:fc4922e0c183 469 USART_TypeDef *uart = (USART_TypeDef *)(obj->uart);
mbed_official 469:fc4922e0c183 470 while (!serial_writable(obj));
mbed_official 469:fc4922e0c183 471 uart->TDR = (uint32_t)(c & (uint16_t)0xFF);
mbed_official 469:fc4922e0c183 472 }
mbed_official 469:fc4922e0c183 473
mbed_official 630:825f75ca301e 474 int serial_readable(serial_t *obj) {
mbed_official 469:fc4922e0c183 475 int status;
mbed_official 469:fc4922e0c183 476 UartHandle.Instance = (USART_TypeDef *)(obj->uart);
mbed_official 469:fc4922e0c183 477 // Check if data is received
mbed_official 469:fc4922e0c183 478 status = ((__HAL_UART_GET_FLAG(&UartHandle, UART_FLAG_RXNE) != RESET) ? 1 : 0);
mbed_official 469:fc4922e0c183 479 return status;
mbed_official 469:fc4922e0c183 480 }
mbed_official 469:fc4922e0c183 481
mbed_official 630:825f75ca301e 482 int serial_writable(serial_t *obj) {
mbed_official 469:fc4922e0c183 483 int status;
mbed_official 469:fc4922e0c183 484 UartHandle.Instance = (USART_TypeDef *)(obj->uart);
mbed_official 469:fc4922e0c183 485 // Check if data is transmitted
mbed_official 469:fc4922e0c183 486 status = ((__HAL_UART_GET_FLAG(&UartHandle, UART_FLAG_TXE) != RESET) ? 1 : 0);
mbed_official 469:fc4922e0c183 487 return status;
mbed_official 469:fc4922e0c183 488 }
mbed_official 469:fc4922e0c183 489
mbed_official 630:825f75ca301e 490 void serial_clear(serial_t *obj) {
mbed_official 469:fc4922e0c183 491 UartHandle.Instance = (USART_TypeDef *)(obj->uart);
mbed_official 469:fc4922e0c183 492 __HAL_UART_CLEAR_IT(&UartHandle, UART_FLAG_TC);
mbed_official 469:fc4922e0c183 493 __HAL_UART_SEND_REQ(&UartHandle, UART_RXDATA_FLUSH_REQUEST);
mbed_official 469:fc4922e0c183 494 }
mbed_official 469:fc4922e0c183 495
mbed_official 630:825f75ca301e 496 void serial_pinout_tx(PinName tx) {
mbed_official 469:fc4922e0c183 497 pinmap_pinout(tx, PinMap_UART_TX);
mbed_official 469:fc4922e0c183 498 }
mbed_official 469:fc4922e0c183 499
mbed_official 630:825f75ca301e 500 void serial_break_set(serial_t *obj) {
mbed_official 469:fc4922e0c183 501 // [TODO]
mbed_official 469:fc4922e0c183 502 }
mbed_official 469:fc4922e0c183 503
mbed_official 630:825f75ca301e 504 void serial_break_clear(serial_t *obj) {
mbed_official 469:fc4922e0c183 505 // [TODO]
mbed_official 469:fc4922e0c183 506 }
mbed_official 469:fc4922e0c183 507
mbed_official 469:fc4922e0c183 508 #endif