Jolyon Hill / mbed-dev

Fork of mbed-dev by mbed official

Committer:
<>
Date:
Fri Sep 02 15:07:44 2016 +0100
Revision:
144:ef7eb2e8f9f7
Parent:
0:9b334a45a8ff
Child:
148:21d94c44109e
This updates the lib to the mbed lib v125

Who changed what in which revision?

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