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 14:00:11 2015 +0100
Revision:
632:7687fb9c4f91
Parent:
508:4f5903e025e6
Child:
634:ac7d6880524d
Synchronized with git revision f7ce4ed029cc611121464252ff28d5e8beb895b0

Full URL: https://github.com/mbedmicro/mbed/commit/f7ce4ed029cc611121464252ff28d5e8beb895b0/

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 632:7687fb9c4f91 97 #if defined(UART3_BASE)
mbed_official 508:4f5903e025e6 98 if (obj->uart == UART_3) {
mbed_official 508:4f5903e025e6 99 __USART3_CLK_ENABLE();
mbed_official 508:4f5903e025e6 100 __HAL_RCC_USART3_CONFIG(RCC_USART3CLKSOURCE_SYSCLK);
mbed_official 508:4f5903e025e6 101 obj->index = 2;
mbed_official 508:4f5903e025e6 102 }
mbed_official 632:7687fb9c4f91 103 #endif
mbed_official 508:4f5903e025e6 104 #if defined(UART4_BASE)
mbed_official 508:4f5903e025e6 105 if (obj->uart == UART_4) {
mbed_official 508:4f5903e025e6 106 __UART4_CLK_ENABLE();
mbed_official 508:4f5903e025e6 107 __HAL_RCC_UART4_CONFIG(RCC_UART4CLKSOURCE_SYSCLK);
mbed_official 508:4f5903e025e6 108 obj->index = 3;
mbed_official 508:4f5903e025e6 109 }
mbed_official 508:4f5903e025e6 110 #endif
mbed_official 508:4f5903e025e6 111 #if defined(UART5_BASE)
mbed_official 508:4f5903e025e6 112 if (obj->uart == UART_5) {
mbed_official 508:4f5903e025e6 113 __UART5_CLK_ENABLE();
mbed_official 508:4f5903e025e6 114 __HAL_RCC_UART5_CONFIG(RCC_UART5CLKSOURCE_SYSCLK);
mbed_official 508:4f5903e025e6 115 obj->index = 4;
mbed_official 508:4f5903e025e6 116 }
mbed_official 508:4f5903e025e6 117 #endif
mbed_official 508:4f5903e025e6 118
mbed_official 508:4f5903e025e6 119 // Configure the UART pins
mbed_official 508:4f5903e025e6 120 pinmap_pinout(tx, PinMap_UART_TX);
mbed_official 508:4f5903e025e6 121 pinmap_pinout(rx, PinMap_UART_RX);
mbed_official 508:4f5903e025e6 122 if (tx != NC) {
mbed_official 508:4f5903e025e6 123 pin_mode(tx, PullUp);
mbed_official 508:4f5903e025e6 124 }
mbed_official 508:4f5903e025e6 125 if (rx != NC) {
mbed_official 508:4f5903e025e6 126 pin_mode(rx, PullUp);
mbed_official 508:4f5903e025e6 127 }
mbed_official 508:4f5903e025e6 128
mbed_official 508:4f5903e025e6 129 // Configure UART
mbed_official 508:4f5903e025e6 130 obj->baudrate = 9600;
mbed_official 508:4f5903e025e6 131 obj->databits = UART_WORDLENGTH_8B;
mbed_official 508:4f5903e025e6 132 obj->stopbits = UART_STOPBITS_1;
mbed_official 508:4f5903e025e6 133 obj->parity = UART_PARITY_NONE;
mbed_official 508:4f5903e025e6 134
mbed_official 508:4f5903e025e6 135 obj->pin_tx = tx;
mbed_official 508:4f5903e025e6 136 obj->pin_rx = rx;
mbed_official 508:4f5903e025e6 137
mbed_official 508:4f5903e025e6 138 init_uart(obj);
mbed_official 508:4f5903e025e6 139
mbed_official 508:4f5903e025e6 140 // For stdio management
mbed_official 508:4f5903e025e6 141 if (obj->uart == STDIO_UART) {
mbed_official 508:4f5903e025e6 142 stdio_uart_inited = 1;
mbed_official 508:4f5903e025e6 143 memcpy(&stdio_uart, obj, sizeof(serial_t));
mbed_official 508:4f5903e025e6 144 }
mbed_official 508:4f5903e025e6 145 }
mbed_official 508:4f5903e025e6 146
mbed_official 508:4f5903e025e6 147 void serial_free(serial_t *obj)
mbed_official 508:4f5903e025e6 148 {
mbed_official 508:4f5903e025e6 149 // Reset UART and disable clock
mbed_official 508:4f5903e025e6 150 if (obj->uart == UART_1) {
mbed_official 508:4f5903e025e6 151 __USART1_FORCE_RESET();
mbed_official 508:4f5903e025e6 152 __USART1_RELEASE_RESET();
mbed_official 508:4f5903e025e6 153 __USART1_CLK_DISABLE();
mbed_official 508:4f5903e025e6 154 }
mbed_official 508:4f5903e025e6 155 if (obj->uart == UART_2) {
mbed_official 508:4f5903e025e6 156 __USART2_FORCE_RESET();
mbed_official 508:4f5903e025e6 157 __USART2_RELEASE_RESET();
mbed_official 508:4f5903e025e6 158 __USART2_CLK_DISABLE();
mbed_official 508:4f5903e025e6 159 }
mbed_official 632:7687fb9c4f91 160 #if defined(UART3_BASE)
mbed_official 508:4f5903e025e6 161 if (obj->uart == UART_3) {
mbed_official 508:4f5903e025e6 162 __USART3_FORCE_RESET();
mbed_official 508:4f5903e025e6 163 __USART3_RELEASE_RESET();
mbed_official 508:4f5903e025e6 164 __USART3_CLK_DISABLE();
mbed_official 508:4f5903e025e6 165 }
mbed_official 632:7687fb9c4f91 166 #endif
mbed_official 508:4f5903e025e6 167 #if defined(UART4_BASE)
mbed_official 508:4f5903e025e6 168 if (obj->uart == UART_4) {
mbed_official 508:4f5903e025e6 169 __UART4_FORCE_RESET();
mbed_official 508:4f5903e025e6 170 __UART4_RELEASE_RESET();
mbed_official 508:4f5903e025e6 171 __UART4_CLK_DISABLE();
mbed_official 508:4f5903e025e6 172 }
mbed_official 508:4f5903e025e6 173 #endif
mbed_official 508:4f5903e025e6 174 #if defined(UART5_BASE)
mbed_official 508:4f5903e025e6 175 if (obj->uart == UART_5) {
mbed_official 508:4f5903e025e6 176 __UART5_FORCE_RESET();
mbed_official 508:4f5903e025e6 177 __UART5_RELEASE_RESET();
mbed_official 508:4f5903e025e6 178 __UART5_CLK_DISABLE();
mbed_official 508:4f5903e025e6 179 }
mbed_official 508:4f5903e025e6 180 #endif
mbed_official 508:4f5903e025e6 181
mbed_official 508:4f5903e025e6 182 // Configure GPIOs
mbed_official 508:4f5903e025e6 183 pin_function(obj->pin_tx, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 0));
mbed_official 508:4f5903e025e6 184 pin_function(obj->pin_rx, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 0));
mbed_official 508:4f5903e025e6 185
mbed_official 508:4f5903e025e6 186 serial_irq_ids[obj->index] = 0;
mbed_official 508:4f5903e025e6 187 }
mbed_official 508:4f5903e025e6 188
mbed_official 508:4f5903e025e6 189 void serial_baud(serial_t *obj, int baudrate)
mbed_official 508:4f5903e025e6 190 {
mbed_official 508:4f5903e025e6 191 obj->baudrate = baudrate;
mbed_official 508:4f5903e025e6 192 init_uart(obj);
mbed_official 508:4f5903e025e6 193 }
mbed_official 508:4f5903e025e6 194
mbed_official 508:4f5903e025e6 195 void serial_format(serial_t *obj, int data_bits, SerialParity parity, int stop_bits)
mbed_official 508:4f5903e025e6 196 {
mbed_official 508:4f5903e025e6 197 if (data_bits == 9) {
mbed_official 508:4f5903e025e6 198 obj->databits = UART_WORDLENGTH_9B;
mbed_official 508:4f5903e025e6 199 } else {
mbed_official 508:4f5903e025e6 200 obj->databits = UART_WORDLENGTH_8B;
mbed_official 508:4f5903e025e6 201 }
mbed_official 508:4f5903e025e6 202
mbed_official 508:4f5903e025e6 203 switch (parity) {
mbed_official 508:4f5903e025e6 204 case ParityOdd:
mbed_official 508:4f5903e025e6 205 case ParityForced0:
mbed_official 508:4f5903e025e6 206 obj->parity = UART_PARITY_ODD;
mbed_official 508:4f5903e025e6 207 break;
mbed_official 508:4f5903e025e6 208 case ParityEven:
mbed_official 508:4f5903e025e6 209 case ParityForced1:
mbed_official 508:4f5903e025e6 210 obj->parity = UART_PARITY_EVEN;
mbed_official 508:4f5903e025e6 211 break;
mbed_official 508:4f5903e025e6 212 default: // ParityNone
mbed_official 508:4f5903e025e6 213 obj->parity = UART_PARITY_NONE;
mbed_official 508:4f5903e025e6 214 break;
mbed_official 508:4f5903e025e6 215 }
mbed_official 508:4f5903e025e6 216
mbed_official 508:4f5903e025e6 217 if (stop_bits == 2) {
mbed_official 508:4f5903e025e6 218 obj->stopbits = UART_STOPBITS_2;
mbed_official 508:4f5903e025e6 219 } else {
mbed_official 508:4f5903e025e6 220 obj->stopbits = UART_STOPBITS_1;
mbed_official 508:4f5903e025e6 221 }
mbed_official 508:4f5903e025e6 222
mbed_official 508:4f5903e025e6 223 init_uart(obj);
mbed_official 508:4f5903e025e6 224 }
mbed_official 508:4f5903e025e6 225
mbed_official 508:4f5903e025e6 226 /******************************************************************************
mbed_official 508:4f5903e025e6 227 * INTERRUPTS HANDLING
mbed_official 508:4f5903e025e6 228 ******************************************************************************/
mbed_official 508:4f5903e025e6 229
mbed_official 508:4f5903e025e6 230 static void uart_irq(UARTName name, int id)
mbed_official 508:4f5903e025e6 231 {
mbed_official 508:4f5903e025e6 232 UartHandle.Instance = (USART_TypeDef *)name;
mbed_official 508:4f5903e025e6 233 if (serial_irq_ids[id] != 0) {
mbed_official 508:4f5903e025e6 234 if (__HAL_UART_GET_FLAG(&UartHandle, UART_FLAG_TC) != RESET) {
mbed_official 508:4f5903e025e6 235 irq_handler(serial_irq_ids[id], TxIrq);
mbed_official 508:4f5903e025e6 236 __HAL_UART_CLEAR_IT(&UartHandle, UART_FLAG_TC);
mbed_official 508:4f5903e025e6 237 }
mbed_official 508:4f5903e025e6 238 if (__HAL_UART_GET_FLAG(&UartHandle, UART_FLAG_RXNE) != RESET) {
mbed_official 508:4f5903e025e6 239 irq_handler(serial_irq_ids[id], RxIrq);
mbed_official 508:4f5903e025e6 240 volatile uint32_t tmpval = UartHandle.Instance->RDR; // Clear RXNE bit
mbed_official 508:4f5903e025e6 241 }
mbed_official 508:4f5903e025e6 242 }
mbed_official 508:4f5903e025e6 243 }
mbed_official 508:4f5903e025e6 244
mbed_official 508:4f5903e025e6 245 static void uart1_irq(void)
mbed_official 508:4f5903e025e6 246 {
mbed_official 508:4f5903e025e6 247 uart_irq(UART_1, 0);
mbed_official 508:4f5903e025e6 248 }
mbed_official 508:4f5903e025e6 249
mbed_official 508:4f5903e025e6 250 static void uart2_irq(void)
mbed_official 508:4f5903e025e6 251 {
mbed_official 508:4f5903e025e6 252 uart_irq(UART_2, 1);
mbed_official 508:4f5903e025e6 253 }
mbed_official 508:4f5903e025e6 254
mbed_official 632:7687fb9c4f91 255 #if defined(UART3_BASE)
mbed_official 508:4f5903e025e6 256 static void uart3_irq(void)
mbed_official 508:4f5903e025e6 257 {
mbed_official 508:4f5903e025e6 258 uart_irq(UART_3, 2);
mbed_official 508:4f5903e025e6 259 }
mbed_official 632:7687fb9c4f91 260 #endif
mbed_official 508:4f5903e025e6 261
mbed_official 508:4f5903e025e6 262 #if defined(UART4_BASE)
mbed_official 508:4f5903e025e6 263 static void uart4_irq(void)
mbed_official 508:4f5903e025e6 264 {
mbed_official 508:4f5903e025e6 265 uart_irq(UART_4, 3);
mbed_official 508:4f5903e025e6 266 }
mbed_official 508:4f5903e025e6 267 #endif
mbed_official 508:4f5903e025e6 268
mbed_official 508:4f5903e025e6 269 #if defined(UART5_BASE)
mbed_official 508:4f5903e025e6 270 static void uart5_irq(void)
mbed_official 508:4f5903e025e6 271 {
mbed_official 508:4f5903e025e6 272 uart_irq(UART_5, 4);
mbed_official 508:4f5903e025e6 273 }
mbed_official 508:4f5903e025e6 274 #endif
mbed_official 508:4f5903e025e6 275
mbed_official 508:4f5903e025e6 276 void serial_irq_handler(serial_t *obj, uart_irq_handler handler, uint32_t id)
mbed_official 508:4f5903e025e6 277 {
mbed_official 508:4f5903e025e6 278 irq_handler = handler;
mbed_official 508:4f5903e025e6 279 serial_irq_ids[obj->index] = id;
mbed_official 508:4f5903e025e6 280 }
mbed_official 508:4f5903e025e6 281
mbed_official 508:4f5903e025e6 282 void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable)
mbed_official 508:4f5903e025e6 283 {
mbed_official 508:4f5903e025e6 284 IRQn_Type irq_n = (IRQn_Type)0;
mbed_official 508:4f5903e025e6 285 uint32_t vector = 0;
mbed_official 508:4f5903e025e6 286
mbed_official 508:4f5903e025e6 287 UartHandle.Instance = (USART_TypeDef *)(obj->uart);
mbed_official 508:4f5903e025e6 288
mbed_official 508:4f5903e025e6 289 if (obj->uart == UART_1) {
mbed_official 508:4f5903e025e6 290 irq_n = USART1_IRQn;
mbed_official 508:4f5903e025e6 291 vector = (uint32_t)&uart1_irq;
mbed_official 508:4f5903e025e6 292 }
mbed_official 508:4f5903e025e6 293
mbed_official 508:4f5903e025e6 294 if (obj->uart == UART_2) {
mbed_official 508:4f5903e025e6 295 irq_n = USART2_IRQn;
mbed_official 508:4f5903e025e6 296 vector = (uint32_t)&uart2_irq;
mbed_official 508:4f5903e025e6 297 }
mbed_official 508:4f5903e025e6 298
mbed_official 632:7687fb9c4f91 299 #if defined(UART3_BASE)
mbed_official 508:4f5903e025e6 300 if (obj->uart == UART_3) {
mbed_official 508:4f5903e025e6 301 irq_n = USART3_IRQn;
mbed_official 508:4f5903e025e6 302 vector = (uint32_t)&uart3_irq;
mbed_official 508:4f5903e025e6 303 }
mbed_official 632:7687fb9c4f91 304 #endif
mbed_official 508:4f5903e025e6 305
mbed_official 508:4f5903e025e6 306 #if defined(UART4_BASE)
mbed_official 508:4f5903e025e6 307 if (obj->uart == UART_4) {
mbed_official 508:4f5903e025e6 308 irq_n = UART4_IRQn;
mbed_official 508:4f5903e025e6 309 vector = (uint32_t)&uart4_irq;
mbed_official 508:4f5903e025e6 310 }
mbed_official 508:4f5903e025e6 311 #endif
mbed_official 508:4f5903e025e6 312
mbed_official 508:4f5903e025e6 313 #if defined(UART5_BASE)
mbed_official 508:4f5903e025e6 314 if (obj->uart == UART_5) {
mbed_official 508:4f5903e025e6 315 irq_n = UART5_IRQn;
mbed_official 508:4f5903e025e6 316 vector = (uint32_t)&uart5_irq;
mbed_official 508:4f5903e025e6 317 }
mbed_official 508:4f5903e025e6 318 #endif
mbed_official 508:4f5903e025e6 319
mbed_official 508:4f5903e025e6 320 if (enable) {
mbed_official 508:4f5903e025e6 321
mbed_official 508:4f5903e025e6 322 if (irq == RxIrq) {
mbed_official 508:4f5903e025e6 323 __HAL_UART_ENABLE_IT(&UartHandle, UART_IT_RXNE);
mbed_official 508:4f5903e025e6 324 } else { // TxIrq
mbed_official 508:4f5903e025e6 325 __HAL_UART_ENABLE_IT(&UartHandle, UART_IT_TC);
mbed_official 508:4f5903e025e6 326 }
mbed_official 508:4f5903e025e6 327
mbed_official 508:4f5903e025e6 328 NVIC_SetVector(irq_n, vector);
mbed_official 508:4f5903e025e6 329 NVIC_EnableIRQ(irq_n);
mbed_official 508:4f5903e025e6 330
mbed_official 508:4f5903e025e6 331 } else { // disable
mbed_official 508:4f5903e025e6 332
mbed_official 508:4f5903e025e6 333 int all_disabled = 0;
mbed_official 508:4f5903e025e6 334
mbed_official 508:4f5903e025e6 335 if (irq == RxIrq) {
mbed_official 508:4f5903e025e6 336 __HAL_UART_DISABLE_IT(&UartHandle, UART_IT_RXNE);
mbed_official 508:4f5903e025e6 337 // Check if TxIrq is disabled too
mbed_official 508:4f5903e025e6 338 if ((UartHandle.Instance->CR1 & USART_CR1_TCIE) == 0) all_disabled = 1;
mbed_official 508:4f5903e025e6 339 } else { // TxIrq
mbed_official 508:4f5903e025e6 340 __HAL_UART_DISABLE_IT(&UartHandle, UART_IT_TC);
mbed_official 508:4f5903e025e6 341 // Check if RxIrq is disabled too
mbed_official 508:4f5903e025e6 342 if ((UartHandle.Instance->CR1 & USART_CR1_RXNEIE) == 0) all_disabled = 1;
mbed_official 508:4f5903e025e6 343 }
mbed_official 508:4f5903e025e6 344
mbed_official 508:4f5903e025e6 345 if (all_disabled) NVIC_DisableIRQ(irq_n);
mbed_official 508:4f5903e025e6 346
mbed_official 508:4f5903e025e6 347 }
mbed_official 508:4f5903e025e6 348 }
mbed_official 508:4f5903e025e6 349
mbed_official 508:4f5903e025e6 350 /******************************************************************************
mbed_official 508:4f5903e025e6 351 * READ/WRITE
mbed_official 508:4f5903e025e6 352 ******************************************************************************/
mbed_official 508:4f5903e025e6 353
mbed_official 508:4f5903e025e6 354 int serial_getc(serial_t *obj)
mbed_official 508:4f5903e025e6 355 {
mbed_official 508:4f5903e025e6 356 USART_TypeDef *uart = (USART_TypeDef *)(obj->uart);
mbed_official 508:4f5903e025e6 357 while (!serial_readable(obj));
mbed_official 508:4f5903e025e6 358 if (obj->databits == UART_WORDLENGTH_8B) {
mbed_official 508:4f5903e025e6 359 return (int)(uart->RDR & (uint8_t)0xFF);
mbed_official 508:4f5903e025e6 360 } else {
mbed_official 508:4f5903e025e6 361 return (int)(uart->RDR & (uint16_t)0x1FF);
mbed_official 508:4f5903e025e6 362 }
mbed_official 508:4f5903e025e6 363 }
mbed_official 508:4f5903e025e6 364
mbed_official 508:4f5903e025e6 365 void serial_putc(serial_t *obj, int c)
mbed_official 508:4f5903e025e6 366 {
mbed_official 508:4f5903e025e6 367 USART_TypeDef *uart = (USART_TypeDef *)(obj->uart);
mbed_official 508:4f5903e025e6 368 while (!serial_writable(obj));
mbed_official 508:4f5903e025e6 369 if (obj->databits == UART_WORDLENGTH_8B) {
mbed_official 508:4f5903e025e6 370 uart->TDR = (uint8_t)(c & (uint8_t)0xFF);
mbed_official 508:4f5903e025e6 371 } else {
mbed_official 508:4f5903e025e6 372 uart->TDR = (uint16_t)(c & (uint16_t)0x1FF);
mbed_official 508:4f5903e025e6 373 }
mbed_official 508:4f5903e025e6 374 }
mbed_official 508:4f5903e025e6 375
mbed_official 508:4f5903e025e6 376 int serial_readable(serial_t *obj)
mbed_official 508:4f5903e025e6 377 {
mbed_official 508:4f5903e025e6 378 int status;
mbed_official 508:4f5903e025e6 379 UartHandle.Instance = (USART_TypeDef *)(obj->uart);
mbed_official 508:4f5903e025e6 380 // Check if data is received
mbed_official 508:4f5903e025e6 381 status = ((__HAL_UART_GET_FLAG(&UartHandle, UART_FLAG_RXNE) != RESET) ? 1 : 0);
mbed_official 508:4f5903e025e6 382 return status;
mbed_official 508:4f5903e025e6 383 }
mbed_official 508:4f5903e025e6 384
mbed_official 508:4f5903e025e6 385 int serial_writable(serial_t *obj)
mbed_official 508:4f5903e025e6 386 {
mbed_official 508:4f5903e025e6 387 int status;
mbed_official 508:4f5903e025e6 388 UartHandle.Instance = (USART_TypeDef *)(obj->uart);
mbed_official 508:4f5903e025e6 389 // Check if data is transmitted
mbed_official 508:4f5903e025e6 390 status = ((__HAL_UART_GET_FLAG(&UartHandle, UART_FLAG_TXE) != RESET) ? 1 : 0);
mbed_official 508:4f5903e025e6 391 return status;
mbed_official 508:4f5903e025e6 392 }
mbed_official 508:4f5903e025e6 393
mbed_official 508:4f5903e025e6 394 void serial_clear(serial_t *obj)
mbed_official 508:4f5903e025e6 395 {
mbed_official 508:4f5903e025e6 396 UartHandle.Instance = (USART_TypeDef *)(obj->uart);
mbed_official 508:4f5903e025e6 397 __HAL_UART_CLEAR_IT(&UartHandle, UART_FLAG_TC);
mbed_official 508:4f5903e025e6 398 __HAL_UART_SEND_REQ(&UartHandle, UART_RXDATA_FLUSH_REQUEST);
mbed_official 508:4f5903e025e6 399 }
mbed_official 508:4f5903e025e6 400
mbed_official 508:4f5903e025e6 401 void serial_pinout_tx(PinName tx)
mbed_official 508:4f5903e025e6 402 {
mbed_official 508:4f5903e025e6 403 pinmap_pinout(tx, PinMap_UART_TX);
mbed_official 508:4f5903e025e6 404 }
mbed_official 508:4f5903e025e6 405
mbed_official 508:4f5903e025e6 406 void serial_break_set(serial_t *obj)
mbed_official 508:4f5903e025e6 407 {
mbed_official 508:4f5903e025e6 408 UartHandle.Instance = (USART_TypeDef *)(obj->uart);
mbed_official 508:4f5903e025e6 409 HAL_LIN_SendBreak(&UartHandle);
mbed_official 508:4f5903e025e6 410 }
mbed_official 508:4f5903e025e6 411
mbed_official 508:4f5903e025e6 412 void serial_break_clear(serial_t *obj)
mbed_official 508:4f5903e025e6 413 {
mbed_official 508:4f5903e025e6 414 }
mbed_official 508:4f5903e025e6 415
mbed_official 508:4f5903e025e6 416 #endif