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:
Mon Sep 28 20:15:09 2015 +0100
Revision:
634:ac7d6880524d
Parent:
632:7687fb9c4f91
Synchronized with git revision 9b7d23d47153c298a6d24de9a415202705889d11

Full URL: https://github.com/mbedmicro/mbed/commit/9b7d23d47153c298a6d24de9a415202705889d11/

Revert "[NUCLEO_F303K8] add support of the STM32F303K8"

Who changed what in which revision?

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