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:
Wed Jul 01 09:45:11 2015 +0100
Revision:
579:53297373a894
Parent:
385:be64abf45658
Child:
632:7687fb9c4f91
Synchronized with git revision d5b4d2ab9c47edb4dc5776e7177b0c2263459081

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

Initial version of drivers for SAMR21

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 237:f3da66175598 1 /**
mbed_official 237:f3da66175598 2 ******************************************************************************
mbed_official 237:f3da66175598 3 * @file stm32f3xx_hal_uart.c
mbed_official 237:f3da66175598 4 * @author MCD Application Team
mbed_official 375:3d36234a1087 5 * @version V1.1.0
mbed_official 375:3d36234a1087 6 * @date 12-Sept-2014
mbed_official 237:f3da66175598 7 * @brief UART HAL module driver.
mbed_official 237:f3da66175598 8 *
mbed_official 237:f3da66175598 9 * This file provides firmware functions to manage the following
mbed_official 237:f3da66175598 10 * functionalities of the Universal Asynchronous Receiver Transmitter Peripheral (UART).
mbed_official 237:f3da66175598 11 * + Initialization and de-initialization functions
mbed_official 237:f3da66175598 12 * + IO operation functions
mbed_official 237:f3da66175598 13 * + Peripheral Control functions
mbed_official 237:f3da66175598 14 *
mbed_official 237:f3da66175598 15 *
mbed_official 237:f3da66175598 16 @verbatim
mbed_official 237:f3da66175598 17 ===============================================================================
mbed_official 237:f3da66175598 18 ##### How to use this driver #####
mbed_official 237:f3da66175598 19 ===============================================================================
mbed_official 237:f3da66175598 20 [..]
mbed_official 237:f3da66175598 21 The UART HAL driver can be used as follows:
mbed_official 237:f3da66175598 22
mbed_official 237:f3da66175598 23 (#) Declare a UART_HandleTypeDef handle structure.
mbed_official 237:f3da66175598 24 (#) Initialize the UART low level resources by implementing the HAL_UART_MspInit ()API:
mbed_official 237:f3da66175598 25 (##) Enable the USARTx interface clock.
mbed_official 237:f3da66175598 26 (##) UART pins configuration:
mbed_official 237:f3da66175598 27 (+) Enable the clock for the UART GPIOs.
mbed_official 237:f3da66175598 28 (+) Configure these UART pins as alternate function pull-up.
mbed_official 237:f3da66175598 29 (##) NVIC configuration if you need to use interrupt process (HAL_UART_Transmit_IT()
mbed_official 237:f3da66175598 30 and HAL_UART_Receive_IT() APIs):
mbed_official 237:f3da66175598 31 (+) Configure the USARTx interrupt priority.
mbed_official 237:f3da66175598 32 (+) Enable the NVIC USART IRQ handle.
mbed_official 237:f3da66175598 33 (@) The specific UART interrupts (Transmission complete interrupt,
mbed_official 237:f3da66175598 34 RXNE interrupt and Error Interrupts) will be managed using the macros
mbed_official 237:f3da66175598 35 __HAL_UART_ENABLE_IT() and __HAL_UART_DISABLE_IT() inside the transmit and receive process.
mbed_official 237:f3da66175598 36 (##) DMA Configuration if you need to use DMA process (HAL_UART_Transmit_DMA()
mbed_official 237:f3da66175598 37 and HAL_UART_Receive_DMA() APIs):
mbed_official 237:f3da66175598 38 (+) Declare a DMA handle structure for the Tx/Rx channel.
mbed_official 237:f3da66175598 39 (+) Enable the DMAx interface clock.
mbed_official 237:f3da66175598 40 (+) Configure the declared DMA handle structure with the required Tx/Rx parameters.
mbed_official 237:f3da66175598 41 (+) Configure the DMA Tx/Rx channel.
mbed_official 237:f3da66175598 42 (+) Associate the initilalized DMA handle to the UART DMA Tx/Rx handle.
mbed_official 237:f3da66175598 43 (+) Configure the priority and enable the NVIC for the transfer complete interrupt on the DMA Tx/Rx channel.
mbed_official 237:f3da66175598 44
mbed_official 237:f3da66175598 45 (#) Program the Baud Rate, Word Length , Stop Bit, Parity, Hardware
mbed_official 237:f3da66175598 46 flow control and Mode(Receiver/Transmitter) in the huart Init structure.
mbed_official 237:f3da66175598 47
mbed_official 237:f3da66175598 48 (#) If required, program UART advanced features (TX/RX pins swap, auto Baud rate detection,...)
mbed_official 237:f3da66175598 49 in the huart AdvancedInit structure.
mbed_official 237:f3da66175598 50
mbed_official 237:f3da66175598 51 (#) For the UART asynchronous mode, initialize the UART registers by calling
mbed_official 237:f3da66175598 52 the HAL_UART_Init() API.
mbed_official 237:f3da66175598 53
mbed_official 237:f3da66175598 54 (#) For the UART Half duplex mode, initialize the UART registers by calling
mbed_official 237:f3da66175598 55 the HAL_HalfDuplex_Init() API.
mbed_official 237:f3da66175598 56
mbed_official 237:f3da66175598 57 (#) For the UART LIN (Local Interconnection Network) mode, initialize the UART registers
mbed_official 237:f3da66175598 58 by calling the HAL_LIN_Init() API.
mbed_official 237:f3da66175598 59
mbed_official 237:f3da66175598 60 (#) For the UART Multiprocessor mode, initialize the UART registers
mbed_official 237:f3da66175598 61 by calling the HAL_MultiProcessor_Init() API.
mbed_official 237:f3da66175598 62
mbed_official 237:f3da66175598 63 (#) For the UART RS485 Driver Enabled mode, initialize the UART registers
mbed_official 237:f3da66175598 64 by calling the HAL_RS485Ex_Init() API.
mbed_official 237:f3da66175598 65
mbed_official 237:f3da66175598 66 (@) These API's(HAL_UART_Init(), HAL_HalfDuplex_Init(), HAL_LIN_Init(), HAL_MultiProcessor_Init(),
mbed_official 237:f3da66175598 67 also configure also the low level Hardware GPIO, CLOCK, CORTEX...etc) by
mbed_official 237:f3da66175598 68 calling the customized HAL_UART_MspInit() API.
mbed_official 237:f3da66175598 69
mbed_official 237:f3da66175598 70 @endverbatim
mbed_official 237:f3da66175598 71 ******************************************************************************
mbed_official 237:f3da66175598 72 * @attention
mbed_official 237:f3da66175598 73 *
mbed_official 237:f3da66175598 74 * <h2><center>&copy; COPYRIGHT(c) 2014 STMicroelectronics</center></h2>
mbed_official 237:f3da66175598 75 *
mbed_official 237:f3da66175598 76 * Redistribution and use in source and binary forms, with or without modification,
mbed_official 237:f3da66175598 77 * are permitted provided that the following conditions are met:
mbed_official 237:f3da66175598 78 * 1. Redistributions of source code must retain the above copyright notice,
mbed_official 237:f3da66175598 79 * this list of conditions and the following disclaimer.
mbed_official 237:f3da66175598 80 * 2. Redistributions in binary form must reproduce the above copyright notice,
mbed_official 237:f3da66175598 81 * this list of conditions and the following disclaimer in the documentation
mbed_official 237:f3da66175598 82 * and/or other materials provided with the distribution.
mbed_official 237:f3da66175598 83 * 3. Neither the name of STMicroelectronics nor the names of its contributors
mbed_official 237:f3da66175598 84 * may be used to endorse or promote products derived from this software
mbed_official 237:f3da66175598 85 * without specific prior written permission.
mbed_official 237:f3da66175598 86 *
mbed_official 237:f3da66175598 87 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
mbed_official 237:f3da66175598 88 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
mbed_official 237:f3da66175598 89 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
mbed_official 237:f3da66175598 90 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
mbed_official 237:f3da66175598 91 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
mbed_official 237:f3da66175598 92 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
mbed_official 237:f3da66175598 93 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
mbed_official 237:f3da66175598 94 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
mbed_official 237:f3da66175598 95 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
mbed_official 237:f3da66175598 96 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
mbed_official 237:f3da66175598 97 *
mbed_official 237:f3da66175598 98 ******************************************************************************
mbed_official 237:f3da66175598 99 */
mbed_official 237:f3da66175598 100
mbed_official 237:f3da66175598 101 /* Includes ------------------------------------------------------------------*/
mbed_official 237:f3da66175598 102 #include "stm32f3xx_hal.h"
mbed_official 237:f3da66175598 103
mbed_official 237:f3da66175598 104 /** @addtogroup STM32F3xx_HAL_Driver
mbed_official 237:f3da66175598 105 * @{
mbed_official 237:f3da66175598 106 */
mbed_official 237:f3da66175598 107
mbed_official 375:3d36234a1087 108 /** @defgroup UART UART HAL module driver
mbed_official 375:3d36234a1087 109 * @brief UART HAL module driver
mbed_official 237:f3da66175598 110 * @{
mbed_official 237:f3da66175598 111 */
mbed_official 237:f3da66175598 112 #ifdef HAL_UART_MODULE_ENABLED
mbed_official 237:f3da66175598 113
mbed_official 237:f3da66175598 114 /* Private typedef -----------------------------------------------------------*/
mbed_official 237:f3da66175598 115 /* Private define ------------------------------------------------------------*/
mbed_official 375:3d36234a1087 116 /** @defgroup UART_Private_Constants UART Private Constants
mbed_official 375:3d36234a1087 117 * @{
mbed_official 375:3d36234a1087 118 */
mbed_official 237:f3da66175598 119 #define HAL_UART_TXDMA_TIMEOUTVALUE 22000
mbed_official 237:f3da66175598 120 #define UART_CR1_FIELDS ((uint32_t)(USART_CR1_M | USART_CR1_PCE | USART_CR1_PS | \
mbed_official 237:f3da66175598 121 USART_CR1_TE | USART_CR1_RE | USART_CR1_OVER8))
mbed_official 375:3d36234a1087 122 /**
mbed_official 375:3d36234a1087 123 * @}
mbed_official 375:3d36234a1087 124 */
mbed_official 375:3d36234a1087 125
mbed_official 237:f3da66175598 126 /* Private macro -------------------------------------------------------------*/
mbed_official 237:f3da66175598 127 /* Private variables ---------------------------------------------------------*/
mbed_official 237:f3da66175598 128 /* Private function prototypes -----------------------------------------------*/
mbed_official 237:f3da66175598 129 static void UART_DMATransmitCplt(DMA_HandleTypeDef *hdma);
mbed_official 237:f3da66175598 130 static void UART_DMAReceiveCplt(DMA_HandleTypeDef *hdma);
mbed_official 237:f3da66175598 131 static void UART_DMARxHalfCplt(DMA_HandleTypeDef *hdma);
mbed_official 237:f3da66175598 132 static void UART_DMATxHalfCplt(DMA_HandleTypeDef *hdma);
mbed_official 237:f3da66175598 133 static void UART_DMAError(DMA_HandleTypeDef *hdma);
mbed_official 237:f3da66175598 134 static HAL_StatusTypeDef UART_Transmit_IT(UART_HandleTypeDef *huart);
mbed_official 375:3d36234a1087 135 static HAL_StatusTypeDef UART_EndTransmit_IT(UART_HandleTypeDef *huart);
mbed_official 237:f3da66175598 136 static HAL_StatusTypeDef UART_Receive_IT(UART_HandleTypeDef *huart);
mbed_official 375:3d36234a1087 137 /* Exported functions ---------------------------------------------------------*/
mbed_official 237:f3da66175598 138
mbed_official 375:3d36234a1087 139 /** @defgroup UART_Exported_Functions UART Exported Functions
mbed_official 237:f3da66175598 140 * @{
mbed_official 237:f3da66175598 141 */
mbed_official 237:f3da66175598 142
mbed_official 375:3d36234a1087 143 /** @defgroup UART_Exported_Functions_Group1 Initialization and de-initialization functions
mbed_official 237:f3da66175598 144 * @brief Initialization and Configuration functions
mbed_official 237:f3da66175598 145 *
mbed_official 237:f3da66175598 146 @verbatim
mbed_official 237:f3da66175598 147 ===============================================================================
mbed_official 237:f3da66175598 148 ##### Initialization and Configuration functions #####
mbed_official 237:f3da66175598 149 ===============================================================================
mbed_official 237:f3da66175598 150 [..]
mbed_official 237:f3da66175598 151 This subsection provides a set of functions allowing to initialize the USARTx or the UARTy
mbed_official 237:f3da66175598 152 in asynchronous mode.
mbed_official 237:f3da66175598 153 (+) For the asynchronous mode the parameters below can be configured:
mbed_official 237:f3da66175598 154 (++) Baud Rate
mbed_official 237:f3da66175598 155 (++) Word Length
mbed_official 237:f3da66175598 156 (++) Stop Bit
mbed_official 237:f3da66175598 157 (++) Parity: If the parity is enabled, then the MSB bit of the data written
mbed_official 237:f3da66175598 158 in the data register is transmitted but is changed by the parity bit.
mbed_official 237:f3da66175598 159 Depending on the frame length defined by the M bit (8-bits or 9-bits)
mbed_official 237:f3da66175598 160 or by the M1 and M0 bits (7-bit, 8-bit or 9-bit),
mbed_official 237:f3da66175598 161 the possible UART frame formats are as listed in the following table:
mbed_official 237:f3da66175598 162 +---------------------------------------------------------------+
mbed_official 237:f3da66175598 163 | M bit | PCE bit | UART frame |
mbed_official 237:f3da66175598 164 |-----------|-----------|---------------------------------------|
mbed_official 237:f3da66175598 165 | 0 | 0 | | SB | 8-bit data | STB | |
mbed_official 237:f3da66175598 166 |-----------|-----------|---------------------------------------|
mbed_official 237:f3da66175598 167 | 0 | 1 | | SB | 7-bit data | PB | STB | |
mbed_official 237:f3da66175598 168 |-----------|-----------|---------------------------------------|
mbed_official 237:f3da66175598 169 | 1 | 0 | | SB | 9-bit data | STB | |
mbed_official 237:f3da66175598 170 |-----------|-----------|---------------------------------------|
mbed_official 237:f3da66175598 171 | 1 | 1 | | SB | 8-bit data | PB | STB | |
mbed_official 237:f3da66175598 172 +---------------------------------------------------------------+
mbed_official 237:f3da66175598 173 | M1M0 bits | PCE bit | UART frame |
mbed_official 237:f3da66175598 174 |-----------------------|---------------------------------------|
mbed_official 237:f3da66175598 175 | 10 | 0 | | SB | 7-bit data | STB | |
mbed_official 237:f3da66175598 176 |-----------|-----------|---------------------------------------|
mbed_official 237:f3da66175598 177 | 10 | 1 | | SB | 6-bit data | PB | STB | |
mbed_official 237:f3da66175598 178 +---------------------------------------------------------------+
mbed_official 237:f3da66175598 179 (++) Hardware flow control
mbed_official 237:f3da66175598 180 (++) Receiver/transmitter modes
mbed_official 237:f3da66175598 181 (++) Over Sampling Method
mbed_official 237:f3da66175598 182 (++) One-Bit Sampling Method
mbed_official 237:f3da66175598 183 (+) For the asynchronous mode, the following advanced features can be configured as well:
mbed_official 237:f3da66175598 184 (++) TX and/or RX pin level inversion
mbed_official 237:f3da66175598 185 (++) data logical level inversion
mbed_official 237:f3da66175598 186 (++) RX and TX pins swap
mbed_official 237:f3da66175598 187 (++) RX overrun detection disabling
mbed_official 237:f3da66175598 188 (++) DMA disabling on RX error
mbed_official 237:f3da66175598 189 (++) MSB first on communication line
mbed_official 237:f3da66175598 190 (++) auto Baud rate detection
mbed_official 237:f3da66175598 191 [..]
mbed_official 237:f3da66175598 192 The HAL_UART_Init(), HAL_HalfDuplex_Init(), HAL_LIN_Init() and HAL_MultiProcessor_Init()
mbed_official 237:f3da66175598 193 API follow respectively the UART asynchronous, UART Half duplex, UART LIN mode and
mbed_official 237:f3da66175598 194 multiprocessor configuration procedures (details for the procedures are available in reference manual).
mbed_official 237:f3da66175598 195
mbed_official 237:f3da66175598 196 @endverbatim
mbed_official 237:f3da66175598 197 * @{
mbed_official 237:f3da66175598 198 */
mbed_official 237:f3da66175598 199
mbed_official 237:f3da66175598 200 /**
mbed_official 237:f3da66175598 201 * @brief Initializes the UART mode according to the specified
mbed_official 237:f3da66175598 202 * parameters in the UART_InitTypeDef and creates the associated handle .
mbed_official 237:f3da66175598 203 * @param huart: uart handle
mbed_official 237:f3da66175598 204 * @retval HAL status
mbed_official 237:f3da66175598 205 */
mbed_official 237:f3da66175598 206 HAL_StatusTypeDef HAL_UART_Init(UART_HandleTypeDef *huart)
mbed_official 237:f3da66175598 207 {
mbed_official 237:f3da66175598 208 /* Check the UART handle allocation */
mbed_official 375:3d36234a1087 209 if(huart == HAL_NULL)
mbed_official 237:f3da66175598 210 {
mbed_official 237:f3da66175598 211 return HAL_ERROR;
mbed_official 237:f3da66175598 212 }
mbed_official 237:f3da66175598 213
mbed_official 237:f3da66175598 214 if(huart->Init.HwFlowCtl != UART_HWCONTROL_NONE)
mbed_official 237:f3da66175598 215 {
mbed_official 237:f3da66175598 216 /* Check the parameters */
mbed_official 237:f3da66175598 217 assert_param(IS_UART_HWFLOW_INSTANCE(huart->Instance));
mbed_official 237:f3da66175598 218 }
mbed_official 237:f3da66175598 219 else
mbed_official 237:f3da66175598 220 {
mbed_official 237:f3da66175598 221 /* Check the parameters */
mbed_official 237:f3da66175598 222 assert_param(IS_UART_INSTANCE(huart->Instance));
mbed_official 237:f3da66175598 223 }
mbed_official 237:f3da66175598 224
mbed_official 237:f3da66175598 225 if(huart->State == HAL_UART_STATE_RESET)
mbed_official 237:f3da66175598 226 {
mbed_official 237:f3da66175598 227 /* Init the low level hardware : GPIO, CLOCK */
mbed_official 237:f3da66175598 228 HAL_UART_MspInit(huart);
mbed_official 237:f3da66175598 229 }
mbed_official 237:f3da66175598 230
mbed_official 237:f3da66175598 231 huart->State = HAL_UART_STATE_BUSY;
mbed_official 237:f3da66175598 232
mbed_official 237:f3da66175598 233 /* Disable the Peripheral */
mbed_official 237:f3da66175598 234 __HAL_UART_DISABLE(huart);
mbed_official 237:f3da66175598 235
mbed_official 237:f3da66175598 236 /* Set the UART Communication parameters */
mbed_official 237:f3da66175598 237 if (UART_SetConfig(huart) == HAL_ERROR)
mbed_official 237:f3da66175598 238 {
mbed_official 237:f3da66175598 239 return HAL_ERROR;
mbed_official 237:f3da66175598 240 }
mbed_official 237:f3da66175598 241
mbed_official 237:f3da66175598 242 if (huart->AdvancedInit.AdvFeatureInit != UART_ADVFEATURE_NO_INIT)
mbed_official 237:f3da66175598 243 {
mbed_official 237:f3da66175598 244 UART_AdvFeatureConfig(huart);
mbed_official 237:f3da66175598 245 }
mbed_official 237:f3da66175598 246
mbed_official 237:f3da66175598 247 /* In asynchronous mode, the following bits must be kept cleared:
mbed_official 237:f3da66175598 248 - LINEN and CLKEN bits in the USART_CR2 register,
mbed_official 237:f3da66175598 249 - SCEN, HDSEL and IREN bits in the USART_CR3 register.*/
mbed_official 237:f3da66175598 250 huart->Instance->CR2 &= ~(USART_CR2_LINEN | USART_CR2_CLKEN);
mbed_official 237:f3da66175598 251 huart->Instance->CR3 &= ~(USART_CR3_SCEN | USART_CR3_HDSEL | USART_CR3_IREN);
mbed_official 237:f3da66175598 252
mbed_official 237:f3da66175598 253 /* Enable the Peripheral */
mbed_official 237:f3da66175598 254 __HAL_UART_ENABLE(huart);
mbed_official 237:f3da66175598 255
mbed_official 237:f3da66175598 256 /* TEACK and/or REACK to check before moving huart->State to Ready */
mbed_official 237:f3da66175598 257 return (UART_CheckIdleState(huart));
mbed_official 237:f3da66175598 258 }
mbed_official 237:f3da66175598 259
mbed_official 237:f3da66175598 260 /**
mbed_official 237:f3da66175598 261 * @brief Initializes the half-duplex mode according to the specified
mbed_official 237:f3da66175598 262 * parameters in the UART_InitTypeDef and creates the associated handle .
mbed_official 237:f3da66175598 263 * @param huart: uart handle
mbed_official 237:f3da66175598 264 * @retval HAL status
mbed_official 237:f3da66175598 265 */
mbed_official 237:f3da66175598 266 HAL_StatusTypeDef HAL_HalfDuplex_Init(UART_HandleTypeDef *huart)
mbed_official 237:f3da66175598 267 {
mbed_official 237:f3da66175598 268 /* Check the UART handle allocation */
mbed_official 375:3d36234a1087 269 if(huart == HAL_NULL)
mbed_official 237:f3da66175598 270 {
mbed_official 237:f3da66175598 271 return HAL_ERROR;
mbed_official 237:f3da66175598 272 }
mbed_official 237:f3da66175598 273
mbed_official 237:f3da66175598 274 /* Check UART instance */
mbed_official 237:f3da66175598 275 assert_param(IS_UART_HALFDUPLEX_INSTANCE(huart->Instance));
mbed_official 237:f3da66175598 276
mbed_official 237:f3da66175598 277 if(huart->State == HAL_UART_STATE_RESET)
mbed_official 237:f3da66175598 278 {
mbed_official 237:f3da66175598 279 /* Init the low level hardware : GPIO, CLOCK */
mbed_official 237:f3da66175598 280 HAL_UART_MspInit(huart);
mbed_official 237:f3da66175598 281 }
mbed_official 237:f3da66175598 282
mbed_official 237:f3da66175598 283 huart->State = HAL_UART_STATE_BUSY;
mbed_official 237:f3da66175598 284
mbed_official 237:f3da66175598 285 /* Disable the Peripheral */
mbed_official 237:f3da66175598 286 __HAL_UART_DISABLE(huart);
mbed_official 237:f3da66175598 287
mbed_official 237:f3da66175598 288 /* Set the UART Communication parameters */
mbed_official 237:f3da66175598 289 if (UART_SetConfig(huart) == HAL_ERROR)
mbed_official 237:f3da66175598 290 {
mbed_official 237:f3da66175598 291 return HAL_ERROR;
mbed_official 237:f3da66175598 292 }
mbed_official 237:f3da66175598 293
mbed_official 237:f3da66175598 294 if (huart->AdvancedInit.AdvFeatureInit != UART_ADVFEATURE_NO_INIT)
mbed_official 237:f3da66175598 295 {
mbed_official 237:f3da66175598 296 UART_AdvFeatureConfig(huart);
mbed_official 237:f3da66175598 297 }
mbed_official 237:f3da66175598 298
mbed_official 237:f3da66175598 299 /* In half-duplex mode, the following bits must be kept cleared:
mbed_official 237:f3da66175598 300 - LINEN and CLKEN bits in the USART_CR2 register,
mbed_official 237:f3da66175598 301 - SCEN and IREN bits in the USART_CR3 register.*/
mbed_official 237:f3da66175598 302 huart->Instance->CR2 &= ~(USART_CR2_LINEN | USART_CR2_CLKEN);
mbed_official 237:f3da66175598 303 huart->Instance->CR3 &= ~(USART_CR3_IREN | USART_CR3_SCEN);
mbed_official 237:f3da66175598 304
mbed_official 237:f3da66175598 305 /* Enable the Half-Duplex mode by setting the HDSEL bit in the CR3 register */
mbed_official 237:f3da66175598 306 huart->Instance->CR3 |= USART_CR3_HDSEL;
mbed_official 237:f3da66175598 307
mbed_official 237:f3da66175598 308 /* Enable the Peripheral */
mbed_official 237:f3da66175598 309 __HAL_UART_ENABLE(huart);
mbed_official 237:f3da66175598 310
mbed_official 237:f3da66175598 311 /* TEACK and/or REACK to check before moving huart->State to Ready */
mbed_official 237:f3da66175598 312 return (UART_CheckIdleState(huart));
mbed_official 237:f3da66175598 313 }
mbed_official 237:f3da66175598 314
mbed_official 237:f3da66175598 315
mbed_official 237:f3da66175598 316 /**
mbed_official 237:f3da66175598 317 * @brief Initializes the LIN mode according to the specified
mbed_official 237:f3da66175598 318 * parameters in the UART_InitTypeDef and creates the associated handle .
mbed_official 237:f3da66175598 319 * @param huart: uart handle
mbed_official 237:f3da66175598 320 * @param BreakDetectLength: specifies the LIN break detection length.
mbed_official 237:f3da66175598 321 * This parameter can be one of the following values:
mbed_official 237:f3da66175598 322 * @arg UART_LINBREAKDETECTLENGTH_10B: 10-bit break detection
mbed_official 237:f3da66175598 323 * @arg UART_LINBREAKDETECTLENGTH_11B: 11-bit break detection
mbed_official 237:f3da66175598 324 * @retval HAL status
mbed_official 237:f3da66175598 325 */
mbed_official 237:f3da66175598 326 HAL_StatusTypeDef HAL_LIN_Init(UART_HandleTypeDef *huart, uint32_t BreakDetectLength)
mbed_official 237:f3da66175598 327 {
mbed_official 237:f3da66175598 328 /* Check the UART handle allocation */
mbed_official 375:3d36234a1087 329 if(huart == HAL_NULL)
mbed_official 237:f3da66175598 330 {
mbed_official 237:f3da66175598 331 return HAL_ERROR;
mbed_official 237:f3da66175598 332 }
mbed_official 237:f3da66175598 333
mbed_official 237:f3da66175598 334 /* Check the LIN UART instance */
mbed_official 237:f3da66175598 335 assert_param(IS_UART_LIN_INSTANCE(huart->Instance));
mbed_official 237:f3da66175598 336 /* Check the Break detection length parameter */
mbed_official 237:f3da66175598 337 assert_param(IS_UART_LIN_BREAK_DETECT_LENGTH(BreakDetectLength));
mbed_official 237:f3da66175598 338
mbed_official 237:f3da66175598 339 /* LIN mode limited to 16-bit oversampling only */
mbed_official 237:f3da66175598 340 if(huart->Init.OverSampling == UART_OVERSAMPLING_8)
mbed_official 237:f3da66175598 341 {
mbed_official 237:f3da66175598 342 return HAL_ERROR;
mbed_official 237:f3da66175598 343 }
mbed_official 237:f3da66175598 344
mbed_official 237:f3da66175598 345 if(huart->State == HAL_UART_STATE_RESET)
mbed_official 237:f3da66175598 346 {
mbed_official 237:f3da66175598 347 /* Init the low level hardware : GPIO, CLOCK */
mbed_official 237:f3da66175598 348 HAL_UART_MspInit(huart);
mbed_official 237:f3da66175598 349 }
mbed_official 237:f3da66175598 350
mbed_official 237:f3da66175598 351 huart->State = HAL_UART_STATE_BUSY;
mbed_official 237:f3da66175598 352
mbed_official 237:f3da66175598 353 /* Disable the Peripheral */
mbed_official 237:f3da66175598 354 __HAL_UART_DISABLE(huart);
mbed_official 237:f3da66175598 355
mbed_official 237:f3da66175598 356 /* Set the UART Communication parameters */
mbed_official 237:f3da66175598 357 if (UART_SetConfig(huart) == HAL_ERROR)
mbed_official 237:f3da66175598 358 {
mbed_official 237:f3da66175598 359 return HAL_ERROR;
mbed_official 237:f3da66175598 360 }
mbed_official 237:f3da66175598 361
mbed_official 237:f3da66175598 362 if (huart->AdvancedInit.AdvFeatureInit != UART_ADVFEATURE_NO_INIT)
mbed_official 237:f3da66175598 363 {
mbed_official 237:f3da66175598 364 UART_AdvFeatureConfig(huart);
mbed_official 237:f3da66175598 365 }
mbed_official 237:f3da66175598 366
mbed_official 237:f3da66175598 367 /* In LIN mode, the following bits must be kept cleared:
mbed_official 237:f3da66175598 368 - LINEN and CLKEN bits in the USART_CR2 register,
mbed_official 237:f3da66175598 369 - SCEN and IREN bits in the USART_CR3 register.*/
mbed_official 237:f3da66175598 370 huart->Instance->CR2 &= ~(USART_CR2_CLKEN);
mbed_official 237:f3da66175598 371 huart->Instance->CR3 &= ~(USART_CR3_HDSEL | USART_CR3_IREN | USART_CR3_SCEN);
mbed_official 237:f3da66175598 372
mbed_official 237:f3da66175598 373 /* Enable the LIN mode by setting the LINEN bit in the CR2 register */
mbed_official 237:f3da66175598 374 huart->Instance->CR2 |= USART_CR2_LINEN;
mbed_official 237:f3da66175598 375
mbed_official 237:f3da66175598 376 /* Set the USART LIN Break detection length. */
mbed_official 237:f3da66175598 377 MODIFY_REG(huart->Instance->CR2, USART_CR2_LBDL, BreakDetectLength);
mbed_official 237:f3da66175598 378
mbed_official 237:f3da66175598 379 /* Enable the Peripheral */
mbed_official 237:f3da66175598 380 __HAL_UART_ENABLE(huart);
mbed_official 237:f3da66175598 381
mbed_official 237:f3da66175598 382 /* TEACK and/or REACK to check before moving huart->State to Ready */
mbed_official 237:f3da66175598 383 return (UART_CheckIdleState(huart));
mbed_official 237:f3da66175598 384 }
mbed_official 237:f3da66175598 385
mbed_official 237:f3da66175598 386
mbed_official 237:f3da66175598 387
mbed_official 237:f3da66175598 388 /**
mbed_official 237:f3da66175598 389 * @brief Initializes the multiprocessor mode according to the specified
mbed_official 237:f3da66175598 390 * parameters in the UART_InitTypeDef and creates the associated handle.
mbed_official 237:f3da66175598 391 * @param huart: UART handle
mbed_official 237:f3da66175598 392 * @param Address: UART node address (4-, 6-, 7- or 8-bit long)
mbed_official 237:f3da66175598 393 * @param WakeUpMethod: specifies the UART wakeup method.
mbed_official 237:f3da66175598 394 * This parameter can be one of the following values:
mbed_official 237:f3da66175598 395 * @arg UART_WAKEUPMETHOD_IDLELINE: WakeUp by an idle line detection
mbed_official 237:f3da66175598 396 * @arg UART_WAKEUPMETHOD_ADDRESSMARK: WakeUp by an address mark
mbed_official 237:f3da66175598 397 * @note If the user resorts to idle line detection wake up, the Address parameter
mbed_official 237:f3da66175598 398 * is useless and ignored by the initialization function.
mbed_official 237:f3da66175598 399 * @note If the user resorts to address mark wake up, the address length detection
mbed_official 237:f3da66175598 400 * is configured by default to 4 bits only. For the UART to be able to
mbed_official 237:f3da66175598 401 * manage 6-, 7- or 8-bit long addresses detection, the API
mbed_official 237:f3da66175598 402 * HAL_MultiProcessorEx_AddressLength_Set() must be called after
mbed_official 237:f3da66175598 403 * HAL_MultiProcessor_Init().
mbed_official 237:f3da66175598 404 * @retval HAL status
mbed_official 237:f3da66175598 405 */
mbed_official 237:f3da66175598 406 HAL_StatusTypeDef HAL_MultiProcessor_Init(UART_HandleTypeDef *huart, uint8_t Address, uint32_t WakeUpMethod)
mbed_official 237:f3da66175598 407 {
mbed_official 237:f3da66175598 408 /* Check the UART handle allocation */
mbed_official 375:3d36234a1087 409 if(huart == HAL_NULL)
mbed_official 237:f3da66175598 410 {
mbed_official 237:f3da66175598 411 return HAL_ERROR;
mbed_official 237:f3da66175598 412 }
mbed_official 237:f3da66175598 413
mbed_official 237:f3da66175598 414 /* Check the wake up method parameter */
mbed_official 237:f3da66175598 415 assert_param(IS_UART_WAKEUPMETHOD(WakeUpMethod));
mbed_official 237:f3da66175598 416
mbed_official 237:f3da66175598 417 if(huart->State == HAL_UART_STATE_RESET)
mbed_official 237:f3da66175598 418 {
mbed_official 237:f3da66175598 419 /* Init the low level hardware : GPIO, CLOCK */
mbed_official 237:f3da66175598 420 HAL_UART_MspInit(huart);
mbed_official 237:f3da66175598 421 }
mbed_official 237:f3da66175598 422
mbed_official 237:f3da66175598 423 huart->State = HAL_UART_STATE_BUSY;
mbed_official 237:f3da66175598 424
mbed_official 237:f3da66175598 425 /* Disable the Peripheral */
mbed_official 237:f3da66175598 426 __HAL_UART_DISABLE(huart);
mbed_official 237:f3da66175598 427
mbed_official 237:f3da66175598 428 /* Set the UART Communication parameters */
mbed_official 237:f3da66175598 429 if (UART_SetConfig(huart) == HAL_ERROR)
mbed_official 237:f3da66175598 430 {
mbed_official 237:f3da66175598 431 return HAL_ERROR;
mbed_official 237:f3da66175598 432 }
mbed_official 237:f3da66175598 433
mbed_official 237:f3da66175598 434 if (huart->AdvancedInit.AdvFeatureInit != UART_ADVFEATURE_NO_INIT)
mbed_official 237:f3da66175598 435 {
mbed_official 237:f3da66175598 436 UART_AdvFeatureConfig(huart);
mbed_official 237:f3da66175598 437 }
mbed_official 237:f3da66175598 438
mbed_official 237:f3da66175598 439 /* In multiprocessor mode, the following bits must be kept cleared:
mbed_official 237:f3da66175598 440 - LINEN and CLKEN bits in the USART_CR2 register,
mbed_official 237:f3da66175598 441 - SCEN, HDSEL and IREN bits in the USART_CR3 register. */
mbed_official 237:f3da66175598 442 huart->Instance->CR2 &= ~(USART_CR2_LINEN | USART_CR2_CLKEN);
mbed_official 237:f3da66175598 443 huart->Instance->CR3 &= ~(USART_CR3_SCEN | USART_CR3_HDSEL | USART_CR3_IREN);
mbed_official 237:f3da66175598 444
mbed_official 237:f3da66175598 445 if (WakeUpMethod == UART_WAKEUPMETHOD_ADDRESSMARK)
mbed_official 237:f3da66175598 446 {
mbed_official 237:f3da66175598 447 /* If address mark wake up method is chosen, set the USART address node */
mbed_official 237:f3da66175598 448 MODIFY_REG(huart->Instance->CR2, USART_CR2_ADD, ((uint32_t)Address << UART_CR2_ADDRESS_LSB_POS));
mbed_official 237:f3da66175598 449 }
mbed_official 237:f3da66175598 450
mbed_official 237:f3da66175598 451 /* Set the wake up method by setting the WAKE bit in the CR1 register */
mbed_official 237:f3da66175598 452 MODIFY_REG(huart->Instance->CR1, USART_CR1_WAKE, WakeUpMethod);
mbed_official 237:f3da66175598 453
mbed_official 237:f3da66175598 454 /* Enable the Peripheral */
mbed_official 237:f3da66175598 455 __HAL_UART_ENABLE(huart);
mbed_official 237:f3da66175598 456
mbed_official 237:f3da66175598 457 /* TEACK and/or REACK to check before moving huart->State to Ready */
mbed_official 237:f3da66175598 458 return (UART_CheckIdleState(huart));
mbed_official 237:f3da66175598 459 }
mbed_official 237:f3da66175598 460
mbed_official 237:f3da66175598 461
mbed_official 237:f3da66175598 462
mbed_official 237:f3da66175598 463
mbed_official 237:f3da66175598 464 /**
mbed_official 237:f3da66175598 465 * @brief DeInitializes the UART peripheral
mbed_official 237:f3da66175598 466 * @param huart: uart handle
mbed_official 237:f3da66175598 467 * @retval HAL status
mbed_official 237:f3da66175598 468 */
mbed_official 237:f3da66175598 469 HAL_StatusTypeDef HAL_UART_DeInit(UART_HandleTypeDef *huart)
mbed_official 237:f3da66175598 470 {
mbed_official 237:f3da66175598 471 /* Check the UART handle allocation */
mbed_official 375:3d36234a1087 472 if(huart == HAL_NULL)
mbed_official 237:f3da66175598 473 {
mbed_official 237:f3da66175598 474 return HAL_ERROR;
mbed_official 237:f3da66175598 475 }
mbed_official 237:f3da66175598 476
mbed_official 237:f3da66175598 477 /* Check the parameters */
mbed_official 237:f3da66175598 478 assert_param(IS_UART_INSTANCE(huart->Instance));
mbed_official 237:f3da66175598 479
mbed_official 237:f3da66175598 480 huart->State = HAL_UART_STATE_BUSY;
mbed_official 237:f3da66175598 481
mbed_official 237:f3da66175598 482 /* Disable the Peripheral */
mbed_official 237:f3da66175598 483 __HAL_UART_DISABLE(huart);
mbed_official 237:f3da66175598 484
mbed_official 237:f3da66175598 485 huart->Instance->CR1 = 0x0;
mbed_official 237:f3da66175598 486 huart->Instance->CR2 = 0x0;
mbed_official 237:f3da66175598 487 huart->Instance->CR3 = 0x0;
mbed_official 237:f3da66175598 488
mbed_official 237:f3da66175598 489 /* DeInit the low level hardware */
mbed_official 237:f3da66175598 490 HAL_UART_MspDeInit(huart);
mbed_official 237:f3da66175598 491
mbed_official 237:f3da66175598 492 huart->ErrorCode = HAL_UART_ERROR_NONE;
mbed_official 237:f3da66175598 493 huart->State = HAL_UART_STATE_RESET;
mbed_official 237:f3da66175598 494
mbed_official 237:f3da66175598 495 /* Process Unlock */
mbed_official 237:f3da66175598 496 __HAL_UNLOCK(huart);
mbed_official 237:f3da66175598 497
mbed_official 237:f3da66175598 498 return HAL_OK;
mbed_official 237:f3da66175598 499 }
mbed_official 237:f3da66175598 500
mbed_official 237:f3da66175598 501 /**
mbed_official 237:f3da66175598 502 * @brief UART MSP Init
mbed_official 237:f3da66175598 503 * @param huart: uart handle
mbed_official 237:f3da66175598 504 * @retval None
mbed_official 237:f3da66175598 505 */
mbed_official 237:f3da66175598 506 __weak void HAL_UART_MspInit(UART_HandleTypeDef *huart)
mbed_official 237:f3da66175598 507 {
mbed_official 237:f3da66175598 508 /* NOTE : This function should not be modified, when the callback is needed,
mbed_official 237:f3da66175598 509 the HAL_UART_MspInit can be implemented in the user file
mbed_official 237:f3da66175598 510 */
mbed_official 237:f3da66175598 511 }
mbed_official 237:f3da66175598 512
mbed_official 237:f3da66175598 513 /**
mbed_official 237:f3da66175598 514 * @brief UART MSP DeInit
mbed_official 237:f3da66175598 515 * @param huart: uart handle
mbed_official 237:f3da66175598 516 * @retval None
mbed_official 237:f3da66175598 517 */
mbed_official 237:f3da66175598 518 __weak void HAL_UART_MspDeInit(UART_HandleTypeDef *huart)
mbed_official 237:f3da66175598 519 {
mbed_official 237:f3da66175598 520 /* NOTE : This function should not be modified, when the callback is needed,
mbed_official 237:f3da66175598 521 the HAL_UART_MspDeInit can be implemented in the user file
mbed_official 237:f3da66175598 522 */
mbed_official 237:f3da66175598 523 }
mbed_official 237:f3da66175598 524
mbed_official 237:f3da66175598 525 /**
mbed_official 237:f3da66175598 526 * @}
mbed_official 237:f3da66175598 527 */
mbed_official 237:f3da66175598 528
mbed_official 375:3d36234a1087 529 /** @defgroup UART_Exported_Functions_Group2 Input and Output operation functions
mbed_official 237:f3da66175598 530 * @brief UART Transmit/Receive functions
mbed_official 237:f3da66175598 531 *
mbed_official 237:f3da66175598 532 @verbatim
mbed_official 237:f3da66175598 533 ===============================================================================
mbed_official 237:f3da66175598 534 ##### I/O operation functions #####
mbed_official 237:f3da66175598 535 ===============================================================================
mbed_official 237:f3da66175598 536 This subsection provides a set of functions allowing to manage the UART asynchronous
mbed_official 237:f3da66175598 537 and Half duplex data transfers.
mbed_official 237:f3da66175598 538
mbed_official 237:f3da66175598 539 (#) There are two mode of transfer:
mbed_official 237:f3da66175598 540 (+) Blocking mode: The communication is performed in polling mode.
mbed_official 237:f3da66175598 541 The HAL status of all data processing is returned by the same function
mbed_official 237:f3da66175598 542 after finishing transfer.
mbed_official 237:f3da66175598 543 (+) No-Blocking mode: The communication is performed using Interrupts
mbed_official 237:f3da66175598 544 or DMA, These API's return the HAL status.
mbed_official 237:f3da66175598 545 The end of the data processing will be indicated through the
mbed_official 237:f3da66175598 546 dedicated UART IRQ when using Interrupt mode or the DMA IRQ when
mbed_official 237:f3da66175598 547 using DMA mode.
mbed_official 237:f3da66175598 548 The HAL_UART_TxCpltCallback(), HAL_UART_RxCpltCallback() user callbacks
mbed_official 237:f3da66175598 549 will be executed respectivelly at the end of the transmit or Receive process
mbed_official 237:f3da66175598 550 The HAL_UART_ErrorCallback()user callback will be executed when a communication error is detected
mbed_official 237:f3da66175598 551
mbed_official 237:f3da66175598 552 (#) Blocking mode API's are :
mbed_official 237:f3da66175598 553 (+) HAL_UART_Transmit()
mbed_official 237:f3da66175598 554 (+) HAL_UART_Receive()
mbed_official 237:f3da66175598 555
mbed_official 237:f3da66175598 556 (#) Non-Blocking mode API's with Interrupt are :
mbed_official 237:f3da66175598 557 (+) HAL_UART_Transmit_IT()
mbed_official 237:f3da66175598 558 (+) HAL_UART_Receive_IT()
mbed_official 237:f3da66175598 559 (+) HAL_UART_IRQHandler()
mbed_official 237:f3da66175598 560
mbed_official 237:f3da66175598 561 (#) No-Blocking mode API's with DMA are :
mbed_official 237:f3da66175598 562 (+) HAL_UART_Transmit_DMA()
mbed_official 237:f3da66175598 563 (+) HAL_UART_Receive_DMA()
mbed_official 237:f3da66175598 564 (+) HAL_UART_DMAPause()
mbed_official 237:f3da66175598 565 (+) HAL_UART_DMAResume()
mbed_official 237:f3da66175598 566 (+) HAL_UART_DMAStop()
mbed_official 237:f3da66175598 567
mbed_official 237:f3da66175598 568 (#) A set of Transfer Complete Callbacks are provided in No_Blocking mode:
mbed_official 237:f3da66175598 569 (+) HAL_UART_TxHalfCpltCallback()
mbed_official 237:f3da66175598 570 (+) HAL_UART_TxCpltCallback()
mbed_official 237:f3da66175598 571 (+) HAL_UART_RxHalfCpltCallback()
mbed_official 237:f3da66175598 572 (+) HAL_UART_RxCpltCallback()
mbed_official 237:f3da66175598 573 (+) HAL_UART_ErrorCallback()
mbed_official 237:f3da66175598 574
mbed_official 237:f3da66175598 575
mbed_official 237:f3da66175598 576 -@- In the Half duplex communication, it is forbidden to run the transmit
mbed_official 237:f3da66175598 577 and receive process in parallel, the UART state HAL_UART_STATE_BUSY_TX_RX can't be useful.
mbed_official 237:f3da66175598 578
mbed_official 237:f3da66175598 579 @endverbatim
mbed_official 237:f3da66175598 580 * @{
mbed_official 237:f3da66175598 581 */
mbed_official 237:f3da66175598 582
mbed_official 237:f3da66175598 583 /**
mbed_official 237:f3da66175598 584 * @brief Send an amount of data in blocking mode
mbed_official 237:f3da66175598 585 * @param huart: uart handle
mbed_official 237:f3da66175598 586 * @param pData: pointer to data buffer
mbed_official 237:f3da66175598 587 * @param Size: amount of data to be sent
mbed_official 237:f3da66175598 588 * @param Timeout : Timeout duration
mbed_official 237:f3da66175598 589 * @retval HAL status
mbed_official 237:f3da66175598 590 */
mbed_official 237:f3da66175598 591 HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
mbed_official 237:f3da66175598 592 {
mbed_official 237:f3da66175598 593 uint16_t* tmp;
mbed_official 237:f3da66175598 594
mbed_official 237:f3da66175598 595 if((huart->State == HAL_UART_STATE_READY) || (huart->State == HAL_UART_STATE_BUSY_RX))
mbed_official 237:f3da66175598 596 {
mbed_official 375:3d36234a1087 597 if((pData == HAL_NULL ) || (Size == 0))
mbed_official 237:f3da66175598 598 {
mbed_official 237:f3da66175598 599 return HAL_ERROR;
mbed_official 237:f3da66175598 600 }
mbed_official 237:f3da66175598 601
mbed_official 237:f3da66175598 602 /* Process Locked */
mbed_official 237:f3da66175598 603 __HAL_LOCK(huart);
mbed_official 237:f3da66175598 604
mbed_official 237:f3da66175598 605 huart->ErrorCode = HAL_UART_ERROR_NONE;
mbed_official 237:f3da66175598 606 /* Check if a non-blocking receive process is ongoing or not */
mbed_official 237:f3da66175598 607 if(huart->State == HAL_UART_STATE_BUSY_RX)
mbed_official 237:f3da66175598 608 {
mbed_official 237:f3da66175598 609 huart->State = HAL_UART_STATE_BUSY_TX_RX;
mbed_official 237:f3da66175598 610 }
mbed_official 237:f3da66175598 611 else
mbed_official 237:f3da66175598 612 {
mbed_official 237:f3da66175598 613 huart->State = HAL_UART_STATE_BUSY_TX;
mbed_official 237:f3da66175598 614 }
mbed_official 237:f3da66175598 615
mbed_official 237:f3da66175598 616 huart->TxXferSize = Size;
mbed_official 237:f3da66175598 617 huart->TxXferCount = Size;
mbed_official 237:f3da66175598 618 while(huart->TxXferCount > 0)
mbed_official 237:f3da66175598 619 {
mbed_official 237:f3da66175598 620 huart->TxXferCount--;
mbed_official 237:f3da66175598 621 if(UART_WaitOnFlagUntilTimeout(huart, UART_FLAG_TXE, RESET, Timeout) != HAL_OK)
mbed_official 237:f3da66175598 622 {
mbed_official 237:f3da66175598 623 return HAL_TIMEOUT;
mbed_official 237:f3da66175598 624 }
mbed_official 237:f3da66175598 625 if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE))
mbed_official 237:f3da66175598 626 {
mbed_official 237:f3da66175598 627 tmp = (uint16_t*) pData;
mbed_official 237:f3da66175598 628 huart->Instance->TDR = (*tmp & (uint16_t)0x01FF);
mbed_official 237:f3da66175598 629 pData += 2;
mbed_official 237:f3da66175598 630 }
mbed_official 237:f3da66175598 631 else
mbed_official 237:f3da66175598 632 {
mbed_official 237:f3da66175598 633 huart->Instance->TDR = (*pData++ & (uint8_t)0xFF);
mbed_official 237:f3da66175598 634 }
mbed_official 237:f3da66175598 635 }
mbed_official 237:f3da66175598 636 if(UART_WaitOnFlagUntilTimeout(huart, UART_FLAG_TC, RESET, Timeout) != HAL_OK)
mbed_official 237:f3da66175598 637 {
mbed_official 237:f3da66175598 638 return HAL_TIMEOUT;
mbed_official 237:f3da66175598 639 }
mbed_official 237:f3da66175598 640 /* Check if a non-blocking receive Process is ongoing or not */
mbed_official 237:f3da66175598 641 if(huart->State == HAL_UART_STATE_BUSY_TX_RX)
mbed_official 237:f3da66175598 642 {
mbed_official 237:f3da66175598 643 huart->State = HAL_UART_STATE_BUSY_RX;
mbed_official 237:f3da66175598 644 }
mbed_official 237:f3da66175598 645 else
mbed_official 237:f3da66175598 646 {
mbed_official 237:f3da66175598 647 huart->State = HAL_UART_STATE_READY;
mbed_official 237:f3da66175598 648 }
mbed_official 237:f3da66175598 649
mbed_official 237:f3da66175598 650 /* Process Unlocked */
mbed_official 237:f3da66175598 651 __HAL_UNLOCK(huart);
mbed_official 237:f3da66175598 652
mbed_official 237:f3da66175598 653 return HAL_OK;
mbed_official 237:f3da66175598 654 }
mbed_official 237:f3da66175598 655 else
mbed_official 237:f3da66175598 656 {
mbed_official 237:f3da66175598 657 return HAL_BUSY;
mbed_official 237:f3da66175598 658 }
mbed_official 237:f3da66175598 659 }
mbed_official 237:f3da66175598 660
mbed_official 237:f3da66175598 661 /**
mbed_official 237:f3da66175598 662 * @brief Receive an amount of data in blocking mode
mbed_official 237:f3da66175598 663 * @param huart: uart handle
mbed_official 237:f3da66175598 664 * @param pData: pointer to data buffer
mbed_official 237:f3da66175598 665 * @param Size: amount of data to be received
mbed_official 237:f3da66175598 666 * @param Timeout : Timeout duration
mbed_official 237:f3da66175598 667 * @retval HAL status
mbed_official 237:f3da66175598 668 */
mbed_official 237:f3da66175598 669 HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
mbed_official 237:f3da66175598 670 {
mbed_official 237:f3da66175598 671 uint16_t* tmp;
mbed_official 237:f3da66175598 672 uint16_t uhMask;
mbed_official 237:f3da66175598 673
mbed_official 237:f3da66175598 674 if((huart->State == HAL_UART_STATE_READY) || (huart->State == HAL_UART_STATE_BUSY_TX))
mbed_official 237:f3da66175598 675 {
mbed_official 375:3d36234a1087 676 if((pData == HAL_NULL ) || (Size == 0))
mbed_official 237:f3da66175598 677 {
mbed_official 237:f3da66175598 678 return HAL_ERROR;
mbed_official 237:f3da66175598 679 }
mbed_official 237:f3da66175598 680
mbed_official 237:f3da66175598 681 /* Process Locked */
mbed_official 237:f3da66175598 682 __HAL_LOCK(huart);
mbed_official 237:f3da66175598 683
mbed_official 237:f3da66175598 684 huart->ErrorCode = HAL_UART_ERROR_NONE;
mbed_official 237:f3da66175598 685 /* Check if a non-blocking transmit process is ongoing or not */
mbed_official 237:f3da66175598 686 if(huart->State == HAL_UART_STATE_BUSY_TX)
mbed_official 237:f3da66175598 687 {
mbed_official 237:f3da66175598 688 huart->State = HAL_UART_STATE_BUSY_TX_RX;
mbed_official 237:f3da66175598 689 }
mbed_official 237:f3da66175598 690 else
mbed_official 237:f3da66175598 691 {
mbed_official 237:f3da66175598 692 huart->State = HAL_UART_STATE_BUSY_RX;
mbed_official 237:f3da66175598 693 }
mbed_official 237:f3da66175598 694
mbed_official 237:f3da66175598 695 huart->RxXferSize = Size;
mbed_official 237:f3da66175598 696 huart->RxXferCount = Size;
mbed_official 237:f3da66175598 697
mbed_official 237:f3da66175598 698 /* Computation of UART mask to apply to RDR register */
mbed_official 237:f3da66175598 699 __HAL_UART_MASK_COMPUTATION(huart);
mbed_official 237:f3da66175598 700 uhMask = huart->Mask;
mbed_official 237:f3da66175598 701
mbed_official 237:f3da66175598 702 /* as long as data have to be received */
mbed_official 237:f3da66175598 703 while(huart->RxXferCount > 0)
mbed_official 237:f3da66175598 704 {
mbed_official 237:f3da66175598 705 huart->RxXferCount--;
mbed_official 237:f3da66175598 706 if(UART_WaitOnFlagUntilTimeout(huart, UART_FLAG_RXNE, RESET, Timeout) != HAL_OK)
mbed_official 237:f3da66175598 707 {
mbed_official 237:f3da66175598 708 return HAL_TIMEOUT;
mbed_official 237:f3da66175598 709 }
mbed_official 237:f3da66175598 710 if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE))
mbed_official 237:f3da66175598 711 {
mbed_official 237:f3da66175598 712 tmp = (uint16_t*) pData ;
mbed_official 237:f3da66175598 713 *tmp = (uint16_t)(huart->Instance->RDR & uhMask);
mbed_official 237:f3da66175598 714 pData +=2;
mbed_official 237:f3da66175598 715 }
mbed_official 237:f3da66175598 716 else
mbed_official 237:f3da66175598 717 {
mbed_official 237:f3da66175598 718 *pData++ = (uint8_t)(huart->Instance->RDR & (uint8_t)uhMask);
mbed_official 237:f3da66175598 719 }
mbed_official 237:f3da66175598 720 }
mbed_official 237:f3da66175598 721
mbed_official 237:f3da66175598 722 /* Check if a non-blocking transmit Process is ongoing or not */
mbed_official 237:f3da66175598 723 if(huart->State == HAL_UART_STATE_BUSY_TX_RX)
mbed_official 237:f3da66175598 724 {
mbed_official 237:f3da66175598 725 huart->State = HAL_UART_STATE_BUSY_TX;
mbed_official 237:f3da66175598 726 }
mbed_official 237:f3da66175598 727 else
mbed_official 237:f3da66175598 728 {
mbed_official 237:f3da66175598 729 huart->State = HAL_UART_STATE_READY;
mbed_official 237:f3da66175598 730 }
mbed_official 237:f3da66175598 731 /* Process Unlocked */
mbed_official 237:f3da66175598 732 __HAL_UNLOCK(huart);
mbed_official 237:f3da66175598 733
mbed_official 237:f3da66175598 734 return HAL_OK;
mbed_official 237:f3da66175598 735 }
mbed_official 237:f3da66175598 736 else
mbed_official 237:f3da66175598 737 {
mbed_official 237:f3da66175598 738 return HAL_BUSY;
mbed_official 237:f3da66175598 739 }
mbed_official 237:f3da66175598 740 }
mbed_official 237:f3da66175598 741
mbed_official 237:f3da66175598 742 /**
mbed_official 237:f3da66175598 743 * @brief Send an amount of data in interrupt mode
mbed_official 237:f3da66175598 744 * @param huart: uart handle
mbed_official 237:f3da66175598 745 * @param pData: pointer to data buffer
mbed_official 237:f3da66175598 746 * @param Size: amount of data to be sent
mbed_official 237:f3da66175598 747 * @retval HAL status
mbed_official 237:f3da66175598 748 */
mbed_official 237:f3da66175598 749 HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
mbed_official 237:f3da66175598 750 {
mbed_official 237:f3da66175598 751 if((huart->State == HAL_UART_STATE_READY) || (huart->State == HAL_UART_STATE_BUSY_RX))
mbed_official 237:f3da66175598 752 {
mbed_official 375:3d36234a1087 753 if((pData == HAL_NULL ) || (Size == 0))
mbed_official 237:f3da66175598 754 {
mbed_official 237:f3da66175598 755 return HAL_ERROR;
mbed_official 237:f3da66175598 756 }
mbed_official 237:f3da66175598 757
mbed_official 237:f3da66175598 758 /* Process Locked */
mbed_official 237:f3da66175598 759 __HAL_LOCK(huart);
mbed_official 237:f3da66175598 760
mbed_official 237:f3da66175598 761 huart->pTxBuffPtr = pData;
mbed_official 237:f3da66175598 762 huart->TxXferSize = Size;
mbed_official 237:f3da66175598 763 huart->TxXferCount = Size;
mbed_official 237:f3da66175598 764
mbed_official 237:f3da66175598 765 huart->ErrorCode = HAL_UART_ERROR_NONE;
mbed_official 237:f3da66175598 766 /* Check if a receive process is ongoing or not */
mbed_official 237:f3da66175598 767 if(huart->State == HAL_UART_STATE_BUSY_RX)
mbed_official 237:f3da66175598 768 {
mbed_official 237:f3da66175598 769 huart->State = HAL_UART_STATE_BUSY_TX_RX;
mbed_official 237:f3da66175598 770 }
mbed_official 237:f3da66175598 771 else
mbed_official 237:f3da66175598 772 {
mbed_official 237:f3da66175598 773 huart->State = HAL_UART_STATE_BUSY_TX;
mbed_official 237:f3da66175598 774 }
mbed_official 237:f3da66175598 775
mbed_official 237:f3da66175598 776 /* Enable the UART Error Interrupt: (Frame error, noise error, overrun error) */
mbed_official 237:f3da66175598 777 __HAL_UART_ENABLE_IT(huart, UART_IT_ERR);
mbed_official 237:f3da66175598 778
mbed_official 237:f3da66175598 779 /* Process Unlocked */
mbed_official 237:f3da66175598 780 __HAL_UNLOCK(huart);
mbed_official 237:f3da66175598 781
mbed_official 237:f3da66175598 782 /* Enable the UART Transmit Data Register Empty Interrupt */
mbed_official 237:f3da66175598 783 __HAL_UART_ENABLE_IT(huart, UART_IT_TXE);
mbed_official 237:f3da66175598 784
mbed_official 237:f3da66175598 785 return HAL_OK;
mbed_official 237:f3da66175598 786 }
mbed_official 237:f3da66175598 787 else
mbed_official 237:f3da66175598 788 {
mbed_official 237:f3da66175598 789 return HAL_BUSY;
mbed_official 237:f3da66175598 790 }
mbed_official 237:f3da66175598 791 }
mbed_official 237:f3da66175598 792
mbed_official 237:f3da66175598 793 /**
mbed_official 237:f3da66175598 794 * @brief Receive an amount of data in interrupt mode
mbed_official 237:f3da66175598 795 * @param huart: uart handle
mbed_official 237:f3da66175598 796 * @param pData: pointer to data buffer
mbed_official 237:f3da66175598 797 * @param Size: amount of data to be received
mbed_official 237:f3da66175598 798 * @retval HAL status
mbed_official 237:f3da66175598 799 */
mbed_official 237:f3da66175598 800 HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
mbed_official 237:f3da66175598 801 {
mbed_official 237:f3da66175598 802 if((huart->State == HAL_UART_STATE_READY) || (huart->State == HAL_UART_STATE_BUSY_TX))
mbed_official 237:f3da66175598 803 {
mbed_official 375:3d36234a1087 804 if((pData == HAL_NULL ) || (Size == 0))
mbed_official 237:f3da66175598 805 {
mbed_official 237:f3da66175598 806 return HAL_ERROR;
mbed_official 237:f3da66175598 807 }
mbed_official 237:f3da66175598 808
mbed_official 237:f3da66175598 809 /* Process Locked */
mbed_official 237:f3da66175598 810 __HAL_LOCK(huart);
mbed_official 237:f3da66175598 811
mbed_official 237:f3da66175598 812 huart->pRxBuffPtr = pData;
mbed_official 237:f3da66175598 813 huart->RxXferSize = Size;
mbed_official 237:f3da66175598 814 huart->RxXferCount = Size;
mbed_official 237:f3da66175598 815
mbed_official 237:f3da66175598 816 /* Computation of UART mask to apply to RDR register */
mbed_official 237:f3da66175598 817 __HAL_UART_MASK_COMPUTATION(huart);
mbed_official 237:f3da66175598 818
mbed_official 237:f3da66175598 819 huart->ErrorCode = HAL_UART_ERROR_NONE;
mbed_official 237:f3da66175598 820 /* Check if a transmit process is ongoing or not */
mbed_official 237:f3da66175598 821 if(huart->State == HAL_UART_STATE_BUSY_TX)
mbed_official 237:f3da66175598 822 {
mbed_official 237:f3da66175598 823 huart->State = HAL_UART_STATE_BUSY_TX_RX;
mbed_official 237:f3da66175598 824 }
mbed_official 237:f3da66175598 825 else
mbed_official 237:f3da66175598 826 {
mbed_official 237:f3da66175598 827 huart->State = HAL_UART_STATE_BUSY_RX;
mbed_official 237:f3da66175598 828 }
mbed_official 237:f3da66175598 829
mbed_official 237:f3da66175598 830 /* Enable the UART Parity Error Interrupt */
mbed_official 237:f3da66175598 831 __HAL_UART_ENABLE_IT(huart, UART_IT_PE);
mbed_official 237:f3da66175598 832
mbed_official 237:f3da66175598 833 /* Enable the UART Error Interrupt: (Frame error, noise error, overrun error) */
mbed_official 237:f3da66175598 834 __HAL_UART_ENABLE_IT(huart, UART_IT_ERR);
mbed_official 237:f3da66175598 835
mbed_official 237:f3da66175598 836 /* Process Unlocked */
mbed_official 237:f3da66175598 837 __HAL_UNLOCK(huart);
mbed_official 237:f3da66175598 838
mbed_official 237:f3da66175598 839 /* Enable the UART Data Register not empty Interrupt */
mbed_official 237:f3da66175598 840 __HAL_UART_ENABLE_IT(huart, UART_IT_RXNE);
mbed_official 237:f3da66175598 841
mbed_official 237:f3da66175598 842 return HAL_OK;
mbed_official 237:f3da66175598 843 }
mbed_official 237:f3da66175598 844 else
mbed_official 237:f3da66175598 845 {
mbed_official 237:f3da66175598 846 return HAL_BUSY;
mbed_official 237:f3da66175598 847 }
mbed_official 237:f3da66175598 848 }
mbed_official 237:f3da66175598 849
mbed_official 237:f3da66175598 850 /**
mbed_official 237:f3da66175598 851 * @brief Send an amount of data in DMA mode
mbed_official 237:f3da66175598 852 * @param huart: uart handle
mbed_official 237:f3da66175598 853 * @param pData: pointer to data buffer
mbed_official 237:f3da66175598 854 * @param Size: amount of data to be sent
mbed_official 237:f3da66175598 855 * @retval HAL status
mbed_official 237:f3da66175598 856 */
mbed_official 237:f3da66175598 857 HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
mbed_official 237:f3da66175598 858 {
mbed_official 237:f3da66175598 859 uint32_t *tmp;
mbed_official 237:f3da66175598 860
mbed_official 237:f3da66175598 861 if((huart->State == HAL_UART_STATE_READY) || (huart->State == HAL_UART_STATE_BUSY_RX))
mbed_official 237:f3da66175598 862 {
mbed_official 375:3d36234a1087 863 if((pData == HAL_NULL ) || (Size == 0))
mbed_official 237:f3da66175598 864 {
mbed_official 237:f3da66175598 865 return HAL_ERROR;
mbed_official 237:f3da66175598 866 }
mbed_official 237:f3da66175598 867
mbed_official 237:f3da66175598 868 /* Process Locked */
mbed_official 237:f3da66175598 869 __HAL_LOCK(huart);
mbed_official 237:f3da66175598 870
mbed_official 237:f3da66175598 871 huart->pTxBuffPtr = pData;
mbed_official 237:f3da66175598 872 huart->TxXferSize = Size;
mbed_official 237:f3da66175598 873 huart->TxXferCount = Size;
mbed_official 237:f3da66175598 874
mbed_official 237:f3da66175598 875 huart->ErrorCode = HAL_UART_ERROR_NONE;
mbed_official 237:f3da66175598 876 /* Check if a receive process is ongoing or not */
mbed_official 237:f3da66175598 877 if(huart->State == HAL_UART_STATE_BUSY_RX)
mbed_official 237:f3da66175598 878 {
mbed_official 237:f3da66175598 879 huart->State = HAL_UART_STATE_BUSY_TX_RX;
mbed_official 237:f3da66175598 880 }
mbed_official 237:f3da66175598 881 else
mbed_official 237:f3da66175598 882 {
mbed_official 237:f3da66175598 883 huart->State = HAL_UART_STATE_BUSY_TX;
mbed_official 237:f3da66175598 884 }
mbed_official 237:f3da66175598 885
mbed_official 237:f3da66175598 886 /* Set the UART DMA transfer complete callback */
mbed_official 237:f3da66175598 887 huart->hdmatx->XferCpltCallback = UART_DMATransmitCplt;
mbed_official 237:f3da66175598 888
mbed_official 237:f3da66175598 889 /* Set the UART DMA Half transfer complete callback */
mbed_official 237:f3da66175598 890 huart->hdmatx->XferHalfCpltCallback = UART_DMATxHalfCplt;
mbed_official 237:f3da66175598 891
mbed_official 237:f3da66175598 892 /* Set the DMA error callback */
mbed_official 237:f3da66175598 893 huart->hdmatx->XferErrorCallback = UART_DMAError;
mbed_official 237:f3da66175598 894
mbed_official 237:f3da66175598 895 /* Enable the UART transmit DMA channel */
mbed_official 237:f3da66175598 896 tmp = (uint32_t*)&pData;
mbed_official 237:f3da66175598 897 HAL_DMA_Start_IT(huart->hdmatx, *(uint32_t*)tmp, (uint32_t)&huart->Instance->TDR, Size);
mbed_official 237:f3da66175598 898
mbed_official 237:f3da66175598 899 /* Enable the DMA transfer for transmit request by setting the DMAT bit
mbed_official 237:f3da66175598 900 in the UART CR3 register */
mbed_official 237:f3da66175598 901 huart->Instance->CR3 |= USART_CR3_DMAT;
mbed_official 237:f3da66175598 902
mbed_official 237:f3da66175598 903 /* Process Unlocked */
mbed_official 237:f3da66175598 904 __HAL_UNLOCK(huart);
mbed_official 237:f3da66175598 905
mbed_official 237:f3da66175598 906 return HAL_OK;
mbed_official 237:f3da66175598 907 }
mbed_official 237:f3da66175598 908 else
mbed_official 237:f3da66175598 909 {
mbed_official 237:f3da66175598 910 return HAL_BUSY;
mbed_official 237:f3da66175598 911 }
mbed_official 237:f3da66175598 912 }
mbed_official 237:f3da66175598 913
mbed_official 237:f3da66175598 914 /**
mbed_official 237:f3da66175598 915 * @brief Receive an amount of data in DMA mode
mbed_official 237:f3da66175598 916 * @param huart: uart handle
mbed_official 237:f3da66175598 917 * @param pData: pointer to data buffer
mbed_official 237:f3da66175598 918 * @param Size: amount of data to be received
mbed_official 237:f3da66175598 919 * @note When the UART parity is enabled (PCE = 1), the received data contain
mbed_official 237:f3da66175598 920 * the parity bit (MSB position)
mbed_official 237:f3da66175598 921 * @retval HAL status
mbed_official 237:f3da66175598 922 */
mbed_official 237:f3da66175598 923 HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
mbed_official 237:f3da66175598 924 {
mbed_official 237:f3da66175598 925 uint32_t *tmp;
mbed_official 237:f3da66175598 926
mbed_official 237:f3da66175598 927 if((huart->State == HAL_UART_STATE_READY) || (huart->State == HAL_UART_STATE_BUSY_TX))
mbed_official 237:f3da66175598 928 {
mbed_official 375:3d36234a1087 929 if((pData == HAL_NULL ) || (Size == 0))
mbed_official 237:f3da66175598 930 {
mbed_official 237:f3da66175598 931 return HAL_ERROR;
mbed_official 237:f3da66175598 932 }
mbed_official 237:f3da66175598 933
mbed_official 237:f3da66175598 934 /* Process Locked */
mbed_official 237:f3da66175598 935 __HAL_LOCK(huart);
mbed_official 237:f3da66175598 936
mbed_official 237:f3da66175598 937 huart->pRxBuffPtr = pData;
mbed_official 237:f3da66175598 938 huart->RxXferSize = Size;
mbed_official 237:f3da66175598 939
mbed_official 237:f3da66175598 940 huart->ErrorCode = HAL_UART_ERROR_NONE;
mbed_official 237:f3da66175598 941 /* Check if a transmit process is ongoing or not */
mbed_official 237:f3da66175598 942 if(huart->State == HAL_UART_STATE_BUSY_TX)
mbed_official 237:f3da66175598 943 {
mbed_official 237:f3da66175598 944 huart->State = HAL_UART_STATE_BUSY_TX_RX;
mbed_official 237:f3da66175598 945 }
mbed_official 237:f3da66175598 946 else
mbed_official 237:f3da66175598 947 {
mbed_official 237:f3da66175598 948 huart->State = HAL_UART_STATE_BUSY_RX;
mbed_official 237:f3da66175598 949 }
mbed_official 237:f3da66175598 950
mbed_official 237:f3da66175598 951 /* Set the UART DMA transfer complete callback */
mbed_official 237:f3da66175598 952 huart->hdmarx->XferCpltCallback = UART_DMAReceiveCplt;
mbed_official 237:f3da66175598 953
mbed_official 237:f3da66175598 954 /* Set the UART DMA Half transfer complete callback */
mbed_official 237:f3da66175598 955 huart->hdmarx->XferHalfCpltCallback = UART_DMARxHalfCplt;
mbed_official 237:f3da66175598 956
mbed_official 237:f3da66175598 957 /* Set the DMA error callback */
mbed_official 237:f3da66175598 958 huart->hdmarx->XferErrorCallback = UART_DMAError;
mbed_official 237:f3da66175598 959
mbed_official 237:f3da66175598 960 /* Enable the DMA channel */
mbed_official 237:f3da66175598 961 tmp = (uint32_t*)&pData;
mbed_official 237:f3da66175598 962 HAL_DMA_Start_IT(huart->hdmarx, (uint32_t)&huart->Instance->RDR, *(uint32_t*)tmp, Size);
mbed_official 237:f3da66175598 963
mbed_official 237:f3da66175598 964 /* Enable the DMA transfer for the receiver request by setting the DMAR bit
mbed_official 237:f3da66175598 965 in the UART CR3 register */
mbed_official 237:f3da66175598 966 huart->Instance->CR3 |= USART_CR3_DMAR;
mbed_official 237:f3da66175598 967
mbed_official 237:f3da66175598 968 /* Process Unlocked */
mbed_official 237:f3da66175598 969 __HAL_UNLOCK(huart);
mbed_official 237:f3da66175598 970
mbed_official 237:f3da66175598 971 return HAL_OK;
mbed_official 237:f3da66175598 972 }
mbed_official 237:f3da66175598 973 else
mbed_official 237:f3da66175598 974 {
mbed_official 237:f3da66175598 975 return HAL_BUSY;
mbed_official 237:f3da66175598 976 }
mbed_official 237:f3da66175598 977 }
mbed_official 237:f3da66175598 978
mbed_official 237:f3da66175598 979 /**
mbed_official 237:f3da66175598 980 * @brief Pauses the DMA Transfer.
mbed_official 237:f3da66175598 981 * @param huart: UART handle
mbed_official 237:f3da66175598 982 * @retval None
mbed_official 237:f3da66175598 983 */
mbed_official 237:f3da66175598 984 HAL_StatusTypeDef HAL_UART_DMAPause(UART_HandleTypeDef *huart)
mbed_official 237:f3da66175598 985 {
mbed_official 237:f3da66175598 986 /* Process Locked */
mbed_official 237:f3da66175598 987 __HAL_LOCK(huart);
mbed_official 237:f3da66175598 988
mbed_official 237:f3da66175598 989 if(huart->State == HAL_UART_STATE_BUSY_TX)
mbed_official 237:f3da66175598 990 {
mbed_official 237:f3da66175598 991 /* Disable the UART DMA Tx request */
mbed_official 237:f3da66175598 992 huart->Instance->CR3 &= (uint32_t)(~USART_CR3_DMAT);
mbed_official 237:f3da66175598 993 }
mbed_official 237:f3da66175598 994 else if(huart->State == HAL_UART_STATE_BUSY_RX)
mbed_official 237:f3da66175598 995 {
mbed_official 237:f3da66175598 996 /* Disable the UART DMA Rx request */
mbed_official 237:f3da66175598 997 huart->Instance->CR3 &= (uint32_t)(~USART_CR3_DMAR);
mbed_official 237:f3da66175598 998 }
mbed_official 237:f3da66175598 999 else if(huart->State == HAL_UART_STATE_BUSY_TX_RX)
mbed_official 237:f3da66175598 1000 {
mbed_official 237:f3da66175598 1001 /* Disable the UART DMA Tx request */
mbed_official 237:f3da66175598 1002 huart->Instance->CR3 &= (uint32_t)(~USART_CR3_DMAT);
mbed_official 237:f3da66175598 1003 /* Disable the UART DMA Rx request */
mbed_official 237:f3da66175598 1004 huart->Instance->CR3 &= (uint32_t)(~USART_CR3_DMAR);
mbed_official 237:f3da66175598 1005 }
mbed_official 237:f3da66175598 1006
mbed_official 237:f3da66175598 1007 /* Process Unlocked */
mbed_official 237:f3da66175598 1008 __HAL_UNLOCK(huart);
mbed_official 237:f3da66175598 1009
mbed_official 237:f3da66175598 1010 return HAL_OK;
mbed_official 237:f3da66175598 1011 }
mbed_official 237:f3da66175598 1012
mbed_official 237:f3da66175598 1013 /**
mbed_official 237:f3da66175598 1014 * @brief Resumes the DMA Transfer.
mbed_official 237:f3da66175598 1015 * @param huart: UART handle
mbed_official 237:f3da66175598 1016 * @retval None
mbed_official 237:f3da66175598 1017 */
mbed_official 237:f3da66175598 1018 HAL_StatusTypeDef HAL_UART_DMAResume(UART_HandleTypeDef *huart)
mbed_official 237:f3da66175598 1019 {
mbed_official 237:f3da66175598 1020 /* Process Locked */
mbed_official 237:f3da66175598 1021 __HAL_LOCK(huart);
mbed_official 237:f3da66175598 1022
mbed_official 237:f3da66175598 1023 if(huart->State == HAL_UART_STATE_BUSY_TX)
mbed_official 237:f3da66175598 1024 {
mbed_official 237:f3da66175598 1025 /* Enable the UART DMA Tx request */
mbed_official 237:f3da66175598 1026 huart->Instance->CR3 |= USART_CR3_DMAT;
mbed_official 237:f3da66175598 1027 }
mbed_official 237:f3da66175598 1028 else if(huart->State == HAL_UART_STATE_BUSY_RX)
mbed_official 237:f3da66175598 1029 {
mbed_official 237:f3da66175598 1030 /* Enable the UART DMA Rx request */
mbed_official 237:f3da66175598 1031 huart->Instance->CR3 |= USART_CR3_DMAR;
mbed_official 237:f3da66175598 1032 }
mbed_official 237:f3da66175598 1033 else if(huart->State == HAL_UART_STATE_BUSY_TX_RX)
mbed_official 237:f3da66175598 1034 {
mbed_official 237:f3da66175598 1035 /* Enable the UART DMA Rx request before the DMA Tx request */
mbed_official 237:f3da66175598 1036 huart->Instance->CR3 |= USART_CR3_DMAR;
mbed_official 237:f3da66175598 1037 /* Enable the UART DMA Tx request */
mbed_official 237:f3da66175598 1038 huart->Instance->CR3 |= USART_CR3_DMAT;
mbed_official 237:f3da66175598 1039 }
mbed_official 237:f3da66175598 1040
mbed_official 237:f3da66175598 1041 /* If the UART peripheral is still not enabled, enable it */
mbed_official 237:f3da66175598 1042 if ((huart->Instance->CR1 & USART_CR1_UE) == 0)
mbed_official 237:f3da66175598 1043 {
mbed_official 237:f3da66175598 1044 /* Enable UART peripheral */
mbed_official 237:f3da66175598 1045 __HAL_UART_ENABLE(huart);
mbed_official 237:f3da66175598 1046 }
mbed_official 237:f3da66175598 1047
mbed_official 237:f3da66175598 1048 /* TEACK and/or REACK to check before moving huart->State to Ready */
mbed_official 237:f3da66175598 1049 return (UART_CheckIdleState(huart));
mbed_official 237:f3da66175598 1050 }
mbed_official 237:f3da66175598 1051
mbed_official 237:f3da66175598 1052 /**
mbed_official 237:f3da66175598 1053 * @brief Stops the DMA Transfer.
mbed_official 237:f3da66175598 1054 * @param huart: UART handle
mbed_official 237:f3da66175598 1055 * @retval None
mbed_official 237:f3da66175598 1056 */
mbed_official 237:f3da66175598 1057 HAL_StatusTypeDef HAL_UART_DMAStop(UART_HandleTypeDef *huart)
mbed_official 237:f3da66175598 1058 {
mbed_official 237:f3da66175598 1059 /* Process Locked */
mbed_official 237:f3da66175598 1060 __HAL_LOCK(huart);
mbed_official 237:f3da66175598 1061
mbed_official 237:f3da66175598 1062 /* Disable the UART Tx/Rx DMA requests */
mbed_official 237:f3da66175598 1063 huart->Instance->CR3 &= ~USART_CR3_DMAT;
mbed_official 237:f3da66175598 1064 huart->Instance->CR3 &= ~USART_CR3_DMAR;
mbed_official 237:f3da66175598 1065
mbed_official 237:f3da66175598 1066 /* Abort the UART DMA tx channel */
mbed_official 375:3d36234a1087 1067 if(huart->hdmatx != HAL_NULL)
mbed_official 237:f3da66175598 1068 {
mbed_official 237:f3da66175598 1069 HAL_DMA_Abort(huart->hdmatx);
mbed_official 237:f3da66175598 1070 }
mbed_official 237:f3da66175598 1071 /* Abort the UART DMA rx channel */
mbed_official 375:3d36234a1087 1072 if(huart->hdmarx != HAL_NULL)
mbed_official 237:f3da66175598 1073 {
mbed_official 237:f3da66175598 1074 HAL_DMA_Abort(huart->hdmarx);
mbed_official 237:f3da66175598 1075 }
mbed_official 237:f3da66175598 1076
mbed_official 237:f3da66175598 1077 /* Disable UART peripheral */
mbed_official 237:f3da66175598 1078 __HAL_UART_DISABLE(huart);
mbed_official 237:f3da66175598 1079
mbed_official 237:f3da66175598 1080 huart->State = HAL_UART_STATE_READY;
mbed_official 237:f3da66175598 1081
mbed_official 237:f3da66175598 1082 /* Process Unlocked */
mbed_official 237:f3da66175598 1083 __HAL_UNLOCK(huart);
mbed_official 237:f3da66175598 1084
mbed_official 237:f3da66175598 1085 return HAL_OK;
mbed_official 237:f3da66175598 1086 }
mbed_official 237:f3da66175598 1087
mbed_official 237:f3da66175598 1088 /**
mbed_official 237:f3da66175598 1089 * @brief This function handles UART interrupt request.
mbed_official 237:f3da66175598 1090 * @param huart: uart handle
mbed_official 237:f3da66175598 1091 * @retval None
mbed_official 237:f3da66175598 1092 */
mbed_official 237:f3da66175598 1093 void HAL_UART_IRQHandler(UART_HandleTypeDef *huart)
mbed_official 237:f3da66175598 1094 {
mbed_official 237:f3da66175598 1095 /* UART parity error interrupt occurred -------------------------------------*/
mbed_official 237:f3da66175598 1096 if((__HAL_UART_GET_IT(huart, UART_IT_PE) != RESET) && (__HAL_UART_GET_IT_SOURCE(huart, UART_IT_PE) != RESET))
mbed_official 237:f3da66175598 1097 {
mbed_official 237:f3da66175598 1098 __HAL_UART_CLEAR_IT(huart, UART_CLEAR_PEF);
mbed_official 237:f3da66175598 1099
mbed_official 237:f3da66175598 1100 huart->ErrorCode |= HAL_UART_ERROR_PE;
mbed_official 237:f3da66175598 1101 /* Set the UART state ready to be able to start again the process */
mbed_official 237:f3da66175598 1102 huart->State = HAL_UART_STATE_READY;
mbed_official 237:f3da66175598 1103 }
mbed_official 237:f3da66175598 1104
mbed_official 237:f3da66175598 1105 /* UART frame error interrupt occured --------------------------------------*/
mbed_official 237:f3da66175598 1106 if((__HAL_UART_GET_IT(huart, UART_IT_FE) != RESET) && (__HAL_UART_GET_IT_SOURCE(huart, UART_IT_ERR) != RESET))
mbed_official 237:f3da66175598 1107 {
mbed_official 237:f3da66175598 1108 __HAL_UART_CLEAR_IT(huart, UART_CLEAR_FEF);
mbed_official 237:f3da66175598 1109
mbed_official 237:f3da66175598 1110 huart->ErrorCode |= HAL_UART_ERROR_FE;
mbed_official 237:f3da66175598 1111 /* Set the UART state ready to be able to start again the process */
mbed_official 237:f3da66175598 1112 huart->State = HAL_UART_STATE_READY;
mbed_official 237:f3da66175598 1113 }
mbed_official 237:f3da66175598 1114
mbed_official 237:f3da66175598 1115 /* UART noise error interrupt occured --------------------------------------*/
mbed_official 237:f3da66175598 1116 if((__HAL_UART_GET_IT(huart, UART_IT_NE) != RESET) && (__HAL_UART_GET_IT_SOURCE(huart, UART_IT_ERR) != RESET))
mbed_official 237:f3da66175598 1117 {
mbed_official 237:f3da66175598 1118 __HAL_UART_CLEAR_IT(huart, UART_CLEAR_NEF);
mbed_official 237:f3da66175598 1119
mbed_official 237:f3da66175598 1120 huart->ErrorCode |= HAL_UART_ERROR_NE;
mbed_official 237:f3da66175598 1121 /* Set the UART state ready to be able to start again the process */
mbed_official 237:f3da66175598 1122 huart->State = HAL_UART_STATE_READY;
mbed_official 237:f3da66175598 1123 }
mbed_official 237:f3da66175598 1124
mbed_official 237:f3da66175598 1125 /* UART Over-Run interrupt occured -----------------------------------------*/
mbed_official 237:f3da66175598 1126 if((__HAL_UART_GET_IT(huart, UART_IT_ORE) != RESET) && (__HAL_UART_GET_IT_SOURCE(huart, UART_IT_ERR) != RESET))
mbed_official 237:f3da66175598 1127 {
mbed_official 237:f3da66175598 1128 __HAL_UART_CLEAR_IT(huart, UART_CLEAR_OREF);
mbed_official 237:f3da66175598 1129
mbed_official 237:f3da66175598 1130 huart->ErrorCode |= HAL_UART_ERROR_ORE;
mbed_official 237:f3da66175598 1131 /* Set the UART state ready to be able to start again the process */
mbed_official 237:f3da66175598 1132 huart->State = HAL_UART_STATE_READY;
mbed_official 237:f3da66175598 1133 }
mbed_official 237:f3da66175598 1134
mbed_official 237:f3da66175598 1135 /* Call UART Error Call back function if need be --------------------------*/
mbed_official 237:f3da66175598 1136 if(huart->ErrorCode != HAL_UART_ERROR_NONE)
mbed_official 237:f3da66175598 1137 {
mbed_official 237:f3da66175598 1138 HAL_UART_ErrorCallback(huart);
mbed_official 237:f3da66175598 1139 }
mbed_official 237:f3da66175598 1140
mbed_official 237:f3da66175598 1141 /* UART wakeup from Stop mode interrupt occurred -------------------------------------*/
mbed_official 237:f3da66175598 1142 if((__HAL_UART_GET_IT(huart, UART_IT_WUF) != RESET) && (__HAL_UART_GET_IT_SOURCE(huart, UART_IT_WUF) != RESET))
mbed_official 237:f3da66175598 1143 {
mbed_official 237:f3da66175598 1144 __HAL_UART_CLEAR_IT(huart, UART_CLEAR_WUF);
mbed_official 237:f3da66175598 1145 /* Set the UART state ready to be able to start again the process */
mbed_official 237:f3da66175598 1146 huart->State = HAL_UART_STATE_READY;
mbed_official 237:f3da66175598 1147 HAL_UART_WakeupCallback(huart);
mbed_official 237:f3da66175598 1148 }
mbed_official 237:f3da66175598 1149
mbed_official 237:f3da66175598 1150 /* UART in mode Receiver ---------------------------------------------------*/
mbed_official 237:f3da66175598 1151 if((__HAL_UART_GET_IT(huart, UART_IT_RXNE) != RESET) && (__HAL_UART_GET_IT_SOURCE(huart, UART_IT_RXNE) != RESET))
mbed_official 237:f3da66175598 1152 {
mbed_official 237:f3da66175598 1153 UART_Receive_IT(huart);
mbed_official 237:f3da66175598 1154 /* Clear RXNE interrupt flag */
mbed_official 237:f3da66175598 1155 __HAL_UART_SEND_REQ(huart, UART_RXDATA_FLUSH_REQUEST);
mbed_official 237:f3da66175598 1156 }
mbed_official 237:f3da66175598 1157
mbed_official 237:f3da66175598 1158
mbed_official 237:f3da66175598 1159 /* UART in mode Transmitter ------------------------------------------------*/
mbed_official 237:f3da66175598 1160 if((__HAL_UART_GET_IT(huart, UART_IT_TXE) != RESET) &&(__HAL_UART_GET_IT_SOURCE(huart, UART_IT_TXE) != RESET))
mbed_official 237:f3da66175598 1161 {
mbed_official 237:f3da66175598 1162 UART_Transmit_IT(huart);
mbed_official 237:f3da66175598 1163 }
mbed_official 237:f3da66175598 1164
mbed_official 375:3d36234a1087 1165 /* UART in mode Transmitter (transmission end) -----------------------------*/
mbed_official 375:3d36234a1087 1166 if((__HAL_UART_GET_IT(huart, UART_IT_TC) != RESET) &&(__HAL_UART_GET_IT_SOURCE(huart, UART_IT_TC) != RESET))
mbed_official 375:3d36234a1087 1167 {
mbed_official 375:3d36234a1087 1168 UART_EndTransmit_IT(huart);
mbed_official 375:3d36234a1087 1169 }
mbed_official 375:3d36234a1087 1170
mbed_official 237:f3da66175598 1171 }
mbed_official 237:f3da66175598 1172
mbed_official 237:f3da66175598 1173
mbed_official 237:f3da66175598 1174 /**
mbed_official 237:f3da66175598 1175 * @brief This function handles UART Communication Timeout.
mbed_official 237:f3da66175598 1176 * @param huart: UART handle
mbed_official 237:f3da66175598 1177 * @param Flag: specifies the UART flag to check.
mbed_official 237:f3da66175598 1178 * @param Status: The new Flag status (SET or RESET).
mbed_official 237:f3da66175598 1179 * @param Timeout: Timeout duration
mbed_official 237:f3da66175598 1180 * @retval HAL status
mbed_official 237:f3da66175598 1181 */
mbed_official 237:f3da66175598 1182 HAL_StatusTypeDef UART_WaitOnFlagUntilTimeout(UART_HandleTypeDef *huart, uint32_t Flag, FlagStatus Status, uint32_t Timeout)
mbed_official 237:f3da66175598 1183 {
mbed_official 237:f3da66175598 1184 uint32_t tickstart = HAL_GetTick();
mbed_official 237:f3da66175598 1185
mbed_official 237:f3da66175598 1186 /* Wait until flag is set */
mbed_official 237:f3da66175598 1187 if(Status == RESET)
mbed_official 237:f3da66175598 1188 {
mbed_official 237:f3da66175598 1189 while(__HAL_UART_GET_FLAG(huart, Flag) == RESET)
mbed_official 237:f3da66175598 1190 {
mbed_official 237:f3da66175598 1191 /* Check for the Timeout */
mbed_official 237:f3da66175598 1192 if(Timeout != HAL_MAX_DELAY)
mbed_official 237:f3da66175598 1193 {
mbed_official 237:f3da66175598 1194 if((Timeout == 0) || ((HAL_GetTick()-tickstart) > Timeout))
mbed_official 237:f3da66175598 1195 {
mbed_official 237:f3da66175598 1196 /* Disable TXE, RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts for the interrupt process */
mbed_official 237:f3da66175598 1197 __HAL_UART_DISABLE_IT(huart, UART_IT_TXE);
mbed_official 237:f3da66175598 1198 __HAL_UART_DISABLE_IT(huart, UART_IT_RXNE);
mbed_official 237:f3da66175598 1199 __HAL_UART_DISABLE_IT(huart, UART_IT_PE);
mbed_official 237:f3da66175598 1200 __HAL_UART_DISABLE_IT(huart, UART_IT_ERR);
mbed_official 237:f3da66175598 1201
mbed_official 237:f3da66175598 1202 huart->State = HAL_UART_STATE_TIMEOUT;
mbed_official 237:f3da66175598 1203
mbed_official 237:f3da66175598 1204 /* Process Unlocked */
mbed_official 237:f3da66175598 1205 __HAL_UNLOCK(huart);
mbed_official 237:f3da66175598 1206
mbed_official 237:f3da66175598 1207 return HAL_TIMEOUT;
mbed_official 237:f3da66175598 1208 }
mbed_official 237:f3da66175598 1209 }
mbed_official 237:f3da66175598 1210 }
mbed_official 237:f3da66175598 1211 }
mbed_official 237:f3da66175598 1212 else
mbed_official 237:f3da66175598 1213 {
mbed_official 237:f3da66175598 1214 while(__HAL_UART_GET_FLAG(huart, Flag) != RESET)
mbed_official 237:f3da66175598 1215 {
mbed_official 237:f3da66175598 1216 /* Check for the Timeout */
mbed_official 237:f3da66175598 1217 if(Timeout != HAL_MAX_DELAY)
mbed_official 237:f3da66175598 1218 {
mbed_official 237:f3da66175598 1219 if((Timeout == 0) || ((HAL_GetTick()-tickstart) > Timeout))
mbed_official 237:f3da66175598 1220 {
mbed_official 237:f3da66175598 1221 /* Disable TXE, RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts for the interrupt process */
mbed_official 237:f3da66175598 1222 __HAL_UART_DISABLE_IT(huart, UART_IT_TXE);
mbed_official 237:f3da66175598 1223 __HAL_UART_DISABLE_IT(huart, UART_IT_RXNE);
mbed_official 237:f3da66175598 1224 __HAL_UART_DISABLE_IT(huart, UART_IT_PE);
mbed_official 237:f3da66175598 1225 __HAL_UART_DISABLE_IT(huart, UART_IT_ERR);
mbed_official 237:f3da66175598 1226
mbed_official 237:f3da66175598 1227 huart->State = HAL_UART_STATE_TIMEOUT;
mbed_official 237:f3da66175598 1228
mbed_official 237:f3da66175598 1229 /* Process Unlocked */
mbed_official 237:f3da66175598 1230 __HAL_UNLOCK(huart);
mbed_official 237:f3da66175598 1231
mbed_official 237:f3da66175598 1232 return HAL_TIMEOUT;
mbed_official 237:f3da66175598 1233 }
mbed_official 237:f3da66175598 1234 }
mbed_official 237:f3da66175598 1235 }
mbed_official 237:f3da66175598 1236 }
mbed_official 237:f3da66175598 1237 return HAL_OK;
mbed_official 237:f3da66175598 1238 }
mbed_official 237:f3da66175598 1239
mbed_official 237:f3da66175598 1240 /**
mbed_official 237:f3da66175598 1241 * @brief Tx Transfer completed callbacks
mbed_official 237:f3da66175598 1242 * @param huart: uart handle
mbed_official 237:f3da66175598 1243 * @retval None
mbed_official 237:f3da66175598 1244 */
mbed_official 237:f3da66175598 1245 __weak void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
mbed_official 237:f3da66175598 1246 {
mbed_official 237:f3da66175598 1247 /* NOTE : This function should not be modified, when the callback is needed,
mbed_official 237:f3da66175598 1248 the HAL_UART_TxCpltCallback can be implemented in the user file
mbed_official 237:f3da66175598 1249 */
mbed_official 237:f3da66175598 1250 }
mbed_official 237:f3da66175598 1251
mbed_official 237:f3da66175598 1252 /**
mbed_official 237:f3da66175598 1253 * @brief Tx Half Transfer completed callbacks.
mbed_official 237:f3da66175598 1254 * @param huart: UART handle
mbed_official 237:f3da66175598 1255 * @retval None
mbed_official 237:f3da66175598 1256 */
mbed_official 237:f3da66175598 1257 __weak void HAL_UART_TxHalfCpltCallback(UART_HandleTypeDef *huart)
mbed_official 237:f3da66175598 1258 {
mbed_official 237:f3da66175598 1259 /* NOTE: This function should not be modified, when the callback is needed,
mbed_official 237:f3da66175598 1260 the HAL_UART_TxHalfCpltCallback can be implemented in the user file
mbed_official 237:f3da66175598 1261 */
mbed_official 237:f3da66175598 1262 }
mbed_official 237:f3da66175598 1263
mbed_official 237:f3da66175598 1264 /**
mbed_official 237:f3da66175598 1265 * @brief Rx Transfer completed callbacks
mbed_official 237:f3da66175598 1266 * @param huart: uart handle
mbed_official 237:f3da66175598 1267 * @retval None
mbed_official 237:f3da66175598 1268 */
mbed_official 237:f3da66175598 1269 __weak void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
mbed_official 237:f3da66175598 1270 {
mbed_official 237:f3da66175598 1271 /* NOTE : This function should not be modified, when the callback is needed,
mbed_official 237:f3da66175598 1272 the HAL_UART_RxCpltCallback can be implemented in the user file
mbed_official 237:f3da66175598 1273 */
mbed_official 237:f3da66175598 1274 }
mbed_official 237:f3da66175598 1275
mbed_official 237:f3da66175598 1276 /**
mbed_official 237:f3da66175598 1277 * @brief Rx Half Transfer completed callbacks.
mbed_official 237:f3da66175598 1278 * @param huart: UART handle
mbed_official 237:f3da66175598 1279 * @retval None
mbed_official 237:f3da66175598 1280 */
mbed_official 237:f3da66175598 1281 __weak void HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *huart)
mbed_official 237:f3da66175598 1282 {
mbed_official 237:f3da66175598 1283 /* NOTE: This function should not be modified, when the callback is needed,
mbed_official 237:f3da66175598 1284 the HAL_UART_RxHalfCpltCallback can be implemented in the user file
mbed_official 237:f3da66175598 1285 */
mbed_official 237:f3da66175598 1286 }
mbed_official 237:f3da66175598 1287
mbed_official 237:f3da66175598 1288 /**
mbed_official 237:f3da66175598 1289 * @brief UART error callbacks
mbed_official 237:f3da66175598 1290 * @param huart: uart handle
mbed_official 237:f3da66175598 1291 * @retval None
mbed_official 237:f3da66175598 1292 */
mbed_official 237:f3da66175598 1293 __weak void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
mbed_official 237:f3da66175598 1294 {
mbed_official 237:f3da66175598 1295 /* NOTE : This function should not be modified, when the callback is needed,
mbed_official 237:f3da66175598 1296 the HAL_UART_ErrorCallback can be implemented in the user file
mbed_official 237:f3da66175598 1297 */
mbed_official 237:f3da66175598 1298 }
mbed_official 237:f3da66175598 1299
mbed_official 237:f3da66175598 1300 /**
mbed_official 237:f3da66175598 1301 * @brief UART wakeup from Stop mode callback
mbed_official 237:f3da66175598 1302 * @param huart: uart handle
mbed_official 237:f3da66175598 1303 * @retval None
mbed_official 237:f3da66175598 1304 */
mbed_official 237:f3da66175598 1305 __weak void HAL_UART_WakeupCallback(UART_HandleTypeDef *huart)
mbed_official 237:f3da66175598 1306 {
mbed_official 237:f3da66175598 1307 /* NOTE : This function should not be modified, when the callback is needed,
mbed_official 237:f3da66175598 1308 the HAL_UART_WakeupCallback can be implemented in the user file
mbed_official 237:f3da66175598 1309 */
mbed_official 237:f3da66175598 1310 }
mbed_official 237:f3da66175598 1311
mbed_official 237:f3da66175598 1312 /**
mbed_official 237:f3da66175598 1313 * @}
mbed_official 237:f3da66175598 1314 */
mbed_official 237:f3da66175598 1315
mbed_official 375:3d36234a1087 1316 /** @defgroup UART_Exported_Functions_Group3 Peripheral Control functions
mbed_official 237:f3da66175598 1317 * @brief UART control functions
mbed_official 237:f3da66175598 1318 *
mbed_official 237:f3da66175598 1319 @verbatim
mbed_official 237:f3da66175598 1320 ===============================================================================
mbed_official 237:f3da66175598 1321 ##### Peripheral Control functions #####
mbed_official 237:f3da66175598 1322 ===============================================================================
mbed_official 237:f3da66175598 1323 [..]
mbed_official 237:f3da66175598 1324 This subsection provides a set of functions allowing to control the UART.
mbed_official 237:f3da66175598 1325 (+) HAL_MultiProcessor_EnableMuteMode() API enables mute mode
mbed_official 237:f3da66175598 1326 (+) HAL_MultiProcessor_DisableMuteMode() API disables mute mode
mbed_official 237:f3da66175598 1327 (+) HAL_MultiProcessor_EnterMuteMode() API enters mute mode
mbed_official 237:f3da66175598 1328 (+) HAL_MultiProcessor_EnableMuteMode() API enables mute mode
mbed_official 237:f3da66175598 1329 (+) UART_SetConfig() API configures the UART peripheral
mbed_official 237:f3da66175598 1330 (+) UART_AdvFeatureConfig() API optionally configures the UART advanced features
mbed_official 237:f3da66175598 1331 (+) UART_CheckIdleState() API ensures that TEACK and/or REACK are set after initialization
mbed_official 237:f3da66175598 1332 (+) UART_Wakeup_AddressConfig() API configures the wake-up from stop mode parameters
mbed_official 237:f3da66175598 1333 (+) HAL_HalfDuplex_EnableTransmitter() API disables receiver and enables transmitter
mbed_official 237:f3da66175598 1334 (+) HAL_HalfDuplex_EnableReceiver() API disables transmitter and enables receiver
mbed_official 237:f3da66175598 1335 (+) HAL_LIN_SendBreak() API transmits the break characters
mbed_official 237:f3da66175598 1336 @endverbatim
mbed_official 237:f3da66175598 1337 * @{
mbed_official 237:f3da66175598 1338 */
mbed_official 237:f3da66175598 1339
mbed_official 237:f3da66175598 1340 /**
mbed_official 237:f3da66175598 1341 * @brief Enable UART in mute mode (doesn't mean UART enters mute mode;
mbed_official 237:f3da66175598 1342 * to enter mute mode, HAL_MultiProcessor_EnterMuteMode() API must be called)
mbed_official 237:f3da66175598 1343 * @param huart: UART handle
mbed_official 237:f3da66175598 1344 * @retval HAL status
mbed_official 237:f3da66175598 1345 */
mbed_official 237:f3da66175598 1346 HAL_StatusTypeDef HAL_MultiProcessor_EnableMuteMode(UART_HandleTypeDef *huart)
mbed_official 237:f3da66175598 1347 {
mbed_official 237:f3da66175598 1348 /* Process Locked */
mbed_official 237:f3da66175598 1349 __HAL_LOCK(huart);
mbed_official 237:f3da66175598 1350
mbed_official 237:f3da66175598 1351 huart->State = HAL_UART_STATE_BUSY;
mbed_official 237:f3da66175598 1352
mbed_official 237:f3da66175598 1353 /* Enable USART mute mode by setting the MME bit in the CR1 register */
mbed_official 237:f3da66175598 1354 huart->Instance->CR1 |= USART_CR1_MME;
mbed_official 237:f3da66175598 1355
mbed_official 237:f3da66175598 1356 huart->State = HAL_UART_STATE_READY;
mbed_official 237:f3da66175598 1357
mbed_official 237:f3da66175598 1358 return (UART_CheckIdleState(huart));
mbed_official 237:f3da66175598 1359 }
mbed_official 237:f3da66175598 1360
mbed_official 237:f3da66175598 1361 /**
mbed_official 237:f3da66175598 1362 * @brief Disable UART mute mode (doesn't mean it actually wakes up the software,
mbed_official 237:f3da66175598 1363 * as it may not have been in mute mode at this very moment).
mbed_official 237:f3da66175598 1364 * @param huart: uart handle
mbed_official 237:f3da66175598 1365 * @retval HAL status
mbed_official 237:f3da66175598 1366 */
mbed_official 237:f3da66175598 1367 HAL_StatusTypeDef HAL_MultiProcessor_DisableMuteMode(UART_HandleTypeDef *huart)
mbed_official 237:f3da66175598 1368 {
mbed_official 237:f3da66175598 1369 /* Process Locked */
mbed_official 237:f3da66175598 1370 __HAL_LOCK(huart);
mbed_official 237:f3da66175598 1371
mbed_official 237:f3da66175598 1372 huart->State = HAL_UART_STATE_BUSY;
mbed_official 237:f3da66175598 1373
mbed_official 237:f3da66175598 1374 /* Disable USART mute mode by clearing the MME bit in the CR1 register */
mbed_official 237:f3da66175598 1375 huart->Instance->CR1 &= ~(USART_CR1_MME);
mbed_official 237:f3da66175598 1376
mbed_official 237:f3da66175598 1377 huart->State = HAL_UART_STATE_READY;
mbed_official 237:f3da66175598 1378
mbed_official 237:f3da66175598 1379 return (UART_CheckIdleState(huart));
mbed_official 237:f3da66175598 1380 }
mbed_official 237:f3da66175598 1381
mbed_official 237:f3da66175598 1382 /**
mbed_official 237:f3da66175598 1383 * @brief Enter UART mute mode (means UART actually enters mute mode).
mbed_official 237:f3da66175598 1384 * To exit from mute mode, HAL_MultiProcessor_DisableMuteMode() API must be called.
mbed_official 237:f3da66175598 1385 * @param huart: uart handle
mbed_official 237:f3da66175598 1386 * @retval HAL status
mbed_official 237:f3da66175598 1387 */
mbed_official 237:f3da66175598 1388 void HAL_MultiProcessor_EnterMuteMode(UART_HandleTypeDef *huart)
mbed_official 237:f3da66175598 1389 {
mbed_official 237:f3da66175598 1390 __HAL_UART_SEND_REQ(huart, UART_MUTE_MODE_REQUEST);
mbed_official 237:f3da66175598 1391 }
mbed_official 237:f3da66175598 1392
mbed_official 237:f3da66175598 1393 /**
mbed_official 237:f3da66175598 1394 * @brief Configure the UART peripheral
mbed_official 237:f3da66175598 1395 * @param huart: uart handle
mbed_official 237:f3da66175598 1396 * @retval None
mbed_official 237:f3da66175598 1397 */
mbed_official 237:f3da66175598 1398 HAL_StatusTypeDef UART_SetConfig(UART_HandleTypeDef *huart)
mbed_official 237:f3da66175598 1399 {
mbed_official 237:f3da66175598 1400 uint32_t tmpreg = 0x00000000;
mbed_official 237:f3da66175598 1401 UART_ClockSourceTypeDef clocksource = UART_CLOCKSOURCE_UNDEFINED;
mbed_official 237:f3da66175598 1402 uint16_t brrtemp = 0x0000;
mbed_official 237:f3da66175598 1403 uint16_t usartdiv = 0x0000;
mbed_official 237:f3da66175598 1404 HAL_StatusTypeDef ret = HAL_OK;
mbed_official 237:f3da66175598 1405
mbed_official 237:f3da66175598 1406 /* Check the parameters */
mbed_official 237:f3da66175598 1407 assert_param(IS_UART_BAUDRATE(huart->Init.BaudRate));
mbed_official 237:f3da66175598 1408 assert_param(IS_UART_WORD_LENGTH(huart->Init.WordLength));
mbed_official 237:f3da66175598 1409 assert_param(IS_UART_STOPBITS(huart->Init.StopBits));
mbed_official 237:f3da66175598 1410 assert_param(IS_UART_PARITY(huart->Init.Parity));
mbed_official 237:f3da66175598 1411 assert_param(IS_UART_MODE(huart->Init.Mode));
mbed_official 237:f3da66175598 1412 assert_param(IS_UART_HARDWARE_FLOW_CONTROL(huart->Init.HwFlowCtl));
mbed_official 237:f3da66175598 1413 assert_param(IS_UART_ONEBIT_SAMPLING(huart->Init.OneBitSampling));
mbed_official 237:f3da66175598 1414 assert_param(IS_UART_OVERSAMPLING(huart->Init.OverSampling));
mbed_official 237:f3da66175598 1415
mbed_official 237:f3da66175598 1416
mbed_official 237:f3da66175598 1417 /*-------------------------- USART CR1 Configuration -----------------------*/
mbed_official 237:f3da66175598 1418 /* Clear M, PCE, PS, TE, RE and OVER8 bits and configure
mbed_official 237:f3da66175598 1419 * the UART Word Length, Parity, Mode and oversampling:
mbed_official 237:f3da66175598 1420 * set the M bits according to huart->Init.WordLength value
mbed_official 237:f3da66175598 1421 * set PCE and PS bits according to huart->Init.Parity value
mbed_official 237:f3da66175598 1422 * set TE and RE bits according to huart->Init.Mode value
mbed_official 237:f3da66175598 1423 * set OVER8 bit according to huart->Init.OverSampling value */
mbed_official 237:f3da66175598 1424 tmpreg = (uint32_t)huart->Init.WordLength | huart->Init.Parity | huart->Init.Mode | huart->Init.OverSampling ;
mbed_official 237:f3da66175598 1425 MODIFY_REG(huart->Instance->CR1, UART_CR1_FIELDS, tmpreg);
mbed_official 237:f3da66175598 1426
mbed_official 237:f3da66175598 1427 /*-------------------------- USART CR2 Configuration -----------------------*/
mbed_official 237:f3da66175598 1428 /* Configure the UART Stop Bits: Set STOP[13:12] bits according
mbed_official 237:f3da66175598 1429 * to huart->Init.StopBits value */
mbed_official 237:f3da66175598 1430 MODIFY_REG(huart->Instance->CR2, USART_CR2_STOP, huart->Init.StopBits);
mbed_official 237:f3da66175598 1431
mbed_official 237:f3da66175598 1432 /*-------------------------- USART CR3 Configuration -----------------------*/
mbed_official 237:f3da66175598 1433 /* Configure
mbed_official 237:f3da66175598 1434 * - UART HardWare Flow Control: set CTSE and RTSE bits according
mbed_official 237:f3da66175598 1435 * to huart->Init.HwFlowCtl value
mbed_official 237:f3da66175598 1436 * - one-bit sampling method versus three samples' majority rule according
mbed_official 237:f3da66175598 1437 * to huart->Init.OneBitSampling */
mbed_official 237:f3da66175598 1438 tmpreg = (uint32_t)huart->Init.HwFlowCtl | huart->Init.OneBitSampling ;
mbed_official 237:f3da66175598 1439 MODIFY_REG(huart->Instance->CR3, (USART_CR3_RTSE | USART_CR3_CTSE | USART_CR3_ONEBIT), tmpreg);
mbed_official 237:f3da66175598 1440
mbed_official 237:f3da66175598 1441 /*-------------------------- USART BRR Configuration -----------------------*/
mbed_official 237:f3da66175598 1442 __HAL_UART_GETCLOCKSOURCE(huart, clocksource);
mbed_official 237:f3da66175598 1443
mbed_official 237:f3da66175598 1444 /* Check the Over Sampling to set Baud Rate Register */
mbed_official 237:f3da66175598 1445 if (huart->Init.OverSampling == UART_OVERSAMPLING_8)
mbed_official 237:f3da66175598 1446 {
mbed_official 237:f3da66175598 1447 switch (clocksource)
mbed_official 237:f3da66175598 1448 {
mbed_official 237:f3da66175598 1449 case UART_CLOCKSOURCE_PCLK1:
mbed_official 237:f3da66175598 1450 usartdiv = (uint16_t)(__DIV_SAMPLING8(HAL_RCC_GetPCLK1Freq(), huart->Init.BaudRate));
mbed_official 237:f3da66175598 1451 break;
mbed_official 237:f3da66175598 1452 case UART_CLOCKSOURCE_PCLK2:
mbed_official 237:f3da66175598 1453 usartdiv = (uint16_t)(__DIV_SAMPLING8(HAL_RCC_GetPCLK2Freq(), huart->Init.BaudRate));
mbed_official 237:f3da66175598 1454 break;
mbed_official 237:f3da66175598 1455 case UART_CLOCKSOURCE_HSI:
mbed_official 237:f3da66175598 1456 usartdiv = (uint16_t)(__DIV_SAMPLING8(HSI_VALUE, huart->Init.BaudRate));
mbed_official 237:f3da66175598 1457 break;
mbed_official 237:f3da66175598 1458 case UART_CLOCKSOURCE_SYSCLK:
mbed_official 237:f3da66175598 1459 usartdiv = (uint16_t)(__DIV_SAMPLING8(HAL_RCC_GetSysClockFreq(), huart->Init.BaudRate));
mbed_official 237:f3da66175598 1460 break;
mbed_official 237:f3da66175598 1461 case UART_CLOCKSOURCE_LSE:
mbed_official 237:f3da66175598 1462 usartdiv = (uint16_t)(__DIV_SAMPLING8(LSE_VALUE, huart->Init.BaudRate));
mbed_official 237:f3da66175598 1463 break;
mbed_official 237:f3da66175598 1464 case UART_CLOCKSOURCE_UNDEFINED:
mbed_official 237:f3da66175598 1465 default:
mbed_official 237:f3da66175598 1466 ret = HAL_ERROR;
mbed_official 237:f3da66175598 1467 break;
mbed_official 237:f3da66175598 1468 }
mbed_official 237:f3da66175598 1469
mbed_official 237:f3da66175598 1470 brrtemp = usartdiv & 0xFFF0;
mbed_official 237:f3da66175598 1471 brrtemp |= (uint16_t)((usartdiv & (uint16_t)0x000F) >> 1U);
mbed_official 237:f3da66175598 1472 huart->Instance->BRR = brrtemp;
mbed_official 237:f3da66175598 1473 }
mbed_official 237:f3da66175598 1474 else
mbed_official 237:f3da66175598 1475 {
mbed_official 237:f3da66175598 1476 switch (clocksource)
mbed_official 237:f3da66175598 1477 {
mbed_official 237:f3da66175598 1478 case UART_CLOCKSOURCE_PCLK1:
mbed_official 237:f3da66175598 1479 huart->Instance->BRR = (uint16_t)(__DIV_SAMPLING16(HAL_RCC_GetPCLK1Freq(), huart->Init.BaudRate));
mbed_official 237:f3da66175598 1480 break;
mbed_official 237:f3da66175598 1481 case UART_CLOCKSOURCE_PCLK2:
mbed_official 237:f3da66175598 1482 huart->Instance->BRR = (uint16_t)(__DIV_SAMPLING16(HAL_RCC_GetPCLK2Freq(), huart->Init.BaudRate));
mbed_official 237:f3da66175598 1483 break;
mbed_official 237:f3da66175598 1484 case UART_CLOCKSOURCE_HSI:
mbed_official 237:f3da66175598 1485 huart->Instance->BRR = (uint16_t)(__DIV_SAMPLING16(HSI_VALUE, huart->Init.BaudRate));
mbed_official 237:f3da66175598 1486 break;
mbed_official 237:f3da66175598 1487 case UART_CLOCKSOURCE_SYSCLK:
mbed_official 237:f3da66175598 1488 huart->Instance->BRR = (uint16_t)(__DIV_SAMPLING16(HAL_RCC_GetSysClockFreq(), huart->Init.BaudRate));
mbed_official 237:f3da66175598 1489 break;
mbed_official 237:f3da66175598 1490 case UART_CLOCKSOURCE_LSE:
mbed_official 237:f3da66175598 1491 huart->Instance->BRR = (uint16_t)(__DIV_SAMPLING16(LSE_VALUE, huart->Init.BaudRate));
mbed_official 237:f3da66175598 1492 break;
mbed_official 237:f3da66175598 1493 case UART_CLOCKSOURCE_UNDEFINED:
mbed_official 237:f3da66175598 1494 default:
mbed_official 237:f3da66175598 1495 ret = HAL_ERROR;
mbed_official 237:f3da66175598 1496 break;
mbed_official 237:f3da66175598 1497 }
mbed_official 237:f3da66175598 1498 }
mbed_official 237:f3da66175598 1499
mbed_official 237:f3da66175598 1500 return ret;
mbed_official 237:f3da66175598 1501
mbed_official 237:f3da66175598 1502 }
mbed_official 237:f3da66175598 1503
mbed_official 237:f3da66175598 1504
mbed_official 237:f3da66175598 1505 /**
mbed_official 237:f3da66175598 1506 * @brief Configure the UART peripheral advanced feautures
mbed_official 237:f3da66175598 1507 * @param huart: uart handle
mbed_official 237:f3da66175598 1508 * @retval None
mbed_official 237:f3da66175598 1509 */
mbed_official 237:f3da66175598 1510 void UART_AdvFeatureConfig(UART_HandleTypeDef *huart)
mbed_official 237:f3da66175598 1511 {
mbed_official 237:f3da66175598 1512 /* Check whether the set of advanced features to configure is properly set */
mbed_official 237:f3da66175598 1513 assert_param(IS_UART_ADVFEATURE_INIT(huart->AdvancedInit.AdvFeatureInit));
mbed_official 237:f3da66175598 1514
mbed_official 237:f3da66175598 1515 /* if required, configure TX pin active level inversion */
mbed_official 237:f3da66175598 1516 if (HAL_IS_BIT_SET(huart->AdvancedInit.AdvFeatureInit, UART_ADVFEATURE_TXINVERT_INIT))
mbed_official 237:f3da66175598 1517 {
mbed_official 237:f3da66175598 1518 assert_param(IS_UART_ADVFEATURE_TXINV(huart->AdvancedInit.TxPinLevelInvert));
mbed_official 237:f3da66175598 1519 MODIFY_REG(huart->Instance->CR2, USART_CR2_TXINV, huart->AdvancedInit.TxPinLevelInvert);
mbed_official 237:f3da66175598 1520 }
mbed_official 237:f3da66175598 1521
mbed_official 237:f3da66175598 1522 /* if required, configure RX pin active level inversion */
mbed_official 237:f3da66175598 1523 if (HAL_IS_BIT_SET(huart->AdvancedInit.AdvFeatureInit, UART_ADVFEATURE_RXINVERT_INIT))
mbed_official 237:f3da66175598 1524 {
mbed_official 237:f3da66175598 1525 assert_param(IS_UART_ADVFEATURE_RXINV(huart->AdvancedInit.RxPinLevelInvert));
mbed_official 237:f3da66175598 1526 MODIFY_REG(huart->Instance->CR2, USART_CR2_RXINV, huart->AdvancedInit.RxPinLevelInvert);
mbed_official 237:f3da66175598 1527 }
mbed_official 237:f3da66175598 1528
mbed_official 237:f3da66175598 1529 /* if required, configure data inversion */
mbed_official 237:f3da66175598 1530 if (HAL_IS_BIT_SET(huart->AdvancedInit.AdvFeatureInit, UART_ADVFEATURE_DATAINVERT_INIT))
mbed_official 237:f3da66175598 1531 {
mbed_official 237:f3da66175598 1532 assert_param(IS_UART_ADVFEATURE_DATAINV(huart->AdvancedInit.DataInvert));
mbed_official 237:f3da66175598 1533 MODIFY_REG(huart->Instance->CR2, USART_CR2_DATAINV, huart->AdvancedInit.DataInvert);
mbed_official 237:f3da66175598 1534 }
mbed_official 237:f3da66175598 1535
mbed_official 237:f3da66175598 1536 /* if required, configure RX/TX pins swap */
mbed_official 237:f3da66175598 1537 if (HAL_IS_BIT_SET(huart->AdvancedInit.AdvFeatureInit, UART_ADVFEATURE_SWAP_INIT))
mbed_official 237:f3da66175598 1538 {
mbed_official 237:f3da66175598 1539 assert_param(IS_UART_ADVFEATURE_SWAP(huart->AdvancedInit.Swap));
mbed_official 237:f3da66175598 1540 MODIFY_REG(huart->Instance->CR2, USART_CR2_SWAP, huart->AdvancedInit.Swap);
mbed_official 237:f3da66175598 1541 }
mbed_official 237:f3da66175598 1542
mbed_official 237:f3da66175598 1543 /* if required, configure RX overrun detection disabling */
mbed_official 237:f3da66175598 1544 if (HAL_IS_BIT_SET(huart->AdvancedInit.AdvFeatureInit, UART_ADVFEATURE_RXOVERRUNDISABLE_INIT))
mbed_official 237:f3da66175598 1545 {
mbed_official 237:f3da66175598 1546 assert_param(IS_UART_OVERRUN(huart->AdvancedInit.OverrunDisable));
mbed_official 237:f3da66175598 1547 MODIFY_REG(huart->Instance->CR3, USART_CR3_OVRDIS, huart->AdvancedInit.OverrunDisable);
mbed_official 237:f3da66175598 1548 }
mbed_official 237:f3da66175598 1549
mbed_official 237:f3da66175598 1550 /* if required, configure DMA disabling on reception error */
mbed_official 237:f3da66175598 1551 if (HAL_IS_BIT_SET(huart->AdvancedInit.AdvFeatureInit, UART_ADVFEATURE_DMADISABLEONERROR_INIT))
mbed_official 237:f3da66175598 1552 {
mbed_official 237:f3da66175598 1553 assert_param(IS_UART_ADVFEATURE_DMAONRXERROR(huart->AdvancedInit.DMADisableonRxError));
mbed_official 237:f3da66175598 1554 MODIFY_REG(huart->Instance->CR3, USART_CR3_DDRE, huart->AdvancedInit.DMADisableonRxError);
mbed_official 237:f3da66175598 1555 }
mbed_official 237:f3da66175598 1556
mbed_official 237:f3da66175598 1557 /* if required, configure auto Baud rate detection scheme */
mbed_official 237:f3da66175598 1558 if (HAL_IS_BIT_SET(huart->AdvancedInit.AdvFeatureInit, UART_ADVFEATURE_AUTOBAUDRATE_INIT))
mbed_official 237:f3da66175598 1559 {
mbed_official 237:f3da66175598 1560 assert_param(IS_USART_AUTOBAUDRATE_DETECTION_INSTANCE(huart->Instance));
mbed_official 237:f3da66175598 1561 assert_param(IS_UART_ADVFEATURE_AUTOBAUDRATE(huart->AdvancedInit.AutoBaudRateEnable));
mbed_official 237:f3da66175598 1562 MODIFY_REG(huart->Instance->CR2, USART_CR2_ABREN, huart->AdvancedInit.AutoBaudRateEnable);
mbed_official 237:f3da66175598 1563 /* set auto Baudrate detection parameters if detection is enabled */
mbed_official 237:f3da66175598 1564 if (huart->AdvancedInit.AutoBaudRateEnable == UART_ADVFEATURE_AUTOBAUDRATE_ENABLE)
mbed_official 237:f3da66175598 1565 {
mbed_official 237:f3da66175598 1566 assert_param(IS_UART_ADVFEATURE_AUTOBAUDRATEMODE(huart->AdvancedInit.AutoBaudRateMode));
mbed_official 237:f3da66175598 1567 MODIFY_REG(huart->Instance->CR2, USART_CR2_ABRMODE, huart->AdvancedInit.AutoBaudRateMode);
mbed_official 237:f3da66175598 1568 }
mbed_official 237:f3da66175598 1569 }
mbed_official 237:f3da66175598 1570
mbed_official 237:f3da66175598 1571 /* if required, configure MSB first on communication line */
mbed_official 237:f3da66175598 1572 if (HAL_IS_BIT_SET(huart->AdvancedInit.AdvFeatureInit, UART_ADVFEATURE_MSBFIRST_INIT))
mbed_official 237:f3da66175598 1573 {
mbed_official 237:f3da66175598 1574 assert_param(IS_UART_ADVFEATURE_MSBFIRST(huart->AdvancedInit.MSBFirst));
mbed_official 237:f3da66175598 1575 MODIFY_REG(huart->Instance->CR2, USART_CR2_MSBFIRST, huart->AdvancedInit.MSBFirst);
mbed_official 237:f3da66175598 1576 }
mbed_official 237:f3da66175598 1577 }
mbed_official 237:f3da66175598 1578
mbed_official 237:f3da66175598 1579
mbed_official 237:f3da66175598 1580
mbed_official 237:f3da66175598 1581 /**
mbed_official 237:f3da66175598 1582 * @brief Check the UART Idle State
mbed_official 237:f3da66175598 1583 * @param huart: uart handle
mbed_official 237:f3da66175598 1584 * @retval HAL status
mbed_official 237:f3da66175598 1585 */
mbed_official 237:f3da66175598 1586 HAL_StatusTypeDef UART_CheckIdleState(UART_HandleTypeDef *huart)
mbed_official 237:f3da66175598 1587 {
mbed_official 237:f3da66175598 1588 /* Initialize the UART ErrorCode */
mbed_official 237:f3da66175598 1589 huart->ErrorCode = HAL_UART_ERROR_NONE;
mbed_official 237:f3da66175598 1590
mbed_official 237:f3da66175598 1591 /* Check if the Transmitter is enabled */
mbed_official 237:f3da66175598 1592 if((huart->Instance->CR1 & USART_CR1_TE) == USART_CR1_TE)
mbed_official 237:f3da66175598 1593 {
mbed_official 237:f3da66175598 1594 /* Wait until TEACK flag is set */
mbed_official 237:f3da66175598 1595 if(UART_WaitOnFlagUntilTimeout(huart, USART_ISR_TEACK, RESET, HAL_UART_TIMEOUT_VALUE) != HAL_OK)
mbed_official 237:f3da66175598 1596 {
mbed_official 237:f3da66175598 1597 /* Timeout Occured */
mbed_official 237:f3da66175598 1598 return HAL_TIMEOUT;
mbed_official 237:f3da66175598 1599 }
mbed_official 237:f3da66175598 1600 }
mbed_official 237:f3da66175598 1601 /* Check if the Receiver is enabled */
mbed_official 237:f3da66175598 1602 if((huart->Instance->CR1 & USART_CR1_RE) == USART_CR1_RE)
mbed_official 237:f3da66175598 1603 {
mbed_official 237:f3da66175598 1604 /* Wait until REACK flag is set */
mbed_official 237:f3da66175598 1605 if(UART_WaitOnFlagUntilTimeout(huart, USART_ISR_REACK, RESET, HAL_UART_TIMEOUT_VALUE) != HAL_OK)
mbed_official 237:f3da66175598 1606 {
mbed_official 237:f3da66175598 1607 /* Timeout Occured */
mbed_official 237:f3da66175598 1608 return HAL_TIMEOUT;
mbed_official 237:f3da66175598 1609 }
mbed_official 237:f3da66175598 1610 }
mbed_official 237:f3da66175598 1611
mbed_official 237:f3da66175598 1612 /* Initialize the UART State */
mbed_official 237:f3da66175598 1613 huart->State= HAL_UART_STATE_READY;
mbed_official 237:f3da66175598 1614
mbed_official 237:f3da66175598 1615 /* Process Unlocked */
mbed_official 237:f3da66175598 1616 __HAL_UNLOCK(huart);
mbed_official 237:f3da66175598 1617
mbed_official 237:f3da66175598 1618 return HAL_OK;
mbed_official 237:f3da66175598 1619 }
mbed_official 237:f3da66175598 1620
mbed_official 237:f3da66175598 1621
mbed_official 237:f3da66175598 1622
mbed_official 237:f3da66175598 1623
mbed_official 237:f3da66175598 1624 /**
mbed_official 237:f3da66175598 1625 * @brief Initializes the UART wake-up from stop mode parameters when triggered by address detection.
mbed_official 237:f3da66175598 1626 * @param huart: uart handle
mbed_official 237:f3da66175598 1627 * @param WakeUpSelection: UART wake up from stop mode parameters
mbed_official 237:f3da66175598 1628 * @retval HAL status
mbed_official 237:f3da66175598 1629 */
mbed_official 237:f3da66175598 1630 void UART_Wakeup_AddressConfig(UART_HandleTypeDef *huart, UART_WakeUpTypeDef WakeUpSelection)
mbed_official 237:f3da66175598 1631 {
mbed_official 237:f3da66175598 1632 assert_param(IS_UART_ADDRESSLENGTH_DETECT(WakeUpSelection.AddressLength));
mbed_official 237:f3da66175598 1633
mbed_official 237:f3da66175598 1634 /* Set the USART address length */
mbed_official 237:f3da66175598 1635 MODIFY_REG(huart->Instance->CR2, USART_CR2_ADDM7, WakeUpSelection.AddressLength);
mbed_official 237:f3da66175598 1636
mbed_official 237:f3da66175598 1637 /* Set the USART address node */
mbed_official 237:f3da66175598 1638 MODIFY_REG(huart->Instance->CR2, USART_CR2_ADD, ((uint32_t)WakeUpSelection.Address << UART_CR2_ADDRESS_LSB_POS));
mbed_official 237:f3da66175598 1639 }
mbed_official 237:f3da66175598 1640
mbed_official 237:f3da66175598 1641 /**
mbed_official 237:f3da66175598 1642 * @brief Enables the UART transmitter and disables the UART receiver.
mbed_official 237:f3da66175598 1643 * @param huart: UART handle
mbed_official 237:f3da66175598 1644 * @retval HAL status
mbed_official 237:f3da66175598 1645 * @retval None
mbed_official 237:f3da66175598 1646 */
mbed_official 237:f3da66175598 1647 HAL_StatusTypeDef HAL_HalfDuplex_EnableTransmitter(UART_HandleTypeDef *huart)
mbed_official 237:f3da66175598 1648 {
mbed_official 237:f3da66175598 1649 /* Process Locked */
mbed_official 237:f3da66175598 1650 __HAL_LOCK(huart);
mbed_official 237:f3da66175598 1651 huart->State = HAL_UART_STATE_BUSY;
mbed_official 237:f3da66175598 1652
mbed_official 237:f3da66175598 1653 /* Clear TE and RE bits */
mbed_official 237:f3da66175598 1654 CLEAR_BIT(huart->Instance->CR1, (USART_CR1_TE | USART_CR1_RE));
mbed_official 237:f3da66175598 1655 /* Enable the USART's transmit interface by setting the TE bit in the USART CR1 register */
mbed_official 237:f3da66175598 1656 SET_BIT(huart->Instance->CR1, USART_CR1_TE);
mbed_official 237:f3da66175598 1657
mbed_official 237:f3da66175598 1658 huart->State = HAL_UART_STATE_READY;
mbed_official 237:f3da66175598 1659 /* Process Unlocked */
mbed_official 237:f3da66175598 1660 __HAL_UNLOCK(huart);
mbed_official 237:f3da66175598 1661
mbed_official 237:f3da66175598 1662 return HAL_OK;
mbed_official 237:f3da66175598 1663 }
mbed_official 237:f3da66175598 1664
mbed_official 237:f3da66175598 1665 /**
mbed_official 237:f3da66175598 1666 * @brief Enables the UART receiver and disables the UART transmitter.
mbed_official 237:f3da66175598 1667 * @param huart: UART handle
mbed_official 237:f3da66175598 1668 * @retval HAL status
mbed_official 237:f3da66175598 1669 */
mbed_official 237:f3da66175598 1670 HAL_StatusTypeDef HAL_HalfDuplex_EnableReceiver(UART_HandleTypeDef *huart)
mbed_official 237:f3da66175598 1671 {
mbed_official 237:f3da66175598 1672 /* Process Locked */
mbed_official 237:f3da66175598 1673 __HAL_LOCK(huart);
mbed_official 237:f3da66175598 1674 huart->State = HAL_UART_STATE_BUSY;
mbed_official 237:f3da66175598 1675
mbed_official 237:f3da66175598 1676 /* Clear TE and RE bits */
mbed_official 237:f3da66175598 1677 CLEAR_BIT(huart->Instance->CR1, (USART_CR1_TE | USART_CR1_RE));
mbed_official 237:f3da66175598 1678 /* Enable the USART's receive interface by setting the RE bit in the USART CR1 register */
mbed_official 237:f3da66175598 1679 SET_BIT(huart->Instance->CR1, USART_CR1_RE);
mbed_official 237:f3da66175598 1680
mbed_official 237:f3da66175598 1681 huart->State = HAL_UART_STATE_READY;
mbed_official 237:f3da66175598 1682 /* Process Unlocked */
mbed_official 237:f3da66175598 1683 __HAL_UNLOCK(huart);
mbed_official 237:f3da66175598 1684
mbed_official 237:f3da66175598 1685 return HAL_OK;
mbed_official 237:f3da66175598 1686 }
mbed_official 237:f3da66175598 1687
mbed_official 237:f3da66175598 1688
mbed_official 237:f3da66175598 1689 /**
mbed_official 237:f3da66175598 1690 * @brief Transmits break characters.
mbed_official 237:f3da66175598 1691 * @param huart: UART handle
mbed_official 237:f3da66175598 1692 * @retval HAL status
mbed_official 237:f3da66175598 1693 */
mbed_official 237:f3da66175598 1694 HAL_StatusTypeDef HAL_LIN_SendBreak(UART_HandleTypeDef *huart)
mbed_official 237:f3da66175598 1695 {
mbed_official 237:f3da66175598 1696 /* Check the parameters */
mbed_official 237:f3da66175598 1697 assert_param(IS_UART_INSTANCE(huart->Instance));
mbed_official 237:f3da66175598 1698
mbed_official 237:f3da66175598 1699 /* Process Locked */
mbed_official 237:f3da66175598 1700 __HAL_LOCK(huart);
mbed_official 237:f3da66175598 1701
mbed_official 237:f3da66175598 1702 huart->State = HAL_UART_STATE_BUSY;
mbed_official 237:f3da66175598 1703
mbed_official 237:f3da66175598 1704 /* Send break characters */
mbed_official 237:f3da66175598 1705 huart->Instance->RQR |= UART_SENDBREAK_REQUEST;
mbed_official 237:f3da66175598 1706
mbed_official 237:f3da66175598 1707 huart->State = HAL_UART_STATE_READY;
mbed_official 237:f3da66175598 1708
mbed_official 237:f3da66175598 1709 /* Process Unlocked */
mbed_official 237:f3da66175598 1710 __HAL_UNLOCK(huart);
mbed_official 237:f3da66175598 1711
mbed_official 237:f3da66175598 1712 return HAL_OK;
mbed_official 237:f3da66175598 1713 }
mbed_official 237:f3da66175598 1714
mbed_official 237:f3da66175598 1715
mbed_official 237:f3da66175598 1716 /**
mbed_official 237:f3da66175598 1717 * @}
mbed_official 237:f3da66175598 1718 */
mbed_official 237:f3da66175598 1719
mbed_official 375:3d36234a1087 1720 /** @defgroup UART_Exported_Functions_Group4 Peripheral State and Error functions
mbed_official 375:3d36234a1087 1721 * @brief UART Peripheral State functions
mbed_official 375:3d36234a1087 1722 *
mbed_official 375:3d36234a1087 1723 @verbatim
mbed_official 375:3d36234a1087 1724 ==============================================================================
mbed_official 375:3d36234a1087 1725 ##### Peripheral State and Error functions #####
mbed_official 375:3d36234a1087 1726 ==============================================================================
mbed_official 375:3d36234a1087 1727 [..]
mbed_official 375:3d36234a1087 1728 This subsection provides functions allowing to :
mbed_official 375:3d36234a1087 1729 (+) Returns the UART state.
mbed_official 375:3d36234a1087 1730 (+) Returns the UART error code
mbed_official 375:3d36234a1087 1731
mbed_official 375:3d36234a1087 1732 @endverbatim
mbed_official 375:3d36234a1087 1733 * @{
mbed_official 375:3d36234a1087 1734 */
mbed_official 375:3d36234a1087 1735
mbed_official 375:3d36234a1087 1736 /**
mbed_official 375:3d36234a1087 1737 * @brief return the UART state
mbed_official 375:3d36234a1087 1738 * @param huart: uart handle
mbed_official 375:3d36234a1087 1739 * @retval HAL state
mbed_official 375:3d36234a1087 1740 */
mbed_official 375:3d36234a1087 1741 HAL_UART_StateTypeDef HAL_UART_GetState(UART_HandleTypeDef *huart)
mbed_official 375:3d36234a1087 1742 {
mbed_official 375:3d36234a1087 1743 return huart->State;
mbed_official 375:3d36234a1087 1744 }
mbed_official 375:3d36234a1087 1745
mbed_official 375:3d36234a1087 1746 /**
mbed_official 375:3d36234a1087 1747 * @brief Return the UART error code
mbed_official 375:3d36234a1087 1748 * @param huart : pointer to a UART_HandleTypeDef structure that contains
mbed_official 375:3d36234a1087 1749 * the configuration information for the specified UART.
mbed_official 375:3d36234a1087 1750 * @retval UART Error Code
mbed_official 375:3d36234a1087 1751 */
mbed_official 375:3d36234a1087 1752 uint32_t HAL_UART_GetError(UART_HandleTypeDef *huart)
mbed_official 375:3d36234a1087 1753 {
mbed_official 375:3d36234a1087 1754 return huart->ErrorCode;
mbed_official 375:3d36234a1087 1755 }
mbed_official 375:3d36234a1087 1756 /**
mbed_official 375:3d36234a1087 1757 * @}
mbed_official 375:3d36234a1087 1758 */
mbed_official 375:3d36234a1087 1759
mbed_official 375:3d36234a1087 1760
mbed_official 237:f3da66175598 1761 /**
mbed_official 237:f3da66175598 1762 * @}
mbed_official 237:f3da66175598 1763 */
mbed_official 237:f3da66175598 1764
mbed_official 375:3d36234a1087 1765 /** @defgroup UART_Private_Functions UART Private Functions
mbed_official 375:3d36234a1087 1766 * @{
mbed_official 375:3d36234a1087 1767 */
mbed_official 375:3d36234a1087 1768 /**
mbed_official 375:3d36234a1087 1769 * @brief DMA UART transmit process complete callback
mbed_official 375:3d36234a1087 1770 * @param hdma: DMA handle
mbed_official 375:3d36234a1087 1771 * @retval None
mbed_official 375:3d36234a1087 1772 */
mbed_official 375:3d36234a1087 1773 static void UART_DMATransmitCplt(DMA_HandleTypeDef *hdma)
mbed_official 375:3d36234a1087 1774 {
mbed_official 375:3d36234a1087 1775 UART_HandleTypeDef* huart = ( UART_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
mbed_official 375:3d36234a1087 1776 huart->TxXferCount = 0;
mbed_official 375:3d36234a1087 1777
mbed_official 375:3d36234a1087 1778 /* Disable the DMA transfer for transmit request by setting the DMAT bit
mbed_official 375:3d36234a1087 1779 in the UART CR3 register */
mbed_official 375:3d36234a1087 1780 huart->Instance->CR3 &= (uint32_t)~((uint32_t)USART_CR3_DMAT);
mbed_official 375:3d36234a1087 1781
mbed_official 375:3d36234a1087 1782 /* Wait for UART TC Flag */
mbed_official 375:3d36234a1087 1783 if(UART_WaitOnFlagUntilTimeout(huart, UART_FLAG_TC, RESET, HAL_UART_TXDMA_TIMEOUTVALUE) != HAL_OK)
mbed_official 375:3d36234a1087 1784 {
mbed_official 375:3d36234a1087 1785 /* Timeout Occured */
mbed_official 375:3d36234a1087 1786 huart->State = HAL_UART_STATE_TIMEOUT;
mbed_official 375:3d36234a1087 1787 HAL_UART_ErrorCallback(huart);
mbed_official 375:3d36234a1087 1788 }
mbed_official 375:3d36234a1087 1789 else
mbed_official 375:3d36234a1087 1790 {
mbed_official 375:3d36234a1087 1791 /* No Timeout */
mbed_official 375:3d36234a1087 1792 /* Check if a receive process is ongoing or not */
mbed_official 375:3d36234a1087 1793 if(huart->State == HAL_UART_STATE_BUSY_TX_RX)
mbed_official 375:3d36234a1087 1794 {
mbed_official 375:3d36234a1087 1795 huart->State = HAL_UART_STATE_BUSY_RX;
mbed_official 375:3d36234a1087 1796 }
mbed_official 375:3d36234a1087 1797 else
mbed_official 375:3d36234a1087 1798 {
mbed_official 375:3d36234a1087 1799 huart->State = HAL_UART_STATE_READY;
mbed_official 375:3d36234a1087 1800 }
mbed_official 375:3d36234a1087 1801 HAL_UART_TxCpltCallback(huart);
mbed_official 375:3d36234a1087 1802 }
mbed_official 375:3d36234a1087 1803 }
mbed_official 375:3d36234a1087 1804
mbed_official 375:3d36234a1087 1805 /**
mbed_official 375:3d36234a1087 1806 * @brief DMA UART transmit process half complete callback
mbed_official 375:3d36234a1087 1807 * @param hdma : DMA handle
mbed_official 375:3d36234a1087 1808 * @retval None
mbed_official 375:3d36234a1087 1809 */
mbed_official 375:3d36234a1087 1810 static void UART_DMATxHalfCplt(DMA_HandleTypeDef *hdma)
mbed_official 375:3d36234a1087 1811 {
mbed_official 375:3d36234a1087 1812 UART_HandleTypeDef* huart = (UART_HandleTypeDef*)((DMA_HandleTypeDef*)hdma)->Parent;
mbed_official 375:3d36234a1087 1813
mbed_official 375:3d36234a1087 1814 HAL_UART_TxHalfCpltCallback(huart);
mbed_official 375:3d36234a1087 1815 }
mbed_official 375:3d36234a1087 1816
mbed_official 375:3d36234a1087 1817 /**
mbed_official 375:3d36234a1087 1818 * @brief DMA UART receive process complete callback
mbed_official 375:3d36234a1087 1819 * @param hdma: DMA handle
mbed_official 375:3d36234a1087 1820 * @retval None
mbed_official 375:3d36234a1087 1821 */
mbed_official 375:3d36234a1087 1822 static void UART_DMAReceiveCplt(DMA_HandleTypeDef *hdma)
mbed_official 375:3d36234a1087 1823 {
mbed_official 375:3d36234a1087 1824 UART_HandleTypeDef* huart = ( UART_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
mbed_official 375:3d36234a1087 1825 huart->RxXferCount = 0;
mbed_official 375:3d36234a1087 1826
mbed_official 375:3d36234a1087 1827 /* Disable the DMA transfer for the receiver request by setting the DMAR bit
mbed_official 375:3d36234a1087 1828 in the UART CR3 register */
mbed_official 375:3d36234a1087 1829 huart->Instance->CR3 &= (uint32_t)~((uint32_t)USART_CR3_DMAR);
mbed_official 375:3d36234a1087 1830
mbed_official 375:3d36234a1087 1831 /* Check if a transmit Process is ongoing or not */
mbed_official 375:3d36234a1087 1832 if(huart->State == HAL_UART_STATE_BUSY_TX_RX)
mbed_official 375:3d36234a1087 1833 {
mbed_official 375:3d36234a1087 1834 huart->State = HAL_UART_STATE_BUSY_TX;
mbed_official 375:3d36234a1087 1835 }
mbed_official 375:3d36234a1087 1836 else
mbed_official 375:3d36234a1087 1837 {
mbed_official 375:3d36234a1087 1838 huart->State = HAL_UART_STATE_READY;
mbed_official 375:3d36234a1087 1839 }
mbed_official 375:3d36234a1087 1840 HAL_UART_RxCpltCallback(huart);
mbed_official 375:3d36234a1087 1841 }
mbed_official 375:3d36234a1087 1842
mbed_official 375:3d36234a1087 1843 /**
mbed_official 375:3d36234a1087 1844 * @brief DMA UART receive process half complete callback
mbed_official 375:3d36234a1087 1845 * @param hdma : DMA handle
mbed_official 375:3d36234a1087 1846 * @retval None
mbed_official 375:3d36234a1087 1847 */
mbed_official 375:3d36234a1087 1848 static void UART_DMARxHalfCplt(DMA_HandleTypeDef *hdma)
mbed_official 375:3d36234a1087 1849 {
mbed_official 375:3d36234a1087 1850 UART_HandleTypeDef* huart = (UART_HandleTypeDef*)((DMA_HandleTypeDef*)hdma)->Parent;
mbed_official 375:3d36234a1087 1851
mbed_official 375:3d36234a1087 1852 HAL_UART_RxHalfCpltCallback(huart);
mbed_official 375:3d36234a1087 1853 }
mbed_official 375:3d36234a1087 1854
mbed_official 375:3d36234a1087 1855 /**
mbed_official 375:3d36234a1087 1856 * @brief DMA UART communication error callback
mbed_official 375:3d36234a1087 1857 * @param hdma: DMA handle
mbed_official 375:3d36234a1087 1858 * @retval None
mbed_official 375:3d36234a1087 1859 */
mbed_official 375:3d36234a1087 1860 static void UART_DMAError(DMA_HandleTypeDef *hdma)
mbed_official 375:3d36234a1087 1861 {
mbed_official 375:3d36234a1087 1862 UART_HandleTypeDef* huart = ( UART_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
mbed_official 375:3d36234a1087 1863 huart->RxXferCount = 0;
mbed_official 375:3d36234a1087 1864 huart->TxXferCount = 0;
mbed_official 375:3d36234a1087 1865 huart->State= HAL_UART_STATE_READY;
mbed_official 375:3d36234a1087 1866 huart->ErrorCode |= HAL_UART_ERROR_DMA;
mbed_official 375:3d36234a1087 1867 HAL_UART_ErrorCallback(huart);
mbed_official 375:3d36234a1087 1868 }
mbed_official 375:3d36234a1087 1869
mbed_official 375:3d36234a1087 1870 /**
mbed_official 375:3d36234a1087 1871 * @brief Send an amount of data in interrupt mode
mbed_official 375:3d36234a1087 1872 * Function called under interruption only, once
mbed_official 375:3d36234a1087 1873 * interruptions have been enabled by HAL_UART_Transmit_IT()
mbed_official 375:3d36234a1087 1874 * @param huart: UART handle
mbed_official 375:3d36234a1087 1875 * @retval HAL status
mbed_official 375:3d36234a1087 1876 */
mbed_official 375:3d36234a1087 1877 static HAL_StatusTypeDef UART_Transmit_IT(UART_HandleTypeDef *huart)
mbed_official 375:3d36234a1087 1878 {
mbed_official 375:3d36234a1087 1879 uint16_t* tmp;
mbed_official 375:3d36234a1087 1880
mbed_official 375:3d36234a1087 1881 if ((huart->State == HAL_UART_STATE_BUSY_TX) || (huart->State == HAL_UART_STATE_BUSY_TX_RX))
mbed_official 375:3d36234a1087 1882 {
mbed_official 375:3d36234a1087 1883
mbed_official 375:3d36234a1087 1884 if(huart->TxXferCount == 0)
mbed_official 375:3d36234a1087 1885 {
mbed_official 375:3d36234a1087 1886 /* Disable the UART Transmit Data Register Empty Interrupt */
mbed_official 375:3d36234a1087 1887 __HAL_UART_DISABLE_IT(huart, UART_IT_TXE);
mbed_official 375:3d36234a1087 1888
mbed_official 375:3d36234a1087 1889 /* Enable the UART Transmit Complete Interrupt */
mbed_official 375:3d36234a1087 1890 __HAL_UART_ENABLE_IT(huart, UART_IT_TC);
mbed_official 375:3d36234a1087 1891
mbed_official 375:3d36234a1087 1892 return HAL_OK;
mbed_official 375:3d36234a1087 1893 }
mbed_official 375:3d36234a1087 1894 else
mbed_official 375:3d36234a1087 1895 {
mbed_official 375:3d36234a1087 1896 if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE))
mbed_official 375:3d36234a1087 1897 {
mbed_official 375:3d36234a1087 1898 tmp = (uint16_t*) huart->pTxBuffPtr;
mbed_official 375:3d36234a1087 1899 huart->Instance->TDR = (*tmp & (uint16_t)0x01FF);
mbed_official 375:3d36234a1087 1900 huart->pTxBuffPtr += 2;
mbed_official 375:3d36234a1087 1901 }
mbed_official 375:3d36234a1087 1902 else
mbed_official 375:3d36234a1087 1903 {
mbed_official 375:3d36234a1087 1904 huart->Instance->TDR = (uint8_t)(*huart->pTxBuffPtr++ & (uint8_t)0xFF);
mbed_official 375:3d36234a1087 1905 }
mbed_official 375:3d36234a1087 1906
mbed_official 375:3d36234a1087 1907 huart->TxXferCount--;
mbed_official 375:3d36234a1087 1908
mbed_official 375:3d36234a1087 1909 return HAL_OK;
mbed_official 375:3d36234a1087 1910 }
mbed_official 375:3d36234a1087 1911 }
mbed_official 375:3d36234a1087 1912 else
mbed_official 375:3d36234a1087 1913 {
mbed_official 375:3d36234a1087 1914 return HAL_BUSY;
mbed_official 375:3d36234a1087 1915 }
mbed_official 375:3d36234a1087 1916 }
mbed_official 375:3d36234a1087 1917
mbed_official 375:3d36234a1087 1918
mbed_official 375:3d36234a1087 1919 /**
mbed_official 375:3d36234a1087 1920 * @brief Wraps up transmission in non blocking mode.
mbed_official 375:3d36234a1087 1921 * @param huart: pointer to a UART_HandleTypeDef structure that contains
mbed_official 375:3d36234a1087 1922 * the configuration information for the specified UART module.
mbed_official 375:3d36234a1087 1923 * @retval HAL status
mbed_official 375:3d36234a1087 1924 */
mbed_official 375:3d36234a1087 1925 static HAL_StatusTypeDef UART_EndTransmit_IT(UART_HandleTypeDef *huart)
mbed_official 375:3d36234a1087 1926 {
mbed_official 375:3d36234a1087 1927 /* Disable the UART Transmit Complete Interrupt */
mbed_official 375:3d36234a1087 1928 __HAL_UART_DISABLE_IT(huart, UART_IT_TC);
mbed_official 375:3d36234a1087 1929
mbed_official 375:3d36234a1087 1930 /* Check if a receive process is ongoing or not */
mbed_official 375:3d36234a1087 1931 if(huart->State == HAL_UART_STATE_BUSY_TX_RX)
mbed_official 375:3d36234a1087 1932 {
mbed_official 375:3d36234a1087 1933 huart->State = HAL_UART_STATE_BUSY_RX;
mbed_official 375:3d36234a1087 1934 }
mbed_official 375:3d36234a1087 1935 else
mbed_official 375:3d36234a1087 1936 {
mbed_official 375:3d36234a1087 1937 /* Disable the UART Error Interrupt: (Frame error, noise error, overrun error) */
mbed_official 375:3d36234a1087 1938 __HAL_UART_DISABLE_IT(huart, UART_IT_ERR);
mbed_official 375:3d36234a1087 1939
mbed_official 375:3d36234a1087 1940 huart->State = HAL_UART_STATE_READY;
mbed_official 375:3d36234a1087 1941 }
mbed_official 375:3d36234a1087 1942
mbed_official 375:3d36234a1087 1943 HAL_UART_TxCpltCallback(huart);
mbed_official 375:3d36234a1087 1944
mbed_official 375:3d36234a1087 1945 return HAL_OK;
mbed_official 375:3d36234a1087 1946 }
mbed_official 375:3d36234a1087 1947
mbed_official 375:3d36234a1087 1948
mbed_official 375:3d36234a1087 1949 /**
mbed_official 375:3d36234a1087 1950 * @brief Receive an amount of data in interrupt mode
mbed_official 375:3d36234a1087 1951 * Function called under interruption only, once
mbed_official 375:3d36234a1087 1952 * interruptions have been enabled by HAL_UART_Receive_IT()
mbed_official 375:3d36234a1087 1953 * @param huart: UART handle
mbed_official 375:3d36234a1087 1954 * @retval HAL status
mbed_official 375:3d36234a1087 1955 */
mbed_official 375:3d36234a1087 1956 static HAL_StatusTypeDef UART_Receive_IT(UART_HandleTypeDef *huart)
mbed_official 375:3d36234a1087 1957 {
mbed_official 375:3d36234a1087 1958 uint16_t* tmp;
mbed_official 375:3d36234a1087 1959 uint16_t uhMask = huart->Mask;
mbed_official 375:3d36234a1087 1960
mbed_official 375:3d36234a1087 1961 if((huart->State == HAL_UART_STATE_BUSY_RX) || (huart->State == HAL_UART_STATE_BUSY_TX_RX))
mbed_official 375:3d36234a1087 1962 {
mbed_official 375:3d36234a1087 1963
mbed_official 375:3d36234a1087 1964 if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE))
mbed_official 375:3d36234a1087 1965 {
mbed_official 375:3d36234a1087 1966 tmp = (uint16_t*) huart->pRxBuffPtr ;
mbed_official 375:3d36234a1087 1967 *tmp = (uint16_t)(huart->Instance->RDR & uhMask);
mbed_official 375:3d36234a1087 1968 huart->pRxBuffPtr +=2;
mbed_official 375:3d36234a1087 1969 }
mbed_official 375:3d36234a1087 1970 else
mbed_official 375:3d36234a1087 1971 {
mbed_official 375:3d36234a1087 1972 *huart->pRxBuffPtr++ = (uint8_t)(huart->Instance->RDR & (uint8_t)uhMask);
mbed_official 375:3d36234a1087 1973 }
mbed_official 375:3d36234a1087 1974
mbed_official 375:3d36234a1087 1975 if(--huart->RxXferCount == 0)
mbed_official 375:3d36234a1087 1976 {
mbed_official 375:3d36234a1087 1977 __HAL_UART_DISABLE_IT(huart, UART_IT_RXNE);
mbed_official 375:3d36234a1087 1978
mbed_official 375:3d36234a1087 1979 /* Check if a transmit Process is ongoing or not */
mbed_official 375:3d36234a1087 1980 if(huart->State == HAL_UART_STATE_BUSY_TX_RX)
mbed_official 375:3d36234a1087 1981 {
mbed_official 375:3d36234a1087 1982 huart->State = HAL_UART_STATE_BUSY_TX;
mbed_official 375:3d36234a1087 1983 }
mbed_official 375:3d36234a1087 1984 else
mbed_official 375:3d36234a1087 1985 {
mbed_official 375:3d36234a1087 1986 /* Disable the UART Parity Error Interrupt */
mbed_official 375:3d36234a1087 1987 __HAL_UART_DISABLE_IT(huart, UART_IT_PE);
mbed_official 375:3d36234a1087 1988
mbed_official 375:3d36234a1087 1989 /* Disable the UART Error Interrupt: (Frame error, noise error, overrun error) */
mbed_official 375:3d36234a1087 1990 __HAL_UART_DISABLE_IT(huart, UART_IT_ERR);
mbed_official 375:3d36234a1087 1991
mbed_official 375:3d36234a1087 1992 huart->State = HAL_UART_STATE_READY;
mbed_official 375:3d36234a1087 1993 }
mbed_official 375:3d36234a1087 1994
mbed_official 375:3d36234a1087 1995 HAL_UART_RxCpltCallback(huart);
mbed_official 375:3d36234a1087 1996
mbed_official 375:3d36234a1087 1997 return HAL_OK;
mbed_official 375:3d36234a1087 1998 }
mbed_official 375:3d36234a1087 1999
mbed_official 375:3d36234a1087 2000 return HAL_OK;
mbed_official 375:3d36234a1087 2001 }
mbed_official 375:3d36234a1087 2002 else
mbed_official 375:3d36234a1087 2003 {
mbed_official 375:3d36234a1087 2004 return HAL_BUSY;
mbed_official 375:3d36234a1087 2005 }
mbed_official 375:3d36234a1087 2006 }
mbed_official 375:3d36234a1087 2007
mbed_official 375:3d36234a1087 2008 /**
mbed_official 375:3d36234a1087 2009 * @}
mbed_official 375:3d36234a1087 2010 */
mbed_official 375:3d36234a1087 2011
mbed_official 237:f3da66175598 2012 #endif /* HAL_UART_MODULE_ENABLED */
mbed_official 237:f3da66175598 2013 /**
mbed_official 237:f3da66175598 2014 * @}
mbed_official 237:f3da66175598 2015 */
mbed_official 237:f3da66175598 2016
mbed_official 237:f3da66175598 2017 /**
mbed_official 237:f3da66175598 2018 * @}
mbed_official 237:f3da66175598 2019 */
mbed_official 237:f3da66175598 2020
mbed_official 237:f3da66175598 2021 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/