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 Feb 09 09:30:07 2015 +0000
Revision:
469:fc4922e0c183
Child:
630:825f75ca301e
Synchronized with git revision 06e2b3c8802cb4f78e9958ba9923755bd458e8b7

Full URL: https://github.com/mbedmicro/mbed/commit/06e2b3c8802cb4f78e9958ba9923755bd458e8b7/

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 469:fc4922e0c183 3 * Copyright (c) 2014, 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 469:fc4922e0c183 50 #else
mbed_official 469:fc4922e0c183 51 #define UART_NUM (4)
mbed_official 469:fc4922e0c183 52
mbed_official 469:fc4922e0c183 53 static uint32_t serial_irq_ids[UART_NUM] = {0, 0, 0, 0};
mbed_official 469:fc4922e0c183 54
mbed_official 469:fc4922e0c183 55 #endif
mbed_official 469:fc4922e0c183 56
mbed_official 469:fc4922e0c183 57 static uart_irq_handler irq_handler;
mbed_official 469:fc4922e0c183 58
mbed_official 469:fc4922e0c183 59 UART_HandleTypeDef UartHandle;
mbed_official 469:fc4922e0c183 60
mbed_official 469:fc4922e0c183 61 int stdio_uart_inited = 0;
mbed_official 469:fc4922e0c183 62 serial_t stdio_uart;
mbed_official 469:fc4922e0c183 63
mbed_official 469:fc4922e0c183 64 static void init_uart(serial_t *obj)
mbed_official 469:fc4922e0c183 65 {
mbed_official 469:fc4922e0c183 66 UartHandle.Instance = (USART_TypeDef *)(obj->uart);
mbed_official 469:fc4922e0c183 67
mbed_official 469:fc4922e0c183 68 UartHandle.Init.BaudRate = obj->baudrate;
mbed_official 469:fc4922e0c183 69 UartHandle.Init.WordLength = obj->databits;
mbed_official 469:fc4922e0c183 70 UartHandle.Init.StopBits = obj->stopbits;
mbed_official 469:fc4922e0c183 71 UartHandle.Init.Parity = obj->parity;
mbed_official 469:fc4922e0c183 72 UartHandle.Init.HwFlowCtl = UART_HWCONTROL_NONE;
mbed_official 469:fc4922e0c183 73
mbed_official 469:fc4922e0c183 74 if (obj->pin_rx == NC) {
mbed_official 469:fc4922e0c183 75 UartHandle.Init.Mode = UART_MODE_TX;
mbed_official 469:fc4922e0c183 76 } else if (obj->pin_tx == NC) {
mbed_official 469:fc4922e0c183 77 UartHandle.Init.Mode = UART_MODE_RX;
mbed_official 469:fc4922e0c183 78 } else {
mbed_official 469:fc4922e0c183 79 UartHandle.Init.Mode = UART_MODE_TX_RX;
mbed_official 469:fc4922e0c183 80 }
mbed_official 469:fc4922e0c183 81
mbed_official 469:fc4922e0c183 82 // Disable the reception overrun detection
mbed_official 469:fc4922e0c183 83 UartHandle.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_RXOVERRUNDISABLE_INIT;
mbed_official 469:fc4922e0c183 84 UartHandle.AdvancedInit.OverrunDisable = UART_ADVFEATURE_OVERRUN_DISABLE;
mbed_official 469:fc4922e0c183 85
mbed_official 469:fc4922e0c183 86 HAL_UART_Init(&UartHandle);
mbed_official 469:fc4922e0c183 87 }
mbed_official 469:fc4922e0c183 88
mbed_official 469:fc4922e0c183 89 void serial_init(serial_t *obj, PinName tx, PinName rx)
mbed_official 469:fc4922e0c183 90 {
mbed_official 469:fc4922e0c183 91 // Determine the UART to use (UART_1, UART_2, ...)
mbed_official 469:fc4922e0c183 92 UARTName uart_tx = (UARTName)pinmap_peripheral(tx, PinMap_UART_TX);
mbed_official 469:fc4922e0c183 93 UARTName uart_rx = (UARTName)pinmap_peripheral(rx, PinMap_UART_RX);
mbed_official 469:fc4922e0c183 94
mbed_official 469:fc4922e0c183 95 // Get the peripheral name (UART_1, UART_2, ...) from the pin and assign it to the object
mbed_official 469:fc4922e0c183 96 obj->uart = (UARTName)pinmap_merge(uart_tx, uart_rx);
mbed_official 469:fc4922e0c183 97 MBED_ASSERT(obj->uart != (UARTName)NC);
mbed_official 469:fc4922e0c183 98
mbed_official 469:fc4922e0c183 99 // Enable USART clock
mbed_official 469:fc4922e0c183 100 if (obj->uart == UART_1) {
mbed_official 469:fc4922e0c183 101 __USART1_CLK_ENABLE();
mbed_official 469:fc4922e0c183 102 obj->index = 0;
mbed_official 469:fc4922e0c183 103 }
mbed_official 469:fc4922e0c183 104
mbed_official 469:fc4922e0c183 105 if (obj->uart == UART_2) {
mbed_official 469:fc4922e0c183 106 __USART2_CLK_ENABLE();
mbed_official 469:fc4922e0c183 107 obj->index = 1;
mbed_official 469:fc4922e0c183 108 }
mbed_official 469:fc4922e0c183 109
mbed_official 469:fc4922e0c183 110 #if defined USART3_BASE
mbed_official 469:fc4922e0c183 111 if (obj->uart == UART_3) {
mbed_official 469:fc4922e0c183 112 __USART3_CLK_ENABLE();
mbed_official 469:fc4922e0c183 113 obj->index = 2;
mbed_official 469:fc4922e0c183 114 }
mbed_official 469:fc4922e0c183 115 #endif
mbed_official 469:fc4922e0c183 116
mbed_official 469:fc4922e0c183 117 #if defined USART4_BASE
mbed_official 469:fc4922e0c183 118 if (obj->uart == UART_4) {
mbed_official 469:fc4922e0c183 119 __USART4_CLK_ENABLE();
mbed_official 469:fc4922e0c183 120 obj->index = 3;
mbed_official 469:fc4922e0c183 121 }
mbed_official 469:fc4922e0c183 122 #endif
mbed_official 469:fc4922e0c183 123
mbed_official 469:fc4922e0c183 124 #if defined USART5_BASE
mbed_official 469:fc4922e0c183 125 if (obj->uart == UART_5) {
mbed_official 469:fc4922e0c183 126 __USART5_CLK_ENABLE();
mbed_official 469:fc4922e0c183 127 obj->index = 4;
mbed_official 469:fc4922e0c183 128 }
mbed_official 469:fc4922e0c183 129 #endif
mbed_official 469:fc4922e0c183 130
mbed_official 469:fc4922e0c183 131 #if defined USART6_BASE
mbed_official 469:fc4922e0c183 132 if (obj->uart == UART_6) {
mbed_official 469:fc4922e0c183 133 __USART6_CLK_ENABLE();
mbed_official 469:fc4922e0c183 134 obj->index = 5;
mbed_official 469:fc4922e0c183 135 }
mbed_official 469:fc4922e0c183 136 #endif
mbed_official 469:fc4922e0c183 137
mbed_official 469:fc4922e0c183 138 #if defined USART7_BASE
mbed_official 469:fc4922e0c183 139 if (obj->uart == UART_7) {
mbed_official 469:fc4922e0c183 140 __USART7_CLK_ENABLE();
mbed_official 469:fc4922e0c183 141 obj->index = 6;
mbed_official 469:fc4922e0c183 142 }
mbed_official 469:fc4922e0c183 143 #endif
mbed_official 469:fc4922e0c183 144
mbed_official 469:fc4922e0c183 145 #if defined USART8_BASE
mbed_official 469:fc4922e0c183 146 if (obj->uart == UART_8) {
mbed_official 469:fc4922e0c183 147 __USART8_CLK_ENABLE();
mbed_official 469:fc4922e0c183 148 obj->index = 7;
mbed_official 469:fc4922e0c183 149 }
mbed_official 469:fc4922e0c183 150 #endif
mbed_official 469:fc4922e0c183 151
mbed_official 469:fc4922e0c183 152 // Configure the UART pins
mbed_official 469:fc4922e0c183 153 pinmap_pinout(tx, PinMap_UART_TX);
mbed_official 469:fc4922e0c183 154 pinmap_pinout(rx, PinMap_UART_RX);
mbed_official 469:fc4922e0c183 155 if (tx != NC) {
mbed_official 469:fc4922e0c183 156 pin_mode(tx, PullUp);
mbed_official 469:fc4922e0c183 157 }
mbed_official 469:fc4922e0c183 158 if (rx != NC) {
mbed_official 469:fc4922e0c183 159 pin_mode(rx, PullUp);
mbed_official 469:fc4922e0c183 160 }
mbed_official 469:fc4922e0c183 161
mbed_official 469:fc4922e0c183 162 // Configure UART
mbed_official 469:fc4922e0c183 163 obj->baudrate = 9600;
mbed_official 469:fc4922e0c183 164 obj->databits = UART_WORDLENGTH_8B;
mbed_official 469:fc4922e0c183 165 obj->stopbits = UART_STOPBITS_1;
mbed_official 469:fc4922e0c183 166 obj->parity = UART_PARITY_NONE;
mbed_official 469:fc4922e0c183 167
mbed_official 469:fc4922e0c183 168 obj->pin_tx = tx;
mbed_official 469:fc4922e0c183 169 obj->pin_rx = rx;
mbed_official 469:fc4922e0c183 170
mbed_official 469:fc4922e0c183 171 init_uart(obj);
mbed_official 469:fc4922e0c183 172
mbed_official 469:fc4922e0c183 173 // For stdio management
mbed_official 469:fc4922e0c183 174 if (obj->uart == STDIO_UART) {
mbed_official 469:fc4922e0c183 175 stdio_uart_inited = 1;
mbed_official 469:fc4922e0c183 176 memcpy(&stdio_uart, obj, sizeof(serial_t));
mbed_official 469:fc4922e0c183 177 }
mbed_official 469:fc4922e0c183 178 }
mbed_official 469:fc4922e0c183 179
mbed_official 469:fc4922e0c183 180 void serial_free(serial_t *obj)
mbed_official 469:fc4922e0c183 181 {
mbed_official 469:fc4922e0c183 182 // Reset UART and disable clock
mbed_official 469:fc4922e0c183 183 if (obj->uart == UART_1) {
mbed_official 469:fc4922e0c183 184 __USART1_FORCE_RESET();
mbed_official 469:fc4922e0c183 185 __USART1_RELEASE_RESET();
mbed_official 469:fc4922e0c183 186 __USART1_CLK_DISABLE();
mbed_official 469:fc4922e0c183 187 }
mbed_official 469:fc4922e0c183 188
mbed_official 469:fc4922e0c183 189 if (obj->uart == UART_2) {
mbed_official 469:fc4922e0c183 190 __USART2_FORCE_RESET();
mbed_official 469:fc4922e0c183 191 __USART2_RELEASE_RESET();
mbed_official 469:fc4922e0c183 192 __USART2_CLK_DISABLE();
mbed_official 469:fc4922e0c183 193 }
mbed_official 469:fc4922e0c183 194
mbed_official 469:fc4922e0c183 195 #if defined USART3_BASE
mbed_official 469:fc4922e0c183 196 if (obj->uart == UART_3) {
mbed_official 469:fc4922e0c183 197 __USART3_FORCE_RESET();
mbed_official 469:fc4922e0c183 198 __USART3_RELEASE_RESET();
mbed_official 469:fc4922e0c183 199 __USART3_CLK_DISABLE();
mbed_official 469:fc4922e0c183 200 }
mbed_official 469:fc4922e0c183 201 #endif
mbed_official 469:fc4922e0c183 202
mbed_official 469:fc4922e0c183 203 #if defined USART4_BASE
mbed_official 469:fc4922e0c183 204 if (obj->uart == UART_4) {
mbed_official 469:fc4922e0c183 205 __USART4_FORCE_RESET();
mbed_official 469:fc4922e0c183 206 __USART4_RELEASE_RESET();
mbed_official 469:fc4922e0c183 207 __USART4_CLK_DISABLE();
mbed_official 469:fc4922e0c183 208 }
mbed_official 469:fc4922e0c183 209 #endif
mbed_official 469:fc4922e0c183 210
mbed_official 469:fc4922e0c183 211 #if defined USART5_BASE
mbed_official 469:fc4922e0c183 212 if (obj->uart == UART_5) {
mbed_official 469:fc4922e0c183 213 __USART5_FORCE_RESET();
mbed_official 469:fc4922e0c183 214 __USART5_RELEASE_RESET();
mbed_official 469:fc4922e0c183 215 __USART5_CLK_DISABLE();
mbed_official 469:fc4922e0c183 216 }
mbed_official 469:fc4922e0c183 217 #endif
mbed_official 469:fc4922e0c183 218
mbed_official 469:fc4922e0c183 219 #if defined USART6_BASE
mbed_official 469:fc4922e0c183 220 if (obj->uart == UART_6) {
mbed_official 469:fc4922e0c183 221 __USART6_FORCE_RESET();
mbed_official 469:fc4922e0c183 222 __USART6_RELEASE_RESET();
mbed_official 469:fc4922e0c183 223 __USART6_CLK_DISABLE();
mbed_official 469:fc4922e0c183 224 }
mbed_official 469:fc4922e0c183 225 #endif
mbed_official 469:fc4922e0c183 226
mbed_official 469:fc4922e0c183 227 #if defined USART7_BASE
mbed_official 469:fc4922e0c183 228 if (obj->uart == UART_7) {
mbed_official 469:fc4922e0c183 229 __USART7_FORCE_RESET();
mbed_official 469:fc4922e0c183 230 __USART7_RELEASE_RESET();
mbed_official 469:fc4922e0c183 231 __USART7_CLK_DISABLE();
mbed_official 469:fc4922e0c183 232 }
mbed_official 469:fc4922e0c183 233 #endif
mbed_official 469:fc4922e0c183 234
mbed_official 469:fc4922e0c183 235 #if defined USART8_BASE
mbed_official 469:fc4922e0c183 236 if (obj->uart == UART_8) {
mbed_official 469:fc4922e0c183 237 __USART8_FORCE_RESET();
mbed_official 469:fc4922e0c183 238 __USART8_RELEASE_RESET();
mbed_official 469:fc4922e0c183 239 __USART8_CLK_DISABLE();
mbed_official 469:fc4922e0c183 240 }
mbed_official 469:fc4922e0c183 241 #endif
mbed_official 469:fc4922e0c183 242
mbed_official 469:fc4922e0c183 243
mbed_official 469:fc4922e0c183 244 // Configure GPIOs
mbed_official 469:fc4922e0c183 245 pin_function(obj->pin_tx, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 0));
mbed_official 469:fc4922e0c183 246 pin_function(obj->pin_rx, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 0));
mbed_official 469:fc4922e0c183 247
mbed_official 469:fc4922e0c183 248 serial_irq_ids[obj->index] = 0;
mbed_official 469:fc4922e0c183 249 }
mbed_official 469:fc4922e0c183 250
mbed_official 469:fc4922e0c183 251 void serial_baud(serial_t *obj, int baudrate)
mbed_official 469:fc4922e0c183 252 {
mbed_official 469:fc4922e0c183 253 obj->baudrate = baudrate;
mbed_official 469:fc4922e0c183 254 init_uart(obj);
mbed_official 469:fc4922e0c183 255 }
mbed_official 469:fc4922e0c183 256
mbed_official 469:fc4922e0c183 257 void serial_format(serial_t *obj, int data_bits, SerialParity parity, int stop_bits)
mbed_official 469:fc4922e0c183 258 {
mbed_official 469:fc4922e0c183 259 if (data_bits == 9) {
mbed_official 469:fc4922e0c183 260 obj->databits = UART_WORDLENGTH_9B;
mbed_official 469:fc4922e0c183 261 } else {
mbed_official 469:fc4922e0c183 262 obj->databits = UART_WORDLENGTH_8B;
mbed_official 469:fc4922e0c183 263 }
mbed_official 469:fc4922e0c183 264
mbed_official 469:fc4922e0c183 265 switch (parity) {
mbed_official 469:fc4922e0c183 266 case ParityOdd:
mbed_official 469:fc4922e0c183 267 case ParityForced0:
mbed_official 469:fc4922e0c183 268 obj->parity = UART_PARITY_ODD;
mbed_official 469:fc4922e0c183 269 break;
mbed_official 469:fc4922e0c183 270 case ParityEven:
mbed_official 469:fc4922e0c183 271 case ParityForced1:
mbed_official 469:fc4922e0c183 272 obj->parity = UART_PARITY_EVEN;
mbed_official 469:fc4922e0c183 273 break;
mbed_official 469:fc4922e0c183 274 default: // ParityNone
mbed_official 469:fc4922e0c183 275 obj->parity = UART_PARITY_NONE;
mbed_official 469:fc4922e0c183 276 break;
mbed_official 469:fc4922e0c183 277 }
mbed_official 469:fc4922e0c183 278
mbed_official 469:fc4922e0c183 279 if (stop_bits == 2) {
mbed_official 469:fc4922e0c183 280 obj->stopbits = UART_STOPBITS_2;
mbed_official 469:fc4922e0c183 281 } else {
mbed_official 469:fc4922e0c183 282 obj->stopbits = UART_STOPBITS_1;
mbed_official 469:fc4922e0c183 283 }
mbed_official 469:fc4922e0c183 284
mbed_official 469:fc4922e0c183 285 init_uart(obj);
mbed_official 469:fc4922e0c183 286 }
mbed_official 469:fc4922e0c183 287
mbed_official 469:fc4922e0c183 288 /******************************************************************************
mbed_official 469:fc4922e0c183 289 * INTERRUPTS HANDLING
mbed_official 469:fc4922e0c183 290 ******************************************************************************/
mbed_official 469:fc4922e0c183 291
mbed_official 469:fc4922e0c183 292 static void uart_irq(UARTName name, int id)
mbed_official 469:fc4922e0c183 293 {
mbed_official 469:fc4922e0c183 294 UartHandle.Instance = (USART_TypeDef *)name;
mbed_official 469:fc4922e0c183 295 if (serial_irq_ids[id] != 0) {
mbed_official 469:fc4922e0c183 296 if (__HAL_UART_GET_FLAG(&UartHandle, UART_FLAG_TC) != RESET) {
mbed_official 469:fc4922e0c183 297 irq_handler(serial_irq_ids[id], TxIrq);
mbed_official 469:fc4922e0c183 298 __HAL_UART_CLEAR_IT(&UartHandle, UART_FLAG_TC);
mbed_official 469:fc4922e0c183 299 }
mbed_official 469:fc4922e0c183 300 if (__HAL_UART_GET_FLAG(&UartHandle, UART_FLAG_RXNE) != RESET) {
mbed_official 469:fc4922e0c183 301 irq_handler(serial_irq_ids[id], RxIrq);
mbed_official 469:fc4922e0c183 302 volatile uint32_t tmpval = UartHandle.Instance->RDR; // Clear RXNE bit
mbed_official 469:fc4922e0c183 303 }
mbed_official 469:fc4922e0c183 304 }
mbed_official 469:fc4922e0c183 305 }
mbed_official 469:fc4922e0c183 306
mbed_official 469:fc4922e0c183 307 static void uart1_irq(void)
mbed_official 469:fc4922e0c183 308 {
mbed_official 469:fc4922e0c183 309 uart_irq(UART_1, 0);
mbed_official 469:fc4922e0c183 310 }
mbed_official 469:fc4922e0c183 311
mbed_official 469:fc4922e0c183 312 static void uart2_irq(void)
mbed_official 469:fc4922e0c183 313 {
mbed_official 469:fc4922e0c183 314 uart_irq(UART_2, 1);
mbed_official 469:fc4922e0c183 315 }
mbed_official 469:fc4922e0c183 316
mbed_official 469:fc4922e0c183 317 #if defined USART3_BASE
mbed_official 469:fc4922e0c183 318 static void uart3_irq(void)
mbed_official 469:fc4922e0c183 319 {
mbed_official 469:fc4922e0c183 320 uart_irq(UART_3, 2);
mbed_official 469:fc4922e0c183 321 }
mbed_official 469:fc4922e0c183 322 #endif
mbed_official 469:fc4922e0c183 323
mbed_official 469:fc4922e0c183 324 #if defined USART4_BASE
mbed_official 469:fc4922e0c183 325 static void uart4_irq(void)
mbed_official 469:fc4922e0c183 326 {
mbed_official 469:fc4922e0c183 327 uart_irq(UART_4, 3);
mbed_official 469:fc4922e0c183 328 }
mbed_official 469:fc4922e0c183 329 #endif
mbed_official 469:fc4922e0c183 330
mbed_official 469:fc4922e0c183 331 #if defined USART5_BASE
mbed_official 469:fc4922e0c183 332 static void uart5_irq(void)
mbed_official 469:fc4922e0c183 333 {
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 469:fc4922e0c183 339 static void uart6_irq(void)
mbed_official 469:fc4922e0c183 340 {
mbed_official 469:fc4922e0c183 341 uart_irq(UART_6, 5);
mbed_official 469:fc4922e0c183 342 }
mbed_official 469:fc4922e0c183 343 #endif
mbed_official 469:fc4922e0c183 344
mbed_official 469:fc4922e0c183 345 #if defined USART7_BASE
mbed_official 469:fc4922e0c183 346 static void uart7_irq(void)
mbed_official 469:fc4922e0c183 347 {
mbed_official 469:fc4922e0c183 348 uart_irq(UART_7, 6);
mbed_official 469:fc4922e0c183 349 }
mbed_official 469:fc4922e0c183 350 #endif
mbed_official 469:fc4922e0c183 351
mbed_official 469:fc4922e0c183 352 #if defined USART8_BASE
mbed_official 469:fc4922e0c183 353 static void uart8_irq(void)
mbed_official 469:fc4922e0c183 354 {
mbed_official 469:fc4922e0c183 355 uart_irq(UART_8, 7);
mbed_official 469:fc4922e0c183 356 }
mbed_official 469:fc4922e0c183 357 #endif
mbed_official 469:fc4922e0c183 358
mbed_official 469:fc4922e0c183 359 void serial_irq_handler(serial_t *obj, uart_irq_handler handler, uint32_t id)
mbed_official 469:fc4922e0c183 360 {
mbed_official 469:fc4922e0c183 361 irq_handler = handler;
mbed_official 469:fc4922e0c183 362 serial_irq_ids[obj->index] = id;
mbed_official 469:fc4922e0c183 363 }
mbed_official 469:fc4922e0c183 364
mbed_official 469:fc4922e0c183 365 void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable)
mbed_official 469:fc4922e0c183 366 {
mbed_official 469:fc4922e0c183 367 IRQn_Type irq_n = (IRQn_Type)0;
mbed_official 469:fc4922e0c183 368 uint32_t vector = 0;
mbed_official 469:fc4922e0c183 369
mbed_official 469:fc4922e0c183 370 UartHandle.Instance = (USART_TypeDef *)(obj->uart);
mbed_official 469:fc4922e0c183 371
mbed_official 469:fc4922e0c183 372 if (obj->uart == UART_1) {
mbed_official 469:fc4922e0c183 373 irq_n = USART1_IRQn;
mbed_official 469:fc4922e0c183 374 vector = (uint32_t)&uart1_irq;
mbed_official 469:fc4922e0c183 375 }
mbed_official 469:fc4922e0c183 376
mbed_official 469:fc4922e0c183 377 if (obj->uart == UART_2) {
mbed_official 469:fc4922e0c183 378 irq_n = USART2_IRQn;
mbed_official 469:fc4922e0c183 379 vector = (uint32_t)&uart2_irq;
mbed_official 469:fc4922e0c183 380 }
mbed_official 469:fc4922e0c183 381
mbed_official 469:fc4922e0c183 382 #if defined (TARGET_STM32F091RC)
mbed_official 469:fc4922e0c183 383 if (obj->uart == UART_3) {
mbed_official 469:fc4922e0c183 384 irq_n = USART3_8_IRQn;
mbed_official 469:fc4922e0c183 385 vector = (uint32_t)&uart3_irq;
mbed_official 469:fc4922e0c183 386 }
mbed_official 469:fc4922e0c183 387
mbed_official 469:fc4922e0c183 388 if (obj->uart == UART_4) {
mbed_official 469:fc4922e0c183 389 irq_n = USART3_8_IRQn;
mbed_official 469:fc4922e0c183 390 vector = (uint32_t)&uart4_irq;
mbed_official 469:fc4922e0c183 391 }
mbed_official 469:fc4922e0c183 392
mbed_official 469:fc4922e0c183 393 if (obj->uart == UART_5) {
mbed_official 469:fc4922e0c183 394 irq_n = USART3_8_IRQn;
mbed_official 469:fc4922e0c183 395 vector = (uint32_t)&uart5_irq;
mbed_official 469:fc4922e0c183 396 }
mbed_official 469:fc4922e0c183 397
mbed_official 469:fc4922e0c183 398 if (obj->uart == UART_6) {
mbed_official 469:fc4922e0c183 399 irq_n = USART3_8_IRQn;
mbed_official 469:fc4922e0c183 400 vector = (uint32_t)&uart6_irq;
mbed_official 469:fc4922e0c183 401 }
mbed_official 469:fc4922e0c183 402
mbed_official 469:fc4922e0c183 403 if (obj->uart == UART_7) {
mbed_official 469:fc4922e0c183 404 irq_n = USART3_8_IRQn;
mbed_official 469:fc4922e0c183 405 vector = (uint32_t)&uart7_irq;
mbed_official 469:fc4922e0c183 406 }
mbed_official 469:fc4922e0c183 407
mbed_official 469:fc4922e0c183 408 if (obj->uart == UART_8) {
mbed_official 469:fc4922e0c183 409 irq_n = USART3_8_IRQn;
mbed_official 469:fc4922e0c183 410 vector = (uint32_t)&uart8_irq;
mbed_official 469:fc4922e0c183 411 }
mbed_official 469:fc4922e0c183 412
mbed_official 469:fc4922e0c183 413 #elif defined (TARGET_STM32F030R8) || defined (TARGET_STM32F051R8)
mbed_official 469:fc4922e0c183 414
mbed_official 469:fc4922e0c183 415 #else
mbed_official 469:fc4922e0c183 416 if (obj->uart == UART_3) {
mbed_official 469:fc4922e0c183 417 irq_n = USART3_4_IRQn;
mbed_official 469:fc4922e0c183 418 vector = (uint32_t)&uart3_irq;
mbed_official 469:fc4922e0c183 419 }
mbed_official 469:fc4922e0c183 420
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 469:fc4922e0c183 426
mbed_official 469:fc4922e0c183 427 if (enable) {
mbed_official 469:fc4922e0c183 428
mbed_official 469:fc4922e0c183 429 if (irq == RxIrq) {
mbed_official 469:fc4922e0c183 430 __HAL_UART_ENABLE_IT(&UartHandle, UART_IT_RXNE);
mbed_official 469:fc4922e0c183 431 } else { // TxIrq
mbed_official 469:fc4922e0c183 432 __HAL_UART_ENABLE_IT(&UartHandle, UART_IT_TC);
mbed_official 469:fc4922e0c183 433 }
mbed_official 469:fc4922e0c183 434
mbed_official 469:fc4922e0c183 435 NVIC_SetVector(irq_n, vector);
mbed_official 469:fc4922e0c183 436 NVIC_EnableIRQ(irq_n);
mbed_official 469:fc4922e0c183 437
mbed_official 469:fc4922e0c183 438 } else { // disable
mbed_official 469:fc4922e0c183 439
mbed_official 469:fc4922e0c183 440 int all_disabled = 0;
mbed_official 469:fc4922e0c183 441
mbed_official 469:fc4922e0c183 442 if (irq == RxIrq) {
mbed_official 469:fc4922e0c183 443 __HAL_UART_DISABLE_IT(&UartHandle, UART_IT_RXNE);
mbed_official 469:fc4922e0c183 444 // Check if TxIrq is disabled too
mbed_official 469:fc4922e0c183 445 if ((UartHandle.Instance->CR1 & USART_CR1_TCIE) == 0) all_disabled = 1;
mbed_official 469:fc4922e0c183 446 } else { // TxIrq
mbed_official 469:fc4922e0c183 447 __HAL_UART_DISABLE_IT(&UartHandle, UART_IT_TC);
mbed_official 469:fc4922e0c183 448 // Check if RxIrq is disabled too
mbed_official 469:fc4922e0c183 449 if ((UartHandle.Instance->CR1 & USART_CR1_RXNEIE) == 0) all_disabled = 1;
mbed_official 469:fc4922e0c183 450 }
mbed_official 469:fc4922e0c183 451
mbed_official 469:fc4922e0c183 452 if (all_disabled) NVIC_DisableIRQ(irq_n);
mbed_official 469:fc4922e0c183 453
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 * READ/WRITE
mbed_official 469:fc4922e0c183 459 ******************************************************************************/
mbed_official 469:fc4922e0c183 460
mbed_official 469:fc4922e0c183 461 int serial_getc(serial_t *obj)
mbed_official 469:fc4922e0c183 462 {
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 469:fc4922e0c183 468 void serial_putc(serial_t *obj, int c)
mbed_official 469:fc4922e0c183 469 {
mbed_official 469:fc4922e0c183 470 USART_TypeDef *uart = (USART_TypeDef *)(obj->uart);
mbed_official 469:fc4922e0c183 471 while (!serial_writable(obj));
mbed_official 469:fc4922e0c183 472 uart->TDR = (uint32_t)(c & (uint16_t)0xFF);
mbed_official 469:fc4922e0c183 473 }
mbed_official 469:fc4922e0c183 474
mbed_official 469:fc4922e0c183 475 int serial_readable(serial_t *obj)
mbed_official 469:fc4922e0c183 476 {
mbed_official 469:fc4922e0c183 477 int status;
mbed_official 469:fc4922e0c183 478 UartHandle.Instance = (USART_TypeDef *)(obj->uart);
mbed_official 469:fc4922e0c183 479 // Check if data is received
mbed_official 469:fc4922e0c183 480 status = ((__HAL_UART_GET_FLAG(&UartHandle, UART_FLAG_RXNE) != RESET) ? 1 : 0);
mbed_official 469:fc4922e0c183 481 return status;
mbed_official 469:fc4922e0c183 482 }
mbed_official 469:fc4922e0c183 483
mbed_official 469:fc4922e0c183 484 int serial_writable(serial_t *obj)
mbed_official 469:fc4922e0c183 485 {
mbed_official 469:fc4922e0c183 486 int status;
mbed_official 469:fc4922e0c183 487 UartHandle.Instance = (USART_TypeDef *)(obj->uart);
mbed_official 469:fc4922e0c183 488 // Check if data is transmitted
mbed_official 469:fc4922e0c183 489 status = ((__HAL_UART_GET_FLAG(&UartHandle, UART_FLAG_TXE) != RESET) ? 1 : 0);
mbed_official 469:fc4922e0c183 490 return status;
mbed_official 469:fc4922e0c183 491 }
mbed_official 469:fc4922e0c183 492
mbed_official 469:fc4922e0c183 493 void serial_clear(serial_t *obj)
mbed_official 469:fc4922e0c183 494 {
mbed_official 469:fc4922e0c183 495 UartHandle.Instance = (USART_TypeDef *)(obj->uart);
mbed_official 469:fc4922e0c183 496 __HAL_UART_CLEAR_IT(&UartHandle, UART_FLAG_TC);
mbed_official 469:fc4922e0c183 497 __HAL_UART_SEND_REQ(&UartHandle, UART_RXDATA_FLUSH_REQUEST);
mbed_official 469:fc4922e0c183 498 }
mbed_official 469:fc4922e0c183 499
mbed_official 469:fc4922e0c183 500 void serial_pinout_tx(PinName tx)
mbed_official 469:fc4922e0c183 501 {
mbed_official 469:fc4922e0c183 502 pinmap_pinout(tx, PinMap_UART_TX);
mbed_official 469:fc4922e0c183 503 }
mbed_official 469:fc4922e0c183 504
mbed_official 469:fc4922e0c183 505 void serial_break_set(serial_t *obj)
mbed_official 469:fc4922e0c183 506 {
mbed_official 469:fc4922e0c183 507 // [TODO]
mbed_official 469:fc4922e0c183 508 }
mbed_official 469:fc4922e0c183 509
mbed_official 469:fc4922e0c183 510 void serial_break_clear(serial_t *obj)
mbed_official 469:fc4922e0c183 511 {
mbed_official 469:fc4922e0c183 512 // [TODO]
mbed_official 469:fc4922e0c183 513 }
mbed_official 469:fc4922e0c183 514
mbed_official 469:fc4922e0c183 515 #endif