mbed library sources. Supersedes mbed-src.

Fork of mbed by teralytic

Committer:
<>
Date:
Fri Sep 02 15:07:44 2016 +0100
Revision:
144:ef7eb2e8f9f7
Parent:
114:fe4fe5cfc3a3
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 "mbed_error.h"
<> 144:ef7eb2e8f9f7 38 #include <string.h>
<> 144:ef7eb2e8f9f7 39 #include "PeripheralPins.h"
<> 144:ef7eb2e8f9f7 40
<> 144:ef7eb2e8f9f7 41 #define UART_NUM (5)
<> 144:ef7eb2e8f9f7 42
<> 144:ef7eb2e8f9f7 43 static uint32_t serial_irq_ids[UART_NUM] = {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 UartHandle.Init.OverSampling = UART_OVERSAMPLING_16;
<> 144:ef7eb2e8f9f7 62 UartHandle.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_ENABLE;
<> 144:ef7eb2e8f9f7 63
<> 144:ef7eb2e8f9f7 64 if (obj->pin_rx == NC) {
<> 144:ef7eb2e8f9f7 65 UartHandle.Init.Mode = UART_MODE_TX;
<> 144:ef7eb2e8f9f7 66 } else if (obj->pin_tx == NC) {
<> 144:ef7eb2e8f9f7 67 UartHandle.Init.Mode = UART_MODE_RX;
<> 144:ef7eb2e8f9f7 68 } else {
<> 144:ef7eb2e8f9f7 69 UartHandle.Init.Mode = UART_MODE_TX_RX;
<> 144:ef7eb2e8f9f7 70 }
<> 144:ef7eb2e8f9f7 71
<> 144:ef7eb2e8f9f7 72 // Disable the reception overrun detection
<> 144:ef7eb2e8f9f7 73 UartHandle.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_RXOVERRUNDISABLE_INIT;
<> 144:ef7eb2e8f9f7 74 UartHandle.AdvancedInit.OverrunDisable = UART_ADVFEATURE_OVERRUN_DISABLE;
<> 144:ef7eb2e8f9f7 75
<> 144:ef7eb2e8f9f7 76 if (HAL_UART_Init(&UartHandle) != HAL_OK) {
<> 144:ef7eb2e8f9f7 77 error("Cannot initialize UART");
<> 144:ef7eb2e8f9f7 78 }
<> 144:ef7eb2e8f9f7 79 }
<> 144:ef7eb2e8f9f7 80
<> 144:ef7eb2e8f9f7 81 void serial_init(serial_t *obj, PinName tx, PinName rx)
<> 144:ef7eb2e8f9f7 82 {
<> 144:ef7eb2e8f9f7 83 // Determine the UART to use (UART_1, UART_2, ...)
<> 144:ef7eb2e8f9f7 84 UARTName uart_tx = (UARTName)pinmap_peripheral(tx, PinMap_UART_TX);
<> 144:ef7eb2e8f9f7 85 UARTName uart_rx = (UARTName)pinmap_peripheral(rx, PinMap_UART_RX);
<> 144:ef7eb2e8f9f7 86
<> 144:ef7eb2e8f9f7 87 // Get the peripheral name (UART_1, UART_2, ...) from the pin and assign it to the object
<> 144:ef7eb2e8f9f7 88 obj->uart = (UARTName)pinmap_merge(uart_tx, uart_rx);
<> 144:ef7eb2e8f9f7 89 MBED_ASSERT(obj->uart != (UARTName)NC);
<> 144:ef7eb2e8f9f7 90
<> 144:ef7eb2e8f9f7 91 // Enable UART clock
<> 144:ef7eb2e8f9f7 92 #if defined(USART1_BASE)
<> 144:ef7eb2e8f9f7 93 if (obj->uart == UART_1) {
<> 144:ef7eb2e8f9f7 94 __HAL_RCC_USART1_FORCE_RESET();
<> 144:ef7eb2e8f9f7 95 __HAL_RCC_USART1_RELEASE_RESET();
<> 144:ef7eb2e8f9f7 96 __HAL_RCC_USART1_CLK_ENABLE();
<> 144:ef7eb2e8f9f7 97 obj->index = 0;
<> 144:ef7eb2e8f9f7 98 }
<> 144:ef7eb2e8f9f7 99 #endif
<> 144:ef7eb2e8f9f7 100
<> 144:ef7eb2e8f9f7 101 if (obj->uart == UART_2) {
<> 144:ef7eb2e8f9f7 102 __HAL_RCC_USART2_FORCE_RESET();
<> 144:ef7eb2e8f9f7 103 __HAL_RCC_USART2_RELEASE_RESET();
<> 144:ef7eb2e8f9f7 104 __HAL_RCC_USART2_CLK_ENABLE();
<> 144:ef7eb2e8f9f7 105 obj->index = 1;
<> 144:ef7eb2e8f9f7 106 }
<> 144:ef7eb2e8f9f7 107
<> 144:ef7eb2e8f9f7 108 if (obj->uart == LPUART_1) {
<> 144:ef7eb2e8f9f7 109 __HAL_RCC_LPUART1_FORCE_RESET();
<> 144:ef7eb2e8f9f7 110 __HAL_RCC_LPUART1_RELEASE_RESET();
<> 144:ef7eb2e8f9f7 111 __HAL_RCC_LPUART1_CLK_ENABLE();
<> 144:ef7eb2e8f9f7 112 obj->index = 2;
<> 144:ef7eb2e8f9f7 113 }
<> 144:ef7eb2e8f9f7 114
<> 144:ef7eb2e8f9f7 115 #if defined(USART4_BASE)
<> 144:ef7eb2e8f9f7 116 if (obj->uart == UART_4) {
<> 144:ef7eb2e8f9f7 117 __HAL_RCC_USART4_FORCE_RESET();
<> 144:ef7eb2e8f9f7 118 __HAL_RCC_USART4_RELEASE_RESET();
<> 144:ef7eb2e8f9f7 119 __HAL_RCC_USART4_CLK_ENABLE();
<> 144:ef7eb2e8f9f7 120 obj->index = 3;
<> 144:ef7eb2e8f9f7 121 }
<> 144:ef7eb2e8f9f7 122 #endif
<> 144:ef7eb2e8f9f7 123
<> 144:ef7eb2e8f9f7 124 #if defined(USART5_BASE)
<> 144:ef7eb2e8f9f7 125 if (obj->uart == UART_5) {
<> 144:ef7eb2e8f9f7 126 __HAL_RCC_USART5_FORCE_RESET();
<> 144:ef7eb2e8f9f7 127 __HAL_RCC_USART5_RELEASE_RESET();
<> 144:ef7eb2e8f9f7 128 __HAL_RCC_USART5_CLK_ENABLE();
<> 144:ef7eb2e8f9f7 129 obj->index = 4;
<> 144:ef7eb2e8f9f7 130 }
<> 144:ef7eb2e8f9f7 131 #endif
<> 144:ef7eb2e8f9f7 132
<> 144:ef7eb2e8f9f7 133 // Configure the UART pins
<> 144:ef7eb2e8f9f7 134 pinmap_pinout(tx, PinMap_UART_TX);
<> 144:ef7eb2e8f9f7 135 pinmap_pinout(rx, PinMap_UART_RX);
<> 144:ef7eb2e8f9f7 136 if (tx != NC) {
<> 144:ef7eb2e8f9f7 137 pin_mode(tx, PullUp);
<> 144:ef7eb2e8f9f7 138 }
<> 144:ef7eb2e8f9f7 139 if (rx != NC) {
<> 144:ef7eb2e8f9f7 140 pin_mode(rx, PullUp);
<> 144:ef7eb2e8f9f7 141 }
<> 144:ef7eb2e8f9f7 142
<> 144:ef7eb2e8f9f7 143 // Configure UART
<> 144:ef7eb2e8f9f7 144 obj->baudrate = 9600;
<> 144:ef7eb2e8f9f7 145 obj->databits = UART_WORDLENGTH_8B;
<> 144:ef7eb2e8f9f7 146 obj->stopbits = UART_STOPBITS_1;
<> 144:ef7eb2e8f9f7 147 obj->parity = UART_PARITY_NONE;
<> 144:ef7eb2e8f9f7 148 obj->pin_tx = tx;
<> 144:ef7eb2e8f9f7 149 obj->pin_rx = rx;
<> 144:ef7eb2e8f9f7 150
<> 144:ef7eb2e8f9f7 151 init_uart(obj);
<> 144:ef7eb2e8f9f7 152
<> 144:ef7eb2e8f9f7 153 // For stdio management
<> 144:ef7eb2e8f9f7 154 if (obj->uart == STDIO_UART) {
<> 144:ef7eb2e8f9f7 155 stdio_uart_inited = 1;
<> 144:ef7eb2e8f9f7 156 memcpy(&stdio_uart, obj, sizeof(serial_t));
<> 144:ef7eb2e8f9f7 157 }
<> 144:ef7eb2e8f9f7 158 }
<> 144:ef7eb2e8f9f7 159
<> 144:ef7eb2e8f9f7 160 void serial_free(serial_t *obj)
<> 144:ef7eb2e8f9f7 161 {
<> 144:ef7eb2e8f9f7 162 // Reset UART and disable clock
<> 144:ef7eb2e8f9f7 163 #if defined(USART1_BASE)
<> 144:ef7eb2e8f9f7 164 if (obj->uart == UART_1) {
<> 144:ef7eb2e8f9f7 165 __HAL_RCC_USART1_FORCE_RESET();
<> 144:ef7eb2e8f9f7 166 __HAL_RCC_USART1_RELEASE_RESET();
<> 144:ef7eb2e8f9f7 167 __HAL_RCC_USART1_CLK_DISABLE();
<> 144:ef7eb2e8f9f7 168 }
<> 144:ef7eb2e8f9f7 169 #endif
<> 144:ef7eb2e8f9f7 170
<> 144:ef7eb2e8f9f7 171 if (obj->uart == UART_2) {
<> 144:ef7eb2e8f9f7 172 __HAL_RCC_USART2_FORCE_RESET();
<> 144:ef7eb2e8f9f7 173 __HAL_RCC_USART2_RELEASE_RESET();
<> 144:ef7eb2e8f9f7 174 __HAL_RCC_USART2_CLK_DISABLE();
<> 144:ef7eb2e8f9f7 175 }
<> 144:ef7eb2e8f9f7 176
<> 144:ef7eb2e8f9f7 177 if (obj->uart == LPUART_1) {
<> 144:ef7eb2e8f9f7 178 __HAL_RCC_LPUART1_FORCE_RESET();
<> 144:ef7eb2e8f9f7 179 __HAL_RCC_LPUART1_RELEASE_RESET();
<> 144:ef7eb2e8f9f7 180 __HAL_RCC_LPUART1_CLK_DISABLE();
<> 144:ef7eb2e8f9f7 181 }
<> 144:ef7eb2e8f9f7 182
<> 144:ef7eb2e8f9f7 183 #if defined(USART4_BASE)
<> 144:ef7eb2e8f9f7 184 if (obj->uart == UART_4) {
<> 144:ef7eb2e8f9f7 185 __HAL_RCC_USART4_FORCE_RESET();
<> 144:ef7eb2e8f9f7 186 __HAL_RCC_USART4_RELEASE_RESET();
<> 144:ef7eb2e8f9f7 187 __HAL_RCC_USART4_CLK_DISABLE();
<> 144:ef7eb2e8f9f7 188 }
<> 144:ef7eb2e8f9f7 189 #endif
<> 144:ef7eb2e8f9f7 190
<> 144:ef7eb2e8f9f7 191 #if defined(USART5_BASE)
<> 144:ef7eb2e8f9f7 192 if (obj->uart == UART_5) {
<> 144:ef7eb2e8f9f7 193 __HAL_RCC_USART5_FORCE_RESET();
<> 144:ef7eb2e8f9f7 194 __HAL_RCC_USART5_RELEASE_RESET();
<> 144:ef7eb2e8f9f7 195 __HAL_RCC_USART5_CLK_DISABLE();
<> 144:ef7eb2e8f9f7 196 }
<> 144:ef7eb2e8f9f7 197 #endif
<> 144:ef7eb2e8f9f7 198
<> 144:ef7eb2e8f9f7 199 // Configure GPIOs
<> 144:ef7eb2e8f9f7 200 pin_function(obj->pin_tx, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 0));
<> 144:ef7eb2e8f9f7 201 pin_function(obj->pin_rx, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 0));
<> 144:ef7eb2e8f9f7 202
<> 144:ef7eb2e8f9f7 203 serial_irq_ids[obj->index] = 0;
<> 144:ef7eb2e8f9f7 204 }
<> 144:ef7eb2e8f9f7 205
<> 144:ef7eb2e8f9f7 206 void serial_baud(serial_t *obj, int baudrate)
<> 144:ef7eb2e8f9f7 207 {
<> 144:ef7eb2e8f9f7 208 obj->baudrate = baudrate;
<> 144:ef7eb2e8f9f7 209 init_uart(obj);
<> 144:ef7eb2e8f9f7 210 }
<> 144:ef7eb2e8f9f7 211
<> 144:ef7eb2e8f9f7 212 void serial_format(serial_t *obj, int data_bits, SerialParity parity, int stop_bits)
<> 144:ef7eb2e8f9f7 213 {
<> 144:ef7eb2e8f9f7 214 if (data_bits == 9) {
<> 144:ef7eb2e8f9f7 215 obj->databits = UART_WORDLENGTH_9B;
<> 144:ef7eb2e8f9f7 216 } else {
<> 144:ef7eb2e8f9f7 217 obj->databits = UART_WORDLENGTH_8B;
<> 144:ef7eb2e8f9f7 218 }
<> 144:ef7eb2e8f9f7 219
<> 144:ef7eb2e8f9f7 220 switch (parity) {
<> 144:ef7eb2e8f9f7 221 case ParityOdd:
<> 144:ef7eb2e8f9f7 222 case ParityForced0:
<> 144:ef7eb2e8f9f7 223 obj->parity = UART_PARITY_ODD;
<> 144:ef7eb2e8f9f7 224 break;
<> 144:ef7eb2e8f9f7 225 case ParityEven:
<> 144:ef7eb2e8f9f7 226 case ParityForced1:
<> 144:ef7eb2e8f9f7 227 obj->parity = UART_PARITY_EVEN;
<> 144:ef7eb2e8f9f7 228 break;
<> 144:ef7eb2e8f9f7 229 default: // ParityNone
<> 144:ef7eb2e8f9f7 230 obj->parity = UART_PARITY_NONE;
<> 144:ef7eb2e8f9f7 231 break;
<> 144:ef7eb2e8f9f7 232 }
<> 144:ef7eb2e8f9f7 233
<> 144:ef7eb2e8f9f7 234 if (stop_bits == 2) {
<> 144:ef7eb2e8f9f7 235 obj->stopbits = UART_STOPBITS_2;
<> 144:ef7eb2e8f9f7 236 } else {
<> 144:ef7eb2e8f9f7 237 obj->stopbits = UART_STOPBITS_1;
<> 144:ef7eb2e8f9f7 238 }
<> 144:ef7eb2e8f9f7 239
<> 144:ef7eb2e8f9f7 240 init_uart(obj);
<> 144:ef7eb2e8f9f7 241 }
<> 144:ef7eb2e8f9f7 242
<> 144:ef7eb2e8f9f7 243 /******************************************************************************
<> 144:ef7eb2e8f9f7 244 * INTERRUPTS HANDLING
<> 144:ef7eb2e8f9f7 245 ******************************************************************************/
<> 144:ef7eb2e8f9f7 246
<> 144:ef7eb2e8f9f7 247 static void uart_irq(UARTName name, int id)
<> 144:ef7eb2e8f9f7 248 {
<> 144:ef7eb2e8f9f7 249 UartHandle.Instance = (USART_TypeDef *)name;
<> 144:ef7eb2e8f9f7 250 if (serial_irq_ids[id] != 0) {
<> 144:ef7eb2e8f9f7 251 if (__HAL_UART_GET_FLAG(&UartHandle, UART_FLAG_TC) != RESET) {
<> 144:ef7eb2e8f9f7 252 irq_handler(serial_irq_ids[id], TxIrq);
<> 144:ef7eb2e8f9f7 253 __HAL_UART_CLEAR_IT(&UartHandle, UART_CLEAR_TCF);
<> 144:ef7eb2e8f9f7 254 }
<> 144:ef7eb2e8f9f7 255 if (__HAL_UART_GET_FLAG(&UartHandle, UART_FLAG_RXNE) != RESET) {
<> 144:ef7eb2e8f9f7 256 irq_handler(serial_irq_ids[id], RxIrq);
<> 144:ef7eb2e8f9f7 257 volatile uint32_t tmpval = UartHandle.Instance->RDR; // Clear RXNE bit
<> 144:ef7eb2e8f9f7 258 }
<> 144:ef7eb2e8f9f7 259 }
<> 144:ef7eb2e8f9f7 260 }
<> 144:ef7eb2e8f9f7 261
<> 144:ef7eb2e8f9f7 262 #if defined(USART1_BASE)
<> 144:ef7eb2e8f9f7 263 static void uart1_irq(void)
<> 144:ef7eb2e8f9f7 264 {
<> 144:ef7eb2e8f9f7 265 uart_irq(UART_1, 0);
<> 144:ef7eb2e8f9f7 266 }
<> 144:ef7eb2e8f9f7 267 #endif
<> 144:ef7eb2e8f9f7 268
<> 144:ef7eb2e8f9f7 269 static void uart2_irq(void)
<> 144:ef7eb2e8f9f7 270 {
<> 144:ef7eb2e8f9f7 271 uart_irq(UART_2, 1);
<> 144:ef7eb2e8f9f7 272 }
<> 144:ef7eb2e8f9f7 273
<> 144:ef7eb2e8f9f7 274 static void lpuart1_irq(void)
<> 144:ef7eb2e8f9f7 275 {
<> 144:ef7eb2e8f9f7 276 uart_irq(LPUART_1, 2);
<> 144:ef7eb2e8f9f7 277 }
<> 144:ef7eb2e8f9f7 278
<> 144:ef7eb2e8f9f7 279 #if defined(USART4_BASE)
<> 144:ef7eb2e8f9f7 280 static void uart4_irq(void)
<> 144:ef7eb2e8f9f7 281 {
<> 144:ef7eb2e8f9f7 282 uart_irq(UART_4, 3);
<> 144:ef7eb2e8f9f7 283 }
<> 144:ef7eb2e8f9f7 284 #endif
<> 144:ef7eb2e8f9f7 285
<> 144:ef7eb2e8f9f7 286 #if defined(USART5_BASE)
<> 144:ef7eb2e8f9f7 287 static void uart5_irq(void)
<> 144:ef7eb2e8f9f7 288 {
<> 144:ef7eb2e8f9f7 289 uart_irq(UART_5, 4);
<> 144:ef7eb2e8f9f7 290 }
<> 144:ef7eb2e8f9f7 291 #endif
<> 144:ef7eb2e8f9f7 292
<> 144:ef7eb2e8f9f7 293 void serial_irq_handler(serial_t *obj, uart_irq_handler handler, uint32_t id)
<> 144:ef7eb2e8f9f7 294 {
<> 144:ef7eb2e8f9f7 295 irq_handler = handler;
<> 144:ef7eb2e8f9f7 296 serial_irq_ids[obj->index] = id;
<> 144:ef7eb2e8f9f7 297 }
<> 144:ef7eb2e8f9f7 298
<> 144:ef7eb2e8f9f7 299 void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable)
<> 144:ef7eb2e8f9f7 300 {
<> 144:ef7eb2e8f9f7 301 IRQn_Type irq_n = (IRQn_Type)0;
<> 144:ef7eb2e8f9f7 302 uint32_t vector = 0;
<> 144:ef7eb2e8f9f7 303
<> 144:ef7eb2e8f9f7 304 UartHandle.Instance = (USART_TypeDef *)(obj->uart);
<> 144:ef7eb2e8f9f7 305
<> 144:ef7eb2e8f9f7 306 #if defined(USART1_BASE)
<> 144:ef7eb2e8f9f7 307 if (obj->uart == UART_1) {
<> 144:ef7eb2e8f9f7 308 irq_n = USART1_IRQn;
<> 144:ef7eb2e8f9f7 309 vector = (uint32_t)&uart1_irq;
<> 144:ef7eb2e8f9f7 310 }
<> 144:ef7eb2e8f9f7 311 #endif
<> 144:ef7eb2e8f9f7 312
<> 144:ef7eb2e8f9f7 313 if (obj->uart == UART_2) {
<> 144:ef7eb2e8f9f7 314 irq_n = USART2_IRQn;
<> 144:ef7eb2e8f9f7 315 vector = (uint32_t)&uart2_irq;
<> 144:ef7eb2e8f9f7 316 }
<> 144:ef7eb2e8f9f7 317
<> 144:ef7eb2e8f9f7 318 if (obj->uart == LPUART_1) {
<> 144:ef7eb2e8f9f7 319 irq_n = RNG_LPUART1_IRQn;
<> 144:ef7eb2e8f9f7 320 vector = (uint32_t)&lpuart1_irq;
<> 144:ef7eb2e8f9f7 321 }
<> 144:ef7eb2e8f9f7 322
<> 144:ef7eb2e8f9f7 323 #if defined(USART4_BASE)
<> 144:ef7eb2e8f9f7 324 if (obj->uart == UART_4) {
<> 144:ef7eb2e8f9f7 325 irq_n = USART4_5_IRQn;
<> 144:ef7eb2e8f9f7 326 vector = (uint32_t)&uart4_irq;
<> 144:ef7eb2e8f9f7 327 }
<> 144:ef7eb2e8f9f7 328 #endif
<> 144:ef7eb2e8f9f7 329
<> 144:ef7eb2e8f9f7 330 #if defined(USART5_BASE)
<> 144:ef7eb2e8f9f7 331 if (obj->uart == UART_5) {
<> 144:ef7eb2e8f9f7 332 irq_n = USART4_5_IRQn;
<> 144:ef7eb2e8f9f7 333 vector = (uint32_t)&uart5_irq;
<> 144:ef7eb2e8f9f7 334 }
<> 144:ef7eb2e8f9f7 335 #endif
<> 144:ef7eb2e8f9f7 336
<> 144:ef7eb2e8f9f7 337 if (enable) {
<> 144:ef7eb2e8f9f7 338
<> 144:ef7eb2e8f9f7 339 if (irq == RxIrq) {
<> 144:ef7eb2e8f9f7 340 __HAL_UART_ENABLE_IT(&UartHandle, UART_IT_RXNE);
<> 144:ef7eb2e8f9f7 341 } else { // TxIrq
<> 144:ef7eb2e8f9f7 342 __HAL_UART_ENABLE_IT(&UartHandle, UART_IT_TC);
<> 144:ef7eb2e8f9f7 343 }
<> 144:ef7eb2e8f9f7 344
<> 144:ef7eb2e8f9f7 345 NVIC_SetVector(irq_n, vector);
<> 144:ef7eb2e8f9f7 346 NVIC_EnableIRQ(irq_n);
<> 144:ef7eb2e8f9f7 347
<> 144:ef7eb2e8f9f7 348 } else { // disable
<> 144:ef7eb2e8f9f7 349
<> 144:ef7eb2e8f9f7 350 int all_disabled = 0;
<> 144:ef7eb2e8f9f7 351
<> 144:ef7eb2e8f9f7 352 if (irq == RxIrq) {
<> 144:ef7eb2e8f9f7 353 __HAL_UART_DISABLE_IT(&UartHandle, UART_IT_RXNE);
<> 144:ef7eb2e8f9f7 354 // Check if TxIrq is disabled too
<> 144:ef7eb2e8f9f7 355 if ((UartHandle.Instance->CR1 & USART_CR1_TCIE) == 0) all_disabled = 1;
<> 144:ef7eb2e8f9f7 356 } else { // TxIrq
<> 144:ef7eb2e8f9f7 357 __HAL_UART_DISABLE_IT(&UartHandle, UART_IT_TC);
<> 144:ef7eb2e8f9f7 358 // Check if RxIrq is disabled too
<> 144:ef7eb2e8f9f7 359 if ((UartHandle.Instance->CR1 & USART_CR1_RXNEIE) == 0) all_disabled = 1;
<> 144:ef7eb2e8f9f7 360 }
<> 144:ef7eb2e8f9f7 361
<> 144:ef7eb2e8f9f7 362 if (all_disabled) NVIC_DisableIRQ(irq_n);
<> 144:ef7eb2e8f9f7 363
<> 144:ef7eb2e8f9f7 364 }
<> 144:ef7eb2e8f9f7 365 }
<> 144:ef7eb2e8f9f7 366
<> 144:ef7eb2e8f9f7 367 /******************************************************************************
<> 144:ef7eb2e8f9f7 368 * READ/WRITE
<> 144:ef7eb2e8f9f7 369 ******************************************************************************/
<> 144:ef7eb2e8f9f7 370
<> 144:ef7eb2e8f9f7 371 int serial_getc(serial_t *obj)
<> 144:ef7eb2e8f9f7 372 {
<> 144:ef7eb2e8f9f7 373 USART_TypeDef *uart = (USART_TypeDef *)(obj->uart);
<> 144:ef7eb2e8f9f7 374 while (!serial_readable(obj));
<> 144:ef7eb2e8f9f7 375 return (int)(uart->RDR & (uint32_t)0xFF);
<> 144:ef7eb2e8f9f7 376 }
<> 144:ef7eb2e8f9f7 377
<> 144:ef7eb2e8f9f7 378 void serial_putc(serial_t *obj, int c)
<> 144:ef7eb2e8f9f7 379 {
<> 144:ef7eb2e8f9f7 380 USART_TypeDef *uart = (USART_TypeDef *)(obj->uart);
<> 144:ef7eb2e8f9f7 381 while (!serial_writable(obj));
<> 144:ef7eb2e8f9f7 382 uart->TDR = (uint32_t)(c & (uint32_t)0xFF);
<> 144:ef7eb2e8f9f7 383 }
<> 144:ef7eb2e8f9f7 384
<> 144:ef7eb2e8f9f7 385 int serial_readable(serial_t *obj)
<> 144:ef7eb2e8f9f7 386 {
<> 144:ef7eb2e8f9f7 387 int status;
<> 144:ef7eb2e8f9f7 388 UartHandle.Instance = (USART_TypeDef *)(obj->uart);
<> 144:ef7eb2e8f9f7 389 // Check if data is received
<> 144:ef7eb2e8f9f7 390 status = ((__HAL_UART_GET_FLAG(&UartHandle, UART_FLAG_RXNE) != RESET) ? 1 : 0);
<> 144:ef7eb2e8f9f7 391 return status;
<> 144:ef7eb2e8f9f7 392 }
<> 144:ef7eb2e8f9f7 393
<> 144:ef7eb2e8f9f7 394 int serial_writable(serial_t *obj)
<> 144:ef7eb2e8f9f7 395 {
<> 144:ef7eb2e8f9f7 396 int status;
<> 144:ef7eb2e8f9f7 397 UartHandle.Instance = (USART_TypeDef *)(obj->uart);
<> 144:ef7eb2e8f9f7 398 // Check if data is transmitted
<> 144:ef7eb2e8f9f7 399 status = ((__HAL_UART_GET_FLAG(&UartHandle, UART_FLAG_TXE) != RESET) ? 1 : 0);
<> 144:ef7eb2e8f9f7 400 return status;
<> 144:ef7eb2e8f9f7 401 }
<> 144:ef7eb2e8f9f7 402
<> 144:ef7eb2e8f9f7 403 void serial_clear(serial_t *obj)
<> 144:ef7eb2e8f9f7 404 {
<> 144:ef7eb2e8f9f7 405 UartHandle.Instance = (USART_TypeDef *)(obj->uart);
<> 144:ef7eb2e8f9f7 406 __HAL_UART_CLEAR_IT(&UartHandle, UART_CLEAR_TCF);
<> 144:ef7eb2e8f9f7 407 __HAL_UART_SEND_REQ(&UartHandle, UART_RXDATA_FLUSH_REQUEST);
<> 144:ef7eb2e8f9f7 408 }
<> 144:ef7eb2e8f9f7 409
<> 144:ef7eb2e8f9f7 410 void serial_pinout_tx(PinName tx)
<> 144:ef7eb2e8f9f7 411 {
<> 144:ef7eb2e8f9f7 412 pinmap_pinout(tx, PinMap_UART_TX);
<> 144:ef7eb2e8f9f7 413 }
<> 144:ef7eb2e8f9f7 414
<> 144:ef7eb2e8f9f7 415 void serial_break_set(serial_t *obj)
<> 144:ef7eb2e8f9f7 416 {
<> 144:ef7eb2e8f9f7 417 UartHandle.Instance = (USART_TypeDef *)(obj->uart);
<> 144:ef7eb2e8f9f7 418 __HAL_UART_SEND_REQ(&UartHandle, UART_SENDBREAK_REQUEST);
<> 144:ef7eb2e8f9f7 419 }
<> 144:ef7eb2e8f9f7 420
<> 144:ef7eb2e8f9f7 421 void serial_break_clear(serial_t *obj)
<> 144:ef7eb2e8f9f7 422 {
<> 144:ef7eb2e8f9f7 423 }
<> 144:ef7eb2e8f9f7 424
<> 144:ef7eb2e8f9f7 425 #endif