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:
Fri Feb 20 18:00:08 2015 +0000
Revision:
478:9f3d4ee935ce
Parent:
442:d916d321e60f
Child:
613:bc40b8d2aec4
Synchronized with git revision 86041dd3983e145ab913b172297848a29804d3bf

Full URL: https://github.com/mbedmicro/mbed/commit/86041dd3983e145ab913b172297848a29804d3bf/

enable the additional uart 7&8 of the STM32F439 in the mbed sdk/api

Who changed what in which revision?

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