Modified version of the mbed library for use with the Nucleo boards.

Dependents:   EEPROMWrite Full-Project

Fork of mbed-src by mbed official

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