mbed library sources

Fork of mbed-src by mbed official

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