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:
Thu Aug 20 10:45:13 2015 +0100
Revision:
613:bc40b8d2aec4
Parent:
478:9f3d4ee935ce
Synchronized with git revision 92ca8c7b60a283b6bb60eb65b183dac1599f0ade

Full URL: https://github.com/mbedmicro/mbed/commit/92ca8c7b60a283b6bb60eb65b183dac1599f0ade/

Nordic: update application start address in GCC linker script

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 613:bc40b8d2aec4 3 * Copyright (c) 2015, 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 613:bc40b8d2aec4 39 #include "mbed_error.h"
mbed_official 442:d916d321e60f 40
mbed_official 478:9f3d4ee935ce 41 #define UART_NUM (8)
mbed_official 442:d916d321e60f 42
mbed_official 478:9f3d4ee935ce 43 static uint32_t serial_irq_ids[UART_NUM] = {0, 0, 0, 0, 0, 0, 0, 0};
mbed_official 442:d916d321e60f 44
mbed_official 442:d916d321e60f 45 static uart_irq_handler irq_handler;
mbed_official 442:d916d321e60f 46
mbed_official 442:d916d321e60f 47 UART_HandleTypeDef UartHandle;
mbed_official 442:d916d321e60f 48
mbed_official 442:d916d321e60f 49 int stdio_uart_inited = 0;
mbed_official 442:d916d321e60f 50 serial_t stdio_uart;
mbed_official 442:d916d321e60f 51
mbed_official 442:d916d321e60f 52 static void init_uart(serial_t *obj)
mbed_official 442:d916d321e60f 53 {
mbed_official 442:d916d321e60f 54 UartHandle.Instance = (USART_TypeDef *)(obj->uart);
mbed_official 442:d916d321e60f 55
mbed_official 442:d916d321e60f 56 UartHandle.Init.BaudRate = obj->baudrate;
mbed_official 442:d916d321e60f 57 UartHandle.Init.WordLength = obj->databits;
mbed_official 442:d916d321e60f 58 UartHandle.Init.StopBits = obj->stopbits;
mbed_official 442:d916d321e60f 59 UartHandle.Init.Parity = obj->parity;
mbed_official 442:d916d321e60f 60 UartHandle.Init.HwFlowCtl = UART_HWCONTROL_NONE;
mbed_official 442:d916d321e60f 61
mbed_official 442:d916d321e60f 62 if (obj->pin_rx == NC) {
mbed_official 442:d916d321e60f 63 UartHandle.Init.Mode = UART_MODE_TX;
mbed_official 442:d916d321e60f 64 } else if (obj->pin_tx == NC) {
mbed_official 442:d916d321e60f 65 UartHandle.Init.Mode = UART_MODE_RX;
mbed_official 442:d916d321e60f 66 } else {
mbed_official 442:d916d321e60f 67 UartHandle.Init.Mode = UART_MODE_TX_RX;
mbed_official 442:d916d321e60f 68 }
mbed_official 442:d916d321e60f 69
mbed_official 613:bc40b8d2aec4 70 if (HAL_UART_Init(&UartHandle) != HAL_OK) {
mbed_official 613:bc40b8d2aec4 71 error("Cannot initialize UART");
mbed_official 613:bc40b8d2aec4 72 }
mbed_official 442:d916d321e60f 73 }
mbed_official 442:d916d321e60f 74
mbed_official 442:d916d321e60f 75 void serial_init(serial_t *obj, PinName tx, PinName rx)
mbed_official 442:d916d321e60f 76 {
mbed_official 442:d916d321e60f 77 // Determine the UART to use (UART_1, UART_2, ...)
mbed_official 442:d916d321e60f 78 UARTName uart_tx = (UARTName)pinmap_peripheral(tx, PinMap_UART_TX);
mbed_official 442:d916d321e60f 79 UARTName uart_rx = (UARTName)pinmap_peripheral(rx, PinMap_UART_RX);
mbed_official 442:d916d321e60f 80
mbed_official 442:d916d321e60f 81 // Get the peripheral name (UART_1, UART_2, ...) from the pin and assign it to the object
mbed_official 442:d916d321e60f 82 obj->uart = (UARTName)pinmap_merge(uart_tx, uart_rx);
mbed_official 442:d916d321e60f 83 MBED_ASSERT(obj->uart != (UARTName)NC);
mbed_official 442:d916d321e60f 84
mbed_official 442:d916d321e60f 85 // Enable USART clock
mbed_official 442:d916d321e60f 86 switch (obj->uart) {
mbed_official 442:d916d321e60f 87 case UART_1:
mbed_official 613:bc40b8d2aec4 88 __HAL_RCC_USART1_CLK_ENABLE();
mbed_official 442:d916d321e60f 89 obj->index = 0;
mbed_official 442:d916d321e60f 90 break;
mbed_official 442:d916d321e60f 91 case UART_2:
mbed_official 613:bc40b8d2aec4 92 __HAL_RCC_USART2_CLK_ENABLE();
mbed_official 442:d916d321e60f 93 obj->index = 1;
mbed_official 442:d916d321e60f 94 break;
mbed_official 442:d916d321e60f 95 #if defined(USART3_BASE)
mbed_official 442:d916d321e60f 96 case UART_3:
mbed_official 613:bc40b8d2aec4 97 __HAL_RCC_USART3_CLK_ENABLE();
mbed_official 442:d916d321e60f 98 obj->index = 2;
mbed_official 442:d916d321e60f 99 break;
mbed_official 442:d916d321e60f 100 #endif
mbed_official 442:d916d321e60f 101 #if defined(UART4_BASE)
mbed_official 442:d916d321e60f 102 case UART_4:
mbed_official 613:bc40b8d2aec4 103 __HAL_RCC_UART4_CLK_ENABLE();
mbed_official 442:d916d321e60f 104 obj->index = 3;
mbed_official 442:d916d321e60f 105 break;
mbed_official 442:d916d321e60f 106 #endif
mbed_official 442:d916d321e60f 107 #if defined(UART5_BASE)
mbed_official 442:d916d321e60f 108 case UART_5:
mbed_official 613:bc40b8d2aec4 109 __HAL_RCC_UART5_CLK_ENABLE();
mbed_official 442:d916d321e60f 110 obj->index = 4;
mbed_official 442:d916d321e60f 111 break;
mbed_official 442:d916d321e60f 112 #endif
mbed_official 613:bc40b8d2aec4 113 #if defined(USART6_BASE)
mbed_official 442:d916d321e60f 114 case UART_6:
mbed_official 613:bc40b8d2aec4 115 __HAL_RCC_USART6_CLK_ENABLE();
mbed_official 442:d916d321e60f 116 obj->index = 5;
mbed_official 442:d916d321e60f 117 break;
mbed_official 613:bc40b8d2aec4 118 #endif
mbed_official 478:9f3d4ee935ce 119 #if defined(UART7_BASE)
mbed_official 478:9f3d4ee935ce 120 case UART_7:
mbed_official 613:bc40b8d2aec4 121 __HAL_RCC_UART7_CLK_ENABLE();
mbed_official 478:9f3d4ee935ce 122 obj->index = 6;
mbed_official 478:9f3d4ee935ce 123 break;
mbed_official 478:9f3d4ee935ce 124 #endif
mbed_official 478:9f3d4ee935ce 125 #if defined(UART8_BASE)
mbed_official 478:9f3d4ee935ce 126 case UART_8:
mbed_official 613:bc40b8d2aec4 127 __HAL_RCC_UART8_CLK_ENABLE();
mbed_official 478:9f3d4ee935ce 128 obj->index = 7;
mbed_official 478:9f3d4ee935ce 129 break;
mbed_official 478:9f3d4ee935ce 130 #endif
mbed_official 442:d916d321e60f 131 }
mbed_official 442:d916d321e60f 132
mbed_official 442:d916d321e60f 133 // Configure the UART pins
mbed_official 442:d916d321e60f 134 pinmap_pinout(tx, PinMap_UART_TX);
mbed_official 442:d916d321e60f 135 pinmap_pinout(rx, PinMap_UART_RX);
mbed_official 442:d916d321e60f 136 if (tx != NC) {
mbed_official 442:d916d321e60f 137 pin_mode(tx, PullUp);
mbed_official 442:d916d321e60f 138 }
mbed_official 442:d916d321e60f 139 if (rx != NC) {
mbed_official 442:d916d321e60f 140 pin_mode(rx, PullUp);
mbed_official 442:d916d321e60f 141 }
mbed_official 442:d916d321e60f 142
mbed_official 442:d916d321e60f 143 // Configure UART
mbed_official 442:d916d321e60f 144 obj->baudrate = 9600;
mbed_official 442:d916d321e60f 145 obj->databits = UART_WORDLENGTH_8B;
mbed_official 442:d916d321e60f 146 obj->stopbits = UART_STOPBITS_1;
mbed_official 442:d916d321e60f 147 obj->parity = UART_PARITY_NONE;
mbed_official 442:d916d321e60f 148
mbed_official 442:d916d321e60f 149 obj->pin_tx = tx;
mbed_official 442:d916d321e60f 150 obj->pin_rx = rx;
mbed_official 442:d916d321e60f 151
mbed_official 442:d916d321e60f 152 init_uart(obj);
mbed_official 442:d916d321e60f 153
mbed_official 442:d916d321e60f 154 // For stdio management
mbed_official 442:d916d321e60f 155 if (obj->uart == STDIO_UART) {
mbed_official 442:d916d321e60f 156 stdio_uart_inited = 1;
mbed_official 442:d916d321e60f 157 memcpy(&stdio_uart, obj, sizeof(serial_t));
mbed_official 442:d916d321e60f 158 }
mbed_official 442:d916d321e60f 159 }
mbed_official 442:d916d321e60f 160
mbed_official 442:d916d321e60f 161 void serial_free(serial_t *obj)
mbed_official 442:d916d321e60f 162 {
mbed_official 442:d916d321e60f 163 // Reset UART and disable clock
mbed_official 442:d916d321e60f 164 switch (obj->uart) {
mbed_official 442:d916d321e60f 165 case UART_1:
mbed_official 442:d916d321e60f 166 __USART1_FORCE_RESET();
mbed_official 442:d916d321e60f 167 __USART1_RELEASE_RESET();
mbed_official 442:d916d321e60f 168 __USART1_CLK_DISABLE();
mbed_official 442:d916d321e60f 169 break;
mbed_official 442:d916d321e60f 170 case UART_2:
mbed_official 442:d916d321e60f 171 __USART2_FORCE_RESET();
mbed_official 442:d916d321e60f 172 __USART2_RELEASE_RESET();
mbed_official 442:d916d321e60f 173 __USART2_CLK_DISABLE();
mbed_official 442:d916d321e60f 174 break;
mbed_official 442:d916d321e60f 175 #if defined(USART3_BASE)
mbed_official 442:d916d321e60f 176 case UART_3:
mbed_official 442:d916d321e60f 177 __USART3_FORCE_RESET();
mbed_official 442:d916d321e60f 178 __USART3_RELEASE_RESET();
mbed_official 442:d916d321e60f 179 __USART3_CLK_DISABLE();
mbed_official 442:d916d321e60f 180 break;
mbed_official 442:d916d321e60f 181 #endif
mbed_official 442:d916d321e60f 182 #if defined(UART4_BASE)
mbed_official 442:d916d321e60f 183 case UART_4:
mbed_official 442:d916d321e60f 184 __UART4_FORCE_RESET();
mbed_official 442:d916d321e60f 185 __UART4_RELEASE_RESET();
mbed_official 442:d916d321e60f 186 __UART4_CLK_DISABLE();
mbed_official 442:d916d321e60f 187 break;
mbed_official 442:d916d321e60f 188 #endif
mbed_official 442:d916d321e60f 189 #if defined(UART5_BASE)
mbed_official 442:d916d321e60f 190 case UART_5:
mbed_official 442:d916d321e60f 191 __UART5_FORCE_RESET();
mbed_official 442:d916d321e60f 192 __UART5_RELEASE_RESET();
mbed_official 442:d916d321e60f 193 __UART5_CLK_DISABLE();
mbed_official 442:d916d321e60f 194 break;
mbed_official 442:d916d321e60f 195 #endif
mbed_official 613:bc40b8d2aec4 196 #if defined(USART6_BASE)
mbed_official 442:d916d321e60f 197 case UART_6:
mbed_official 442:d916d321e60f 198 __USART6_FORCE_RESET();
mbed_official 442:d916d321e60f 199 __USART6_RELEASE_RESET();
mbed_official 442:d916d321e60f 200 __USART6_CLK_DISABLE();
mbed_official 442:d916d321e60f 201 break;
mbed_official 613:bc40b8d2aec4 202 #endif
mbed_official 478:9f3d4ee935ce 203 #if defined(UART7_BASE)
mbed_official 478:9f3d4ee935ce 204 case UART_7:
mbed_official 478:9f3d4ee935ce 205 __UART7_FORCE_RESET();
mbed_official 478:9f3d4ee935ce 206 __UART7_RELEASE_RESET();
mbed_official 478:9f3d4ee935ce 207 __UART7_CLK_DISABLE();
mbed_official 478:9f3d4ee935ce 208 break;
mbed_official 478:9f3d4ee935ce 209 #endif
mbed_official 478:9f3d4ee935ce 210 #if defined(UART8_BASE)
mbed_official 478:9f3d4ee935ce 211 case UART_8:
mbed_official 478:9f3d4ee935ce 212 __UART8_FORCE_RESET();
mbed_official 478:9f3d4ee935ce 213 __UART8_RELEASE_RESET();
mbed_official 478:9f3d4ee935ce 214 __UART8_CLK_DISABLE();
mbed_official 478:9f3d4ee935ce 215 break;
mbed_official 478:9f3d4ee935ce 216 #endif
mbed_official 442:d916d321e60f 217 }
mbed_official 442:d916d321e60f 218 // Configure GPIOs
mbed_official 442:d916d321e60f 219 pin_function(obj->pin_tx, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 0));
mbed_official 442:d916d321e60f 220 pin_function(obj->pin_rx, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 0));
mbed_official 442:d916d321e60f 221
mbed_official 442:d916d321e60f 222 serial_irq_ids[obj->index] = 0;
mbed_official 442:d916d321e60f 223 }
mbed_official 442:d916d321e60f 224
mbed_official 442:d916d321e60f 225 void serial_baud(serial_t *obj, int baudrate)
mbed_official 442:d916d321e60f 226 {
mbed_official 442:d916d321e60f 227 obj->baudrate = baudrate;
mbed_official 442:d916d321e60f 228 init_uart(obj);
mbed_official 442:d916d321e60f 229 }
mbed_official 442:d916d321e60f 230
mbed_official 442:d916d321e60f 231 void serial_format(serial_t *obj, int data_bits, SerialParity parity, int stop_bits)
mbed_official 442:d916d321e60f 232 {
mbed_official 442:d916d321e60f 233 if (data_bits == 9) {
mbed_official 442:d916d321e60f 234 obj->databits = UART_WORDLENGTH_9B;
mbed_official 442:d916d321e60f 235 } else {
mbed_official 442:d916d321e60f 236 obj->databits = UART_WORDLENGTH_8B;
mbed_official 442:d916d321e60f 237 }
mbed_official 442:d916d321e60f 238
mbed_official 442:d916d321e60f 239 switch (parity) {
mbed_official 442:d916d321e60f 240 case ParityOdd:
mbed_official 442:d916d321e60f 241 case ParityForced0:
mbed_official 442:d916d321e60f 242 obj->parity = UART_PARITY_ODD;
mbed_official 442:d916d321e60f 243 break;
mbed_official 442:d916d321e60f 244 case ParityEven:
mbed_official 442:d916d321e60f 245 case ParityForced1:
mbed_official 442:d916d321e60f 246 obj->parity = UART_PARITY_EVEN;
mbed_official 442:d916d321e60f 247 break;
mbed_official 442:d916d321e60f 248 default: // ParityNone
mbed_official 442:d916d321e60f 249 obj->parity = UART_PARITY_NONE;
mbed_official 442:d916d321e60f 250 break;
mbed_official 442:d916d321e60f 251 }
mbed_official 442:d916d321e60f 252
mbed_official 442:d916d321e60f 253 if (stop_bits == 2) {
mbed_official 442:d916d321e60f 254 obj->stopbits = UART_STOPBITS_2;
mbed_official 442:d916d321e60f 255 } else {
mbed_official 442:d916d321e60f 256 obj->stopbits = UART_STOPBITS_1;
mbed_official 442:d916d321e60f 257 }
mbed_official 442:d916d321e60f 258
mbed_official 442:d916d321e60f 259 init_uart(obj);
mbed_official 442:d916d321e60f 260 }
mbed_official 442:d916d321e60f 261
mbed_official 442:d916d321e60f 262 /******************************************************************************
mbed_official 442:d916d321e60f 263 * INTERRUPTS HANDLING
mbed_official 442:d916d321e60f 264 ******************************************************************************/
mbed_official 442:d916d321e60f 265
mbed_official 442:d916d321e60f 266 static void uart_irq(UARTName name, int id)
mbed_official 442:d916d321e60f 267 {
mbed_official 442:d916d321e60f 268 UartHandle.Instance = (USART_TypeDef *)name;
mbed_official 442:d916d321e60f 269 if (serial_irq_ids[id] != 0) {
mbed_official 442:d916d321e60f 270 if (__HAL_UART_GET_FLAG(&UartHandle, UART_FLAG_TC) != RESET) {
mbed_official 442:d916d321e60f 271 irq_handler(serial_irq_ids[id], TxIrq);
mbed_official 442:d916d321e60f 272 __HAL_UART_CLEAR_FLAG(&UartHandle, UART_FLAG_TC);
mbed_official 442:d916d321e60f 273 }
mbed_official 442:d916d321e60f 274 if (__HAL_UART_GET_FLAG(&UartHandle, UART_FLAG_RXNE) != RESET) {
mbed_official 442:d916d321e60f 275 irq_handler(serial_irq_ids[id], RxIrq);
mbed_official 442:d916d321e60f 276 __HAL_UART_CLEAR_FLAG(&UartHandle, UART_FLAG_RXNE);
mbed_official 442:d916d321e60f 277 }
mbed_official 442:d916d321e60f 278 }
mbed_official 442:d916d321e60f 279 }
mbed_official 442:d916d321e60f 280
mbed_official 442:d916d321e60f 281 static void uart1_irq(void)
mbed_official 442:d916d321e60f 282 {
mbed_official 442:d916d321e60f 283 uart_irq(UART_1, 0);
mbed_official 442:d916d321e60f 284 }
mbed_official 442:d916d321e60f 285
mbed_official 442:d916d321e60f 286 static void uart2_irq(void)
mbed_official 442:d916d321e60f 287 {
mbed_official 442:d916d321e60f 288 uart_irq(UART_2, 1);
mbed_official 442:d916d321e60f 289 }
mbed_official 442:d916d321e60f 290
mbed_official 442:d916d321e60f 291 #if defined(USART3_BASE)
mbed_official 613:bc40b8d2aec4 292 static void uart3_irq(void)
mbed_official 442:d916d321e60f 293 {
mbed_official 442:d916d321e60f 294 uart_irq(UART_3, 2);
mbed_official 442:d916d321e60f 295 }
mbed_official 442:d916d321e60f 296 #endif
mbed_official 442:d916d321e60f 297
mbed_official 442:d916d321e60f 298 #if defined(UART4_BASE)
mbed_official 613:bc40b8d2aec4 299 static void uart4_irq(void)
mbed_official 442:d916d321e60f 300 {
mbed_official 442:d916d321e60f 301 uart_irq(UART_4, 3);
mbed_official 442:d916d321e60f 302 }
mbed_official 442:d916d321e60f 303 #endif
mbed_official 442:d916d321e60f 304
mbed_official 442:d916d321e60f 305 #if defined(UART5_BASE)
mbed_official 613:bc40b8d2aec4 306 static void uart5_irq(void)
mbed_official 442:d916d321e60f 307 {
mbed_official 442:d916d321e60f 308 uart_irq(UART_5, 4);
mbed_official 442:d916d321e60f 309 }
mbed_official 442:d916d321e60f 310 #endif
mbed_official 442:d916d321e60f 311
mbed_official 613:bc40b8d2aec4 312 #if defined(USART6_BASE)
mbed_official 442:d916d321e60f 313 static void uart6_irq(void)
mbed_official 442:d916d321e60f 314 {
mbed_official 442:d916d321e60f 315 uart_irq(UART_6, 5);
mbed_official 442:d916d321e60f 316 }
mbed_official 613:bc40b8d2aec4 317 #endif
mbed_official 442:d916d321e60f 318
mbed_official 478:9f3d4ee935ce 319 #if defined(UART7_BASE)
mbed_official 613:bc40b8d2aec4 320 static void uart7_irq(void)
mbed_official 478:9f3d4ee935ce 321 {
mbed_official 478:9f3d4ee935ce 322 uart_irq(UART_7, 6);
mbed_official 478:9f3d4ee935ce 323 }
mbed_official 478:9f3d4ee935ce 324 #endif
mbed_official 478:9f3d4ee935ce 325
mbed_official 478:9f3d4ee935ce 326 #if defined(UART8_BASE)
mbed_official 613:bc40b8d2aec4 327 static void uart8_irq(void)
mbed_official 478:9f3d4ee935ce 328 {
mbed_official 478:9f3d4ee935ce 329 uart_irq(UART_8, 7);
mbed_official 478:9f3d4ee935ce 330 }
mbed_official 478:9f3d4ee935ce 331 #endif
mbed_official 478:9f3d4ee935ce 332
mbed_official 442:d916d321e60f 333 void serial_irq_handler(serial_t *obj, uart_irq_handler handler, uint32_t id)
mbed_official 442:d916d321e60f 334 {
mbed_official 442:d916d321e60f 335 irq_handler = handler;
mbed_official 442:d916d321e60f 336 serial_irq_ids[obj->index] = id;
mbed_official 442:d916d321e60f 337 }
mbed_official 442:d916d321e60f 338
mbed_official 442:d916d321e60f 339 void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable)
mbed_official 442:d916d321e60f 340 {
mbed_official 442:d916d321e60f 341 IRQn_Type irq_n = (IRQn_Type)0;
mbed_official 442:d916d321e60f 342 uint32_t vector = 0;
mbed_official 442:d916d321e60f 343
mbed_official 442:d916d321e60f 344 UartHandle.Instance = (USART_TypeDef *)(obj->uart);
mbed_official 442:d916d321e60f 345
mbed_official 442:d916d321e60f 346 switch (obj->uart) {
mbed_official 442:d916d321e60f 347 case UART_1:
mbed_official 442:d916d321e60f 348 irq_n = USART1_IRQn;
mbed_official 442:d916d321e60f 349 vector = (uint32_t)&uart1_irq;
mbed_official 442:d916d321e60f 350 break;
mbed_official 442:d916d321e60f 351
mbed_official 442:d916d321e60f 352 case UART_2:
mbed_official 442:d916d321e60f 353 irq_n = USART2_IRQn;
mbed_official 442:d916d321e60f 354 vector = (uint32_t)&uart2_irq;
mbed_official 442:d916d321e60f 355 break;
mbed_official 442:d916d321e60f 356 #if defined(USART3_BASE)
mbed_official 442:d916d321e60f 357 case UART_3:
mbed_official 442:d916d321e60f 358 irq_n = USART3_IRQn;
mbed_official 442:d916d321e60f 359 vector = (uint32_t)&uart3_irq;
mbed_official 442:d916d321e60f 360 break;
mbed_official 442:d916d321e60f 361 #endif
mbed_official 442:d916d321e60f 362 #if defined(UART4_BASE)
mbed_official 442:d916d321e60f 363 case UART_4:
mbed_official 442:d916d321e60f 364 irq_n = UART4_IRQn;
mbed_official 442:d916d321e60f 365 vector = (uint32_t)&uart4_irq;
mbed_official 442:d916d321e60f 366 break;
mbed_official 442:d916d321e60f 367 #endif
mbed_official 442:d916d321e60f 368 #if defined(UART5_BASE)
mbed_official 442:d916d321e60f 369 case UART_5:
mbed_official 442:d916d321e60f 370 irq_n = UART5_IRQn;
mbed_official 442:d916d321e60f 371 vector = (uint32_t)&uart5_irq;
mbed_official 442:d916d321e60f 372 break;
mbed_official 442:d916d321e60f 373 #endif
mbed_official 613:bc40b8d2aec4 374 #if defined(USART6_BASE)
mbed_official 442:d916d321e60f 375 case UART_6:
mbed_official 442:d916d321e60f 376 irq_n = USART6_IRQn;
mbed_official 442:d916d321e60f 377 vector = (uint32_t)&uart6_irq;
mbed_official 442:d916d321e60f 378 break;
mbed_official 613:bc40b8d2aec4 379 #endif
mbed_official 478:9f3d4ee935ce 380 #if defined(UART7_BASE)
mbed_official 478:9f3d4ee935ce 381 case UART_7:
mbed_official 478:9f3d4ee935ce 382 irq_n = UART7_IRQn;
mbed_official 478:9f3d4ee935ce 383 vector = (uint32_t)&uart7_irq;
mbed_official 478:9f3d4ee935ce 384 break;
mbed_official 478:9f3d4ee935ce 385 #endif
mbed_official 478:9f3d4ee935ce 386 #if defined(UART8_BASE)
mbed_official 478:9f3d4ee935ce 387 case UART_8:
mbed_official 478:9f3d4ee935ce 388 irq_n = UART8_IRQn;
mbed_official 478:9f3d4ee935ce 389 vector = (uint32_t)&uart8_irq;
mbed_official 478:9f3d4ee935ce 390 break;
mbed_official 478:9f3d4ee935ce 391 #endif
mbed_official 442:d916d321e60f 392 }
mbed_official 442:d916d321e60f 393
mbed_official 442:d916d321e60f 394 if (enable) {
mbed_official 442:d916d321e60f 395
mbed_official 442:d916d321e60f 396 if (irq == RxIrq) {
mbed_official 442:d916d321e60f 397 __HAL_UART_ENABLE_IT(&UartHandle, UART_IT_RXNE);
mbed_official 442:d916d321e60f 398 } else { // TxIrq
mbed_official 442:d916d321e60f 399 __HAL_UART_ENABLE_IT(&UartHandle, UART_IT_TC);
mbed_official 442:d916d321e60f 400 }
mbed_official 442:d916d321e60f 401
mbed_official 442:d916d321e60f 402 NVIC_SetVector(irq_n, vector);
mbed_official 442:d916d321e60f 403 NVIC_EnableIRQ(irq_n);
mbed_official 442:d916d321e60f 404
mbed_official 442:d916d321e60f 405 } else { // disable
mbed_official 442:d916d321e60f 406
mbed_official 442:d916d321e60f 407 int all_disabled = 0;
mbed_official 442:d916d321e60f 408
mbed_official 442:d916d321e60f 409 if (irq == RxIrq) {
mbed_official 442:d916d321e60f 410 __HAL_UART_DISABLE_IT(&UartHandle, UART_IT_RXNE);
mbed_official 442:d916d321e60f 411 // Check if TxIrq is disabled too
mbed_official 442:d916d321e60f 412 if ((UartHandle.Instance->CR1 & USART_CR1_TXEIE) == 0) all_disabled = 1;
mbed_official 442:d916d321e60f 413 } else { // TxIrq
mbed_official 442:d916d321e60f 414 __HAL_UART_DISABLE_IT(&UartHandle, UART_IT_TXE);
mbed_official 442:d916d321e60f 415 // Check if RxIrq is disabled too
mbed_official 442:d916d321e60f 416 if ((UartHandle.Instance->CR1 & USART_CR1_RXNEIE) == 0) all_disabled = 1;
mbed_official 442:d916d321e60f 417 }
mbed_official 442:d916d321e60f 418
mbed_official 442:d916d321e60f 419 if (all_disabled) NVIC_DisableIRQ(irq_n);
mbed_official 442:d916d321e60f 420
mbed_official 442:d916d321e60f 421 }
mbed_official 442:d916d321e60f 422 }
mbed_official 442:d916d321e60f 423
mbed_official 442:d916d321e60f 424 /******************************************************************************
mbed_official 442:d916d321e60f 425 * READ/WRITE
mbed_official 442:d916d321e60f 426 ******************************************************************************/
mbed_official 442:d916d321e60f 427
mbed_official 442:d916d321e60f 428 int serial_getc(serial_t *obj)
mbed_official 442:d916d321e60f 429 {
mbed_official 442:d916d321e60f 430 USART_TypeDef *uart = (USART_TypeDef *)(obj->uart);
mbed_official 442:d916d321e60f 431 while (!serial_readable(obj));
mbed_official 442:d916d321e60f 432 return (int)(uart->DR & 0x1FF);
mbed_official 442:d916d321e60f 433 }
mbed_official 442:d916d321e60f 434
mbed_official 442:d916d321e60f 435 void serial_putc(serial_t *obj, int c)
mbed_official 442:d916d321e60f 436 {
mbed_official 442:d916d321e60f 437 USART_TypeDef *uart = (USART_TypeDef *)(obj->uart);
mbed_official 442:d916d321e60f 438 while (!serial_writable(obj));
mbed_official 442:d916d321e60f 439 uart->DR = (uint32_t)(c & 0x1FF);
mbed_official 442:d916d321e60f 440 }
mbed_official 442:d916d321e60f 441
mbed_official 442:d916d321e60f 442 int serial_readable(serial_t *obj)
mbed_official 442:d916d321e60f 443 {
mbed_official 442:d916d321e60f 444 int status;
mbed_official 442:d916d321e60f 445 UartHandle.Instance = (USART_TypeDef *)(obj->uart);
mbed_official 442:d916d321e60f 446 // Check if data is received
mbed_official 442:d916d321e60f 447 status = ((__HAL_UART_GET_FLAG(&UartHandle, UART_FLAG_RXNE) != RESET) ? 1 : 0);
mbed_official 442:d916d321e60f 448 return status;
mbed_official 442:d916d321e60f 449 }
mbed_official 442:d916d321e60f 450
mbed_official 442:d916d321e60f 451 int serial_writable(serial_t *obj)
mbed_official 442:d916d321e60f 452 {
mbed_official 442:d916d321e60f 453 int status;
mbed_official 442:d916d321e60f 454 UartHandle.Instance = (USART_TypeDef *)(obj->uart);
mbed_official 442:d916d321e60f 455 // Check if data is transmitted
mbed_official 442:d916d321e60f 456 status = ((__HAL_UART_GET_FLAG(&UartHandle, UART_FLAG_TXE) != RESET) ? 1 : 0);
mbed_official 442:d916d321e60f 457 return status;
mbed_official 442:d916d321e60f 458 }
mbed_official 442:d916d321e60f 459
mbed_official 442:d916d321e60f 460 void serial_clear(serial_t *obj)
mbed_official 442:d916d321e60f 461 {
mbed_official 442:d916d321e60f 462 UartHandle.Instance = (USART_TypeDef *)(obj->uart);
mbed_official 442:d916d321e60f 463 __HAL_UART_CLEAR_FLAG(&UartHandle, UART_FLAG_TXE);
mbed_official 442:d916d321e60f 464 __HAL_UART_CLEAR_FLAG(&UartHandle, UART_FLAG_RXNE);
mbed_official 442:d916d321e60f 465 }
mbed_official 442:d916d321e60f 466
mbed_official 442:d916d321e60f 467 void serial_pinout_tx(PinName tx)
mbed_official 442:d916d321e60f 468 {
mbed_official 442:d916d321e60f 469 pinmap_pinout(tx, PinMap_UART_TX);
mbed_official 442:d916d321e60f 470 }
mbed_official 442:d916d321e60f 471
mbed_official 442:d916d321e60f 472 void serial_break_set(serial_t *obj)
mbed_official 442:d916d321e60f 473 {
mbed_official 442:d916d321e60f 474 UartHandle.Instance = (USART_TypeDef *)(obj->uart);
mbed_official 442:d916d321e60f 475 HAL_LIN_SendBreak(&UartHandle);
mbed_official 442:d916d321e60f 476 }
mbed_official 442:d916d321e60f 477
mbed_official 442:d916d321e60f 478 void serial_break_clear(serial_t *obj)
mbed_official 442:d916d321e60f 479 {
mbed_official 442:d916d321e60f 480 }
mbed_official 442:d916d321e60f 481
mbed_official 442:d916d321e60f 482 #endif