Mouse code for the MacroRat

Dependencies:   ITG3200 QEI

Committer:
sahilmgandhi
Date:
Sat Jun 03 00:22:44 2017 +0000
Revision:
46:b156ef445742
Parent:
18:6a4db94011d3
Final code for internal battlebot competition.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sahilmgandhi 18:6a4db94011d3 1 /* mbed Microcontroller Library
sahilmgandhi 18:6a4db94011d3 2 *******************************************************************************
sahilmgandhi 18:6a4db94011d3 3 * Copyright (c) 2015, STMicroelectronics
sahilmgandhi 18:6a4db94011d3 4 * All rights reserved.
sahilmgandhi 18:6a4db94011d3 5 *
sahilmgandhi 18:6a4db94011d3 6 * Redistribution and use in source and binary forms, with or without
sahilmgandhi 18:6a4db94011d3 7 * modification, are permitted provided that the following conditions are met:
sahilmgandhi 18:6a4db94011d3 8 *
sahilmgandhi 18:6a4db94011d3 9 * 1. Redistributions of source code must retain the above copyright notice,
sahilmgandhi 18:6a4db94011d3 10 * this list of conditions and the following disclaimer.
sahilmgandhi 18:6a4db94011d3 11 * 2. Redistributions in binary form must reproduce the above copyright notice,
sahilmgandhi 18:6a4db94011d3 12 * this list of conditions and the following disclaimer in the documentation
sahilmgandhi 18:6a4db94011d3 13 * and/or other materials provided with the distribution.
sahilmgandhi 18:6a4db94011d3 14 * 3. Neither the name of STMicroelectronics nor the names of its contributors
sahilmgandhi 18:6a4db94011d3 15 * may be used to endorse or promote products derived from this software
sahilmgandhi 18:6a4db94011d3 16 * without specific prior written permission.
sahilmgandhi 18:6a4db94011d3 17 *
sahilmgandhi 18:6a4db94011d3 18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
sahilmgandhi 18:6a4db94011d3 19 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
sahilmgandhi 18:6a4db94011d3 20 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
sahilmgandhi 18:6a4db94011d3 21 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
sahilmgandhi 18:6a4db94011d3 22 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
sahilmgandhi 18:6a4db94011d3 23 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
sahilmgandhi 18:6a4db94011d3 24 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
sahilmgandhi 18:6a4db94011d3 25 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
sahilmgandhi 18:6a4db94011d3 26 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
sahilmgandhi 18:6a4db94011d3 27 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
sahilmgandhi 18:6a4db94011d3 28 *******************************************************************************
sahilmgandhi 18:6a4db94011d3 29 */
sahilmgandhi 18:6a4db94011d3 30 #include "mbed_assert.h"
sahilmgandhi 18:6a4db94011d3 31 #include "serial_api.h"
sahilmgandhi 18:6a4db94011d3 32
sahilmgandhi 18:6a4db94011d3 33 #if DEVICE_SERIAL
sahilmgandhi 18:6a4db94011d3 34
sahilmgandhi 18:6a4db94011d3 35 #include "cmsis.h"
sahilmgandhi 18:6a4db94011d3 36 #include "pinmap.h"
sahilmgandhi 18:6a4db94011d3 37 #include <string.h>
sahilmgandhi 18:6a4db94011d3 38 #include "PeripheralPins.h"
sahilmgandhi 18:6a4db94011d3 39 #include "mbed_error.h"
sahilmgandhi 18:6a4db94011d3 40
sahilmgandhi 18:6a4db94011d3 41 #if defined (TARGET_STM32F091RC)
sahilmgandhi 18:6a4db94011d3 42 #define UART_NUM (8)
sahilmgandhi 18:6a4db94011d3 43 #elif defined (TARGET_STM32F030R8) || defined (TARGET_STM32F051R8) || defined (TARGET_STM32F042K6)
sahilmgandhi 18:6a4db94011d3 44 #define UART_NUM (2)
sahilmgandhi 18:6a4db94011d3 45 #elif defined (TARGET_STM32F031K6)
sahilmgandhi 18:6a4db94011d3 46 #define UART_NUM (1)
sahilmgandhi 18:6a4db94011d3 47 #else
sahilmgandhi 18:6a4db94011d3 48 #define UART_NUM (4)
sahilmgandhi 18:6a4db94011d3 49 #endif
sahilmgandhi 18:6a4db94011d3 50
sahilmgandhi 18:6a4db94011d3 51 static uint32_t serial_irq_ids[UART_NUM] = {0};
sahilmgandhi 18:6a4db94011d3 52 static UART_HandleTypeDef uart_handlers[UART_NUM];
sahilmgandhi 18:6a4db94011d3 53
sahilmgandhi 18:6a4db94011d3 54 static uart_irq_handler irq_handler;
sahilmgandhi 18:6a4db94011d3 55
sahilmgandhi 18:6a4db94011d3 56 int stdio_uart_inited = 0;
sahilmgandhi 18:6a4db94011d3 57 serial_t stdio_uart;
sahilmgandhi 18:6a4db94011d3 58
sahilmgandhi 18:6a4db94011d3 59 #if DEVICE_SERIAL_ASYNCH
sahilmgandhi 18:6a4db94011d3 60 #define SERIAL_S(obj) (&((obj)->serial))
sahilmgandhi 18:6a4db94011d3 61 #else
sahilmgandhi 18:6a4db94011d3 62 #define SERIAL_S(obj) (obj)
sahilmgandhi 18:6a4db94011d3 63 #endif
sahilmgandhi 18:6a4db94011d3 64
sahilmgandhi 18:6a4db94011d3 65 static void init_uart(serial_t *obj)
sahilmgandhi 18:6a4db94011d3 66 {
sahilmgandhi 18:6a4db94011d3 67 struct serial_s *obj_s = SERIAL_S(obj);
sahilmgandhi 18:6a4db94011d3 68 UART_HandleTypeDef *huart = &uart_handlers[obj_s->index];
sahilmgandhi 18:6a4db94011d3 69 huart->Instance = (USART_TypeDef *)(obj_s->uart);
sahilmgandhi 18:6a4db94011d3 70
sahilmgandhi 18:6a4db94011d3 71 huart->Init.BaudRate = obj_s->baudrate;
sahilmgandhi 18:6a4db94011d3 72 huart->Init.WordLength = obj_s->databits;
sahilmgandhi 18:6a4db94011d3 73 huart->Init.StopBits = obj_s->stopbits;
sahilmgandhi 18:6a4db94011d3 74 huart->Init.Parity = obj_s->parity;
sahilmgandhi 18:6a4db94011d3 75 #if DEVICE_SERIAL_FC
sahilmgandhi 18:6a4db94011d3 76 huart->Init.HwFlowCtl = obj_s->hw_flow_ctl;
sahilmgandhi 18:6a4db94011d3 77 #else
sahilmgandhi 18:6a4db94011d3 78 huart->Init.HwFlowCtl = UART_HWCONTROL_NONE;
sahilmgandhi 18:6a4db94011d3 79 #endif
sahilmgandhi 18:6a4db94011d3 80 huart->TxXferCount = 0;
sahilmgandhi 18:6a4db94011d3 81 huart->TxXferSize = 0;
sahilmgandhi 18:6a4db94011d3 82 huart->RxXferCount = 0;
sahilmgandhi 18:6a4db94011d3 83 huart->RxXferSize = 0;
sahilmgandhi 18:6a4db94011d3 84
sahilmgandhi 18:6a4db94011d3 85 if (obj_s->pin_rx == NC) {
sahilmgandhi 18:6a4db94011d3 86 huart->Init.Mode = UART_MODE_TX;
sahilmgandhi 18:6a4db94011d3 87 } else if (obj_s->pin_tx == NC) {
sahilmgandhi 18:6a4db94011d3 88 huart->Init.Mode = UART_MODE_RX;
sahilmgandhi 18:6a4db94011d3 89 } else {
sahilmgandhi 18:6a4db94011d3 90 huart->Init.Mode = UART_MODE_TX_RX;
sahilmgandhi 18:6a4db94011d3 91 }
sahilmgandhi 18:6a4db94011d3 92
sahilmgandhi 18:6a4db94011d3 93 if (HAL_UART_Init(huart) != HAL_OK) {
sahilmgandhi 18:6a4db94011d3 94 error("Cannot initialize UART\n");
sahilmgandhi 18:6a4db94011d3 95 }
sahilmgandhi 18:6a4db94011d3 96 }
sahilmgandhi 18:6a4db94011d3 97
sahilmgandhi 18:6a4db94011d3 98 void serial_init(serial_t *obj, PinName tx, PinName rx)
sahilmgandhi 18:6a4db94011d3 99 {
sahilmgandhi 18:6a4db94011d3 100 struct serial_s *obj_s = SERIAL_S(obj);
sahilmgandhi 18:6a4db94011d3 101
sahilmgandhi 18:6a4db94011d3 102 // Determine the UART to use (UART_1, UART_2, ...)
sahilmgandhi 18:6a4db94011d3 103 UARTName uart_tx = (UARTName)pinmap_peripheral(tx, PinMap_UART_TX);
sahilmgandhi 18:6a4db94011d3 104 UARTName uart_rx = (UARTName)pinmap_peripheral(rx, PinMap_UART_RX);
sahilmgandhi 18:6a4db94011d3 105
sahilmgandhi 18:6a4db94011d3 106 // Get the peripheral name (UART_1, UART_2, ...) from the pin and assign it to the object
sahilmgandhi 18:6a4db94011d3 107 obj_s->uart = (UARTName)pinmap_merge(uart_tx, uart_rx);
sahilmgandhi 18:6a4db94011d3 108 MBED_ASSERT(obj_s->uart != (UARTName)NC);
sahilmgandhi 18:6a4db94011d3 109
sahilmgandhi 18:6a4db94011d3 110 // Enable USART clock
sahilmgandhi 18:6a4db94011d3 111 if (obj_s->uart == UART_1) {
sahilmgandhi 18:6a4db94011d3 112 __HAL_RCC_USART1_FORCE_RESET();
sahilmgandhi 18:6a4db94011d3 113 __HAL_RCC_USART1_RELEASE_RESET();
sahilmgandhi 18:6a4db94011d3 114 __HAL_RCC_USART1_CLK_ENABLE();
sahilmgandhi 18:6a4db94011d3 115 obj_s->index = 0;
sahilmgandhi 18:6a4db94011d3 116 }
sahilmgandhi 18:6a4db94011d3 117
sahilmgandhi 18:6a4db94011d3 118 #if defined USART2_BASE
sahilmgandhi 18:6a4db94011d3 119 if (obj_s->uart == UART_2) {
sahilmgandhi 18:6a4db94011d3 120 __HAL_RCC_USART2_FORCE_RESET();
sahilmgandhi 18:6a4db94011d3 121 __HAL_RCC_USART2_RELEASE_RESET();
sahilmgandhi 18:6a4db94011d3 122 __HAL_RCC_USART2_CLK_ENABLE();
sahilmgandhi 18:6a4db94011d3 123 obj_s->index = 1;
sahilmgandhi 18:6a4db94011d3 124 }
sahilmgandhi 18:6a4db94011d3 125 #endif
sahilmgandhi 18:6a4db94011d3 126
sahilmgandhi 18:6a4db94011d3 127 #if defined USART3_BASE
sahilmgandhi 18:6a4db94011d3 128 if (obj_s->uart == UART_3) {
sahilmgandhi 18:6a4db94011d3 129 __HAL_RCC_USART3_FORCE_RESET();
sahilmgandhi 18:6a4db94011d3 130 __HAL_RCC_USART3_RELEASE_RESET();
sahilmgandhi 18:6a4db94011d3 131 __HAL_RCC_USART3_CLK_ENABLE();
sahilmgandhi 18:6a4db94011d3 132 obj_s->index = 2;
sahilmgandhi 18:6a4db94011d3 133 }
sahilmgandhi 18:6a4db94011d3 134 #endif
sahilmgandhi 18:6a4db94011d3 135
sahilmgandhi 18:6a4db94011d3 136 #if defined USART4_BASE
sahilmgandhi 18:6a4db94011d3 137 if (obj_s->uart == UART_4) {
sahilmgandhi 18:6a4db94011d3 138 __HAL_RCC_USART4_FORCE_RESET();
sahilmgandhi 18:6a4db94011d3 139 __HAL_RCC_USART4_RELEASE_RESET();
sahilmgandhi 18:6a4db94011d3 140 __HAL_RCC_USART4_CLK_ENABLE();
sahilmgandhi 18:6a4db94011d3 141 obj_s->index = 3;
sahilmgandhi 18:6a4db94011d3 142 }
sahilmgandhi 18:6a4db94011d3 143 #endif
sahilmgandhi 18:6a4db94011d3 144
sahilmgandhi 18:6a4db94011d3 145 #if defined USART5_BASE
sahilmgandhi 18:6a4db94011d3 146 if (obj_s->uart == UART_5) {
sahilmgandhi 18:6a4db94011d3 147 __HAL_RCC_USART5_FORCE_RESET();
sahilmgandhi 18:6a4db94011d3 148 __HAL_RCC_USART5_RELEASE_RESET();
sahilmgandhi 18:6a4db94011d3 149 __HAL_RCC_USART5_CLK_ENABLE();
sahilmgandhi 18:6a4db94011d3 150 obj_s->index = 4;
sahilmgandhi 18:6a4db94011d3 151 }
sahilmgandhi 18:6a4db94011d3 152 #endif
sahilmgandhi 18:6a4db94011d3 153
sahilmgandhi 18:6a4db94011d3 154 #if defined USART6_BASE
sahilmgandhi 18:6a4db94011d3 155 if (obj_s->uart == UART_6) {
sahilmgandhi 18:6a4db94011d3 156 __HAL_RCC_USART6_FORCE_RESET();
sahilmgandhi 18:6a4db94011d3 157 __HAL_RCC_USART6_RELEASE_RESET();
sahilmgandhi 18:6a4db94011d3 158 __HAL_RCC_USART6_CLK_ENABLE();
sahilmgandhi 18:6a4db94011d3 159 obj_s->index = 5;
sahilmgandhi 18:6a4db94011d3 160 }
sahilmgandhi 18:6a4db94011d3 161 #endif
sahilmgandhi 18:6a4db94011d3 162
sahilmgandhi 18:6a4db94011d3 163 #if defined USART7_BASE
sahilmgandhi 18:6a4db94011d3 164 if (obj_s->uart == UART_7) {
sahilmgandhi 18:6a4db94011d3 165 __HAL_RCC_USART7_FORCE_RESET();
sahilmgandhi 18:6a4db94011d3 166 __HAL_RCC_USART7_RELEASE_RESET();
sahilmgandhi 18:6a4db94011d3 167 __HAL_RCC_USART7_CLK_ENABLE();
sahilmgandhi 18:6a4db94011d3 168 obj_s->index = 6;
sahilmgandhi 18:6a4db94011d3 169 }
sahilmgandhi 18:6a4db94011d3 170 #endif
sahilmgandhi 18:6a4db94011d3 171
sahilmgandhi 18:6a4db94011d3 172 #if defined USART8_BASE
sahilmgandhi 18:6a4db94011d3 173 if (obj_s->uart == UART_8) {
sahilmgandhi 18:6a4db94011d3 174 __HAL_RCC_USART8_FORCE_RESET();
sahilmgandhi 18:6a4db94011d3 175 __HAL_RCC_USART8_RELEASE_RESET();
sahilmgandhi 18:6a4db94011d3 176 __HAL_RCC_USART8_CLK_ENABLE();
sahilmgandhi 18:6a4db94011d3 177 obj_s->index = 7;
sahilmgandhi 18:6a4db94011d3 178 }
sahilmgandhi 18:6a4db94011d3 179 #endif
sahilmgandhi 18:6a4db94011d3 180
sahilmgandhi 18:6a4db94011d3 181 // Configure the UART pins
sahilmgandhi 18:6a4db94011d3 182 pinmap_pinout(tx, PinMap_UART_TX);
sahilmgandhi 18:6a4db94011d3 183 pinmap_pinout(rx, PinMap_UART_RX);
sahilmgandhi 18:6a4db94011d3 184
sahilmgandhi 18:6a4db94011d3 185 if (tx != NC) {
sahilmgandhi 18:6a4db94011d3 186 pin_mode(tx, PullUp);
sahilmgandhi 18:6a4db94011d3 187 }
sahilmgandhi 18:6a4db94011d3 188 if (rx != NC) {
sahilmgandhi 18:6a4db94011d3 189 pin_mode(rx, PullUp);
sahilmgandhi 18:6a4db94011d3 190 }
sahilmgandhi 18:6a4db94011d3 191
sahilmgandhi 18:6a4db94011d3 192 // Configure UART
sahilmgandhi 18:6a4db94011d3 193 obj_s->baudrate = 9600;
sahilmgandhi 18:6a4db94011d3 194 obj_s->databits = UART_WORDLENGTH_8B;
sahilmgandhi 18:6a4db94011d3 195 obj_s->stopbits = UART_STOPBITS_1;
sahilmgandhi 18:6a4db94011d3 196 obj_s->parity = UART_PARITY_NONE;
sahilmgandhi 18:6a4db94011d3 197
sahilmgandhi 18:6a4db94011d3 198 #if DEVICE_SERIAL_FC
sahilmgandhi 18:6a4db94011d3 199 obj_s->hw_flow_ctl = UART_HWCONTROL_NONE;
sahilmgandhi 18:6a4db94011d3 200 #endif
sahilmgandhi 18:6a4db94011d3 201
sahilmgandhi 18:6a4db94011d3 202 obj_s->pin_tx = tx;
sahilmgandhi 18:6a4db94011d3 203 obj_s->pin_rx = rx;
sahilmgandhi 18:6a4db94011d3 204
sahilmgandhi 18:6a4db94011d3 205 init_uart(obj);
sahilmgandhi 18:6a4db94011d3 206
sahilmgandhi 18:6a4db94011d3 207 // For stdio management
sahilmgandhi 18:6a4db94011d3 208 if (obj_s->uart == STDIO_UART) {
sahilmgandhi 18:6a4db94011d3 209 stdio_uart_inited = 1;
sahilmgandhi 18:6a4db94011d3 210 memcpy(&stdio_uart, obj, sizeof(serial_t));
sahilmgandhi 18:6a4db94011d3 211 }
sahilmgandhi 18:6a4db94011d3 212 }
sahilmgandhi 18:6a4db94011d3 213
sahilmgandhi 18:6a4db94011d3 214 void serial_free(serial_t *obj)
sahilmgandhi 18:6a4db94011d3 215 {
sahilmgandhi 18:6a4db94011d3 216 struct serial_s *obj_s = SERIAL_S(obj);
sahilmgandhi 18:6a4db94011d3 217
sahilmgandhi 18:6a4db94011d3 218 // Reset UART and disable clock
sahilmgandhi 18:6a4db94011d3 219 if (obj_s->uart == UART_1) {
sahilmgandhi 18:6a4db94011d3 220 __HAL_RCC_USART1_FORCE_RESET();
sahilmgandhi 18:6a4db94011d3 221 __HAL_RCC_USART1_RELEASE_RESET();
sahilmgandhi 18:6a4db94011d3 222 __HAL_RCC_USART1_CLK_DISABLE();
sahilmgandhi 18:6a4db94011d3 223 }
sahilmgandhi 18:6a4db94011d3 224
sahilmgandhi 18:6a4db94011d3 225 #if defined(USART2_BASE)
sahilmgandhi 18:6a4db94011d3 226 if (obj_s->uart == UART_2) {
sahilmgandhi 18:6a4db94011d3 227 __HAL_RCC_USART2_FORCE_RESET();
sahilmgandhi 18:6a4db94011d3 228 __HAL_RCC_USART2_RELEASE_RESET();
sahilmgandhi 18:6a4db94011d3 229 __HAL_RCC_USART2_CLK_DISABLE();
sahilmgandhi 18:6a4db94011d3 230 }
sahilmgandhi 18:6a4db94011d3 231 #endif
sahilmgandhi 18:6a4db94011d3 232
sahilmgandhi 18:6a4db94011d3 233 #if defined USART3_BASE
sahilmgandhi 18:6a4db94011d3 234 if (obj_s->uart == UART_3) {
sahilmgandhi 18:6a4db94011d3 235 __HAL_RCC_USART3_FORCE_RESET();
sahilmgandhi 18:6a4db94011d3 236 __HAL_RCC_USART3_RELEASE_RESET();
sahilmgandhi 18:6a4db94011d3 237 __HAL_RCC_USART3_CLK_DISABLE();
sahilmgandhi 18:6a4db94011d3 238 }
sahilmgandhi 18:6a4db94011d3 239 #endif
sahilmgandhi 18:6a4db94011d3 240
sahilmgandhi 18:6a4db94011d3 241 #if defined USART4_BASE
sahilmgandhi 18:6a4db94011d3 242 if (obj_s->uart == UART_4) {
sahilmgandhi 18:6a4db94011d3 243 __HAL_RCC_USART4_FORCE_RESET();
sahilmgandhi 18:6a4db94011d3 244 __HAL_RCC_USART4_RELEASE_RESET();
sahilmgandhi 18:6a4db94011d3 245 __HAL_RCC_USART4_CLK_DISABLE();
sahilmgandhi 18:6a4db94011d3 246 }
sahilmgandhi 18:6a4db94011d3 247 #endif
sahilmgandhi 18:6a4db94011d3 248
sahilmgandhi 18:6a4db94011d3 249 #if defined USART5_BASE
sahilmgandhi 18:6a4db94011d3 250 if (obj_s->uart == UART_5) {
sahilmgandhi 18:6a4db94011d3 251 __HAL_RCC_USART5_FORCE_RESET();
sahilmgandhi 18:6a4db94011d3 252 __HAL_RCC_USART5_RELEASE_RESET();
sahilmgandhi 18:6a4db94011d3 253 __HAL_RCC_USART5_CLK_DISABLE();
sahilmgandhi 18:6a4db94011d3 254 }
sahilmgandhi 18:6a4db94011d3 255 #endif
sahilmgandhi 18:6a4db94011d3 256
sahilmgandhi 18:6a4db94011d3 257 #if defined USART6_BASE
sahilmgandhi 18:6a4db94011d3 258 if (obj_s->uart == UART_6) {
sahilmgandhi 18:6a4db94011d3 259 __HAL_RCC_USART6_FORCE_RESET();
sahilmgandhi 18:6a4db94011d3 260 __HAL_RCC_USART6_RELEASE_RESET();
sahilmgandhi 18:6a4db94011d3 261 __HAL_RCC_USART6_CLK_DISABLE();
sahilmgandhi 18:6a4db94011d3 262 }
sahilmgandhi 18:6a4db94011d3 263 #endif
sahilmgandhi 18:6a4db94011d3 264
sahilmgandhi 18:6a4db94011d3 265 #if defined USART7_BASE
sahilmgandhi 18:6a4db94011d3 266 if (obj_s->uart == UART_7) {
sahilmgandhi 18:6a4db94011d3 267 __HAL_RCC_USART7_FORCE_RESET();
sahilmgandhi 18:6a4db94011d3 268 __HAL_RCC_USART7_RELEASE_RESET();
sahilmgandhi 18:6a4db94011d3 269 __HAL_RCC_USART7_CLK_DISABLE();
sahilmgandhi 18:6a4db94011d3 270 }
sahilmgandhi 18:6a4db94011d3 271 #endif
sahilmgandhi 18:6a4db94011d3 272
sahilmgandhi 18:6a4db94011d3 273 #if defined USART8_BASE
sahilmgandhi 18:6a4db94011d3 274 if (obj_s->uart == UART_8) {
sahilmgandhi 18:6a4db94011d3 275 __HAL_RCC_USART8_FORCE_RESET();
sahilmgandhi 18:6a4db94011d3 276 __HAL_RCC_USART8_RELEASE_RESET();
sahilmgandhi 18:6a4db94011d3 277 __HAL_RCC_USART8_CLK_DISABLE();
sahilmgandhi 18:6a4db94011d3 278 }
sahilmgandhi 18:6a4db94011d3 279 #endif
sahilmgandhi 18:6a4db94011d3 280
sahilmgandhi 18:6a4db94011d3 281 // Configure GPIOs
sahilmgandhi 18:6a4db94011d3 282 pin_function(obj_s->pin_tx, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 0));
sahilmgandhi 18:6a4db94011d3 283 pin_function(obj_s->pin_rx, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 0));
sahilmgandhi 18:6a4db94011d3 284
sahilmgandhi 18:6a4db94011d3 285 serial_irq_ids[obj_s->index] = 0;
sahilmgandhi 18:6a4db94011d3 286 }
sahilmgandhi 18:6a4db94011d3 287
sahilmgandhi 18:6a4db94011d3 288 void serial_baud(serial_t *obj, int baudrate)
sahilmgandhi 18:6a4db94011d3 289 {
sahilmgandhi 18:6a4db94011d3 290 struct serial_s *obj_s = SERIAL_S(obj);
sahilmgandhi 18:6a4db94011d3 291
sahilmgandhi 18:6a4db94011d3 292 obj_s->baudrate = baudrate;
sahilmgandhi 18:6a4db94011d3 293 init_uart(obj);
sahilmgandhi 18:6a4db94011d3 294 }
sahilmgandhi 18:6a4db94011d3 295
sahilmgandhi 18:6a4db94011d3 296 void serial_format(serial_t *obj, int data_bits, SerialParity parity, int stop_bits)
sahilmgandhi 18:6a4db94011d3 297 {
sahilmgandhi 18:6a4db94011d3 298 struct serial_s *obj_s = SERIAL_S(obj);
sahilmgandhi 18:6a4db94011d3 299
sahilmgandhi 18:6a4db94011d3 300 if (data_bits == 9) {
sahilmgandhi 18:6a4db94011d3 301 obj_s->databits = UART_WORDLENGTH_9B;
sahilmgandhi 18:6a4db94011d3 302 } else {
sahilmgandhi 18:6a4db94011d3 303 obj_s->databits = UART_WORDLENGTH_8B;
sahilmgandhi 18:6a4db94011d3 304 }
sahilmgandhi 18:6a4db94011d3 305
sahilmgandhi 18:6a4db94011d3 306 switch (parity) {
sahilmgandhi 18:6a4db94011d3 307 case ParityOdd:
sahilmgandhi 18:6a4db94011d3 308 obj_s->parity = UART_PARITY_ODD;
sahilmgandhi 18:6a4db94011d3 309 break;
sahilmgandhi 18:6a4db94011d3 310 case ParityEven:
sahilmgandhi 18:6a4db94011d3 311 obj_s->parity = UART_PARITY_EVEN;
sahilmgandhi 18:6a4db94011d3 312 break;
sahilmgandhi 18:6a4db94011d3 313 default: // ParityNone
sahilmgandhi 18:6a4db94011d3 314 case ParityForced0: // unsupported!
sahilmgandhi 18:6a4db94011d3 315 case ParityForced1: // unsupported!
sahilmgandhi 18:6a4db94011d3 316 obj_s->parity = UART_PARITY_NONE;
sahilmgandhi 18:6a4db94011d3 317 break;
sahilmgandhi 18:6a4db94011d3 318 }
sahilmgandhi 18:6a4db94011d3 319
sahilmgandhi 18:6a4db94011d3 320 if (stop_bits == 2) {
sahilmgandhi 18:6a4db94011d3 321 obj_s->stopbits = UART_STOPBITS_2;
sahilmgandhi 18:6a4db94011d3 322 } else {
sahilmgandhi 18:6a4db94011d3 323 obj_s->stopbits = UART_STOPBITS_1;
sahilmgandhi 18:6a4db94011d3 324 }
sahilmgandhi 18:6a4db94011d3 325
sahilmgandhi 18:6a4db94011d3 326 init_uart(obj);
sahilmgandhi 18:6a4db94011d3 327 }
sahilmgandhi 18:6a4db94011d3 328
sahilmgandhi 18:6a4db94011d3 329 /******************************************************************************
sahilmgandhi 18:6a4db94011d3 330 * INTERRUPTS HANDLING
sahilmgandhi 18:6a4db94011d3 331 ******************************************************************************/
sahilmgandhi 18:6a4db94011d3 332
sahilmgandhi 18:6a4db94011d3 333 static void uart_irq(int id)
sahilmgandhi 18:6a4db94011d3 334 {
sahilmgandhi 18:6a4db94011d3 335 UART_HandleTypeDef * huart = &uart_handlers[id];
sahilmgandhi 18:6a4db94011d3 336
sahilmgandhi 18:6a4db94011d3 337 if (serial_irq_ids[id] != 0) {
sahilmgandhi 18:6a4db94011d3 338 if (__HAL_UART_GET_FLAG(huart, UART_FLAG_TC) != RESET) {
sahilmgandhi 18:6a4db94011d3 339 if (__HAL_UART_GET_IT_SOURCE(huart, UART_IT_TC) != RESET) {
sahilmgandhi 18:6a4db94011d3 340 irq_handler(serial_irq_ids[id], TxIrq);
sahilmgandhi 18:6a4db94011d3 341 __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_TCF);
sahilmgandhi 18:6a4db94011d3 342 }
sahilmgandhi 18:6a4db94011d3 343 }
sahilmgandhi 18:6a4db94011d3 344 if (__HAL_UART_GET_FLAG(huart, UART_FLAG_RXNE) != RESET) {
sahilmgandhi 18:6a4db94011d3 345 if (__HAL_UART_GET_IT_SOURCE(huart, UART_IT_RXNE) != RESET) {
sahilmgandhi 18:6a4db94011d3 346 irq_handler(serial_irq_ids[id], RxIrq);
sahilmgandhi 18:6a4db94011d3 347 volatile uint32_t tmpval = huart->Instance->RDR; // Clear RXNE flag
sahilmgandhi 18:6a4db94011d3 348 }
sahilmgandhi 18:6a4db94011d3 349 }
sahilmgandhi 18:6a4db94011d3 350 if (__HAL_UART_GET_FLAG(huart, UART_FLAG_ORE) != RESET) {
sahilmgandhi 18:6a4db94011d3 351 if (__HAL_UART_GET_IT_SOURCE(huart, UART_IT_ORE) != RESET) {
sahilmgandhi 18:6a4db94011d3 352 __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_OREF);
sahilmgandhi 18:6a4db94011d3 353 }
sahilmgandhi 18:6a4db94011d3 354 }
sahilmgandhi 18:6a4db94011d3 355 }
sahilmgandhi 18:6a4db94011d3 356 }
sahilmgandhi 18:6a4db94011d3 357
sahilmgandhi 18:6a4db94011d3 358 static void uart1_irq(void)
sahilmgandhi 18:6a4db94011d3 359 {
sahilmgandhi 18:6a4db94011d3 360 uart_irq(0);
sahilmgandhi 18:6a4db94011d3 361 }
sahilmgandhi 18:6a4db94011d3 362
sahilmgandhi 18:6a4db94011d3 363 #if defined(USART2_BASE)
sahilmgandhi 18:6a4db94011d3 364 static void uart2_irq(void)
sahilmgandhi 18:6a4db94011d3 365 {
sahilmgandhi 18:6a4db94011d3 366 uart_irq(1);
sahilmgandhi 18:6a4db94011d3 367 }
sahilmgandhi 18:6a4db94011d3 368 #endif
sahilmgandhi 18:6a4db94011d3 369
sahilmgandhi 18:6a4db94011d3 370 #if defined USART3_BASE
sahilmgandhi 18:6a4db94011d3 371 static void uart3_irq(void)
sahilmgandhi 18:6a4db94011d3 372 {
sahilmgandhi 18:6a4db94011d3 373 uart_irq(2);
sahilmgandhi 18:6a4db94011d3 374 }
sahilmgandhi 18:6a4db94011d3 375 #endif
sahilmgandhi 18:6a4db94011d3 376
sahilmgandhi 18:6a4db94011d3 377 #if defined USART4_BASE
sahilmgandhi 18:6a4db94011d3 378 static void uart4_irq(void)
sahilmgandhi 18:6a4db94011d3 379 {
sahilmgandhi 18:6a4db94011d3 380 uart_irq(3);
sahilmgandhi 18:6a4db94011d3 381 }
sahilmgandhi 18:6a4db94011d3 382 #endif
sahilmgandhi 18:6a4db94011d3 383
sahilmgandhi 18:6a4db94011d3 384 #if defined USART5_BASE
sahilmgandhi 18:6a4db94011d3 385 static void uart5_irq(void)
sahilmgandhi 18:6a4db94011d3 386 {
sahilmgandhi 18:6a4db94011d3 387 uart_irq(4);
sahilmgandhi 18:6a4db94011d3 388 }
sahilmgandhi 18:6a4db94011d3 389 #endif
sahilmgandhi 18:6a4db94011d3 390
sahilmgandhi 18:6a4db94011d3 391 #if defined USART6_BASE
sahilmgandhi 18:6a4db94011d3 392 static void uart6_irq(void)
sahilmgandhi 18:6a4db94011d3 393 {
sahilmgandhi 18:6a4db94011d3 394 uart_irq(5);
sahilmgandhi 18:6a4db94011d3 395 }
sahilmgandhi 18:6a4db94011d3 396 #endif
sahilmgandhi 18:6a4db94011d3 397
sahilmgandhi 18:6a4db94011d3 398 #if defined USART7_BASE
sahilmgandhi 18:6a4db94011d3 399 static void uart7_irq(void)
sahilmgandhi 18:6a4db94011d3 400 {
sahilmgandhi 18:6a4db94011d3 401 uart_irq(6);
sahilmgandhi 18:6a4db94011d3 402 }
sahilmgandhi 18:6a4db94011d3 403 #endif
sahilmgandhi 18:6a4db94011d3 404
sahilmgandhi 18:6a4db94011d3 405 #if defined USART8_BASE
sahilmgandhi 18:6a4db94011d3 406 static void uart8_irq(void)
sahilmgandhi 18:6a4db94011d3 407 {
sahilmgandhi 18:6a4db94011d3 408 uart_irq(7);
sahilmgandhi 18:6a4db94011d3 409 }
sahilmgandhi 18:6a4db94011d3 410 #endif
sahilmgandhi 18:6a4db94011d3 411
sahilmgandhi 18:6a4db94011d3 412 void serial_irq_handler(serial_t *obj, uart_irq_handler handler, uint32_t id)
sahilmgandhi 18:6a4db94011d3 413 {
sahilmgandhi 18:6a4db94011d3 414 struct serial_s *obj_s = SERIAL_S(obj);
sahilmgandhi 18:6a4db94011d3 415
sahilmgandhi 18:6a4db94011d3 416 irq_handler = handler;
sahilmgandhi 18:6a4db94011d3 417 serial_irq_ids[obj_s->index] = id;
sahilmgandhi 18:6a4db94011d3 418 }
sahilmgandhi 18:6a4db94011d3 419
sahilmgandhi 18:6a4db94011d3 420 void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable)
sahilmgandhi 18:6a4db94011d3 421 {
sahilmgandhi 18:6a4db94011d3 422 struct serial_s *obj_s = SERIAL_S(obj);
sahilmgandhi 18:6a4db94011d3 423 UART_HandleTypeDef *huart = &uart_handlers[obj_s->index];
sahilmgandhi 18:6a4db94011d3 424 IRQn_Type irq_n = (IRQn_Type)0;
sahilmgandhi 18:6a4db94011d3 425 uint32_t vector = 0;
sahilmgandhi 18:6a4db94011d3 426
sahilmgandhi 18:6a4db94011d3 427 if (obj_s->uart == UART_1) {
sahilmgandhi 18:6a4db94011d3 428 irq_n = USART1_IRQn;
sahilmgandhi 18:6a4db94011d3 429 vector = (uint32_t)&uart1_irq;
sahilmgandhi 18:6a4db94011d3 430 }
sahilmgandhi 18:6a4db94011d3 431
sahilmgandhi 18:6a4db94011d3 432 #if defined(USART2_BASE)
sahilmgandhi 18:6a4db94011d3 433 if (obj_s->uart == UART_2) {
sahilmgandhi 18:6a4db94011d3 434 irq_n = USART2_IRQn;
sahilmgandhi 18:6a4db94011d3 435 vector = (uint32_t)&uart2_irq;
sahilmgandhi 18:6a4db94011d3 436 }
sahilmgandhi 18:6a4db94011d3 437 #endif
sahilmgandhi 18:6a4db94011d3 438
sahilmgandhi 18:6a4db94011d3 439 #if defined (TARGET_STM32F091RC)
sahilmgandhi 18:6a4db94011d3 440 if (obj_s->uart == UART_3) {
sahilmgandhi 18:6a4db94011d3 441 irq_n = USART3_8_IRQn;
sahilmgandhi 18:6a4db94011d3 442 vector = (uint32_t)&uart3_irq;
sahilmgandhi 18:6a4db94011d3 443 }
sahilmgandhi 18:6a4db94011d3 444
sahilmgandhi 18:6a4db94011d3 445 if (obj_s->uart == UART_4) {
sahilmgandhi 18:6a4db94011d3 446 irq_n = USART3_8_IRQn;
sahilmgandhi 18:6a4db94011d3 447 vector = (uint32_t)&uart4_irq;
sahilmgandhi 18:6a4db94011d3 448 }
sahilmgandhi 18:6a4db94011d3 449
sahilmgandhi 18:6a4db94011d3 450 if (obj_s->uart == UART_5) {
sahilmgandhi 18:6a4db94011d3 451 irq_n = USART3_8_IRQn;
sahilmgandhi 18:6a4db94011d3 452 vector = (uint32_t)&uart5_irq;
sahilmgandhi 18:6a4db94011d3 453 }
sahilmgandhi 18:6a4db94011d3 454
sahilmgandhi 18:6a4db94011d3 455 if (obj_s->uart == UART_6) {
sahilmgandhi 18:6a4db94011d3 456 irq_n = USART3_8_IRQn;
sahilmgandhi 18:6a4db94011d3 457 vector = (uint32_t)&uart6_irq;
sahilmgandhi 18:6a4db94011d3 458 }
sahilmgandhi 18:6a4db94011d3 459
sahilmgandhi 18:6a4db94011d3 460 if (obj_s->uart == UART_7) {
sahilmgandhi 18:6a4db94011d3 461 irq_n = USART3_8_IRQn;
sahilmgandhi 18:6a4db94011d3 462 vector = (uint32_t)&uart7_irq;
sahilmgandhi 18:6a4db94011d3 463 }
sahilmgandhi 18:6a4db94011d3 464
sahilmgandhi 18:6a4db94011d3 465 if (obj_s->uart == UART_8) {
sahilmgandhi 18:6a4db94011d3 466 irq_n = USART3_8_IRQn;
sahilmgandhi 18:6a4db94011d3 467 vector = (uint32_t)&uart8_irq;
sahilmgandhi 18:6a4db94011d3 468 }
sahilmgandhi 18:6a4db94011d3 469
sahilmgandhi 18:6a4db94011d3 470 #elif defined (TARGET_STM32F030R8) || defined (TARGET_STM32F051R8)
sahilmgandhi 18:6a4db94011d3 471
sahilmgandhi 18:6a4db94011d3 472 #else
sahilmgandhi 18:6a4db94011d3 473 #if defined(USART3_BASE)
sahilmgandhi 18:6a4db94011d3 474 if (obj_s->uart == UART_3) {
sahilmgandhi 18:6a4db94011d3 475 irq_n = USART3_4_IRQn;
sahilmgandhi 18:6a4db94011d3 476 vector = (uint32_t)&uart3_irq;
sahilmgandhi 18:6a4db94011d3 477 }
sahilmgandhi 18:6a4db94011d3 478 #endif
sahilmgandhi 18:6a4db94011d3 479
sahilmgandhi 18:6a4db94011d3 480 #if defined(USART4_BASE)
sahilmgandhi 18:6a4db94011d3 481 if (obj_s->uart == UART_4) {
sahilmgandhi 18:6a4db94011d3 482 irq_n = USART3_4_IRQn;
sahilmgandhi 18:6a4db94011d3 483 vector = (uint32_t)&uart4_irq;
sahilmgandhi 18:6a4db94011d3 484 }
sahilmgandhi 18:6a4db94011d3 485 #endif
sahilmgandhi 18:6a4db94011d3 486 #endif
sahilmgandhi 18:6a4db94011d3 487
sahilmgandhi 18:6a4db94011d3 488 if (enable) {
sahilmgandhi 18:6a4db94011d3 489 if (irq == RxIrq) {
sahilmgandhi 18:6a4db94011d3 490 __HAL_UART_ENABLE_IT(huart, UART_IT_RXNE);
sahilmgandhi 18:6a4db94011d3 491 } else { // TxIrq
sahilmgandhi 18:6a4db94011d3 492 __HAL_UART_ENABLE_IT(huart, UART_IT_TC);
sahilmgandhi 18:6a4db94011d3 493 }
sahilmgandhi 18:6a4db94011d3 494 NVIC_SetVector(irq_n, vector);
sahilmgandhi 18:6a4db94011d3 495 NVIC_EnableIRQ(irq_n);
sahilmgandhi 18:6a4db94011d3 496
sahilmgandhi 18:6a4db94011d3 497 } else { // disable
sahilmgandhi 18:6a4db94011d3 498 int all_disabled = 0;
sahilmgandhi 18:6a4db94011d3 499 if (irq == RxIrq) {
sahilmgandhi 18:6a4db94011d3 500 __HAL_UART_DISABLE_IT(huart, UART_IT_RXNE);
sahilmgandhi 18:6a4db94011d3 501 // Check if TxIrq is disabled too
sahilmgandhi 18:6a4db94011d3 502 if ((huart->Instance->CR1 & USART_CR1_TXEIE) == 0) {
sahilmgandhi 18:6a4db94011d3 503 all_disabled = 1;
sahilmgandhi 18:6a4db94011d3 504 }
sahilmgandhi 18:6a4db94011d3 505 } else { // TxIrq
sahilmgandhi 18:6a4db94011d3 506 __HAL_UART_DISABLE_IT(huart, UART_IT_TC);
sahilmgandhi 18:6a4db94011d3 507 // Check if RxIrq is disabled too
sahilmgandhi 18:6a4db94011d3 508 if ((huart->Instance->CR1 & USART_CR1_RXNEIE) == 0) {
sahilmgandhi 18:6a4db94011d3 509 all_disabled = 1;
sahilmgandhi 18:6a4db94011d3 510 }
sahilmgandhi 18:6a4db94011d3 511 }
sahilmgandhi 18:6a4db94011d3 512
sahilmgandhi 18:6a4db94011d3 513 if (all_disabled) {
sahilmgandhi 18:6a4db94011d3 514 NVIC_DisableIRQ(irq_n);
sahilmgandhi 18:6a4db94011d3 515 }
sahilmgandhi 18:6a4db94011d3 516 }
sahilmgandhi 18:6a4db94011d3 517 }
sahilmgandhi 18:6a4db94011d3 518
sahilmgandhi 18:6a4db94011d3 519 /******************************************************************************
sahilmgandhi 18:6a4db94011d3 520 * READ/WRITE
sahilmgandhi 18:6a4db94011d3 521 ******************************************************************************/
sahilmgandhi 18:6a4db94011d3 522
sahilmgandhi 18:6a4db94011d3 523 int serial_getc(serial_t *obj)
sahilmgandhi 18:6a4db94011d3 524 {
sahilmgandhi 18:6a4db94011d3 525 struct serial_s *obj_s = SERIAL_S(obj);
sahilmgandhi 18:6a4db94011d3 526 UART_HandleTypeDef *huart = &uart_handlers[obj_s->index];
sahilmgandhi 18:6a4db94011d3 527
sahilmgandhi 18:6a4db94011d3 528 while (!serial_readable(obj));
sahilmgandhi 18:6a4db94011d3 529 return (int)(huart->Instance->RDR & (uint16_t)0xFF);
sahilmgandhi 18:6a4db94011d3 530 }
sahilmgandhi 18:6a4db94011d3 531
sahilmgandhi 18:6a4db94011d3 532 void serial_putc(serial_t *obj, int c)
sahilmgandhi 18:6a4db94011d3 533 {
sahilmgandhi 18:6a4db94011d3 534 struct serial_s *obj_s = SERIAL_S(obj);
sahilmgandhi 18:6a4db94011d3 535 UART_HandleTypeDef *huart = &uart_handlers[obj_s->index];
sahilmgandhi 18:6a4db94011d3 536
sahilmgandhi 18:6a4db94011d3 537 while (!serial_writable(obj));
sahilmgandhi 18:6a4db94011d3 538 huart->Instance->TDR = (uint32_t)(c & (uint16_t)0xFF);
sahilmgandhi 18:6a4db94011d3 539 }
sahilmgandhi 18:6a4db94011d3 540
sahilmgandhi 18:6a4db94011d3 541 int serial_readable(serial_t *obj)
sahilmgandhi 18:6a4db94011d3 542 {
sahilmgandhi 18:6a4db94011d3 543 struct serial_s *obj_s = SERIAL_S(obj);
sahilmgandhi 18:6a4db94011d3 544 UART_HandleTypeDef *huart = &uart_handlers[obj_s->index];
sahilmgandhi 18:6a4db94011d3 545
sahilmgandhi 18:6a4db94011d3 546 // Check if data is received
sahilmgandhi 18:6a4db94011d3 547 return (__HAL_UART_GET_FLAG(huart, UART_FLAG_RXNE) != RESET) ? 1 : 0;
sahilmgandhi 18:6a4db94011d3 548 }
sahilmgandhi 18:6a4db94011d3 549
sahilmgandhi 18:6a4db94011d3 550 int serial_writable(serial_t *obj)
sahilmgandhi 18:6a4db94011d3 551 {
sahilmgandhi 18:6a4db94011d3 552 struct serial_s *obj_s = SERIAL_S(obj);
sahilmgandhi 18:6a4db94011d3 553 UART_HandleTypeDef *huart = &uart_handlers[obj_s->index];
sahilmgandhi 18:6a4db94011d3 554
sahilmgandhi 18:6a4db94011d3 555 // Check if data is transmitted
sahilmgandhi 18:6a4db94011d3 556 return (__HAL_UART_GET_FLAG(huart, UART_FLAG_TXE) != RESET) ? 1 : 0;
sahilmgandhi 18:6a4db94011d3 557 }
sahilmgandhi 18:6a4db94011d3 558
sahilmgandhi 18:6a4db94011d3 559 void serial_clear(serial_t *obj)
sahilmgandhi 18:6a4db94011d3 560 {
sahilmgandhi 18:6a4db94011d3 561 struct serial_s *obj_s = SERIAL_S(obj);
sahilmgandhi 18:6a4db94011d3 562 UART_HandleTypeDef *huart = &uart_handlers[obj_s->index];
sahilmgandhi 18:6a4db94011d3 563
sahilmgandhi 18:6a4db94011d3 564 huart->TxXferCount = 0;
sahilmgandhi 18:6a4db94011d3 565 huart->RxXferCount = 0;
sahilmgandhi 18:6a4db94011d3 566 }
sahilmgandhi 18:6a4db94011d3 567
sahilmgandhi 18:6a4db94011d3 568 void serial_pinout_tx(PinName tx)
sahilmgandhi 18:6a4db94011d3 569 {
sahilmgandhi 18:6a4db94011d3 570 pinmap_pinout(tx, PinMap_UART_TX);
sahilmgandhi 18:6a4db94011d3 571 }
sahilmgandhi 18:6a4db94011d3 572
sahilmgandhi 18:6a4db94011d3 573 void serial_break_set(serial_t *obj)
sahilmgandhi 18:6a4db94011d3 574 {
sahilmgandhi 18:6a4db94011d3 575 struct serial_s *obj_s = SERIAL_S(obj);
sahilmgandhi 18:6a4db94011d3 576 UART_HandleTypeDef *huart = &uart_handlers[obj_s->index];
sahilmgandhi 18:6a4db94011d3 577
sahilmgandhi 18:6a4db94011d3 578 //HAL_LIN_SendBreak(huart);
sahilmgandhi 18:6a4db94011d3 579 }
sahilmgandhi 18:6a4db94011d3 580
sahilmgandhi 18:6a4db94011d3 581 void serial_break_clear(serial_t *obj)
sahilmgandhi 18:6a4db94011d3 582 {
sahilmgandhi 18:6a4db94011d3 583 (void)obj;
sahilmgandhi 18:6a4db94011d3 584 }
sahilmgandhi 18:6a4db94011d3 585
sahilmgandhi 18:6a4db94011d3 586 #if DEVICE_SERIAL_ASYNCH
sahilmgandhi 18:6a4db94011d3 587
sahilmgandhi 18:6a4db94011d3 588 /******************************************************************************
sahilmgandhi 18:6a4db94011d3 589 * LOCAL HELPER FUNCTIONS
sahilmgandhi 18:6a4db94011d3 590 ******************************************************************************/
sahilmgandhi 18:6a4db94011d3 591
sahilmgandhi 18:6a4db94011d3 592 /**
sahilmgandhi 18:6a4db94011d3 593 * Configure the TX buffer for an asynchronous write serial transaction
sahilmgandhi 18:6a4db94011d3 594 *
sahilmgandhi 18:6a4db94011d3 595 * @param obj The serial object.
sahilmgandhi 18:6a4db94011d3 596 * @param tx The buffer for sending.
sahilmgandhi 18:6a4db94011d3 597 * @param tx_length The number of words to transmit.
sahilmgandhi 18:6a4db94011d3 598 */
sahilmgandhi 18:6a4db94011d3 599 static void serial_tx_buffer_set(serial_t *obj, void *tx, int tx_length, uint8_t width)
sahilmgandhi 18:6a4db94011d3 600 {
sahilmgandhi 18:6a4db94011d3 601 (void)width;
sahilmgandhi 18:6a4db94011d3 602
sahilmgandhi 18:6a4db94011d3 603 // Exit if a transmit is already on-going
sahilmgandhi 18:6a4db94011d3 604 if (serial_tx_active(obj)) {
sahilmgandhi 18:6a4db94011d3 605 return;
sahilmgandhi 18:6a4db94011d3 606 }
sahilmgandhi 18:6a4db94011d3 607
sahilmgandhi 18:6a4db94011d3 608 obj->tx_buff.buffer = tx;
sahilmgandhi 18:6a4db94011d3 609 obj->tx_buff.length = tx_length;
sahilmgandhi 18:6a4db94011d3 610 obj->tx_buff.pos = 0;
sahilmgandhi 18:6a4db94011d3 611 }
sahilmgandhi 18:6a4db94011d3 612
sahilmgandhi 18:6a4db94011d3 613 /**
sahilmgandhi 18:6a4db94011d3 614 * Configure the RX buffer for an asynchronous write serial transaction
sahilmgandhi 18:6a4db94011d3 615 *
sahilmgandhi 18:6a4db94011d3 616 * @param obj The serial object.
sahilmgandhi 18:6a4db94011d3 617 * @param tx The buffer for sending.
sahilmgandhi 18:6a4db94011d3 618 * @param tx_length The number of words to transmit.
sahilmgandhi 18:6a4db94011d3 619 */
sahilmgandhi 18:6a4db94011d3 620 static void serial_rx_buffer_set(serial_t *obj, void *rx, int rx_length, uint8_t width)
sahilmgandhi 18:6a4db94011d3 621 {
sahilmgandhi 18:6a4db94011d3 622 (void)width;
sahilmgandhi 18:6a4db94011d3 623
sahilmgandhi 18:6a4db94011d3 624 // Exit if a reception is already on-going
sahilmgandhi 18:6a4db94011d3 625 if (serial_rx_active(obj)) {
sahilmgandhi 18:6a4db94011d3 626 return;
sahilmgandhi 18:6a4db94011d3 627 }
sahilmgandhi 18:6a4db94011d3 628
sahilmgandhi 18:6a4db94011d3 629 obj->rx_buff.buffer = rx;
sahilmgandhi 18:6a4db94011d3 630 obj->rx_buff.length = rx_length;
sahilmgandhi 18:6a4db94011d3 631 obj->rx_buff.pos = 0;
sahilmgandhi 18:6a4db94011d3 632 }
sahilmgandhi 18:6a4db94011d3 633
sahilmgandhi 18:6a4db94011d3 634 /**
sahilmgandhi 18:6a4db94011d3 635 * Configure events
sahilmgandhi 18:6a4db94011d3 636 *
sahilmgandhi 18:6a4db94011d3 637 * @param obj The serial object
sahilmgandhi 18:6a4db94011d3 638 * @param event The logical OR of the events to configure
sahilmgandhi 18:6a4db94011d3 639 * @param enable Set to non-zero to enable events, or zero to disable them
sahilmgandhi 18:6a4db94011d3 640 */
sahilmgandhi 18:6a4db94011d3 641 static void serial_enable_event(serial_t *obj, int event, uint8_t enable)
sahilmgandhi 18:6a4db94011d3 642 {
sahilmgandhi 18:6a4db94011d3 643 struct serial_s *obj_s = SERIAL_S(obj);
sahilmgandhi 18:6a4db94011d3 644
sahilmgandhi 18:6a4db94011d3 645 // Shouldn't have to enable interrupt here, just need to keep track of the requested events.
sahilmgandhi 18:6a4db94011d3 646 if (enable) {
sahilmgandhi 18:6a4db94011d3 647 obj_s->events |= event;
sahilmgandhi 18:6a4db94011d3 648 } else {
sahilmgandhi 18:6a4db94011d3 649 obj_s->events &= ~event;
sahilmgandhi 18:6a4db94011d3 650 }
sahilmgandhi 18:6a4db94011d3 651 }
sahilmgandhi 18:6a4db94011d3 652
sahilmgandhi 18:6a4db94011d3 653
sahilmgandhi 18:6a4db94011d3 654 /**
sahilmgandhi 18:6a4db94011d3 655 * Get index of serial object TX IRQ, relating it to the physical peripheral.
sahilmgandhi 18:6a4db94011d3 656 *
sahilmgandhi 18:6a4db94011d3 657 * @param obj pointer to serial object
sahilmgandhi 18:6a4db94011d3 658 * @return internal NVIC TX IRQ index of U(S)ART peripheral
sahilmgandhi 18:6a4db94011d3 659 */
sahilmgandhi 18:6a4db94011d3 660 static IRQn_Type serial_get_irq_n(serial_t *obj)
sahilmgandhi 18:6a4db94011d3 661 {
sahilmgandhi 18:6a4db94011d3 662 struct serial_s *obj_s = SERIAL_S(obj);
sahilmgandhi 18:6a4db94011d3 663 IRQn_Type irq_n;
sahilmgandhi 18:6a4db94011d3 664
sahilmgandhi 18:6a4db94011d3 665 switch (obj_s->index) {
sahilmgandhi 18:6a4db94011d3 666 #if defined(USART1_BASE)
sahilmgandhi 18:6a4db94011d3 667 case 0:
sahilmgandhi 18:6a4db94011d3 668 irq_n = USART1_IRQn;
sahilmgandhi 18:6a4db94011d3 669 break;
sahilmgandhi 18:6a4db94011d3 670 #endif
sahilmgandhi 18:6a4db94011d3 671 #if defined(USART2_BASE)
sahilmgandhi 18:6a4db94011d3 672 case 1:
sahilmgandhi 18:6a4db94011d3 673 irq_n = USART2_IRQn;
sahilmgandhi 18:6a4db94011d3 674 break;
sahilmgandhi 18:6a4db94011d3 675 #endif
sahilmgandhi 18:6a4db94011d3 676 #if defined (TARGET_STM32F091RC)
sahilmgandhi 18:6a4db94011d3 677 case 2:
sahilmgandhi 18:6a4db94011d3 678 case 3:
sahilmgandhi 18:6a4db94011d3 679 case 4:
sahilmgandhi 18:6a4db94011d3 680 case 5:
sahilmgandhi 18:6a4db94011d3 681 case 6:
sahilmgandhi 18:6a4db94011d3 682 case 7:
sahilmgandhi 18:6a4db94011d3 683 irq_n = USART3_8_IRQn;
sahilmgandhi 18:6a4db94011d3 684 break;
sahilmgandhi 18:6a4db94011d3 685 #elif !defined (TARGET_STM32F030R8) && !defined (TARGET_STM32F051R8)
sahilmgandhi 18:6a4db94011d3 686 case 2:
sahilmgandhi 18:6a4db94011d3 687 case 3:
sahilmgandhi 18:6a4db94011d3 688 irq_n = USART3_4_IRQn;
sahilmgandhi 18:6a4db94011d3 689 break;
sahilmgandhi 18:6a4db94011d3 690 #endif
sahilmgandhi 18:6a4db94011d3 691 default:
sahilmgandhi 18:6a4db94011d3 692 irq_n = (IRQn_Type)0;
sahilmgandhi 18:6a4db94011d3 693 }
sahilmgandhi 18:6a4db94011d3 694
sahilmgandhi 18:6a4db94011d3 695 return irq_n;
sahilmgandhi 18:6a4db94011d3 696 }
sahilmgandhi 18:6a4db94011d3 697
sahilmgandhi 18:6a4db94011d3 698
sahilmgandhi 18:6a4db94011d3 699 /******************************************************************************
sahilmgandhi 18:6a4db94011d3 700 * MBED API FUNCTIONS
sahilmgandhi 18:6a4db94011d3 701 ******************************************************************************/
sahilmgandhi 18:6a4db94011d3 702
sahilmgandhi 18:6a4db94011d3 703 /**
sahilmgandhi 18:6a4db94011d3 704 * Begin asynchronous TX transfer. The used buffer is specified in the serial
sahilmgandhi 18:6a4db94011d3 705 * object, tx_buff
sahilmgandhi 18:6a4db94011d3 706 *
sahilmgandhi 18:6a4db94011d3 707 * @param obj The serial object
sahilmgandhi 18:6a4db94011d3 708 * @param tx The buffer for sending
sahilmgandhi 18:6a4db94011d3 709 * @param tx_length The number of words to transmit
sahilmgandhi 18:6a4db94011d3 710 * @param tx_width The bit width of buffer word
sahilmgandhi 18:6a4db94011d3 711 * @param handler The serial handler
sahilmgandhi 18:6a4db94011d3 712 * @param event The logical OR of events to be registered
sahilmgandhi 18:6a4db94011d3 713 * @param hint A suggestion for how to use DMA with this transfer
sahilmgandhi 18:6a4db94011d3 714 * @return Returns number of data transfered, or 0 otherwise
sahilmgandhi 18:6a4db94011d3 715 */
sahilmgandhi 18:6a4db94011d3 716 int serial_tx_asynch(serial_t *obj, const void *tx, size_t tx_length, uint8_t tx_width, uint32_t handler, uint32_t event, DMAUsage hint)
sahilmgandhi 18:6a4db94011d3 717 {
sahilmgandhi 18:6a4db94011d3 718 // TODO: DMA usage is currently ignored
sahilmgandhi 18:6a4db94011d3 719 (void) hint;
sahilmgandhi 18:6a4db94011d3 720
sahilmgandhi 18:6a4db94011d3 721 // Check buffer is ok
sahilmgandhi 18:6a4db94011d3 722 MBED_ASSERT(tx != (void*)0);
sahilmgandhi 18:6a4db94011d3 723 MBED_ASSERT(tx_width == 8); // support only 8b width
sahilmgandhi 18:6a4db94011d3 724
sahilmgandhi 18:6a4db94011d3 725 struct serial_s *obj_s = SERIAL_S(obj);
sahilmgandhi 18:6a4db94011d3 726 UART_HandleTypeDef * huart = &uart_handlers[obj_s->index];
sahilmgandhi 18:6a4db94011d3 727
sahilmgandhi 18:6a4db94011d3 728 if (tx_length == 0) {
sahilmgandhi 18:6a4db94011d3 729 return 0;
sahilmgandhi 18:6a4db94011d3 730 }
sahilmgandhi 18:6a4db94011d3 731
sahilmgandhi 18:6a4db94011d3 732 // Set up buffer
sahilmgandhi 18:6a4db94011d3 733 serial_tx_buffer_set(obj, (void *)tx, tx_length, tx_width);
sahilmgandhi 18:6a4db94011d3 734
sahilmgandhi 18:6a4db94011d3 735 // Set up events
sahilmgandhi 18:6a4db94011d3 736 serial_enable_event(obj, SERIAL_EVENT_TX_ALL, 0); // Clear all events
sahilmgandhi 18:6a4db94011d3 737 serial_enable_event(obj, event, 1); // Set only the wanted events
sahilmgandhi 18:6a4db94011d3 738
sahilmgandhi 18:6a4db94011d3 739 // Enable interrupt
sahilmgandhi 18:6a4db94011d3 740 IRQn_Type irq_n = serial_get_irq_n(obj);
sahilmgandhi 18:6a4db94011d3 741 NVIC_ClearPendingIRQ(irq_n);
sahilmgandhi 18:6a4db94011d3 742 NVIC_DisableIRQ(irq_n);
sahilmgandhi 18:6a4db94011d3 743 NVIC_SetPriority(irq_n, 1);
sahilmgandhi 18:6a4db94011d3 744 NVIC_SetVector(irq_n, (uint32_t)handler);
sahilmgandhi 18:6a4db94011d3 745 NVIC_EnableIRQ(irq_n);
sahilmgandhi 18:6a4db94011d3 746
sahilmgandhi 18:6a4db94011d3 747 // the following function will enable UART_IT_TXE and error interrupts
sahilmgandhi 18:6a4db94011d3 748 if (HAL_UART_Transmit_IT(huart, (uint8_t*)tx, tx_length) != HAL_OK) {
sahilmgandhi 18:6a4db94011d3 749 return 0;
sahilmgandhi 18:6a4db94011d3 750 }
sahilmgandhi 18:6a4db94011d3 751
sahilmgandhi 18:6a4db94011d3 752 return tx_length;
sahilmgandhi 18:6a4db94011d3 753 }
sahilmgandhi 18:6a4db94011d3 754
sahilmgandhi 18:6a4db94011d3 755 /**
sahilmgandhi 18:6a4db94011d3 756 * Begin asynchronous RX transfer (enable interrupt for data collecting)
sahilmgandhi 18:6a4db94011d3 757 * The used buffer is specified in the serial object, rx_buff
sahilmgandhi 18:6a4db94011d3 758 *
sahilmgandhi 18:6a4db94011d3 759 * @param obj The serial object
sahilmgandhi 18:6a4db94011d3 760 * @param rx The buffer for sending
sahilmgandhi 18:6a4db94011d3 761 * @param rx_length The number of words to transmit
sahilmgandhi 18:6a4db94011d3 762 * @param rx_width The bit width of buffer word
sahilmgandhi 18:6a4db94011d3 763 * @param handler The serial handler
sahilmgandhi 18:6a4db94011d3 764 * @param event The logical OR of events to be registered
sahilmgandhi 18:6a4db94011d3 765 * @param handler The serial handler
sahilmgandhi 18:6a4db94011d3 766 * @param char_match A character in range 0-254 to be matched
sahilmgandhi 18:6a4db94011d3 767 * @param hint A suggestion for how to use DMA with this transfer
sahilmgandhi 18:6a4db94011d3 768 */
sahilmgandhi 18:6a4db94011d3 769 void serial_rx_asynch(serial_t *obj, void *rx, size_t rx_length, uint8_t rx_width, uint32_t handler, uint32_t event, uint8_t char_match, DMAUsage hint)
sahilmgandhi 18:6a4db94011d3 770 {
sahilmgandhi 18:6a4db94011d3 771 // TODO: DMA usage is currently ignored
sahilmgandhi 18:6a4db94011d3 772 (void) hint;
sahilmgandhi 18:6a4db94011d3 773
sahilmgandhi 18:6a4db94011d3 774 /* Sanity check arguments */
sahilmgandhi 18:6a4db94011d3 775 MBED_ASSERT(obj);
sahilmgandhi 18:6a4db94011d3 776 MBED_ASSERT(rx != (void*)0);
sahilmgandhi 18:6a4db94011d3 777 MBED_ASSERT(rx_width == 8); // support only 8b width
sahilmgandhi 18:6a4db94011d3 778
sahilmgandhi 18:6a4db94011d3 779 struct serial_s *obj_s = SERIAL_S(obj);
sahilmgandhi 18:6a4db94011d3 780 UART_HandleTypeDef *huart = &uart_handlers[obj_s->index];
sahilmgandhi 18:6a4db94011d3 781
sahilmgandhi 18:6a4db94011d3 782 serial_enable_event(obj, SERIAL_EVENT_RX_ALL, 0);
sahilmgandhi 18:6a4db94011d3 783 serial_enable_event(obj, event, 1);
sahilmgandhi 18:6a4db94011d3 784
sahilmgandhi 18:6a4db94011d3 785 // set CharMatch
sahilmgandhi 18:6a4db94011d3 786 obj->char_match = char_match;
sahilmgandhi 18:6a4db94011d3 787
sahilmgandhi 18:6a4db94011d3 788 serial_rx_buffer_set(obj, rx, rx_length, rx_width);
sahilmgandhi 18:6a4db94011d3 789
sahilmgandhi 18:6a4db94011d3 790 IRQn_Type irq_n = serial_get_irq_n(obj);
sahilmgandhi 18:6a4db94011d3 791 NVIC_ClearPendingIRQ(irq_n);
sahilmgandhi 18:6a4db94011d3 792 NVIC_DisableIRQ(irq_n);
sahilmgandhi 18:6a4db94011d3 793 NVIC_SetPriority(irq_n, 0);
sahilmgandhi 18:6a4db94011d3 794 NVIC_SetVector(irq_n, (uint32_t)handler);
sahilmgandhi 18:6a4db94011d3 795 NVIC_EnableIRQ(irq_n);
sahilmgandhi 18:6a4db94011d3 796
sahilmgandhi 18:6a4db94011d3 797 // following HAL function will enable the RXNE interrupt + error interrupts
sahilmgandhi 18:6a4db94011d3 798 HAL_UART_Receive_IT(huart, (uint8_t*)rx, rx_length);
sahilmgandhi 18:6a4db94011d3 799 }
sahilmgandhi 18:6a4db94011d3 800
sahilmgandhi 18:6a4db94011d3 801 /**
sahilmgandhi 18:6a4db94011d3 802 * Attempts to determine if the serial peripheral is already in use for TX
sahilmgandhi 18:6a4db94011d3 803 *
sahilmgandhi 18:6a4db94011d3 804 * @param obj The serial object
sahilmgandhi 18:6a4db94011d3 805 * @return Non-zero if the TX transaction is ongoing, 0 otherwise
sahilmgandhi 18:6a4db94011d3 806 */
sahilmgandhi 18:6a4db94011d3 807 uint8_t serial_tx_active(serial_t *obj)
sahilmgandhi 18:6a4db94011d3 808 {
sahilmgandhi 18:6a4db94011d3 809 MBED_ASSERT(obj);
sahilmgandhi 18:6a4db94011d3 810
sahilmgandhi 18:6a4db94011d3 811 struct serial_s *obj_s = SERIAL_S(obj);
sahilmgandhi 18:6a4db94011d3 812 UART_HandleTypeDef *huart = &uart_handlers[obj_s->index];
sahilmgandhi 18:6a4db94011d3 813
sahilmgandhi 18:6a4db94011d3 814 return ((HAL_UART_GetState(huart) == HAL_UART_STATE_BUSY_TX) ? 1 : 0);
sahilmgandhi 18:6a4db94011d3 815 }
sahilmgandhi 18:6a4db94011d3 816
sahilmgandhi 18:6a4db94011d3 817 /**
sahilmgandhi 18:6a4db94011d3 818 * Attempts to determine if the serial peripheral is already in use for RX
sahilmgandhi 18:6a4db94011d3 819 *
sahilmgandhi 18:6a4db94011d3 820 * @param obj The serial object
sahilmgandhi 18:6a4db94011d3 821 * @return Non-zero if the RX transaction is ongoing, 0 otherwise
sahilmgandhi 18:6a4db94011d3 822 */
sahilmgandhi 18:6a4db94011d3 823 uint8_t serial_rx_active(serial_t *obj)
sahilmgandhi 18:6a4db94011d3 824 {
sahilmgandhi 18:6a4db94011d3 825 MBED_ASSERT(obj);
sahilmgandhi 18:6a4db94011d3 826
sahilmgandhi 18:6a4db94011d3 827 struct serial_s *obj_s = SERIAL_S(obj);
sahilmgandhi 18:6a4db94011d3 828 UART_HandleTypeDef *huart = &uart_handlers[obj_s->index];
sahilmgandhi 18:6a4db94011d3 829
sahilmgandhi 18:6a4db94011d3 830 return ((HAL_UART_GetState(huart) == HAL_UART_STATE_BUSY_RX) ? 1 : 0);
sahilmgandhi 18:6a4db94011d3 831 }
sahilmgandhi 18:6a4db94011d3 832
sahilmgandhi 18:6a4db94011d3 833 void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) {
sahilmgandhi 18:6a4db94011d3 834 if (__HAL_UART_GET_FLAG(huart, UART_FLAG_TC) != RESET) {
sahilmgandhi 18:6a4db94011d3 835 __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_TCF);
sahilmgandhi 18:6a4db94011d3 836 }
sahilmgandhi 18:6a4db94011d3 837 }
sahilmgandhi 18:6a4db94011d3 838
sahilmgandhi 18:6a4db94011d3 839 void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart) {
sahilmgandhi 18:6a4db94011d3 840 if (__HAL_UART_GET_FLAG(huart, UART_FLAG_PE) != RESET) {
sahilmgandhi 18:6a4db94011d3 841 __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_PEF);
sahilmgandhi 18:6a4db94011d3 842 }
sahilmgandhi 18:6a4db94011d3 843 if (__HAL_UART_GET_FLAG(huart, UART_FLAG_FE) != RESET) {
sahilmgandhi 18:6a4db94011d3 844 __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_FEF);
sahilmgandhi 18:6a4db94011d3 845 }
sahilmgandhi 18:6a4db94011d3 846 if (__HAL_UART_GET_FLAG(huart, UART_FLAG_NE) != RESET) {
sahilmgandhi 18:6a4db94011d3 847 __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_NEF);
sahilmgandhi 18:6a4db94011d3 848 }
sahilmgandhi 18:6a4db94011d3 849 if (__HAL_UART_GET_FLAG(huart, UART_FLAG_ORE) != RESET) {
sahilmgandhi 18:6a4db94011d3 850 __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_OREF);
sahilmgandhi 18:6a4db94011d3 851 }
sahilmgandhi 18:6a4db94011d3 852 }
sahilmgandhi 18:6a4db94011d3 853
sahilmgandhi 18:6a4db94011d3 854 /**
sahilmgandhi 18:6a4db94011d3 855 * The asynchronous TX and RX handler.
sahilmgandhi 18:6a4db94011d3 856 *
sahilmgandhi 18:6a4db94011d3 857 * @param obj The serial object
sahilmgandhi 18:6a4db94011d3 858 * @return Returns event flags if a TX/RX transfer termination condition was met or 0 otherwise
sahilmgandhi 18:6a4db94011d3 859 */
sahilmgandhi 18:6a4db94011d3 860 int serial_irq_handler_asynch(serial_t *obj)
sahilmgandhi 18:6a4db94011d3 861 {
sahilmgandhi 18:6a4db94011d3 862 struct serial_s *obj_s = SERIAL_S(obj);
sahilmgandhi 18:6a4db94011d3 863 UART_HandleTypeDef *huart = &uart_handlers[obj_s->index];
sahilmgandhi 18:6a4db94011d3 864
sahilmgandhi 18:6a4db94011d3 865 volatile int return_event = 0;
sahilmgandhi 18:6a4db94011d3 866 uint8_t *buf = (uint8_t*)(obj->rx_buff.buffer);
sahilmgandhi 18:6a4db94011d3 867 uint8_t i = 0;
sahilmgandhi 18:6a4db94011d3 868
sahilmgandhi 18:6a4db94011d3 869 // TX PART:
sahilmgandhi 18:6a4db94011d3 870 if (__HAL_UART_GET_FLAG(huart, UART_FLAG_TC) != RESET) {
sahilmgandhi 18:6a4db94011d3 871 if (__HAL_UART_GET_IT_SOURCE(huart, UART_IT_TC) != RESET) {
sahilmgandhi 18:6a4db94011d3 872 // Return event SERIAL_EVENT_TX_COMPLETE if requested
sahilmgandhi 18:6a4db94011d3 873 if ((obj_s->events & SERIAL_EVENT_TX_COMPLETE ) != 0) {
sahilmgandhi 18:6a4db94011d3 874 return_event |= (SERIAL_EVENT_TX_COMPLETE & obj_s->events);
sahilmgandhi 18:6a4db94011d3 875 }
sahilmgandhi 18:6a4db94011d3 876 }
sahilmgandhi 18:6a4db94011d3 877 }
sahilmgandhi 18:6a4db94011d3 878
sahilmgandhi 18:6a4db94011d3 879 // Handle error events
sahilmgandhi 18:6a4db94011d3 880 if (__HAL_UART_GET_FLAG(huart, UART_FLAG_PE) != RESET) {
sahilmgandhi 18:6a4db94011d3 881 if (__HAL_UART_GET_IT_SOURCE(huart, USART_IT_ERR) != RESET) {
sahilmgandhi 18:6a4db94011d3 882 return_event |= (SERIAL_EVENT_RX_PARITY_ERROR & obj_s->events);
sahilmgandhi 18:6a4db94011d3 883 }
sahilmgandhi 18:6a4db94011d3 884 }
sahilmgandhi 18:6a4db94011d3 885
sahilmgandhi 18:6a4db94011d3 886 if (__HAL_UART_GET_FLAG(huart, UART_FLAG_FE) != RESET) {
sahilmgandhi 18:6a4db94011d3 887 if (__HAL_UART_GET_IT_SOURCE(huart, USART_IT_ERR) != RESET) {
sahilmgandhi 18:6a4db94011d3 888 return_event |= (SERIAL_EVENT_RX_FRAMING_ERROR & obj_s->events);
sahilmgandhi 18:6a4db94011d3 889 }
sahilmgandhi 18:6a4db94011d3 890 }
sahilmgandhi 18:6a4db94011d3 891
sahilmgandhi 18:6a4db94011d3 892 if (__HAL_UART_GET_FLAG(huart, UART_FLAG_ORE) != RESET) {
sahilmgandhi 18:6a4db94011d3 893 if (__HAL_UART_GET_IT_SOURCE(huart, USART_IT_ERR) != RESET) {
sahilmgandhi 18:6a4db94011d3 894 return_event |= (SERIAL_EVENT_RX_OVERRUN_ERROR & obj_s->events);
sahilmgandhi 18:6a4db94011d3 895 }
sahilmgandhi 18:6a4db94011d3 896 }
sahilmgandhi 18:6a4db94011d3 897
sahilmgandhi 18:6a4db94011d3 898 HAL_UART_IRQHandler(huart);
sahilmgandhi 18:6a4db94011d3 899
sahilmgandhi 18:6a4db94011d3 900 // Abort if an error occurs
sahilmgandhi 18:6a4db94011d3 901 if (return_event & SERIAL_EVENT_RX_PARITY_ERROR ||
sahilmgandhi 18:6a4db94011d3 902 return_event & SERIAL_EVENT_RX_FRAMING_ERROR ||
sahilmgandhi 18:6a4db94011d3 903 return_event & SERIAL_EVENT_RX_OVERRUN_ERROR) {
sahilmgandhi 18:6a4db94011d3 904 return return_event;
sahilmgandhi 18:6a4db94011d3 905 }
sahilmgandhi 18:6a4db94011d3 906
sahilmgandhi 18:6a4db94011d3 907 //RX PART
sahilmgandhi 18:6a4db94011d3 908 if (huart->RxXferSize != 0) {
sahilmgandhi 18:6a4db94011d3 909 obj->rx_buff.pos = huart->RxXferSize - huart->RxXferCount;
sahilmgandhi 18:6a4db94011d3 910 }
sahilmgandhi 18:6a4db94011d3 911 if ((huart->RxXferCount == 0) && (obj->rx_buff.pos >= (obj->rx_buff.length - 1))) {
sahilmgandhi 18:6a4db94011d3 912 return_event |= (SERIAL_EVENT_RX_COMPLETE & obj_s->events);
sahilmgandhi 18:6a4db94011d3 913 }
sahilmgandhi 18:6a4db94011d3 914
sahilmgandhi 18:6a4db94011d3 915 // Check if char_match is present
sahilmgandhi 18:6a4db94011d3 916 if (obj_s->events & SERIAL_EVENT_RX_CHARACTER_MATCH) {
sahilmgandhi 18:6a4db94011d3 917 if (buf != NULL) {
sahilmgandhi 18:6a4db94011d3 918 for (i = 0; i < obj->rx_buff.pos; i++) {
sahilmgandhi 18:6a4db94011d3 919 if (buf[i] == obj->char_match) {
sahilmgandhi 18:6a4db94011d3 920 obj->rx_buff.pos = i;
sahilmgandhi 18:6a4db94011d3 921 return_event |= (SERIAL_EVENT_RX_CHARACTER_MATCH & obj_s->events);
sahilmgandhi 18:6a4db94011d3 922 serial_rx_abort_asynch(obj);
sahilmgandhi 18:6a4db94011d3 923 break;
sahilmgandhi 18:6a4db94011d3 924 }
sahilmgandhi 18:6a4db94011d3 925 }
sahilmgandhi 18:6a4db94011d3 926 }
sahilmgandhi 18:6a4db94011d3 927 }
sahilmgandhi 18:6a4db94011d3 928
sahilmgandhi 18:6a4db94011d3 929 return return_event;
sahilmgandhi 18:6a4db94011d3 930 }
sahilmgandhi 18:6a4db94011d3 931
sahilmgandhi 18:6a4db94011d3 932 /**
sahilmgandhi 18:6a4db94011d3 933 * Abort the ongoing TX transaction. It disables the enabled interupt for TX and
sahilmgandhi 18:6a4db94011d3 934 * flush TX hardware buffer if TX FIFO is used
sahilmgandhi 18:6a4db94011d3 935 *
sahilmgandhi 18:6a4db94011d3 936 * @param obj The serial object
sahilmgandhi 18:6a4db94011d3 937 */
sahilmgandhi 18:6a4db94011d3 938 void serial_tx_abort_asynch(serial_t *obj)
sahilmgandhi 18:6a4db94011d3 939 {
sahilmgandhi 18:6a4db94011d3 940 struct serial_s *obj_s = SERIAL_S(obj);
sahilmgandhi 18:6a4db94011d3 941 UART_HandleTypeDef *huart = &uart_handlers[obj_s->index];
sahilmgandhi 18:6a4db94011d3 942
sahilmgandhi 18:6a4db94011d3 943 __HAL_UART_DISABLE_IT(huart, UART_IT_TC);
sahilmgandhi 18:6a4db94011d3 944 __HAL_UART_DISABLE_IT(huart, UART_IT_TXE);
sahilmgandhi 18:6a4db94011d3 945
sahilmgandhi 18:6a4db94011d3 946 // clear flags
sahilmgandhi 18:6a4db94011d3 947 __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_TCF);
sahilmgandhi 18:6a4db94011d3 948
sahilmgandhi 18:6a4db94011d3 949 // reset states
sahilmgandhi 18:6a4db94011d3 950 huart->TxXferCount = 0;
sahilmgandhi 18:6a4db94011d3 951 // update handle state
sahilmgandhi 18:6a4db94011d3 952 if(huart->gState == HAL_UART_STATE_BUSY_TX_RX) {
sahilmgandhi 18:6a4db94011d3 953 huart->gState = HAL_UART_STATE_BUSY_RX;
sahilmgandhi 18:6a4db94011d3 954 } else {
sahilmgandhi 18:6a4db94011d3 955 huart->gState = HAL_UART_STATE_READY;
sahilmgandhi 18:6a4db94011d3 956 }
sahilmgandhi 18:6a4db94011d3 957 }
sahilmgandhi 18:6a4db94011d3 958
sahilmgandhi 18:6a4db94011d3 959 /**
sahilmgandhi 18:6a4db94011d3 960 * Abort the ongoing RX transaction It disables the enabled interrupt for RX and
sahilmgandhi 18:6a4db94011d3 961 * flush RX hardware buffer if RX FIFO is used
sahilmgandhi 18:6a4db94011d3 962 *
sahilmgandhi 18:6a4db94011d3 963 * @param obj The serial object
sahilmgandhi 18:6a4db94011d3 964 */
sahilmgandhi 18:6a4db94011d3 965 void serial_rx_abort_asynch(serial_t *obj)
sahilmgandhi 18:6a4db94011d3 966 {
sahilmgandhi 18:6a4db94011d3 967 struct serial_s *obj_s = SERIAL_S(obj);
sahilmgandhi 18:6a4db94011d3 968 UART_HandleTypeDef *huart = &uart_handlers[obj_s->index];
sahilmgandhi 18:6a4db94011d3 969
sahilmgandhi 18:6a4db94011d3 970 // disable interrupts
sahilmgandhi 18:6a4db94011d3 971 __HAL_UART_DISABLE_IT(huart, UART_IT_RXNE);
sahilmgandhi 18:6a4db94011d3 972 __HAL_UART_DISABLE_IT(huart, UART_IT_PE);
sahilmgandhi 18:6a4db94011d3 973 __HAL_UART_DISABLE_IT(huart, UART_IT_ERR);
sahilmgandhi 18:6a4db94011d3 974
sahilmgandhi 18:6a4db94011d3 975 // clear flags
sahilmgandhi 18:6a4db94011d3 976 __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_PEF | UART_CLEAR_FEF | UART_CLEAR_OREF);
sahilmgandhi 18:6a4db94011d3 977 volatile uint32_t tmpval = huart->Instance->RDR; // Clear RXNE flag
sahilmgandhi 18:6a4db94011d3 978
sahilmgandhi 18:6a4db94011d3 979 // reset states
sahilmgandhi 18:6a4db94011d3 980 huart->RxXferCount = 0;
sahilmgandhi 18:6a4db94011d3 981 // update handle state
sahilmgandhi 18:6a4db94011d3 982 if(huart->RxState == HAL_UART_STATE_BUSY_TX_RX) {
sahilmgandhi 18:6a4db94011d3 983 huart->RxState = HAL_UART_STATE_BUSY_TX;
sahilmgandhi 18:6a4db94011d3 984 } else {
sahilmgandhi 18:6a4db94011d3 985 huart->RxState = HAL_UART_STATE_READY;
sahilmgandhi 18:6a4db94011d3 986 }
sahilmgandhi 18:6a4db94011d3 987 }
sahilmgandhi 18:6a4db94011d3 988
sahilmgandhi 18:6a4db94011d3 989 #endif
sahilmgandhi 18:6a4db94011d3 990
sahilmgandhi 18:6a4db94011d3 991 #if DEVICE_SERIAL_FC
sahilmgandhi 18:6a4db94011d3 992
sahilmgandhi 18:6a4db94011d3 993 /**
sahilmgandhi 18:6a4db94011d3 994 * Set HW Control Flow
sahilmgandhi 18:6a4db94011d3 995 * @param obj The serial object
sahilmgandhi 18:6a4db94011d3 996 * @param type The Control Flow type (FlowControlNone, FlowControlRTS, FlowControlCTS, FlowControlRTSCTS)
sahilmgandhi 18:6a4db94011d3 997 * @param rxflow Pin for the rxflow
sahilmgandhi 18:6a4db94011d3 998 * @param txflow Pin for the txflow
sahilmgandhi 18:6a4db94011d3 999 */
sahilmgandhi 18:6a4db94011d3 1000 void serial_set_flow_control(serial_t *obj, FlowControl type, PinName rxflow, PinName txflow)
sahilmgandhi 18:6a4db94011d3 1001 {
sahilmgandhi 18:6a4db94011d3 1002 struct serial_s *obj_s = SERIAL_S(obj);
sahilmgandhi 18:6a4db94011d3 1003
sahilmgandhi 18:6a4db94011d3 1004 // Determine the UART to use (UART_1, UART_2, ...)
sahilmgandhi 18:6a4db94011d3 1005 UARTName uart_rts = (UARTName)pinmap_peripheral(rxflow, PinMap_UART_RTS);
sahilmgandhi 18:6a4db94011d3 1006 UARTName uart_cts = (UARTName)pinmap_peripheral(txflow, PinMap_UART_CTS);
sahilmgandhi 18:6a4db94011d3 1007
sahilmgandhi 18:6a4db94011d3 1008 // Get the peripheral name (UART_1, UART_2, ...) from the pin and assign it to the object
sahilmgandhi 18:6a4db94011d3 1009 obj_s->uart = (UARTName)pinmap_merge(uart_cts, uart_rts);
sahilmgandhi 18:6a4db94011d3 1010 MBED_ASSERT(obj_s->uart != (UARTName)NC);
sahilmgandhi 18:6a4db94011d3 1011
sahilmgandhi 18:6a4db94011d3 1012 if(type == FlowControlNone) {
sahilmgandhi 18:6a4db94011d3 1013 // Disable hardware flow control
sahilmgandhi 18:6a4db94011d3 1014 obj_s->hw_flow_ctl = UART_HWCONTROL_NONE;
sahilmgandhi 18:6a4db94011d3 1015 }
sahilmgandhi 18:6a4db94011d3 1016 if (type == FlowControlRTS) {
sahilmgandhi 18:6a4db94011d3 1017 // Enable RTS
sahilmgandhi 18:6a4db94011d3 1018 MBED_ASSERT(uart_rts != (UARTName)NC);
sahilmgandhi 18:6a4db94011d3 1019 obj_s->hw_flow_ctl = UART_HWCONTROL_RTS;
sahilmgandhi 18:6a4db94011d3 1020 obj_s->pin_rts = rxflow;
sahilmgandhi 18:6a4db94011d3 1021 // Enable the pin for RTS function
sahilmgandhi 18:6a4db94011d3 1022 pinmap_pinout(rxflow, PinMap_UART_RTS);
sahilmgandhi 18:6a4db94011d3 1023 }
sahilmgandhi 18:6a4db94011d3 1024 if (type == FlowControlCTS) {
sahilmgandhi 18:6a4db94011d3 1025 // Enable CTS
sahilmgandhi 18:6a4db94011d3 1026 MBED_ASSERT(uart_cts != (UARTName)NC);
sahilmgandhi 18:6a4db94011d3 1027 obj_s->hw_flow_ctl = UART_HWCONTROL_CTS;
sahilmgandhi 18:6a4db94011d3 1028 obj_s->pin_cts = txflow;
sahilmgandhi 18:6a4db94011d3 1029 // Enable the pin for CTS function
sahilmgandhi 18:6a4db94011d3 1030 pinmap_pinout(txflow, PinMap_UART_CTS);
sahilmgandhi 18:6a4db94011d3 1031 }
sahilmgandhi 18:6a4db94011d3 1032 if (type == FlowControlRTSCTS) {
sahilmgandhi 18:6a4db94011d3 1033 // Enable CTS & RTS
sahilmgandhi 18:6a4db94011d3 1034 MBED_ASSERT(uart_rts != (UARTName)NC);
sahilmgandhi 18:6a4db94011d3 1035 MBED_ASSERT(uart_cts != (UARTName)NC);
sahilmgandhi 18:6a4db94011d3 1036 obj_s->hw_flow_ctl = UART_HWCONTROL_RTS_CTS;
sahilmgandhi 18:6a4db94011d3 1037 obj_s->pin_rts = rxflow;
sahilmgandhi 18:6a4db94011d3 1038 obj_s->pin_cts = txflow;
sahilmgandhi 18:6a4db94011d3 1039 // Enable the pin for CTS function
sahilmgandhi 18:6a4db94011d3 1040 pinmap_pinout(txflow, PinMap_UART_CTS);
sahilmgandhi 18:6a4db94011d3 1041 // Enable the pin for RTS function
sahilmgandhi 18:6a4db94011d3 1042 pinmap_pinout(rxflow, PinMap_UART_RTS);
sahilmgandhi 18:6a4db94011d3 1043 }
sahilmgandhi 18:6a4db94011d3 1044
sahilmgandhi 18:6a4db94011d3 1045 init_uart(obj);
sahilmgandhi 18:6a4db94011d3 1046 }
sahilmgandhi 18:6a4db94011d3 1047
sahilmgandhi 18:6a4db94011d3 1048 #endif
sahilmgandhi 18:6a4db94011d3 1049
sahilmgandhi 18:6a4db94011d3 1050 #endif