fix LPC812 PWM

Dependents:   IR_LED_Send

Fork of mbed-dev by mbed official

Committer:
nameless129
Date:
Mon May 16 16:50:30 2016 +0000
Revision:
129:2e517c56bcfb
Parent:
83:a036322b8637
PWM Fix:Duty 0%??H???????????????

Who changed what in which revision?

UserRevisionLine numberNew contents of line
bogdanm 0:9b334a45a8ff 1 /**
bogdanm 0:9b334a45a8ff 2 ******************************************************************************
bogdanm 0:9b334a45a8ff 3 * @file stm32f7xx_hal_usart.c
bogdanm 0:9b334a45a8ff 4 * @author MCD Application Team
mbed_official 83:a036322b8637 5 * @version V1.0.4
mbed_official 83:a036322b8637 6 * @date 09-December-2015
bogdanm 0:9b334a45a8ff 7 * @brief USART HAL module driver.
bogdanm 0:9b334a45a8ff 8 * This file provides firmware functions to manage the following
bogdanm 0:9b334a45a8ff 9 * functionalities of the Universal Synchronous/Asynchronous Receiver Transmitter
bogdanm 0:9b334a45a8ff 10 * Peripheral (USART).
bogdanm 0:9b334a45a8ff 11 * + Initialization and de-initialization functions
bogdanm 0:9b334a45a8ff 12 * + IO operation functions
bogdanm 0:9b334a45a8ff 13 * + Peripheral Control functions
bogdanm 0:9b334a45a8ff 14 *
bogdanm 0:9b334a45a8ff 15 @verbatim
bogdanm 0:9b334a45a8ff 16 ===============================================================================
bogdanm 0:9b334a45a8ff 17 ##### How to use this driver #####
bogdanm 0:9b334a45a8ff 18 ===============================================================================
bogdanm 0:9b334a45a8ff 19 [..]
bogdanm 0:9b334a45a8ff 20 The USART HAL driver can be used as follows:
bogdanm 0:9b334a45a8ff 21
bogdanm 0:9b334a45a8ff 22 (#) Declare a USART_HandleTypeDef handle structure.
bogdanm 0:9b334a45a8ff 23 (#) Initialize the USART low level resources by implement the HAL_USART_MspInit ()API:
bogdanm 0:9b334a45a8ff 24 (##) Enable the USARTx interface clock.
bogdanm 0:9b334a45a8ff 25 (##) USART pins configuration:
bogdanm 0:9b334a45a8ff 26 (+++) Enable the clock for the USART GPIOs.
bogdanm 0:9b334a45a8ff 27 (+++) Configure these USART pins as alternate function pull-up.
bogdanm 0:9b334a45a8ff 28 (##) NVIC configuration if you need to use interrupt process (HAL_USART_Transmit_IT(),
bogdanm 0:9b334a45a8ff 29 HAL_USART_Receive_IT() and HAL_USART_TransmitReceive_IT() APIs):
bogdanm 0:9b334a45a8ff 30 (+++) Configure the USARTx interrupt priority.
bogdanm 0:9b334a45a8ff 31 (+++) Enable the NVIC USART IRQ handle.
bogdanm 0:9b334a45a8ff 32 (+++) The specific USART interrupts (Transmission complete interrupt,
bogdanm 0:9b334a45a8ff 33 RXNE interrupt and Error Interrupts) will be managed using the macros
bogdanm 0:9b334a45a8ff 34 __HAL_USART_ENABLE_IT() and __HAL_USART_DISABLE_IT() inside the transmit and receive process.
bogdanm 0:9b334a45a8ff 35 (##) DMA Configuration if you need to use DMA process (HAL_USART_Transmit_DMA()
bogdanm 0:9b334a45a8ff 36 HAL_USART_Receive_IT() and HAL_USART_TransmitReceive_IT() APIs):
bogdanm 0:9b334a45a8ff 37 (+++) Declare a DMA handle structure for the Tx/Rx stream.
bogdanm 0:9b334a45a8ff 38 (+++) Enable the DMAx interface clock.
bogdanm 0:9b334a45a8ff 39 (+++) Configure the declared DMA handle structure with the required Tx/Rx parameters.
bogdanm 0:9b334a45a8ff 40 (+++) Configure the DMA Tx/Rx Stream.
bogdanm 0:9b334a45a8ff 41 (+++) Associate the initialized DMA handle to the USART DMA Tx/Rx handle.
bogdanm 0:9b334a45a8ff 42 (+++) Configure the priority and enable the NVIC for the transfer complete interrupt on the DMA Tx/Rx Stream.
bogdanm 0:9b334a45a8ff 43
bogdanm 0:9b334a45a8ff 44 (#) Program the Baud Rate, Word Length, Stop Bit, Parity, Hardware
bogdanm 0:9b334a45a8ff 45 flow control and Mode(Receiver/Transmitter) in the husart Init structure.
bogdanm 0:9b334a45a8ff 46
bogdanm 0:9b334a45a8ff 47 (#) Initialize the USART registers by calling the HAL_USART_Init() API:
bogdanm 0:9b334a45a8ff 48 (++) These API's configures also the low level Hardware (GPIO, CLOCK, CORTEX...etc)
bogdanm 0:9b334a45a8ff 49 by calling the customed HAL_USART_MspInit(&husart) API.
bogdanm 0:9b334a45a8ff 50
bogdanm 0:9b334a45a8ff 51 @endverbatim
bogdanm 0:9b334a45a8ff 52 ******************************************************************************
bogdanm 0:9b334a45a8ff 53 * @attention
bogdanm 0:9b334a45a8ff 54 *
bogdanm 0:9b334a45a8ff 55 * <h2><center>&copy; COPYRIGHT(c) 2015 STMicroelectronics</center></h2>
bogdanm 0:9b334a45a8ff 56 *
bogdanm 0:9b334a45a8ff 57 * Redistribution and use in source and binary forms, with or without modification,
bogdanm 0:9b334a45a8ff 58 * are permitted provided that the following conditions are met:
bogdanm 0:9b334a45a8ff 59 * 1. Redistributions of source code must retain the above copyright notice,
bogdanm 0:9b334a45a8ff 60 * this list of conditions and the following disclaimer.
bogdanm 0:9b334a45a8ff 61 * 2. Redistributions in binary form must reproduce the above copyright notice,
bogdanm 0:9b334a45a8ff 62 * this list of conditions and the following disclaimer in the documentation
bogdanm 0:9b334a45a8ff 63 * and/or other materials provided with the distribution.
bogdanm 0:9b334a45a8ff 64 * 3. Neither the name of STMicroelectronics nor the names of its contributors
bogdanm 0:9b334a45a8ff 65 * may be used to endorse or promote products derived from this software
bogdanm 0:9b334a45a8ff 66 * without specific prior written permission.
bogdanm 0:9b334a45a8ff 67 *
bogdanm 0:9b334a45a8ff 68 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
bogdanm 0:9b334a45a8ff 69 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
bogdanm 0:9b334a45a8ff 70 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
bogdanm 0:9b334a45a8ff 71 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
bogdanm 0:9b334a45a8ff 72 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
bogdanm 0:9b334a45a8ff 73 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
bogdanm 0:9b334a45a8ff 74 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
bogdanm 0:9b334a45a8ff 75 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
bogdanm 0:9b334a45a8ff 76 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
bogdanm 0:9b334a45a8ff 77 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
bogdanm 0:9b334a45a8ff 78 *
bogdanm 0:9b334a45a8ff 79 ******************************************************************************
bogdanm 0:9b334a45a8ff 80 */
bogdanm 0:9b334a45a8ff 81
bogdanm 0:9b334a45a8ff 82 /* Includes ------------------------------------------------------------------*/
bogdanm 0:9b334a45a8ff 83 #include "stm32f7xx_hal.h"
bogdanm 0:9b334a45a8ff 84
bogdanm 0:9b334a45a8ff 85 /** @addtogroup STM32F7xx_HAL_Driver
bogdanm 0:9b334a45a8ff 86 * @{
bogdanm 0:9b334a45a8ff 87 */
bogdanm 0:9b334a45a8ff 88
bogdanm 0:9b334a45a8ff 89 /** @defgroup USART USART
bogdanm 0:9b334a45a8ff 90 * @brief HAL USART Synchronous module driver
bogdanm 0:9b334a45a8ff 91 * @{
bogdanm 0:9b334a45a8ff 92 */
bogdanm 0:9b334a45a8ff 93
bogdanm 0:9b334a45a8ff 94 #ifdef HAL_USART_MODULE_ENABLED
bogdanm 0:9b334a45a8ff 95
bogdanm 0:9b334a45a8ff 96 /* Private typedef -----------------------------------------------------------*/
bogdanm 0:9b334a45a8ff 97 /* Private define ------------------------------------------------------------*/
bogdanm 0:9b334a45a8ff 98 /** @addtogroup USART_Private_Constants
bogdanm 0:9b334a45a8ff 99 * @{
bogdanm 0:9b334a45a8ff 100 */
bogdanm 0:9b334a45a8ff 101 #define DUMMY_DATA ((uint16_t) 0xFFFF)
bogdanm 0:9b334a45a8ff 102 #define TEACK_REACK_TIMEOUT ((uint32_t) 1000)
bogdanm 0:9b334a45a8ff 103 #define USART_CR1_FIELDS ((uint32_t)(USART_CR1_M | USART_CR1_PCE | USART_CR1_PS | \
bogdanm 0:9b334a45a8ff 104 USART_CR1_TE | USART_CR1_RE | USART_CR1_OVER8))
bogdanm 0:9b334a45a8ff 105 #define USART_CR2_FIELDS ((uint32_t)(USART_CR2_CPHA | USART_CR2_CPOL | \
bogdanm 0:9b334a45a8ff 106 USART_CR2_CLKEN | USART_CR2_LBCL | USART_CR2_STOP))
bogdanm 0:9b334a45a8ff 107 /**
bogdanm 0:9b334a45a8ff 108 * @}
bogdanm 0:9b334a45a8ff 109 */
bogdanm 0:9b334a45a8ff 110 /* Private macro -------------------------------------------------------------*/
bogdanm 0:9b334a45a8ff 111 /* Private variables ---------------------------------------------------------*/
bogdanm 0:9b334a45a8ff 112 /* Private function prototypes -----------------------------------------------*/
bogdanm 0:9b334a45a8ff 113 /* Private functions ---------------------------------------------------------*/
bogdanm 0:9b334a45a8ff 114 /** @addtogroup USART_Private_Functions
bogdanm 0:9b334a45a8ff 115 * @{
bogdanm 0:9b334a45a8ff 116 */
bogdanm 0:9b334a45a8ff 117 static void USART_DMATransmitCplt(DMA_HandleTypeDef *hdma);
bogdanm 0:9b334a45a8ff 118 static void USART_DMAReceiveCplt(DMA_HandleTypeDef *hdma);
bogdanm 0:9b334a45a8ff 119 static void USART_DMATxHalfCplt(DMA_HandleTypeDef *hdma);
bogdanm 0:9b334a45a8ff 120 static void USART_DMARxHalfCplt(DMA_HandleTypeDef *hdma);
bogdanm 0:9b334a45a8ff 121 static void USART_DMAError(DMA_HandleTypeDef *hdma);
bogdanm 0:9b334a45a8ff 122 static HAL_StatusTypeDef USART_WaitOnFlagUntilTimeout(USART_HandleTypeDef *husart, uint32_t Flag, FlagStatus Status, uint32_t Timeout);
bogdanm 0:9b334a45a8ff 123 static HAL_StatusTypeDef USART_SetConfig(USART_HandleTypeDef *husart);
bogdanm 0:9b334a45a8ff 124 static HAL_StatusTypeDef USART_CheckIdleState(USART_HandleTypeDef *husart);
bogdanm 0:9b334a45a8ff 125 static HAL_StatusTypeDef USART_Transmit_IT(USART_HandleTypeDef *husart);
bogdanm 0:9b334a45a8ff 126 static HAL_StatusTypeDef USART_EndTransmit_IT(USART_HandleTypeDef *husart);
bogdanm 0:9b334a45a8ff 127 static HAL_StatusTypeDef USART_Receive_IT(USART_HandleTypeDef *husart);
bogdanm 0:9b334a45a8ff 128 static HAL_StatusTypeDef USART_TransmitReceive_IT(USART_HandleTypeDef *husart);
bogdanm 0:9b334a45a8ff 129 /**
bogdanm 0:9b334a45a8ff 130 * @}
bogdanm 0:9b334a45a8ff 131 */
bogdanm 0:9b334a45a8ff 132
bogdanm 0:9b334a45a8ff 133 /* Exported functions --------------------------------------------------------*/
bogdanm 0:9b334a45a8ff 134
bogdanm 0:9b334a45a8ff 135 /** @defgroup USART_Exported_Functions USART Exported Functions
bogdanm 0:9b334a45a8ff 136 * @{
bogdanm 0:9b334a45a8ff 137 */
bogdanm 0:9b334a45a8ff 138
bogdanm 0:9b334a45a8ff 139 /** @defgroup USART_Exported_Functions_Group1 USART Initialization and de-initialization functions
bogdanm 0:9b334a45a8ff 140 * @brief Initialization and Configuration functions
bogdanm 0:9b334a45a8ff 141 *
bogdanm 0:9b334a45a8ff 142 @verbatim
bogdanm 0:9b334a45a8ff 143 ===============================================================================
bogdanm 0:9b334a45a8ff 144 ##### Initialization and Configuration functions #####
bogdanm 0:9b334a45a8ff 145 ===============================================================================
bogdanm 0:9b334a45a8ff 146 [..]
bogdanm 0:9b334a45a8ff 147 This subsection provides a set of functions allowing to initialize the USART
bogdanm 0:9b334a45a8ff 148 in asynchronous and in synchronous modes.
bogdanm 0:9b334a45a8ff 149 (+) For the asynchronous mode only these parameters can be configured:
bogdanm 0:9b334a45a8ff 150 (++) Baud Rate
bogdanm 0:9b334a45a8ff 151 (++) Word Length
bogdanm 0:9b334a45a8ff 152 (++) Stop Bit
bogdanm 0:9b334a45a8ff 153 (++) Parity: If the parity is enabled, then the MSB bit of the data written
bogdanm 0:9b334a45a8ff 154 in the data register is transmitted but is changed by the parity bit.
bogdanm 0:9b334a45a8ff 155 Depending on the frame length defined by the M1 and M0 bits (7-bit,
bogdanm 0:9b334a45a8ff 156 8-bit or 9-bit), the possible USART frame formats are as listed in the
bogdanm 0:9b334a45a8ff 157 following table:
bogdanm 0:9b334a45a8ff 158
bogdanm 0:9b334a45a8ff 159 (+++) +---------------------------------------------------------------+
bogdanm 0:9b334a45a8ff 160 (+++) | M1M0 bits | PCE bit | USART frame |
bogdanm 0:9b334a45a8ff 161 (+++) |-----------------------|---------------------------------------|
bogdanm 0:9b334a45a8ff 162 (+++) | 10 | 0 | | SB | 7-bit data | STB | |
bogdanm 0:9b334a45a8ff 163 (+++) |-----------|-----------|---------------------------------------|
bogdanm 0:9b334a45a8ff 164 (+++) | 10 | 1 | | SB | 6-bit data | PB | STB | |
bogdanm 0:9b334a45a8ff 165 (+++) +---------------------------------------------------------------+
bogdanm 0:9b334a45a8ff 166
bogdanm 0:9b334a45a8ff 167 (++) USART polarity
bogdanm 0:9b334a45a8ff 168 (++) USART phase
bogdanm 0:9b334a45a8ff 169 (++) USART LastBit
bogdanm 0:9b334a45a8ff 170 (++) Receiver/transmitter modes
bogdanm 0:9b334a45a8ff 171
bogdanm 0:9b334a45a8ff 172 [..]
bogdanm 0:9b334a45a8ff 173 The HAL_USART_Init() function follows the USART synchronous configuration
bogdanm 0:9b334a45a8ff 174 procedure (details for the procedure are available in reference manual).
bogdanm 0:9b334a45a8ff 175
bogdanm 0:9b334a45a8ff 176 @endverbatim
bogdanm 0:9b334a45a8ff 177 * @{
bogdanm 0:9b334a45a8ff 178 */
bogdanm 0:9b334a45a8ff 179
bogdanm 0:9b334a45a8ff 180 /**
bogdanm 0:9b334a45a8ff 181 * @brief Initializes the USART mode according to the specified
bogdanm 0:9b334a45a8ff 182 * parameters in the USART_InitTypeDef and create the associated handle.
bogdanm 0:9b334a45a8ff 183 * @param husart: USART handle
bogdanm 0:9b334a45a8ff 184 * @retval HAL status
bogdanm 0:9b334a45a8ff 185 */
bogdanm 0:9b334a45a8ff 186 HAL_StatusTypeDef HAL_USART_Init(USART_HandleTypeDef *husart)
bogdanm 0:9b334a45a8ff 187 {
bogdanm 0:9b334a45a8ff 188 /* Check the USART handle allocation */
bogdanm 0:9b334a45a8ff 189 if(husart == NULL)
bogdanm 0:9b334a45a8ff 190 {
bogdanm 0:9b334a45a8ff 191 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 192 }
bogdanm 0:9b334a45a8ff 193
bogdanm 0:9b334a45a8ff 194 /* Check the parameters */
bogdanm 0:9b334a45a8ff 195 assert_param(IS_USART_INSTANCE(husart->Instance));
bogdanm 0:9b334a45a8ff 196
bogdanm 0:9b334a45a8ff 197 if(husart->State == HAL_USART_STATE_RESET)
bogdanm 0:9b334a45a8ff 198 {
bogdanm 0:9b334a45a8ff 199 /* Allocate lock resource and initialize it */
bogdanm 0:9b334a45a8ff 200 husart->Lock = HAL_UNLOCKED;
bogdanm 0:9b334a45a8ff 201 /* Init the low level hardware : GPIO, CLOCK */
bogdanm 0:9b334a45a8ff 202 HAL_USART_MspInit(husart);
bogdanm 0:9b334a45a8ff 203 }
bogdanm 0:9b334a45a8ff 204
bogdanm 0:9b334a45a8ff 205 husart->State = HAL_USART_STATE_BUSY;
bogdanm 0:9b334a45a8ff 206
bogdanm 0:9b334a45a8ff 207 /* Disable the Peripheral */
bogdanm 0:9b334a45a8ff 208 __HAL_USART_DISABLE(husart);
bogdanm 0:9b334a45a8ff 209
bogdanm 0:9b334a45a8ff 210 /* Set the Usart Communication parameters */
bogdanm 0:9b334a45a8ff 211 if (USART_SetConfig(husart) == HAL_ERROR)
bogdanm 0:9b334a45a8ff 212 {
bogdanm 0:9b334a45a8ff 213 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 214 }
bogdanm 0:9b334a45a8ff 215
bogdanm 0:9b334a45a8ff 216 /* In Synchronous mode, the following bits must be kept cleared:
bogdanm 0:9b334a45a8ff 217 - LINEN bit in the USART_CR2 register
bogdanm 0:9b334a45a8ff 218 - HDSEL, SCEN and IREN bits in the USART_CR3 register.*/
bogdanm 0:9b334a45a8ff 219 husart->Instance->CR2 &= ~USART_CR2_LINEN;
bogdanm 0:9b334a45a8ff 220 husart->Instance->CR3 &= ~(USART_CR3_SCEN | USART_CR3_HDSEL | USART_CR3_IREN);
bogdanm 0:9b334a45a8ff 221
bogdanm 0:9b334a45a8ff 222 /* Enable the Peripheral */
bogdanm 0:9b334a45a8ff 223 __HAL_USART_ENABLE(husart);
bogdanm 0:9b334a45a8ff 224
bogdanm 0:9b334a45a8ff 225 /* TEACK and/or REACK to check before moving husart->State to Ready */
bogdanm 0:9b334a45a8ff 226 return (USART_CheckIdleState(husart));
bogdanm 0:9b334a45a8ff 227 }
bogdanm 0:9b334a45a8ff 228
bogdanm 0:9b334a45a8ff 229 /**
bogdanm 0:9b334a45a8ff 230 * @brief DeInitializes the USART peripheral
bogdanm 0:9b334a45a8ff 231 * @param husart: USART handle
bogdanm 0:9b334a45a8ff 232 * @retval HAL status
bogdanm 0:9b334a45a8ff 233 */
bogdanm 0:9b334a45a8ff 234 HAL_StatusTypeDef HAL_USART_DeInit(USART_HandleTypeDef *husart)
bogdanm 0:9b334a45a8ff 235 {
bogdanm 0:9b334a45a8ff 236 /* Check the USART handle allocation */
bogdanm 0:9b334a45a8ff 237 if(husart == NULL)
bogdanm 0:9b334a45a8ff 238 {
bogdanm 0:9b334a45a8ff 239 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 240 }
bogdanm 0:9b334a45a8ff 241
bogdanm 0:9b334a45a8ff 242 /* Check the parameters */
bogdanm 0:9b334a45a8ff 243 assert_param(IS_USART_INSTANCE(husart->Instance));
bogdanm 0:9b334a45a8ff 244
bogdanm 0:9b334a45a8ff 245 husart->State = HAL_USART_STATE_BUSY;
bogdanm 0:9b334a45a8ff 246
bogdanm 0:9b334a45a8ff 247 husart->Instance->CR1 = 0x0;
bogdanm 0:9b334a45a8ff 248 husart->Instance->CR2 = 0x0;
bogdanm 0:9b334a45a8ff 249 husart->Instance->CR3 = 0x0;
bogdanm 0:9b334a45a8ff 250
bogdanm 0:9b334a45a8ff 251 /* DeInit the low level hardware */
bogdanm 0:9b334a45a8ff 252 HAL_USART_MspDeInit(husart);
bogdanm 0:9b334a45a8ff 253
bogdanm 0:9b334a45a8ff 254 husart->ErrorCode = HAL_USART_ERROR_NONE;
bogdanm 0:9b334a45a8ff 255 husart->State = HAL_USART_STATE_RESET;
bogdanm 0:9b334a45a8ff 256
bogdanm 0:9b334a45a8ff 257 /* Process Unlock */
bogdanm 0:9b334a45a8ff 258 __HAL_UNLOCK(husart);
bogdanm 0:9b334a45a8ff 259
bogdanm 0:9b334a45a8ff 260 return HAL_OK;
bogdanm 0:9b334a45a8ff 261 }
bogdanm 0:9b334a45a8ff 262
bogdanm 0:9b334a45a8ff 263 /**
bogdanm 0:9b334a45a8ff 264 * @brief USART MSP Init
bogdanm 0:9b334a45a8ff 265 * @param husart: USART handle
bogdanm 0:9b334a45a8ff 266 * @retval None
bogdanm 0:9b334a45a8ff 267 */
bogdanm 0:9b334a45a8ff 268 __weak void HAL_USART_MspInit(USART_HandleTypeDef *husart)
bogdanm 0:9b334a45a8ff 269 {
mbed_official 83:a036322b8637 270 /* Prevent unused argument(s) compilation warning */
mbed_official 83:a036322b8637 271 UNUSED(husart);
mbed_official 83:a036322b8637 272
bogdanm 0:9b334a45a8ff 273 /* NOTE : This function should not be modified, when the callback is needed,
bogdanm 0:9b334a45a8ff 274 the HAL_USART_MspInit can be implemented in the user file
bogdanm 0:9b334a45a8ff 275 */
bogdanm 0:9b334a45a8ff 276 }
bogdanm 0:9b334a45a8ff 277
bogdanm 0:9b334a45a8ff 278 /**
bogdanm 0:9b334a45a8ff 279 * @brief USART MSP DeInit
bogdanm 0:9b334a45a8ff 280 * @param husart: USART handle
bogdanm 0:9b334a45a8ff 281 * @retval None
bogdanm 0:9b334a45a8ff 282 */
bogdanm 0:9b334a45a8ff 283 __weak void HAL_USART_MspDeInit(USART_HandleTypeDef *husart)
bogdanm 0:9b334a45a8ff 284 {
mbed_official 83:a036322b8637 285 /* Prevent unused argument(s) compilation warning */
mbed_official 83:a036322b8637 286 UNUSED(husart);
mbed_official 83:a036322b8637 287
bogdanm 0:9b334a45a8ff 288 /* NOTE : This function should not be modified, when the callback is needed,
bogdanm 0:9b334a45a8ff 289 the HAL_USART_MspDeInit can be implemented in the user file
bogdanm 0:9b334a45a8ff 290 */
bogdanm 0:9b334a45a8ff 291 }
bogdanm 0:9b334a45a8ff 292
bogdanm 0:9b334a45a8ff 293 /**
bogdanm 0:9b334a45a8ff 294 * @}
bogdanm 0:9b334a45a8ff 295 */
bogdanm 0:9b334a45a8ff 296
bogdanm 0:9b334a45a8ff 297 /** @defgroup USART_Exported_Functions_Group2 IO operation functions
bogdanm 0:9b334a45a8ff 298 * @brief USART Transmit and Receive functions
bogdanm 0:9b334a45a8ff 299 *
bogdanm 0:9b334a45a8ff 300 @verbatim
bogdanm 0:9b334a45a8ff 301 ===============================================================================
bogdanm 0:9b334a45a8ff 302 ##### IO operation functions #####
bogdanm 0:9b334a45a8ff 303 ===============================================================================
bogdanm 0:9b334a45a8ff 304 This subsection provides a set of functions allowing to manage the USART synchronous
bogdanm 0:9b334a45a8ff 305 data transfers.
bogdanm 0:9b334a45a8ff 306
bogdanm 0:9b334a45a8ff 307 [..] The USART supports master mode only: it cannot receive or send data related to an input
bogdanm 0:9b334a45a8ff 308 clock (SCLK is always an output).
bogdanm 0:9b334a45a8ff 309
bogdanm 0:9b334a45a8ff 310 (#) There are two mode of transfer:
bogdanm 0:9b334a45a8ff 311 (++) Blocking mode: The communication is performed in polling mode.
bogdanm 0:9b334a45a8ff 312 The HAL status of all data processing is returned by the same function
bogdanm 0:9b334a45a8ff 313 after finishing transfer.
bogdanm 0:9b334a45a8ff 314 (++) No-Blocking mode: The communication is performed using Interrupts
bogdanm 0:9b334a45a8ff 315 or DMA, These API's return the HAL status.
bogdanm 0:9b334a45a8ff 316 The end of the data processing will be indicated through the
bogdanm 0:9b334a45a8ff 317 dedicated USART IRQ when using Interrupt mode or the DMA IRQ when
bogdanm 0:9b334a45a8ff 318 using DMA mode.
bogdanm 0:9b334a45a8ff 319 The HAL_USART_TxCpltCallback(), HAL_USART_RxCpltCallback() and HAL_USART_TxRxCpltCallback() user callbacks
bogdanm 0:9b334a45a8ff 320 will be executed respectively at the end of the transmit or Receive process
bogdanm 0:9b334a45a8ff 321 The HAL_USART_ErrorCallback()user callback will be executed when a communication error is detected
bogdanm 0:9b334a45a8ff 322
bogdanm 0:9b334a45a8ff 323 (#) Blocking mode API's are :
bogdanm 0:9b334a45a8ff 324 (++) HAL_USART_Transmit()in simplex mode
bogdanm 0:9b334a45a8ff 325 (++) HAL_USART_Receive() in full duplex receive only
bogdanm 0:9b334a45a8ff 326 (++) HAL_USART_TransmitReceive() in full duplex mode
bogdanm 0:9b334a45a8ff 327
bogdanm 0:9b334a45a8ff 328 (#) Non-Blocking mode API's with Interrupt are :
bogdanm 0:9b334a45a8ff 329 (++) HAL_USART_Transmit_IT()in simplex mode
bogdanm 0:9b334a45a8ff 330 (++) HAL_USART_Receive_IT() in full duplex receive only
bogdanm 0:9b334a45a8ff 331 (++) HAL_USART_TransmitReceive_IT()in full duplex mode
bogdanm 0:9b334a45a8ff 332 (++) HAL_USART_IRQHandler()
bogdanm 0:9b334a45a8ff 333
bogdanm 0:9b334a45a8ff 334 (#) No-Blocking mode functions with DMA are :
bogdanm 0:9b334a45a8ff 335 (++) HAL_USART_Transmit_DMA()in simplex mode
bogdanm 0:9b334a45a8ff 336 (++) HAL_USART_Receive_DMA() in full duplex receive only
bogdanm 0:9b334a45a8ff 337 (++) HAL_USART_TransmitReceive_DMA() in full duplex mode
bogdanm 0:9b334a45a8ff 338 (++) HAL_USART_DMAPause()
bogdanm 0:9b334a45a8ff 339 (++) HAL_USART_DMAResume()
bogdanm 0:9b334a45a8ff 340 (++) HAL_USART_DMAStop()
bogdanm 0:9b334a45a8ff 341
bogdanm 0:9b334a45a8ff 342 (#) A set of Transfer Complete Callbacks are provided in No_Blocking mode:
bogdanm 0:9b334a45a8ff 343 (++) HAL_USART_TxCpltCallback()
bogdanm 0:9b334a45a8ff 344 (++) HAL_USART_RxCpltCallback()
bogdanm 0:9b334a45a8ff 345 (++) HAL_USART_TxHalfCpltCallback()
bogdanm 0:9b334a45a8ff 346 (++) HAL_USART_RxHalfCpltCallback()
bogdanm 0:9b334a45a8ff 347 (++) HAL_USART_ErrorCallback()
bogdanm 0:9b334a45a8ff 348 (++) HAL_USART_TxRxCpltCallback()
bogdanm 0:9b334a45a8ff 349
bogdanm 0:9b334a45a8ff 350 @endverbatim
bogdanm 0:9b334a45a8ff 351 * @{
bogdanm 0:9b334a45a8ff 352 */
bogdanm 0:9b334a45a8ff 353
bogdanm 0:9b334a45a8ff 354 /**
bogdanm 0:9b334a45a8ff 355 * @brief Simplex Send an amount of data in blocking mode
bogdanm 0:9b334a45a8ff 356 * @param husart: USART handle
bogdanm 0:9b334a45a8ff 357 * @param pTxData: pointer to data buffer
bogdanm 0:9b334a45a8ff 358 * @param Size: amount of data to be sent
bogdanm 0:9b334a45a8ff 359 * @param Timeout : Timeout duration
bogdanm 0:9b334a45a8ff 360 * @retval HAL status
bogdanm 0:9b334a45a8ff 361 */
bogdanm 0:9b334a45a8ff 362 HAL_StatusTypeDef HAL_USART_Transmit(USART_HandleTypeDef *husart, uint8_t *pTxData, uint16_t Size, uint32_t Timeout)
bogdanm 0:9b334a45a8ff 363 {
bogdanm 0:9b334a45a8ff 364 uint16_t* tmp;
bogdanm 0:9b334a45a8ff 365
bogdanm 0:9b334a45a8ff 366 if(husart->State == HAL_USART_STATE_READY)
bogdanm 0:9b334a45a8ff 367 {
bogdanm 0:9b334a45a8ff 368 if((pTxData == NULL) || (Size == 0))
bogdanm 0:9b334a45a8ff 369 {
bogdanm 0:9b334a45a8ff 370 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 371 }
bogdanm 0:9b334a45a8ff 372
bogdanm 0:9b334a45a8ff 373 /* Process Locked */
bogdanm 0:9b334a45a8ff 374 __HAL_LOCK(husart);
bogdanm 0:9b334a45a8ff 375
bogdanm 0:9b334a45a8ff 376 husart->ErrorCode = HAL_USART_ERROR_NONE;
bogdanm 0:9b334a45a8ff 377 husart->State = HAL_USART_STATE_BUSY_TX;
bogdanm 0:9b334a45a8ff 378
bogdanm 0:9b334a45a8ff 379 husart->TxXferSize = Size;
bogdanm 0:9b334a45a8ff 380 husart->TxXferCount = Size;
bogdanm 0:9b334a45a8ff 381
bogdanm 0:9b334a45a8ff 382 /* Check the remaining data to be sent */
bogdanm 0:9b334a45a8ff 383 while(husart->TxXferCount > 0)
bogdanm 0:9b334a45a8ff 384 {
bogdanm 0:9b334a45a8ff 385 husart->TxXferCount--;
bogdanm 0:9b334a45a8ff 386 if(USART_WaitOnFlagUntilTimeout(husart, USART_FLAG_TC, RESET, Timeout) != HAL_OK)
bogdanm 0:9b334a45a8ff 387 {
bogdanm 0:9b334a45a8ff 388 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 389 }
bogdanm 0:9b334a45a8ff 390 if((husart->Init.WordLength == USART_WORDLENGTH_9B) && (husart->Init.Parity == USART_PARITY_NONE))
bogdanm 0:9b334a45a8ff 391 {
bogdanm 0:9b334a45a8ff 392 tmp = (uint16_t*) pTxData;
bogdanm 0:9b334a45a8ff 393 husart->Instance->TDR = (*tmp & (uint16_t)0x01FF);
bogdanm 0:9b334a45a8ff 394 pTxData += 2;
bogdanm 0:9b334a45a8ff 395 }
bogdanm 0:9b334a45a8ff 396 else
bogdanm 0:9b334a45a8ff 397 {
bogdanm 0:9b334a45a8ff 398 husart->Instance->TDR = (*pTxData++ & (uint8_t)0xFF);
bogdanm 0:9b334a45a8ff 399 }
bogdanm 0:9b334a45a8ff 400 }
bogdanm 0:9b334a45a8ff 401
bogdanm 0:9b334a45a8ff 402 if(USART_WaitOnFlagUntilTimeout(husart, USART_FLAG_TC, RESET, Timeout) != HAL_OK)
bogdanm 0:9b334a45a8ff 403 {
bogdanm 0:9b334a45a8ff 404 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 405 }
bogdanm 0:9b334a45a8ff 406
bogdanm 0:9b334a45a8ff 407 husart->State = HAL_USART_STATE_READY;
bogdanm 0:9b334a45a8ff 408
bogdanm 0:9b334a45a8ff 409 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 410 __HAL_UNLOCK(husart);
bogdanm 0:9b334a45a8ff 411
bogdanm 0:9b334a45a8ff 412 return HAL_OK;
bogdanm 0:9b334a45a8ff 413 }
bogdanm 0:9b334a45a8ff 414 else
bogdanm 0:9b334a45a8ff 415 {
bogdanm 0:9b334a45a8ff 416 return HAL_BUSY;
bogdanm 0:9b334a45a8ff 417 }
bogdanm 0:9b334a45a8ff 418 }
bogdanm 0:9b334a45a8ff 419
bogdanm 0:9b334a45a8ff 420 /**
bogdanm 0:9b334a45a8ff 421 * @brief Receive an amount of data in blocking mode
bogdanm 0:9b334a45a8ff 422 * @note To receive synchronous data, dummy data are simultaneously transmitted
bogdanm 0:9b334a45a8ff 423 * @param husart: USART handle
bogdanm 0:9b334a45a8ff 424 * @param pRxData: pointer to data buffer
bogdanm 0:9b334a45a8ff 425 * @param Size: amount of data to be received
bogdanm 0:9b334a45a8ff 426 * @param Timeout : Timeout duration
bogdanm 0:9b334a45a8ff 427 * @retval HAL status
bogdanm 0:9b334a45a8ff 428 */
bogdanm 0:9b334a45a8ff 429 HAL_StatusTypeDef HAL_USART_Receive(USART_HandleTypeDef *husart, uint8_t *pRxData, uint16_t Size, uint32_t Timeout)
bogdanm 0:9b334a45a8ff 430 {
bogdanm 0:9b334a45a8ff 431 uint16_t* tmp;
bogdanm 0:9b334a45a8ff 432 uint16_t uhMask;
bogdanm 0:9b334a45a8ff 433
bogdanm 0:9b334a45a8ff 434 if(husart->State == HAL_USART_STATE_READY)
bogdanm 0:9b334a45a8ff 435 {
bogdanm 0:9b334a45a8ff 436 if((pRxData == NULL) || (Size == 0))
bogdanm 0:9b334a45a8ff 437 {
bogdanm 0:9b334a45a8ff 438 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 439 }
bogdanm 0:9b334a45a8ff 440 /* Process Locked */
bogdanm 0:9b334a45a8ff 441 __HAL_LOCK(husart);
bogdanm 0:9b334a45a8ff 442
bogdanm 0:9b334a45a8ff 443 husart->ErrorCode = HAL_USART_ERROR_NONE;
bogdanm 0:9b334a45a8ff 444 husart->State = HAL_USART_STATE_BUSY_RX;
bogdanm 0:9b334a45a8ff 445
bogdanm 0:9b334a45a8ff 446 husart->RxXferSize = Size;
bogdanm 0:9b334a45a8ff 447 husart->RxXferCount = Size;
bogdanm 0:9b334a45a8ff 448
bogdanm 0:9b334a45a8ff 449 /* Computation of USART mask to apply to RDR register */
bogdanm 0:9b334a45a8ff 450 __HAL_USART_MASK_COMPUTATION(husart);
bogdanm 0:9b334a45a8ff 451 uhMask = husart->Mask;
bogdanm 0:9b334a45a8ff 452
bogdanm 0:9b334a45a8ff 453 /* as long as data have to be received */
bogdanm 0:9b334a45a8ff 454 while(husart->RxXferCount > 0)
bogdanm 0:9b334a45a8ff 455 {
bogdanm 0:9b334a45a8ff 456 husart->RxXferCount--;
bogdanm 0:9b334a45a8ff 457
bogdanm 0:9b334a45a8ff 458 /* Wait until TC flag is set to send dummy byte in order to generate the
bogdanm 0:9b334a45a8ff 459 * clock for the slave to send data.
bogdanm 0:9b334a45a8ff 460 * Whatever the frame length (7, 8 or 9-bit long), the same dummy value
bogdanm 0:9b334a45a8ff 461 * can be written for all the cases. */
bogdanm 0:9b334a45a8ff 462 if(USART_WaitOnFlagUntilTimeout(husart, USART_FLAG_TC, RESET, Timeout) != HAL_OK)
bogdanm 0:9b334a45a8ff 463 {
bogdanm 0:9b334a45a8ff 464 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 465 }
bogdanm 0:9b334a45a8ff 466 husart->Instance->TDR = (DUMMY_DATA & (uint16_t)0x0FF);
bogdanm 0:9b334a45a8ff 467
bogdanm 0:9b334a45a8ff 468 /* Wait for RXNE Flag */
bogdanm 0:9b334a45a8ff 469 if(USART_WaitOnFlagUntilTimeout(husart, USART_FLAG_RXNE, RESET, Timeout) != HAL_OK)
bogdanm 0:9b334a45a8ff 470 {
bogdanm 0:9b334a45a8ff 471 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 472 }
bogdanm 0:9b334a45a8ff 473
bogdanm 0:9b334a45a8ff 474 if((husart->Init.WordLength == USART_WORDLENGTH_9B) && (husart->Init.Parity == USART_PARITY_NONE))
bogdanm 0:9b334a45a8ff 475 {
bogdanm 0:9b334a45a8ff 476 tmp = (uint16_t*) pRxData ;
bogdanm 0:9b334a45a8ff 477 *tmp = (uint16_t)(husart->Instance->RDR & uhMask);
bogdanm 0:9b334a45a8ff 478 pRxData +=2;
bogdanm 0:9b334a45a8ff 479 }
bogdanm 0:9b334a45a8ff 480 else
bogdanm 0:9b334a45a8ff 481 {
bogdanm 0:9b334a45a8ff 482 *pRxData++ = (uint8_t)(husart->Instance->RDR & (uint8_t)uhMask);
bogdanm 0:9b334a45a8ff 483 }
bogdanm 0:9b334a45a8ff 484 }
bogdanm 0:9b334a45a8ff 485
bogdanm 0:9b334a45a8ff 486 husart->State = HAL_USART_STATE_READY;
bogdanm 0:9b334a45a8ff 487
bogdanm 0:9b334a45a8ff 488 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 489 __HAL_UNLOCK(husart);
bogdanm 0:9b334a45a8ff 490
bogdanm 0:9b334a45a8ff 491 return HAL_OK;
bogdanm 0:9b334a45a8ff 492 }
bogdanm 0:9b334a45a8ff 493 else
bogdanm 0:9b334a45a8ff 494 {
bogdanm 0:9b334a45a8ff 495 return HAL_BUSY;
bogdanm 0:9b334a45a8ff 496 }
bogdanm 0:9b334a45a8ff 497 }
bogdanm 0:9b334a45a8ff 498
bogdanm 0:9b334a45a8ff 499 /**
bogdanm 0:9b334a45a8ff 500 * @brief Full-Duplex Send and Receive an amount of data in blocking mode
bogdanm 0:9b334a45a8ff 501 * @param husart: USART handle
bogdanm 0:9b334a45a8ff 502 * @param pTxData: pointer to TX data buffer
bogdanm 0:9b334a45a8ff 503 * @param pRxData: pointer to RX data buffer
bogdanm 0:9b334a45a8ff 504 * @param Size: amount of data to be sent (same amount to be received)
bogdanm 0:9b334a45a8ff 505 * @param Timeout : Timeout duration
bogdanm 0:9b334a45a8ff 506 * @retval HAL status
bogdanm 0:9b334a45a8ff 507 */
bogdanm 0:9b334a45a8ff 508 HAL_StatusTypeDef HAL_USART_TransmitReceive(USART_HandleTypeDef *husart, uint8_t *pTxData, uint8_t *pRxData, uint16_t Size, uint32_t Timeout)
bogdanm 0:9b334a45a8ff 509 {
bogdanm 0:9b334a45a8ff 510 uint16_t* tmp;
bogdanm 0:9b334a45a8ff 511 uint16_t uhMask;
bogdanm 0:9b334a45a8ff 512
bogdanm 0:9b334a45a8ff 513 if(husart->State == HAL_USART_STATE_READY)
bogdanm 0:9b334a45a8ff 514 {
bogdanm 0:9b334a45a8ff 515 if((pTxData == NULL) || (pRxData == NULL) || (Size == 0))
bogdanm 0:9b334a45a8ff 516 {
bogdanm 0:9b334a45a8ff 517 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 518 }
bogdanm 0:9b334a45a8ff 519 /* Process Locked */
bogdanm 0:9b334a45a8ff 520 __HAL_LOCK(husart);
bogdanm 0:9b334a45a8ff 521
bogdanm 0:9b334a45a8ff 522 husart->ErrorCode = HAL_USART_ERROR_NONE;
bogdanm 0:9b334a45a8ff 523 husart->State = HAL_USART_STATE_BUSY_RX;
bogdanm 0:9b334a45a8ff 524
bogdanm 0:9b334a45a8ff 525 husart->RxXferSize = Size;
bogdanm 0:9b334a45a8ff 526 husart->TxXferSize = Size;
bogdanm 0:9b334a45a8ff 527 husart->TxXferCount = Size;
bogdanm 0:9b334a45a8ff 528 husart->RxXferCount = Size;
bogdanm 0:9b334a45a8ff 529
bogdanm 0:9b334a45a8ff 530 /* Computation of USART mask to apply to RDR register */
bogdanm 0:9b334a45a8ff 531 __HAL_USART_MASK_COMPUTATION(husart);
bogdanm 0:9b334a45a8ff 532 uhMask = husart->Mask;
bogdanm 0:9b334a45a8ff 533
bogdanm 0:9b334a45a8ff 534 /* Check the remain data to be sent */
bogdanm 0:9b334a45a8ff 535 while(husart->TxXferCount > 0)
bogdanm 0:9b334a45a8ff 536 {
bogdanm 0:9b334a45a8ff 537 husart->TxXferCount--;
bogdanm 0:9b334a45a8ff 538 husart->RxXferCount--;
bogdanm 0:9b334a45a8ff 539
bogdanm 0:9b334a45a8ff 540 /* Wait until TC flag is set to send data */
bogdanm 0:9b334a45a8ff 541 if(USART_WaitOnFlagUntilTimeout(husart, USART_FLAG_TC, RESET, Timeout) != HAL_OK)
bogdanm 0:9b334a45a8ff 542 {
bogdanm 0:9b334a45a8ff 543 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 544 }
bogdanm 0:9b334a45a8ff 545 if((husart->Init.WordLength == USART_WORDLENGTH_9B) && (husart->Init.Parity == USART_PARITY_NONE))
bogdanm 0:9b334a45a8ff 546 {
bogdanm 0:9b334a45a8ff 547 tmp = (uint16_t*) pTxData;
bogdanm 0:9b334a45a8ff 548 husart->Instance->TDR = (*tmp & uhMask);
bogdanm 0:9b334a45a8ff 549 pTxData += 2;
bogdanm 0:9b334a45a8ff 550 }
bogdanm 0:9b334a45a8ff 551 else
bogdanm 0:9b334a45a8ff 552 {
bogdanm 0:9b334a45a8ff 553 husart->Instance->TDR = (*pTxData++ & (uint8_t)uhMask);
bogdanm 0:9b334a45a8ff 554 }
bogdanm 0:9b334a45a8ff 555
bogdanm 0:9b334a45a8ff 556 /* Wait for RXNE Flag */
bogdanm 0:9b334a45a8ff 557 if(USART_WaitOnFlagUntilTimeout(husart, USART_FLAG_RXNE, RESET, Timeout) != HAL_OK)
bogdanm 0:9b334a45a8ff 558 {
bogdanm 0:9b334a45a8ff 559 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 560 }
bogdanm 0:9b334a45a8ff 561
bogdanm 0:9b334a45a8ff 562 if((husart->Init.WordLength == USART_WORDLENGTH_9B) && (husart->Init.Parity == USART_PARITY_NONE))
bogdanm 0:9b334a45a8ff 563 {
bogdanm 0:9b334a45a8ff 564 tmp = (uint16_t*) pRxData ;
bogdanm 0:9b334a45a8ff 565 *tmp = (uint16_t)(husart->Instance->RDR & uhMask);
bogdanm 0:9b334a45a8ff 566 pRxData +=2;
bogdanm 0:9b334a45a8ff 567 }
bogdanm 0:9b334a45a8ff 568 else
bogdanm 0:9b334a45a8ff 569 {
bogdanm 0:9b334a45a8ff 570 *pRxData++ = (uint8_t)(husart->Instance->RDR & (uint8_t)uhMask);
bogdanm 0:9b334a45a8ff 571 }
bogdanm 0:9b334a45a8ff 572 }
bogdanm 0:9b334a45a8ff 573
bogdanm 0:9b334a45a8ff 574 husart->State = HAL_USART_STATE_READY;
bogdanm 0:9b334a45a8ff 575
bogdanm 0:9b334a45a8ff 576 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 577 __HAL_UNLOCK(husart);
bogdanm 0:9b334a45a8ff 578
bogdanm 0:9b334a45a8ff 579 return HAL_OK;
bogdanm 0:9b334a45a8ff 580 }
bogdanm 0:9b334a45a8ff 581 else
bogdanm 0:9b334a45a8ff 582 {
bogdanm 0:9b334a45a8ff 583 return HAL_BUSY;
bogdanm 0:9b334a45a8ff 584 }
bogdanm 0:9b334a45a8ff 585 }
bogdanm 0:9b334a45a8ff 586
bogdanm 0:9b334a45a8ff 587 /**
bogdanm 0:9b334a45a8ff 588 * @brief Send an amount of data in interrupt mode
bogdanm 0:9b334a45a8ff 589 * @param husart: USART handle
bogdanm 0:9b334a45a8ff 590 * @param pTxData: pointer to data buffer
bogdanm 0:9b334a45a8ff 591 * @param Size: amount of data to be sent
bogdanm 0:9b334a45a8ff 592 * @retval HAL status
bogdanm 0:9b334a45a8ff 593 */
bogdanm 0:9b334a45a8ff 594 HAL_StatusTypeDef HAL_USART_Transmit_IT(USART_HandleTypeDef *husart, uint8_t *pTxData, uint16_t Size)
bogdanm 0:9b334a45a8ff 595 {
bogdanm 0:9b334a45a8ff 596 if(husart->State == HAL_USART_STATE_READY)
bogdanm 0:9b334a45a8ff 597 {
bogdanm 0:9b334a45a8ff 598 if((pTxData == NULL ) || (Size == 0))
bogdanm 0:9b334a45a8ff 599 {
bogdanm 0:9b334a45a8ff 600 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 601 }
bogdanm 0:9b334a45a8ff 602
bogdanm 0:9b334a45a8ff 603 /* Process Locked */
bogdanm 0:9b334a45a8ff 604 __HAL_LOCK(husart);
bogdanm 0:9b334a45a8ff 605
bogdanm 0:9b334a45a8ff 606 husart->pTxBuffPtr = pTxData;
bogdanm 0:9b334a45a8ff 607 husart->TxXferSize = Size;
bogdanm 0:9b334a45a8ff 608 husart->TxXferCount = Size;
bogdanm 0:9b334a45a8ff 609
bogdanm 0:9b334a45a8ff 610 husart->ErrorCode = HAL_USART_ERROR_NONE;
bogdanm 0:9b334a45a8ff 611 husart->State = HAL_USART_STATE_BUSY_TX;
bogdanm 0:9b334a45a8ff 612
bogdanm 0:9b334a45a8ff 613 /* The USART Error Interrupts: (Frame error, noise error, overrun error)
bogdanm 0:9b334a45a8ff 614 are not managed by the USART Transmit Process to avoid the overrun interrupt
bogdanm 0:9b334a45a8ff 615 when the usart mode is configured for transmit and receive "USART_MODE_TX_RX"
bogdanm 0:9b334a45a8ff 616 to benefit for the frame error and noise interrupts the usart mode should be
bogdanm 0:9b334a45a8ff 617 configured only for transmit "USART_MODE_TX" */
bogdanm 0:9b334a45a8ff 618
bogdanm 0:9b334a45a8ff 619 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 620 __HAL_UNLOCK(husart);
bogdanm 0:9b334a45a8ff 621
bogdanm 0:9b334a45a8ff 622 /* Enable the USART Transmit Data Register Empty Interrupt */
bogdanm 0:9b334a45a8ff 623 __HAL_USART_ENABLE_IT(husart, USART_IT_TXE);
bogdanm 0:9b334a45a8ff 624
bogdanm 0:9b334a45a8ff 625 return HAL_OK;
bogdanm 0:9b334a45a8ff 626 }
bogdanm 0:9b334a45a8ff 627 else
bogdanm 0:9b334a45a8ff 628 {
bogdanm 0:9b334a45a8ff 629 return HAL_BUSY;
bogdanm 0:9b334a45a8ff 630 }
bogdanm 0:9b334a45a8ff 631 }
bogdanm 0:9b334a45a8ff 632
bogdanm 0:9b334a45a8ff 633 /**
bogdanm 0:9b334a45a8ff 634 * @brief Receive an amount of data in blocking mode
bogdanm 0:9b334a45a8ff 635 * To receive synchronous data, dummy data are simultaneously transmitted
bogdanm 0:9b334a45a8ff 636 * @param husart: USART handle
bogdanm 0:9b334a45a8ff 637 * @param pRxData: pointer to data buffer
bogdanm 0:9b334a45a8ff 638 * @param Size: amount of data to be received
bogdanm 0:9b334a45a8ff 639 * @retval HAL status
bogdanm 0:9b334a45a8ff 640 */
bogdanm 0:9b334a45a8ff 641 HAL_StatusTypeDef HAL_USART_Receive_IT(USART_HandleTypeDef *husart, uint8_t *pRxData, uint16_t Size)
bogdanm 0:9b334a45a8ff 642 {
bogdanm 0:9b334a45a8ff 643 if(husart->State == HAL_USART_STATE_READY)
bogdanm 0:9b334a45a8ff 644 {
bogdanm 0:9b334a45a8ff 645 if((pRxData == NULL ) || (Size == 0))
bogdanm 0:9b334a45a8ff 646 {
bogdanm 0:9b334a45a8ff 647 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 648 }
bogdanm 0:9b334a45a8ff 649 /* Process Locked */
bogdanm 0:9b334a45a8ff 650 __HAL_LOCK(husart);
bogdanm 0:9b334a45a8ff 651
bogdanm 0:9b334a45a8ff 652 husart->pRxBuffPtr = pRxData;
bogdanm 0:9b334a45a8ff 653 husart->RxXferSize = Size;
bogdanm 0:9b334a45a8ff 654 husart->RxXferCount = Size;
bogdanm 0:9b334a45a8ff 655
bogdanm 0:9b334a45a8ff 656 __HAL_USART_MASK_COMPUTATION(husart);
bogdanm 0:9b334a45a8ff 657
bogdanm 0:9b334a45a8ff 658 husart->ErrorCode = HAL_USART_ERROR_NONE;
bogdanm 0:9b334a45a8ff 659 husart->State = HAL_USART_STATE_BUSY_RX;
bogdanm 0:9b334a45a8ff 660
bogdanm 0:9b334a45a8ff 661 /* Enable the USART Parity Error Interrupt */
bogdanm 0:9b334a45a8ff 662 __HAL_USART_ENABLE_IT(husart, USART_IT_PE);
bogdanm 0:9b334a45a8ff 663
bogdanm 0:9b334a45a8ff 664 /* Enable the USART Error Interrupt: (Frame error, noise error, overrun error) */
bogdanm 0:9b334a45a8ff 665 __HAL_USART_ENABLE_IT(husart, USART_IT_ERR);
bogdanm 0:9b334a45a8ff 666
bogdanm 0:9b334a45a8ff 667 /* Enable the USART Data Register not empty Interrupt */
bogdanm 0:9b334a45a8ff 668 __HAL_USART_ENABLE_IT(husart, USART_IT_RXNE);
bogdanm 0:9b334a45a8ff 669
bogdanm 0:9b334a45a8ff 670 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 671 __HAL_UNLOCK(husart);
bogdanm 0:9b334a45a8ff 672
bogdanm 0:9b334a45a8ff 673
bogdanm 0:9b334a45a8ff 674 /* Send dummy byte in order to generate the clock for the Slave to send the next data */
bogdanm 0:9b334a45a8ff 675 if(husart->Init.WordLength == USART_WORDLENGTH_9B)
bogdanm 0:9b334a45a8ff 676 {
bogdanm 0:9b334a45a8ff 677 husart->Instance->TDR = (DUMMY_DATA & (uint16_t)0x01FF);
bogdanm 0:9b334a45a8ff 678 }
bogdanm 0:9b334a45a8ff 679 else
bogdanm 0:9b334a45a8ff 680 {
bogdanm 0:9b334a45a8ff 681 husart->Instance->TDR = (DUMMY_DATA & (uint16_t)0x00FF);
bogdanm 0:9b334a45a8ff 682 }
bogdanm 0:9b334a45a8ff 683
bogdanm 0:9b334a45a8ff 684 return HAL_OK;
bogdanm 0:9b334a45a8ff 685 }
bogdanm 0:9b334a45a8ff 686 else
bogdanm 0:9b334a45a8ff 687 {
bogdanm 0:9b334a45a8ff 688 return HAL_BUSY;
bogdanm 0:9b334a45a8ff 689 }
bogdanm 0:9b334a45a8ff 690 }
bogdanm 0:9b334a45a8ff 691
bogdanm 0:9b334a45a8ff 692 /**
bogdanm 0:9b334a45a8ff 693 * @brief Full-Duplex Send and Receive an amount of data in interrupt mode
bogdanm 0:9b334a45a8ff 694 * @param husart: USART handle
bogdanm 0:9b334a45a8ff 695 * @param pTxData: pointer to TX data buffer
bogdanm 0:9b334a45a8ff 696 * @param pRxData: pointer to RX data buffer
bogdanm 0:9b334a45a8ff 697 * @param Size: amount of data to be sent (same amount to be received)
bogdanm 0:9b334a45a8ff 698 * @retval HAL status
bogdanm 0:9b334a45a8ff 699 */
bogdanm 0:9b334a45a8ff 700 HAL_StatusTypeDef HAL_USART_TransmitReceive_IT(USART_HandleTypeDef *husart, uint8_t *pTxData, uint8_t *pRxData, uint16_t Size)
bogdanm 0:9b334a45a8ff 701 {
bogdanm 0:9b334a45a8ff 702
bogdanm 0:9b334a45a8ff 703 if(husart->State == HAL_USART_STATE_READY)
bogdanm 0:9b334a45a8ff 704 {
bogdanm 0:9b334a45a8ff 705 if((pTxData == NULL) || (pRxData == NULL) || (Size == 0))
bogdanm 0:9b334a45a8ff 706 {
bogdanm 0:9b334a45a8ff 707 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 708 }
bogdanm 0:9b334a45a8ff 709 /* Process Locked */
bogdanm 0:9b334a45a8ff 710 __HAL_LOCK(husart);
bogdanm 0:9b334a45a8ff 711
bogdanm 0:9b334a45a8ff 712 husart->pRxBuffPtr = pRxData;
bogdanm 0:9b334a45a8ff 713 husart->RxXferSize = Size;
bogdanm 0:9b334a45a8ff 714 husart->RxXferCount = Size;
bogdanm 0:9b334a45a8ff 715 husart->pTxBuffPtr = pTxData;
bogdanm 0:9b334a45a8ff 716 husart->TxXferSize = Size;
bogdanm 0:9b334a45a8ff 717 husart->TxXferCount = Size;
bogdanm 0:9b334a45a8ff 718
bogdanm 0:9b334a45a8ff 719 /* Computation of USART mask to apply to RDR register */
bogdanm 0:9b334a45a8ff 720 __HAL_USART_MASK_COMPUTATION(husart);
bogdanm 0:9b334a45a8ff 721
bogdanm 0:9b334a45a8ff 722 husart->ErrorCode = HAL_USART_ERROR_NONE;
bogdanm 0:9b334a45a8ff 723 husart->State = HAL_USART_STATE_BUSY_TX_RX;
bogdanm 0:9b334a45a8ff 724
bogdanm 0:9b334a45a8ff 725 /* Enable the USART Data Register not empty Interrupt */
bogdanm 0:9b334a45a8ff 726 __HAL_USART_ENABLE_IT(husart, USART_IT_RXNE);
bogdanm 0:9b334a45a8ff 727
bogdanm 0:9b334a45a8ff 728 /* Enable the USART Parity Error Interrupt */
bogdanm 0:9b334a45a8ff 729 __HAL_USART_ENABLE_IT(husart, USART_IT_PE);
bogdanm 0:9b334a45a8ff 730
bogdanm 0:9b334a45a8ff 731 /* Enable the USART Error Interrupt: (Frame error, noise error, overrun error) */
bogdanm 0:9b334a45a8ff 732 __HAL_USART_ENABLE_IT(husart, USART_IT_ERR);
bogdanm 0:9b334a45a8ff 733
bogdanm 0:9b334a45a8ff 734 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 735 __HAL_UNLOCK(husart);
bogdanm 0:9b334a45a8ff 736
bogdanm 0:9b334a45a8ff 737 /* Enable the USART Transmit Data Register Empty Interrupt */
bogdanm 0:9b334a45a8ff 738 __HAL_USART_ENABLE_IT(husart, USART_IT_TXE);
bogdanm 0:9b334a45a8ff 739
bogdanm 0:9b334a45a8ff 740 return HAL_OK;
bogdanm 0:9b334a45a8ff 741 }
bogdanm 0:9b334a45a8ff 742 else
bogdanm 0:9b334a45a8ff 743 {
bogdanm 0:9b334a45a8ff 744 return HAL_BUSY;
bogdanm 0:9b334a45a8ff 745 }
bogdanm 0:9b334a45a8ff 746
bogdanm 0:9b334a45a8ff 747 }
bogdanm 0:9b334a45a8ff 748
bogdanm 0:9b334a45a8ff 749 /**
bogdanm 0:9b334a45a8ff 750 * @brief Send an amount of data in DMA mode
bogdanm 0:9b334a45a8ff 751 * @param husart: USART handle
bogdanm 0:9b334a45a8ff 752 * @param pTxData: pointer to data buffer
bogdanm 0:9b334a45a8ff 753 * @param Size: amount of data to be sent
bogdanm 0:9b334a45a8ff 754 * @retval HAL status
bogdanm 0:9b334a45a8ff 755 */
bogdanm 0:9b334a45a8ff 756 HAL_StatusTypeDef HAL_USART_Transmit_DMA(USART_HandleTypeDef *husart, uint8_t *pTxData, uint16_t Size)
bogdanm 0:9b334a45a8ff 757 {
bogdanm 0:9b334a45a8ff 758 uint32_t *tmp;
bogdanm 0:9b334a45a8ff 759
bogdanm 0:9b334a45a8ff 760 if(husart->State == HAL_USART_STATE_READY)
bogdanm 0:9b334a45a8ff 761 {
bogdanm 0:9b334a45a8ff 762 if((pTxData == NULL ) || (Size == 0))
bogdanm 0:9b334a45a8ff 763 {
bogdanm 0:9b334a45a8ff 764 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 765 }
bogdanm 0:9b334a45a8ff 766 /* Process Locked */
bogdanm 0:9b334a45a8ff 767 __HAL_LOCK(husart);
bogdanm 0:9b334a45a8ff 768
bogdanm 0:9b334a45a8ff 769 husart->pTxBuffPtr = pTxData;
bogdanm 0:9b334a45a8ff 770 husart->TxXferSize = Size;
bogdanm 0:9b334a45a8ff 771 husart->TxXferCount = Size;
bogdanm 0:9b334a45a8ff 772
bogdanm 0:9b334a45a8ff 773 husart->ErrorCode = HAL_USART_ERROR_NONE;
bogdanm 0:9b334a45a8ff 774 husart->State = HAL_USART_STATE_BUSY_TX;
bogdanm 0:9b334a45a8ff 775
bogdanm 0:9b334a45a8ff 776 /* Set the USART DMA transfer complete callback */
bogdanm 0:9b334a45a8ff 777 husart->hdmatx->XferCpltCallback = USART_DMATransmitCplt;
bogdanm 0:9b334a45a8ff 778
bogdanm 0:9b334a45a8ff 779 /* Set the USART DMA Half transfer complete callback */
bogdanm 0:9b334a45a8ff 780 husart->hdmatx->XferHalfCpltCallback = USART_DMATxHalfCplt;
bogdanm 0:9b334a45a8ff 781
bogdanm 0:9b334a45a8ff 782 /* Set the DMA error callback */
bogdanm 0:9b334a45a8ff 783 husart->hdmatx->XferErrorCallback = USART_DMAError;
bogdanm 0:9b334a45a8ff 784
bogdanm 0:9b334a45a8ff 785 /* Enable the USART transmit DMA channel */
bogdanm 0:9b334a45a8ff 786 tmp = (uint32_t*)&pTxData;
bogdanm 0:9b334a45a8ff 787 HAL_DMA_Start_IT(husart->hdmatx, *(uint32_t*)tmp, (uint32_t)&husart->Instance->TDR, Size);
bogdanm 0:9b334a45a8ff 788
bogdanm 0:9b334a45a8ff 789
bogdanm 0:9b334a45a8ff 790 /* Clear the TC flag in the SR register by writing 0 to it */
bogdanm 0:9b334a45a8ff 791 __HAL_USART_CLEAR_IT(husart, USART_FLAG_TC);
bogdanm 0:9b334a45a8ff 792
bogdanm 0:9b334a45a8ff 793 /* Enable the DMA transfer for transmit request by setting the DMAT bit
bogdanm 0:9b334a45a8ff 794 in the USART CR3 register */
bogdanm 0:9b334a45a8ff 795 husart->Instance->CR3 |= USART_CR3_DMAT;
bogdanm 0:9b334a45a8ff 796
bogdanm 0:9b334a45a8ff 797 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 798 __HAL_UNLOCK(husart);
bogdanm 0:9b334a45a8ff 799
bogdanm 0:9b334a45a8ff 800 return HAL_OK;
bogdanm 0:9b334a45a8ff 801 }
bogdanm 0:9b334a45a8ff 802 else
bogdanm 0:9b334a45a8ff 803 {
bogdanm 0:9b334a45a8ff 804 return HAL_BUSY;
bogdanm 0:9b334a45a8ff 805 }
bogdanm 0:9b334a45a8ff 806 }
bogdanm 0:9b334a45a8ff 807
bogdanm 0:9b334a45a8ff 808 /**
bogdanm 0:9b334a45a8ff 809 * @brief Receive an amount of data in DMA mode
bogdanm 0:9b334a45a8ff 810 * @param husart: USART handle
bogdanm 0:9b334a45a8ff 811 * @param pRxData: pointer to data buffer
bogdanm 0:9b334a45a8ff 812 * @param Size: amount of data to be received
bogdanm 0:9b334a45a8ff 813 * @note When the USART parity is enabled (PCE = 1), the received data contain
bogdanm 0:9b334a45a8ff 814 * the parity bit (MSB position)
bogdanm 0:9b334a45a8ff 815 * @retval HAL status
bogdanm 0:9b334a45a8ff 816 * @note The USART DMA transmit stream must be configured in order to generate the clock for the slave.
bogdanm 0:9b334a45a8ff 817 */
bogdanm 0:9b334a45a8ff 818 HAL_StatusTypeDef HAL_USART_Receive_DMA(USART_HandleTypeDef *husart, uint8_t *pRxData, uint16_t Size)
bogdanm 0:9b334a45a8ff 819 {
bogdanm 0:9b334a45a8ff 820 uint32_t *tmp;
bogdanm 0:9b334a45a8ff 821
bogdanm 0:9b334a45a8ff 822 if(husart->State == HAL_USART_STATE_READY)
bogdanm 0:9b334a45a8ff 823 {
bogdanm 0:9b334a45a8ff 824 if((pRxData == NULL ) || (Size == 0))
bogdanm 0:9b334a45a8ff 825 {
bogdanm 0:9b334a45a8ff 826 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 827 }
bogdanm 0:9b334a45a8ff 828
bogdanm 0:9b334a45a8ff 829 /* Process Locked */
bogdanm 0:9b334a45a8ff 830 __HAL_LOCK(husart);
bogdanm 0:9b334a45a8ff 831
bogdanm 0:9b334a45a8ff 832 husart->pRxBuffPtr = pRxData;
bogdanm 0:9b334a45a8ff 833 husart->RxXferSize = Size;
bogdanm 0:9b334a45a8ff 834 husart->pTxBuffPtr = pRxData;
bogdanm 0:9b334a45a8ff 835 husart->TxXferSize = Size;
bogdanm 0:9b334a45a8ff 836
bogdanm 0:9b334a45a8ff 837 husart->ErrorCode = HAL_USART_ERROR_NONE;
bogdanm 0:9b334a45a8ff 838 husart->State = HAL_USART_STATE_BUSY_RX;
bogdanm 0:9b334a45a8ff 839
bogdanm 0:9b334a45a8ff 840 /* Set the USART DMA Rx transfer complete callback */
bogdanm 0:9b334a45a8ff 841 husart->hdmarx->XferCpltCallback = USART_DMAReceiveCplt;
bogdanm 0:9b334a45a8ff 842
bogdanm 0:9b334a45a8ff 843 /* Set the USART DMA Half transfer complete callback */
bogdanm 0:9b334a45a8ff 844 husart->hdmarx->XferHalfCpltCallback = USART_DMARxHalfCplt;
bogdanm 0:9b334a45a8ff 845
bogdanm 0:9b334a45a8ff 846 /* Set the USART DMA Rx transfer error callback */
bogdanm 0:9b334a45a8ff 847 husart->hdmarx->XferErrorCallback = USART_DMAError;
bogdanm 0:9b334a45a8ff 848
bogdanm 0:9b334a45a8ff 849 /* Enable the USART receive DMA channel */
bogdanm 0:9b334a45a8ff 850 tmp = (uint32_t*)&pRxData;
bogdanm 0:9b334a45a8ff 851 HAL_DMA_Start_IT(husart->hdmarx, (uint32_t)&husart->Instance->RDR, *(uint32_t*)tmp, Size);
bogdanm 0:9b334a45a8ff 852
bogdanm 0:9b334a45a8ff 853 /* Enable the USART transmit DMA channel: the transmit stream is used in order
bogdanm 0:9b334a45a8ff 854 to generate in the non-blocking mode the clock to the slave device,
bogdanm 0:9b334a45a8ff 855 this mode isn't a simplex receive mode but a full-duplex receive mode */
bogdanm 0:9b334a45a8ff 856 tmp = (uint32_t*)&pRxData;
bogdanm 0:9b334a45a8ff 857 HAL_DMA_Start_IT(husart->hdmatx, *(uint32_t*)tmp, (uint32_t)&husart->Instance->TDR, Size);
bogdanm 0:9b334a45a8ff 858
bogdanm 0:9b334a45a8ff 859 /* Enable the DMA transfer for the receiver request by setting the DMAR bit
bogdanm 0:9b334a45a8ff 860 in the USART CR3 register */
bogdanm 0:9b334a45a8ff 861 husart->Instance->CR3 |= USART_CR3_DMAR;
bogdanm 0:9b334a45a8ff 862
bogdanm 0:9b334a45a8ff 863 /* Enable the DMA transfer for transmit request by setting the DMAT bit
bogdanm 0:9b334a45a8ff 864 in the USART CR3 register */
bogdanm 0:9b334a45a8ff 865 husart->Instance->CR3 |= USART_CR3_DMAT;
bogdanm 0:9b334a45a8ff 866
bogdanm 0:9b334a45a8ff 867 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 868 __HAL_UNLOCK(husart);
bogdanm 0:9b334a45a8ff 869
bogdanm 0:9b334a45a8ff 870 return HAL_OK;
bogdanm 0:9b334a45a8ff 871 }
bogdanm 0:9b334a45a8ff 872 else
bogdanm 0:9b334a45a8ff 873 {
bogdanm 0:9b334a45a8ff 874 return HAL_BUSY;
bogdanm 0:9b334a45a8ff 875 }
bogdanm 0:9b334a45a8ff 876 }
bogdanm 0:9b334a45a8ff 877
bogdanm 0:9b334a45a8ff 878 /**
bogdanm 0:9b334a45a8ff 879 * @brief Full-Duplex Transmit Receive an amount of data in non blocking mode
bogdanm 0:9b334a45a8ff 880 * @param husart: USART handle
bogdanm 0:9b334a45a8ff 881 * @param pTxData: pointer to TX data buffer
bogdanm 0:9b334a45a8ff 882 * @param pRxData: pointer to RX data buffer
bogdanm 0:9b334a45a8ff 883 * @param Size: amount of data to be received/sent
bogdanm 0:9b334a45a8ff 884 * @note When the USART parity is enabled (PCE = 1) the data received contain the parity bit.
bogdanm 0:9b334a45a8ff 885 * @retval HAL status
bogdanm 0:9b334a45a8ff 886 */
bogdanm 0:9b334a45a8ff 887 HAL_StatusTypeDef HAL_USART_TransmitReceive_DMA(USART_HandleTypeDef *husart, uint8_t *pTxData, uint8_t *pRxData, uint16_t Size)
bogdanm 0:9b334a45a8ff 888 {
bogdanm 0:9b334a45a8ff 889 uint32_t *tmp;
bogdanm 0:9b334a45a8ff 890
bogdanm 0:9b334a45a8ff 891 if(husart->State == HAL_USART_STATE_READY)
bogdanm 0:9b334a45a8ff 892 {
bogdanm 0:9b334a45a8ff 893 if((pTxData == NULL) || (pRxData == NULL) || (Size == 0))
bogdanm 0:9b334a45a8ff 894 {
bogdanm 0:9b334a45a8ff 895 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 896 }
bogdanm 0:9b334a45a8ff 897 /* Process Locked */
bogdanm 0:9b334a45a8ff 898 __HAL_LOCK(husart);
bogdanm 0:9b334a45a8ff 899
bogdanm 0:9b334a45a8ff 900 husart->pRxBuffPtr = pRxData;
bogdanm 0:9b334a45a8ff 901 husart->RxXferSize = Size;
bogdanm 0:9b334a45a8ff 902 husart->pTxBuffPtr = pTxData;
bogdanm 0:9b334a45a8ff 903 husart->TxXferSize = Size;
bogdanm 0:9b334a45a8ff 904
bogdanm 0:9b334a45a8ff 905 husart->ErrorCode = HAL_USART_ERROR_NONE;
bogdanm 0:9b334a45a8ff 906 husart->State = HAL_USART_STATE_BUSY_TX_RX;
bogdanm 0:9b334a45a8ff 907
bogdanm 0:9b334a45a8ff 908 /* Set the USART DMA Rx transfer complete callback */
bogdanm 0:9b334a45a8ff 909 husart->hdmarx->XferCpltCallback = USART_DMAReceiveCplt;
bogdanm 0:9b334a45a8ff 910
bogdanm 0:9b334a45a8ff 911 /* Set the USART DMA Half transfer complete callback */
bogdanm 0:9b334a45a8ff 912 husart->hdmarx->XferHalfCpltCallback = USART_DMARxHalfCplt;
bogdanm 0:9b334a45a8ff 913
bogdanm 0:9b334a45a8ff 914 /* Set the USART DMA Tx transfer complete callback */
bogdanm 0:9b334a45a8ff 915 husart->hdmatx->XferCpltCallback = USART_DMATransmitCplt;
bogdanm 0:9b334a45a8ff 916
bogdanm 0:9b334a45a8ff 917 /* Set the USART DMA Half transfer complete callback */
bogdanm 0:9b334a45a8ff 918 husart->hdmatx->XferHalfCpltCallback = USART_DMATxHalfCplt;
bogdanm 0:9b334a45a8ff 919
bogdanm 0:9b334a45a8ff 920 /* Set the USART DMA Tx transfer error callback */
bogdanm 0:9b334a45a8ff 921 husart->hdmatx->XferErrorCallback = USART_DMAError;
bogdanm 0:9b334a45a8ff 922
bogdanm 0:9b334a45a8ff 923 /* Set the USART DMA Rx transfer error callback */
bogdanm 0:9b334a45a8ff 924 husart->hdmarx->XferErrorCallback = USART_DMAError;
bogdanm 0:9b334a45a8ff 925
bogdanm 0:9b334a45a8ff 926 /* Enable the USART receive DMA channel */
bogdanm 0:9b334a45a8ff 927 tmp = (uint32_t*)&pRxData;
bogdanm 0:9b334a45a8ff 928 HAL_DMA_Start_IT(husart->hdmarx, (uint32_t)&husart->Instance->RDR, *(uint32_t*)tmp, Size);
bogdanm 0:9b334a45a8ff 929
bogdanm 0:9b334a45a8ff 930 /* Enable the USART transmit DMA channel */
bogdanm 0:9b334a45a8ff 931 tmp = (uint32_t*)&pTxData;
bogdanm 0:9b334a45a8ff 932 HAL_DMA_Start_IT(husart->hdmatx, *(uint32_t*)tmp, (uint32_t)&husart->Instance->TDR, Size);
bogdanm 0:9b334a45a8ff 933
bogdanm 0:9b334a45a8ff 934 /* Clear the TC flag in the SR register by writing 0 to it */
bogdanm 0:9b334a45a8ff 935 __HAL_USART_CLEAR_IT(husart, USART_FLAG_TC);
bogdanm 0:9b334a45a8ff 936
bogdanm 0:9b334a45a8ff 937 /* Enable the DMA transfer for the receiver request by setting the DMAR bit
bogdanm 0:9b334a45a8ff 938 in the USART CR3 register */
bogdanm 0:9b334a45a8ff 939 husart->Instance->CR3 |= USART_CR3_DMAR;
bogdanm 0:9b334a45a8ff 940
bogdanm 0:9b334a45a8ff 941 /* Enable the DMA transfer for transmit request by setting the DMAT bit
bogdanm 0:9b334a45a8ff 942 in the USART CR3 register */
bogdanm 0:9b334a45a8ff 943 husart->Instance->CR3 |= USART_CR3_DMAT;
bogdanm 0:9b334a45a8ff 944
bogdanm 0:9b334a45a8ff 945 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 946 __HAL_UNLOCK(husart);
bogdanm 0:9b334a45a8ff 947
bogdanm 0:9b334a45a8ff 948 return HAL_OK;
bogdanm 0:9b334a45a8ff 949 }
bogdanm 0:9b334a45a8ff 950 else
bogdanm 0:9b334a45a8ff 951 {
bogdanm 0:9b334a45a8ff 952 return HAL_BUSY;
bogdanm 0:9b334a45a8ff 953 }
bogdanm 0:9b334a45a8ff 954 }
bogdanm 0:9b334a45a8ff 955
bogdanm 0:9b334a45a8ff 956 /**
bogdanm 0:9b334a45a8ff 957 * @brief Pauses the DMA Transfer.
bogdanm 0:9b334a45a8ff 958 * @param husart: USART handle
bogdanm 0:9b334a45a8ff 959 * @retval None
bogdanm 0:9b334a45a8ff 960 */
bogdanm 0:9b334a45a8ff 961 HAL_StatusTypeDef HAL_USART_DMAPause(USART_HandleTypeDef *husart)
bogdanm 0:9b334a45a8ff 962 {
bogdanm 0:9b334a45a8ff 963 /* Process Locked */
bogdanm 0:9b334a45a8ff 964 __HAL_LOCK(husart);
bogdanm 0:9b334a45a8ff 965
bogdanm 0:9b334a45a8ff 966 if(husart->State == HAL_USART_STATE_BUSY_TX)
bogdanm 0:9b334a45a8ff 967 {
bogdanm 0:9b334a45a8ff 968 /* Disable the USART DMA Tx request */
bogdanm 0:9b334a45a8ff 969 husart->Instance->CR3 &= (uint32_t)(~USART_CR3_DMAT);
bogdanm 0:9b334a45a8ff 970 }
bogdanm 0:9b334a45a8ff 971 else if(husart->State == HAL_USART_STATE_BUSY_RX)
bogdanm 0:9b334a45a8ff 972 {
bogdanm 0:9b334a45a8ff 973 /* Disable the USART DMA Rx request */
bogdanm 0:9b334a45a8ff 974 husart->Instance->CR3 &= (uint32_t)(~USART_CR3_DMAR);
bogdanm 0:9b334a45a8ff 975 }
bogdanm 0:9b334a45a8ff 976 else if(husart->State == HAL_USART_STATE_BUSY_TX_RX)
bogdanm 0:9b334a45a8ff 977 {
bogdanm 0:9b334a45a8ff 978 /* Disable the USART DMA Tx request */
bogdanm 0:9b334a45a8ff 979 husart->Instance->CR3 &= (uint32_t)(~USART_CR3_DMAT);
bogdanm 0:9b334a45a8ff 980 /* Disable the USART DMA Rx request */
bogdanm 0:9b334a45a8ff 981 husart->Instance->CR3 &= (uint32_t)(~USART_CR3_DMAR);
bogdanm 0:9b334a45a8ff 982 }
bogdanm 0:9b334a45a8ff 983
bogdanm 0:9b334a45a8ff 984 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 985 __HAL_UNLOCK(husart);
bogdanm 0:9b334a45a8ff 986
bogdanm 0:9b334a45a8ff 987 return HAL_OK;
bogdanm 0:9b334a45a8ff 988 }
bogdanm 0:9b334a45a8ff 989
bogdanm 0:9b334a45a8ff 990 /**
bogdanm 0:9b334a45a8ff 991 * @brief Resumes the DMA Transfer.
bogdanm 0:9b334a45a8ff 992 * @param husart: USART handle
bogdanm 0:9b334a45a8ff 993 * @retval None
bogdanm 0:9b334a45a8ff 994 */
bogdanm 0:9b334a45a8ff 995 HAL_StatusTypeDef HAL_USART_DMAResume(USART_HandleTypeDef *husart)
bogdanm 0:9b334a45a8ff 996 {
bogdanm 0:9b334a45a8ff 997 /* Process Locked */
bogdanm 0:9b334a45a8ff 998 __HAL_LOCK(husart);
bogdanm 0:9b334a45a8ff 999
bogdanm 0:9b334a45a8ff 1000 if(husart->State == HAL_USART_STATE_BUSY_TX)
bogdanm 0:9b334a45a8ff 1001 {
bogdanm 0:9b334a45a8ff 1002 /* Enable the USART DMA Tx request */
bogdanm 0:9b334a45a8ff 1003 husart->Instance->CR3 |= USART_CR3_DMAT;
bogdanm 0:9b334a45a8ff 1004 }
bogdanm 0:9b334a45a8ff 1005 else if(husart->State == HAL_USART_STATE_BUSY_RX)
bogdanm 0:9b334a45a8ff 1006 {
bogdanm 0:9b334a45a8ff 1007 /* Clear the Overrun flag before resuming the Rx transfer*/
bogdanm 0:9b334a45a8ff 1008 __HAL_USART_CLEAR_IT(husart, USART_CLEAR_OREF);
bogdanm 0:9b334a45a8ff 1009
bogdanm 0:9b334a45a8ff 1010 /* Enable the USART DMA Rx request */
bogdanm 0:9b334a45a8ff 1011 husart->Instance->CR3 |= USART_CR3_DMAR;
bogdanm 0:9b334a45a8ff 1012 }
bogdanm 0:9b334a45a8ff 1013 else if(husart->State == HAL_USART_STATE_BUSY_TX_RX)
bogdanm 0:9b334a45a8ff 1014 {
bogdanm 0:9b334a45a8ff 1015 /* Clear the Overrun flag before resuming the Rx transfer*/
bogdanm 0:9b334a45a8ff 1016 __HAL_USART_CLEAR_IT(husart, USART_CLEAR_OREF);
bogdanm 0:9b334a45a8ff 1017
bogdanm 0:9b334a45a8ff 1018 /* Enable the USART DMA Rx request before the DMA Tx request */
bogdanm 0:9b334a45a8ff 1019 husart->Instance->CR3 |= USART_CR3_DMAR;
bogdanm 0:9b334a45a8ff 1020
bogdanm 0:9b334a45a8ff 1021 /* Enable the USART DMA Tx request */
bogdanm 0:9b334a45a8ff 1022 husart->Instance->CR3 |= USART_CR3_DMAT;
bogdanm 0:9b334a45a8ff 1023 }
bogdanm 0:9b334a45a8ff 1024
bogdanm 0:9b334a45a8ff 1025 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 1026 __HAL_UNLOCK(husart);
bogdanm 0:9b334a45a8ff 1027
bogdanm 0:9b334a45a8ff 1028 return HAL_OK;
bogdanm 0:9b334a45a8ff 1029 }
bogdanm 0:9b334a45a8ff 1030
bogdanm 0:9b334a45a8ff 1031 /**
bogdanm 0:9b334a45a8ff 1032 * @brief Stops the DMA Transfer.
bogdanm 0:9b334a45a8ff 1033 * @param husart: USART handle
bogdanm 0:9b334a45a8ff 1034 * @retval None
bogdanm 0:9b334a45a8ff 1035 */
bogdanm 0:9b334a45a8ff 1036 HAL_StatusTypeDef HAL_USART_DMAStop(USART_HandleTypeDef *husart)
bogdanm 0:9b334a45a8ff 1037 {
bogdanm 0:9b334a45a8ff 1038 /* The Lock is not implemented on this API to allow the user application
bogdanm 0:9b334a45a8ff 1039 to call the HAL USART API under callbacks HAL_USART_TxCpltCallback() / HAL_USART_RxCpltCallback() /
bogdanm 0:9b334a45a8ff 1040 HAL_USART_TxHalfCpltCallback / HAL_USART_RxHalfCpltCallback:
bogdanm 0:9b334a45a8ff 1041 indeed, when HAL_DMA_Abort() API is called, the DMA TX/RX Transfer or Half Transfer complete
bogdanm 0:9b334a45a8ff 1042 interrupt is generated if the DMA transfer interruption occurs at the middle or at the end of
bogdanm 0:9b334a45a8ff 1043 the stream and the corresponding call back is executed. */
bogdanm 0:9b334a45a8ff 1044
bogdanm 0:9b334a45a8ff 1045 /* Disable the USART Tx/Rx DMA requests */
bogdanm 0:9b334a45a8ff 1046 husart->Instance->CR3 &= ~USART_CR3_DMAT;
bogdanm 0:9b334a45a8ff 1047 husart->Instance->CR3 &= ~USART_CR3_DMAR;
bogdanm 0:9b334a45a8ff 1048
bogdanm 0:9b334a45a8ff 1049 /* Abort the USART DMA tx Stream */
bogdanm 0:9b334a45a8ff 1050 if(husart->hdmatx != NULL)
bogdanm 0:9b334a45a8ff 1051 {
bogdanm 0:9b334a45a8ff 1052 HAL_DMA_Abort(husart->hdmatx);
bogdanm 0:9b334a45a8ff 1053 }
bogdanm 0:9b334a45a8ff 1054 /* Abort the USART DMA rx Stream */
bogdanm 0:9b334a45a8ff 1055 if(husart->hdmarx != NULL)
bogdanm 0:9b334a45a8ff 1056 {
bogdanm 0:9b334a45a8ff 1057 HAL_DMA_Abort(husart->hdmarx);
bogdanm 0:9b334a45a8ff 1058 }
bogdanm 0:9b334a45a8ff 1059
bogdanm 0:9b334a45a8ff 1060 husart->State = HAL_USART_STATE_READY;
bogdanm 0:9b334a45a8ff 1061
bogdanm 0:9b334a45a8ff 1062 return HAL_OK;
bogdanm 0:9b334a45a8ff 1063 }
bogdanm 0:9b334a45a8ff 1064
bogdanm 0:9b334a45a8ff 1065 /**
bogdanm 0:9b334a45a8ff 1066 * @brief This function handles USART interrupt request.
bogdanm 0:9b334a45a8ff 1067 * @param husart: USART handle
bogdanm 0:9b334a45a8ff 1068 * @retval None
bogdanm 0:9b334a45a8ff 1069 */
bogdanm 0:9b334a45a8ff 1070 void HAL_USART_IRQHandler(USART_HandleTypeDef *husart)
bogdanm 0:9b334a45a8ff 1071 {
bogdanm 0:9b334a45a8ff 1072
bogdanm 0:9b334a45a8ff 1073 /* USART parity error interrupt occurred ------------------------------------*/
bogdanm 0:9b334a45a8ff 1074 if((__HAL_USART_GET_IT(husart, USART_IT_PE) != RESET) && (__HAL_USART_GET_IT_SOURCE(husart, USART_IT_PE) != RESET))
bogdanm 0:9b334a45a8ff 1075 {
bogdanm 0:9b334a45a8ff 1076 __HAL_USART_CLEAR_IT(husart, USART_CLEAR_PEF);
bogdanm 0:9b334a45a8ff 1077 husart->ErrorCode |= HAL_USART_ERROR_PE;
bogdanm 0:9b334a45a8ff 1078 /* Set the USART state ready to be able to start again the process */
bogdanm 0:9b334a45a8ff 1079 husart->State = HAL_USART_STATE_READY;
bogdanm 0:9b334a45a8ff 1080 }
bogdanm 0:9b334a45a8ff 1081
bogdanm 0:9b334a45a8ff 1082 /* USART frame error interrupt occurred -------------------------------------*/
bogdanm 0:9b334a45a8ff 1083 if((__HAL_USART_GET_IT(husart, USART_IT_FE) != RESET) && (__HAL_USART_GET_IT_SOURCE(husart, USART_IT_ERR) != RESET))
bogdanm 0:9b334a45a8ff 1084 {
bogdanm 0:9b334a45a8ff 1085 __HAL_USART_CLEAR_IT(husart, USART_CLEAR_FEF);
bogdanm 0:9b334a45a8ff 1086 husart->ErrorCode |= HAL_USART_ERROR_FE;
bogdanm 0:9b334a45a8ff 1087 /* Set the USART state ready to be able to start again the process */
bogdanm 0:9b334a45a8ff 1088 husart->State = HAL_USART_STATE_READY;
bogdanm 0:9b334a45a8ff 1089 }
bogdanm 0:9b334a45a8ff 1090
bogdanm 0:9b334a45a8ff 1091 /* USART noise error interrupt occurred -------------------------------------*/
bogdanm 0:9b334a45a8ff 1092 if((__HAL_USART_GET_IT(husart, USART_IT_NE) != RESET) && (__HAL_USART_GET_IT_SOURCE(husart, USART_IT_ERR) != RESET))
bogdanm 0:9b334a45a8ff 1093 {
bogdanm 0:9b334a45a8ff 1094 __HAL_USART_CLEAR_IT(husart, USART_CLEAR_NEF);
bogdanm 0:9b334a45a8ff 1095 husart->ErrorCode |= HAL_USART_ERROR_NE;
bogdanm 0:9b334a45a8ff 1096 /* Set the USART state ready to be able to start again the process */
bogdanm 0:9b334a45a8ff 1097 husart->State = HAL_USART_STATE_READY;
bogdanm 0:9b334a45a8ff 1098 }
bogdanm 0:9b334a45a8ff 1099
bogdanm 0:9b334a45a8ff 1100 /* USART Over-Run interrupt occurred ----------------------------------------*/
bogdanm 0:9b334a45a8ff 1101 if((__HAL_USART_GET_IT(husart, USART_IT_ORE) != RESET) && (__HAL_USART_GET_IT_SOURCE(husart, USART_IT_ERR) != RESET))
bogdanm 0:9b334a45a8ff 1102 {
bogdanm 0:9b334a45a8ff 1103 __HAL_USART_CLEAR_IT(husart, USART_CLEAR_OREF);
bogdanm 0:9b334a45a8ff 1104 husart->ErrorCode |= HAL_USART_ERROR_ORE;
bogdanm 0:9b334a45a8ff 1105 /* Set the USART state ready to be able to start again the process */
bogdanm 0:9b334a45a8ff 1106 husart->State = HAL_USART_STATE_READY;
bogdanm 0:9b334a45a8ff 1107 }
bogdanm 0:9b334a45a8ff 1108
bogdanm 0:9b334a45a8ff 1109 /* Call USART Error Call back function if need be --------------------------*/
bogdanm 0:9b334a45a8ff 1110 if(husart->ErrorCode != HAL_USART_ERROR_NONE)
bogdanm 0:9b334a45a8ff 1111 {
bogdanm 0:9b334a45a8ff 1112 HAL_USART_ErrorCallback(husart);
bogdanm 0:9b334a45a8ff 1113 }
bogdanm 0:9b334a45a8ff 1114
bogdanm 0:9b334a45a8ff 1115 /* USART in mode Receiver --------------------------------------------------*/
bogdanm 0:9b334a45a8ff 1116 if((__HAL_USART_GET_IT(husart, USART_IT_RXNE) != RESET) && (__HAL_USART_GET_IT_SOURCE(husart, USART_IT_RXNE) != RESET))
bogdanm 0:9b334a45a8ff 1117 {
bogdanm 0:9b334a45a8ff 1118 if(husart->State == HAL_USART_STATE_BUSY_RX)
bogdanm 0:9b334a45a8ff 1119 {
bogdanm 0:9b334a45a8ff 1120 USART_Receive_IT(husart);
bogdanm 0:9b334a45a8ff 1121 }
bogdanm 0:9b334a45a8ff 1122 else
bogdanm 0:9b334a45a8ff 1123 {
bogdanm 0:9b334a45a8ff 1124 USART_TransmitReceive_IT(husart);
bogdanm 0:9b334a45a8ff 1125 }
bogdanm 0:9b334a45a8ff 1126 }
bogdanm 0:9b334a45a8ff 1127
bogdanm 0:9b334a45a8ff 1128 /* USART in mode Transmitter -----------------------------------------------*/
bogdanm 0:9b334a45a8ff 1129 if((__HAL_USART_GET_IT(husart, USART_IT_TXE) != RESET) &&(__HAL_USART_GET_IT_SOURCE(husart, USART_IT_TXE) != RESET))
bogdanm 0:9b334a45a8ff 1130 {
bogdanm 0:9b334a45a8ff 1131 if(husart->State == HAL_USART_STATE_BUSY_TX)
bogdanm 0:9b334a45a8ff 1132 {
bogdanm 0:9b334a45a8ff 1133 USART_Transmit_IT(husart);
bogdanm 0:9b334a45a8ff 1134 }
bogdanm 0:9b334a45a8ff 1135 else
bogdanm 0:9b334a45a8ff 1136 {
bogdanm 0:9b334a45a8ff 1137 USART_TransmitReceive_IT(husart);
bogdanm 0:9b334a45a8ff 1138 }
bogdanm 0:9b334a45a8ff 1139 }
bogdanm 0:9b334a45a8ff 1140
bogdanm 0:9b334a45a8ff 1141 /* USART in mode Transmitter (transmission end) -----------------------------*/
bogdanm 0:9b334a45a8ff 1142 if((__HAL_USART_GET_IT(husart, USART_IT_TC) != RESET) &&(__HAL_USART_GET_IT_SOURCE(husart, USART_IT_TC) != RESET))
bogdanm 0:9b334a45a8ff 1143 {
bogdanm 0:9b334a45a8ff 1144 USART_EndTransmit_IT(husart);
bogdanm 0:9b334a45a8ff 1145 }
bogdanm 0:9b334a45a8ff 1146
bogdanm 0:9b334a45a8ff 1147 }
bogdanm 0:9b334a45a8ff 1148
bogdanm 0:9b334a45a8ff 1149 /**
bogdanm 0:9b334a45a8ff 1150 * @brief Tx Transfer completed callbacks
bogdanm 0:9b334a45a8ff 1151 * @param husart: USART handle
bogdanm 0:9b334a45a8ff 1152 * @retval None
bogdanm 0:9b334a45a8ff 1153 */
bogdanm 0:9b334a45a8ff 1154 __weak void HAL_USART_TxCpltCallback(USART_HandleTypeDef *husart)
bogdanm 0:9b334a45a8ff 1155 {
mbed_official 83:a036322b8637 1156 /* Prevent unused argument(s) compilation warning */
mbed_official 83:a036322b8637 1157 UNUSED(husart);
mbed_official 83:a036322b8637 1158
bogdanm 0:9b334a45a8ff 1159 /* NOTE : This function should not be modified, when the callback is needed,
bogdanm 0:9b334a45a8ff 1160 the HAL_USART_TxCpltCallback can be implemented in the user file
bogdanm 0:9b334a45a8ff 1161 */
bogdanm 0:9b334a45a8ff 1162 }
bogdanm 0:9b334a45a8ff 1163
bogdanm 0:9b334a45a8ff 1164 /**
bogdanm 0:9b334a45a8ff 1165 * @brief Tx Half Transfer completed callbacks.
bogdanm 0:9b334a45a8ff 1166 * @param husart: USART handle
bogdanm 0:9b334a45a8ff 1167 * @retval None
bogdanm 0:9b334a45a8ff 1168 */
bogdanm 0:9b334a45a8ff 1169 __weak void HAL_USART_TxHalfCpltCallback(USART_HandleTypeDef *husart)
bogdanm 0:9b334a45a8ff 1170 {
mbed_official 83:a036322b8637 1171 /* Prevent unused argument(s) compilation warning */
mbed_official 83:a036322b8637 1172 UNUSED(husart);
mbed_official 83:a036322b8637 1173
bogdanm 0:9b334a45a8ff 1174 /* NOTE: This function should not be modified, when the callback is needed,
bogdanm 0:9b334a45a8ff 1175 the HAL_USART_TxHalfCpltCallback can be implemented in the user file
bogdanm 0:9b334a45a8ff 1176 */
bogdanm 0:9b334a45a8ff 1177 }
bogdanm 0:9b334a45a8ff 1178
bogdanm 0:9b334a45a8ff 1179 /**
bogdanm 0:9b334a45a8ff 1180 * @brief Rx Transfer completed callbacks.
bogdanm 0:9b334a45a8ff 1181 * @param husart: USART handle
bogdanm 0:9b334a45a8ff 1182 * @retval None
bogdanm 0:9b334a45a8ff 1183 */
bogdanm 0:9b334a45a8ff 1184 __weak void HAL_USART_RxCpltCallback(USART_HandleTypeDef *husart)
bogdanm 0:9b334a45a8ff 1185 {
mbed_official 83:a036322b8637 1186 /* Prevent unused argument(s) compilation warning */
mbed_official 83:a036322b8637 1187 UNUSED(husart);
mbed_official 83:a036322b8637 1188
bogdanm 0:9b334a45a8ff 1189 /* NOTE: This function should not be modified, when the callback is needed,
bogdanm 0:9b334a45a8ff 1190 the HAL_USART_RxCpltCallback can be implemented in the user file
bogdanm 0:9b334a45a8ff 1191 */
bogdanm 0:9b334a45a8ff 1192 }
bogdanm 0:9b334a45a8ff 1193
bogdanm 0:9b334a45a8ff 1194 /**
bogdanm 0:9b334a45a8ff 1195 * @brief Rx Half Transfer completed callbacks
bogdanm 0:9b334a45a8ff 1196 * @param husart: usart handle
bogdanm 0:9b334a45a8ff 1197 * @retval None
bogdanm 0:9b334a45a8ff 1198 */
bogdanm 0:9b334a45a8ff 1199 __weak void HAL_USART_RxHalfCpltCallback(USART_HandleTypeDef *husart)
bogdanm 0:9b334a45a8ff 1200 {
mbed_official 83:a036322b8637 1201 /* Prevent unused argument(s) compilation warning */
mbed_official 83:a036322b8637 1202 UNUSED(husart);
mbed_official 83:a036322b8637 1203
bogdanm 0:9b334a45a8ff 1204 /* NOTE : This function should not be modified, when the callback is needed,
bogdanm 0:9b334a45a8ff 1205 the HAL_USART_RxHalfCpltCallback can be implemented in the user file
bogdanm 0:9b334a45a8ff 1206 */
bogdanm 0:9b334a45a8ff 1207 }
bogdanm 0:9b334a45a8ff 1208
bogdanm 0:9b334a45a8ff 1209 /**
bogdanm 0:9b334a45a8ff 1210 * @brief Tx/Rx Transfers completed callback for the non-blocking process
bogdanm 0:9b334a45a8ff 1211 * @param husart: USART handle
bogdanm 0:9b334a45a8ff 1212 * @retval None
bogdanm 0:9b334a45a8ff 1213 */
bogdanm 0:9b334a45a8ff 1214 __weak void HAL_USART_TxRxCpltCallback(USART_HandleTypeDef *husart)
bogdanm 0:9b334a45a8ff 1215 {
mbed_official 83:a036322b8637 1216 /* Prevent unused argument(s) compilation warning */
mbed_official 83:a036322b8637 1217 UNUSED(husart);
mbed_official 83:a036322b8637 1218
bogdanm 0:9b334a45a8ff 1219 /* NOTE : This function should not be modified, when the callback is needed,
bogdanm 0:9b334a45a8ff 1220 the HAL_USART_TxRxCpltCallback can be implemented in the user file
bogdanm 0:9b334a45a8ff 1221 */
bogdanm 0:9b334a45a8ff 1222 }
bogdanm 0:9b334a45a8ff 1223
bogdanm 0:9b334a45a8ff 1224 /**
bogdanm 0:9b334a45a8ff 1225 * @brief USART error callbacks
bogdanm 0:9b334a45a8ff 1226 * @param husart: USART handle
bogdanm 0:9b334a45a8ff 1227 * @retval None
bogdanm 0:9b334a45a8ff 1228 */
bogdanm 0:9b334a45a8ff 1229 __weak void HAL_USART_ErrorCallback(USART_HandleTypeDef *husart)
bogdanm 0:9b334a45a8ff 1230 {
mbed_official 83:a036322b8637 1231 /* Prevent unused argument(s) compilation warning */
mbed_official 83:a036322b8637 1232 UNUSED(husart);
mbed_official 83:a036322b8637 1233
bogdanm 0:9b334a45a8ff 1234 /* NOTE : This function should not be modified, when the callback is needed,
bogdanm 0:9b334a45a8ff 1235 the HAL_USART_ErrorCallback can be implemented in the user file
bogdanm 0:9b334a45a8ff 1236 */
bogdanm 0:9b334a45a8ff 1237 }
bogdanm 0:9b334a45a8ff 1238
bogdanm 0:9b334a45a8ff 1239 /**
bogdanm 0:9b334a45a8ff 1240 * @}
bogdanm 0:9b334a45a8ff 1241 */
bogdanm 0:9b334a45a8ff 1242
bogdanm 0:9b334a45a8ff 1243 /** @defgroup USART_Exported_Functions_Group3 Peripheral State and Errors functions
bogdanm 0:9b334a45a8ff 1244 * @brief USART State and Errors functions
bogdanm 0:9b334a45a8ff 1245 *
bogdanm 0:9b334a45a8ff 1246 @verbatim
bogdanm 0:9b334a45a8ff 1247 ==============================================================================
bogdanm 0:9b334a45a8ff 1248 ##### Peripheral State and Errors functions #####
bogdanm 0:9b334a45a8ff 1249 ==============================================================================
bogdanm 0:9b334a45a8ff 1250 [..]
bogdanm 0:9b334a45a8ff 1251 This subsection provides a set of functions allowing to return the State of
bogdanm 0:9b334a45a8ff 1252 USART communication
bogdanm 0:9b334a45a8ff 1253 process, return Peripheral Errors occurred during communication process
bogdanm 0:9b334a45a8ff 1254 (+) HAL_USART_GetState() API can be helpful to check in run-time the state
bogdanm 0:9b334a45a8ff 1255 of the USART peripheral.
bogdanm 0:9b334a45a8ff 1256 (+) HAL_USART_GetError() check in run-time errors that could be occurred during
bogdanm 0:9b334a45a8ff 1257 communication.
bogdanm 0:9b334a45a8ff 1258 @endverbatim
bogdanm 0:9b334a45a8ff 1259 * @{
bogdanm 0:9b334a45a8ff 1260 */
bogdanm 0:9b334a45a8ff 1261
bogdanm 0:9b334a45a8ff 1262 /**
bogdanm 0:9b334a45a8ff 1263 * @brief return the USART state
bogdanm 0:9b334a45a8ff 1264 * @param husart: USART handle
bogdanm 0:9b334a45a8ff 1265 * @retval HAL state
bogdanm 0:9b334a45a8ff 1266 */
bogdanm 0:9b334a45a8ff 1267 HAL_USART_StateTypeDef HAL_USART_GetState(USART_HandleTypeDef *husart)
bogdanm 0:9b334a45a8ff 1268 {
bogdanm 0:9b334a45a8ff 1269 return husart->State;
bogdanm 0:9b334a45a8ff 1270 }
bogdanm 0:9b334a45a8ff 1271
bogdanm 0:9b334a45a8ff 1272 /**
bogdanm 0:9b334a45a8ff 1273 * @brief Return the USART error code
bogdanm 0:9b334a45a8ff 1274 * @param husart : pointer to a USART_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 1275 * the configuration information for the specified USART.
bogdanm 0:9b334a45a8ff 1276 * @retval USART Error Code
bogdanm 0:9b334a45a8ff 1277 */
bogdanm 0:9b334a45a8ff 1278 uint32_t HAL_USART_GetError(USART_HandleTypeDef *husart)
bogdanm 0:9b334a45a8ff 1279 {
bogdanm 0:9b334a45a8ff 1280 return husart->ErrorCode;
bogdanm 0:9b334a45a8ff 1281 }
bogdanm 0:9b334a45a8ff 1282
bogdanm 0:9b334a45a8ff 1283 /**
bogdanm 0:9b334a45a8ff 1284 * @}
bogdanm 0:9b334a45a8ff 1285 */
bogdanm 0:9b334a45a8ff 1286
bogdanm 0:9b334a45a8ff 1287
bogdanm 0:9b334a45a8ff 1288 /**
bogdanm 0:9b334a45a8ff 1289 * @brief Simplex Send an amount of data in non-blocking mode.
bogdanm 0:9b334a45a8ff 1290 * @note Function called under interruption only, once
bogdanm 0:9b334a45a8ff 1291 * interruptions have been enabled by HAL_USART_Transmit_IT().
bogdanm 0:9b334a45a8ff 1292 * @param husart: USART handle
bogdanm 0:9b334a45a8ff 1293 * @retval HAL status
bogdanm 0:9b334a45a8ff 1294 * @note The USART errors are not managed to avoid the overrun error.
bogdanm 0:9b334a45a8ff 1295 */
bogdanm 0:9b334a45a8ff 1296 static HAL_StatusTypeDef USART_Transmit_IT(USART_HandleTypeDef *husart)
bogdanm 0:9b334a45a8ff 1297 {
bogdanm 0:9b334a45a8ff 1298 uint16_t* tmp;
bogdanm 0:9b334a45a8ff 1299
bogdanm 0:9b334a45a8ff 1300 if(husart->State == HAL_USART_STATE_BUSY_TX)
bogdanm 0:9b334a45a8ff 1301 {
bogdanm 0:9b334a45a8ff 1302
bogdanm 0:9b334a45a8ff 1303 if(husart->TxXferCount == 0)
bogdanm 0:9b334a45a8ff 1304 {
bogdanm 0:9b334a45a8ff 1305 /* Disable the USART Transmit Complete Interrupt */
bogdanm 0:9b334a45a8ff 1306 __HAL_USART_DISABLE_IT(husart, USART_IT_TXE);
bogdanm 0:9b334a45a8ff 1307
bogdanm 0:9b334a45a8ff 1308 /* Enable the USART Transmit Complete Interrupt */
bogdanm 0:9b334a45a8ff 1309 __HAL_USART_ENABLE_IT(husart, USART_IT_TC);
bogdanm 0:9b334a45a8ff 1310
bogdanm 0:9b334a45a8ff 1311 return HAL_OK;
bogdanm 0:9b334a45a8ff 1312 }
bogdanm 0:9b334a45a8ff 1313 else
bogdanm 0:9b334a45a8ff 1314 {
bogdanm 0:9b334a45a8ff 1315 if((husart->Init.WordLength == USART_WORDLENGTH_9B) && (husart->Init.Parity == USART_PARITY_NONE))
bogdanm 0:9b334a45a8ff 1316 {
bogdanm 0:9b334a45a8ff 1317 tmp = (uint16_t*) husart->pTxBuffPtr;
bogdanm 0:9b334a45a8ff 1318 husart->Instance->TDR = (*tmp & (uint16_t)0x01FF);
bogdanm 0:9b334a45a8ff 1319 husart->pTxBuffPtr += 2;
bogdanm 0:9b334a45a8ff 1320 }
bogdanm 0:9b334a45a8ff 1321 else
bogdanm 0:9b334a45a8ff 1322 {
bogdanm 0:9b334a45a8ff 1323 husart->Instance->TDR = (uint8_t)(*husart->pTxBuffPtr++ & (uint8_t)0xFF);
bogdanm 0:9b334a45a8ff 1324 }
bogdanm 0:9b334a45a8ff 1325
bogdanm 0:9b334a45a8ff 1326 husart->TxXferCount--;
bogdanm 0:9b334a45a8ff 1327
bogdanm 0:9b334a45a8ff 1328 return HAL_OK;
bogdanm 0:9b334a45a8ff 1329 }
bogdanm 0:9b334a45a8ff 1330 }
bogdanm 0:9b334a45a8ff 1331 else
bogdanm 0:9b334a45a8ff 1332 {
bogdanm 0:9b334a45a8ff 1333 return HAL_BUSY;
bogdanm 0:9b334a45a8ff 1334 }
bogdanm 0:9b334a45a8ff 1335 }
bogdanm 0:9b334a45a8ff 1336
bogdanm 0:9b334a45a8ff 1337 /**
bogdanm 0:9b334a45a8ff 1338 * @brief Wraps up transmission in non-blocking mode.
bogdanm 0:9b334a45a8ff 1339 * @param husart: pointer to a USART_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 1340 * the configuration information for the specified USART module.
bogdanm 0:9b334a45a8ff 1341 * @retval HAL status
bogdanm 0:9b334a45a8ff 1342 */
bogdanm 0:9b334a45a8ff 1343 static HAL_StatusTypeDef USART_EndTransmit_IT(USART_HandleTypeDef *husart)
bogdanm 0:9b334a45a8ff 1344 {
bogdanm 0:9b334a45a8ff 1345 /* Disable the USART Transmit Complete Interrupt */
bogdanm 0:9b334a45a8ff 1346 __HAL_USART_DISABLE_IT(husart, USART_IT_TC);
bogdanm 0:9b334a45a8ff 1347
bogdanm 0:9b334a45a8ff 1348 /* Disable the USART Error Interrupt: (Frame error, noise error, overrun error) */
bogdanm 0:9b334a45a8ff 1349 __HAL_USART_DISABLE_IT(husart, USART_IT_ERR);
bogdanm 0:9b334a45a8ff 1350
bogdanm 0:9b334a45a8ff 1351 husart->State = HAL_USART_STATE_READY;
bogdanm 0:9b334a45a8ff 1352
bogdanm 0:9b334a45a8ff 1353 HAL_USART_TxCpltCallback(husart);
bogdanm 0:9b334a45a8ff 1354
bogdanm 0:9b334a45a8ff 1355 return HAL_OK;
bogdanm 0:9b334a45a8ff 1356 }
bogdanm 0:9b334a45a8ff 1357
bogdanm 0:9b334a45a8ff 1358 /**
bogdanm 0:9b334a45a8ff 1359 * @brief Simplex Receive an amount of data in non-blocking mode.
bogdanm 0:9b334a45a8ff 1360 * Function called under interruption only, once
bogdanm 0:9b334a45a8ff 1361 * interruptions have been enabled by HAL_USART_Receive_IT()
bogdanm 0:9b334a45a8ff 1362 * @param husart: USART handle
bogdanm 0:9b334a45a8ff 1363 * @retval HAL status
bogdanm 0:9b334a45a8ff 1364 */
bogdanm 0:9b334a45a8ff 1365 static HAL_StatusTypeDef USART_Receive_IT(USART_HandleTypeDef *husart)
bogdanm 0:9b334a45a8ff 1366 {
bogdanm 0:9b334a45a8ff 1367 uint16_t* tmp;
bogdanm 0:9b334a45a8ff 1368 uint16_t uhMask = husart->Mask;
bogdanm 0:9b334a45a8ff 1369
bogdanm 0:9b334a45a8ff 1370 if(husart->State == HAL_USART_STATE_BUSY_RX)
bogdanm 0:9b334a45a8ff 1371 {
bogdanm 0:9b334a45a8ff 1372
bogdanm 0:9b334a45a8ff 1373 if((husart->Init.WordLength == USART_WORDLENGTH_9B) && (husart->Init.Parity == USART_PARITY_NONE))
bogdanm 0:9b334a45a8ff 1374 {
bogdanm 0:9b334a45a8ff 1375 tmp = (uint16_t*) husart->pRxBuffPtr;
bogdanm 0:9b334a45a8ff 1376 *tmp = (uint16_t)(husart->Instance->RDR & uhMask);
bogdanm 0:9b334a45a8ff 1377 husart->pRxBuffPtr += 2;
bogdanm 0:9b334a45a8ff 1378 }
bogdanm 0:9b334a45a8ff 1379 else
bogdanm 0:9b334a45a8ff 1380 {
bogdanm 0:9b334a45a8ff 1381 *husart->pRxBuffPtr++ = (uint8_t)(husart->Instance->RDR & (uint8_t)uhMask);
bogdanm 0:9b334a45a8ff 1382 }
bogdanm 0:9b334a45a8ff 1383 /* Send dummy byte in order to generate the clock for the Slave to Send the next data */
bogdanm 0:9b334a45a8ff 1384 husart->Instance->TDR = (DUMMY_DATA & (uint16_t)0x00FF);
bogdanm 0:9b334a45a8ff 1385
bogdanm 0:9b334a45a8ff 1386 if(--husart->RxXferCount == 0)
bogdanm 0:9b334a45a8ff 1387 {
bogdanm 0:9b334a45a8ff 1388 __HAL_USART_DISABLE_IT(husart, USART_IT_RXNE);
bogdanm 0:9b334a45a8ff 1389
bogdanm 0:9b334a45a8ff 1390 /* Disable the USART Parity Error Interrupt */
bogdanm 0:9b334a45a8ff 1391 __HAL_USART_DISABLE_IT(husart, USART_IT_PE);
bogdanm 0:9b334a45a8ff 1392
bogdanm 0:9b334a45a8ff 1393 /* Disable the USART Error Interrupt: (Frame error, noise error, overrun error) */
bogdanm 0:9b334a45a8ff 1394 __HAL_USART_DISABLE_IT(husart, USART_IT_ERR);
bogdanm 0:9b334a45a8ff 1395
bogdanm 0:9b334a45a8ff 1396 husart->State = HAL_USART_STATE_READY;
bogdanm 0:9b334a45a8ff 1397
bogdanm 0:9b334a45a8ff 1398 HAL_USART_RxCpltCallback(husart);
bogdanm 0:9b334a45a8ff 1399
bogdanm 0:9b334a45a8ff 1400 return HAL_OK;
bogdanm 0:9b334a45a8ff 1401 }
bogdanm 0:9b334a45a8ff 1402
bogdanm 0:9b334a45a8ff 1403 return HAL_OK;
bogdanm 0:9b334a45a8ff 1404 }
bogdanm 0:9b334a45a8ff 1405 else
bogdanm 0:9b334a45a8ff 1406 {
bogdanm 0:9b334a45a8ff 1407 return HAL_BUSY;
bogdanm 0:9b334a45a8ff 1408 }
bogdanm 0:9b334a45a8ff 1409 }
bogdanm 0:9b334a45a8ff 1410
bogdanm 0:9b334a45a8ff 1411 /**
bogdanm 0:9b334a45a8ff 1412 * @brief Full-Duplex Send receive an amount of data in full-duplex mode (non-blocking).
bogdanm 0:9b334a45a8ff 1413 * Function called under interruption only, once
bogdanm 0:9b334a45a8ff 1414 * interruptions have been enabled by HAL_USART_TransmitReceive_IT()
bogdanm 0:9b334a45a8ff 1415 * @param husart: USART handle
bogdanm 0:9b334a45a8ff 1416 * @retval HAL status
bogdanm 0:9b334a45a8ff 1417 */
bogdanm 0:9b334a45a8ff 1418 static HAL_StatusTypeDef USART_TransmitReceive_IT(USART_HandleTypeDef *husart)
bogdanm 0:9b334a45a8ff 1419 {
bogdanm 0:9b334a45a8ff 1420 uint16_t* tmp;
bogdanm 0:9b334a45a8ff 1421 uint16_t uhMask = husart->Mask;
bogdanm 0:9b334a45a8ff 1422
bogdanm 0:9b334a45a8ff 1423 if(husart->State == HAL_USART_STATE_BUSY_TX_RX)
bogdanm 0:9b334a45a8ff 1424 {
bogdanm 0:9b334a45a8ff 1425 if(husart->TxXferCount != 0x00)
bogdanm 0:9b334a45a8ff 1426 {
bogdanm 0:9b334a45a8ff 1427 if(__HAL_USART_GET_FLAG(husart, USART_FLAG_TXE) != RESET)
bogdanm 0:9b334a45a8ff 1428 {
bogdanm 0:9b334a45a8ff 1429 if((husart->Init.WordLength == USART_WORDLENGTH_9B) && (husart->Init.Parity == USART_PARITY_NONE))
bogdanm 0:9b334a45a8ff 1430 {
bogdanm 0:9b334a45a8ff 1431 tmp = (uint16_t*) husart->pTxBuffPtr;
bogdanm 0:9b334a45a8ff 1432 husart->Instance->TDR = (uint16_t)(*tmp & uhMask);
bogdanm 0:9b334a45a8ff 1433 husart->pTxBuffPtr += 2;
bogdanm 0:9b334a45a8ff 1434 }
bogdanm 0:9b334a45a8ff 1435 else
bogdanm 0:9b334a45a8ff 1436 {
bogdanm 0:9b334a45a8ff 1437 husart->Instance->TDR = (uint8_t)(*husart->pTxBuffPtr++ & (uint8_t)uhMask);
bogdanm 0:9b334a45a8ff 1438 }
bogdanm 0:9b334a45a8ff 1439 husart->TxXferCount--;
bogdanm 0:9b334a45a8ff 1440
bogdanm 0:9b334a45a8ff 1441 /* Check the latest data transmitted */
bogdanm 0:9b334a45a8ff 1442 if(husart->TxXferCount == 0)
bogdanm 0:9b334a45a8ff 1443 {
bogdanm 0:9b334a45a8ff 1444 __HAL_USART_DISABLE_IT(husart, USART_IT_TXE);
bogdanm 0:9b334a45a8ff 1445 }
bogdanm 0:9b334a45a8ff 1446 }
bogdanm 0:9b334a45a8ff 1447 }
bogdanm 0:9b334a45a8ff 1448
bogdanm 0:9b334a45a8ff 1449 if(husart->RxXferCount != 0x00)
bogdanm 0:9b334a45a8ff 1450 {
bogdanm 0:9b334a45a8ff 1451 if(__HAL_USART_GET_FLAG(husart, USART_FLAG_RXNE) != RESET)
bogdanm 0:9b334a45a8ff 1452 {
bogdanm 0:9b334a45a8ff 1453 if((husart->Init.WordLength == USART_WORDLENGTH_9B) && (husart->Init.Parity == USART_PARITY_NONE))
bogdanm 0:9b334a45a8ff 1454 {
bogdanm 0:9b334a45a8ff 1455 tmp = (uint16_t*) husart->pRxBuffPtr;
bogdanm 0:9b334a45a8ff 1456 *tmp = (uint16_t)(husart->Instance->RDR & uhMask);
bogdanm 0:9b334a45a8ff 1457 husart->pRxBuffPtr += 2;
bogdanm 0:9b334a45a8ff 1458 }
bogdanm 0:9b334a45a8ff 1459 else
bogdanm 0:9b334a45a8ff 1460 {
bogdanm 0:9b334a45a8ff 1461 *husart->pRxBuffPtr++ = (uint8_t)(husart->Instance->RDR & (uint8_t)uhMask);
bogdanm 0:9b334a45a8ff 1462 }
bogdanm 0:9b334a45a8ff 1463 husart->RxXferCount--;
bogdanm 0:9b334a45a8ff 1464 }
bogdanm 0:9b334a45a8ff 1465 }
bogdanm 0:9b334a45a8ff 1466
bogdanm 0:9b334a45a8ff 1467 /* Check the latest data received */
bogdanm 0:9b334a45a8ff 1468 if(husart->RxXferCount == 0)
bogdanm 0:9b334a45a8ff 1469 {
bogdanm 0:9b334a45a8ff 1470 __HAL_USART_DISABLE_IT(husart, USART_IT_RXNE);
bogdanm 0:9b334a45a8ff 1471
bogdanm 0:9b334a45a8ff 1472 /* Disable the USART Parity Error Interrupt */
bogdanm 0:9b334a45a8ff 1473 __HAL_USART_DISABLE_IT(husart, USART_IT_PE);
bogdanm 0:9b334a45a8ff 1474
bogdanm 0:9b334a45a8ff 1475 /* Disable the USART Error Interrupt: (Frame error, noise error, overrun error) */
bogdanm 0:9b334a45a8ff 1476 __HAL_USART_DISABLE_IT(husart, USART_IT_ERR);
bogdanm 0:9b334a45a8ff 1477
bogdanm 0:9b334a45a8ff 1478 husart->State = HAL_USART_STATE_READY;
bogdanm 0:9b334a45a8ff 1479
bogdanm 0:9b334a45a8ff 1480 HAL_USART_TxRxCpltCallback(husart);
bogdanm 0:9b334a45a8ff 1481
bogdanm 0:9b334a45a8ff 1482 return HAL_OK;
bogdanm 0:9b334a45a8ff 1483 }
bogdanm 0:9b334a45a8ff 1484
bogdanm 0:9b334a45a8ff 1485 return HAL_OK;
bogdanm 0:9b334a45a8ff 1486 }
bogdanm 0:9b334a45a8ff 1487 else
bogdanm 0:9b334a45a8ff 1488 {
bogdanm 0:9b334a45a8ff 1489 return HAL_BUSY;
bogdanm 0:9b334a45a8ff 1490 }
bogdanm 0:9b334a45a8ff 1491 }
bogdanm 0:9b334a45a8ff 1492
bogdanm 0:9b334a45a8ff 1493 /**
bogdanm 0:9b334a45a8ff 1494 * @brief This function handles USART Communication Timeout.
bogdanm 0:9b334a45a8ff 1495 * @param husart: USART handle
bogdanm 0:9b334a45a8ff 1496 * @param Flag: specifies the USART flag to check.
bogdanm 0:9b334a45a8ff 1497 * @param Status: The new Flag status (SET or RESET).
bogdanm 0:9b334a45a8ff 1498 * @param Timeout: Timeout duration
bogdanm 0:9b334a45a8ff 1499 * @retval HAL status
bogdanm 0:9b334a45a8ff 1500 */
bogdanm 0:9b334a45a8ff 1501 static HAL_StatusTypeDef USART_WaitOnFlagUntilTimeout(USART_HandleTypeDef *husart, uint32_t Flag, FlagStatus Status, uint32_t Timeout)
bogdanm 0:9b334a45a8ff 1502 {
bogdanm 0:9b334a45a8ff 1503 uint32_t tickstart = HAL_GetTick();
bogdanm 0:9b334a45a8ff 1504
bogdanm 0:9b334a45a8ff 1505 /* Wait until flag is set */
bogdanm 0:9b334a45a8ff 1506 if(Status == RESET)
bogdanm 0:9b334a45a8ff 1507 {
bogdanm 0:9b334a45a8ff 1508 while(__HAL_USART_GET_FLAG(husart, Flag) == RESET)
bogdanm 0:9b334a45a8ff 1509 {
bogdanm 0:9b334a45a8ff 1510 /* Check for the Timeout */
bogdanm 0:9b334a45a8ff 1511 if(Timeout != HAL_MAX_DELAY)
bogdanm 0:9b334a45a8ff 1512 {
bogdanm 0:9b334a45a8ff 1513 if((Timeout == 0)||((HAL_GetTick()-tickstart) >= Timeout))
bogdanm 0:9b334a45a8ff 1514 {
bogdanm 0:9b334a45a8ff 1515 /* Disable TXE, RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts for the interrupt process */
bogdanm 0:9b334a45a8ff 1516 __HAL_USART_DISABLE_IT(husart, USART_IT_TXE);
bogdanm 0:9b334a45a8ff 1517 __HAL_USART_DISABLE_IT(husart, USART_IT_RXNE);
bogdanm 0:9b334a45a8ff 1518 __HAL_USART_DISABLE_IT(husart, USART_IT_PE);
bogdanm 0:9b334a45a8ff 1519 __HAL_USART_DISABLE_IT(husart, USART_IT_ERR);
bogdanm 0:9b334a45a8ff 1520
bogdanm 0:9b334a45a8ff 1521 husart->State= HAL_USART_STATE_READY;
bogdanm 0:9b334a45a8ff 1522
bogdanm 0:9b334a45a8ff 1523 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 1524 __HAL_UNLOCK(husart);
bogdanm 0:9b334a45a8ff 1525
bogdanm 0:9b334a45a8ff 1526 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 1527 }
bogdanm 0:9b334a45a8ff 1528 }
bogdanm 0:9b334a45a8ff 1529 }
bogdanm 0:9b334a45a8ff 1530 }
bogdanm 0:9b334a45a8ff 1531 else
bogdanm 0:9b334a45a8ff 1532 {
bogdanm 0:9b334a45a8ff 1533 while(__HAL_USART_GET_FLAG(husart, Flag) != RESET)
bogdanm 0:9b334a45a8ff 1534 {
bogdanm 0:9b334a45a8ff 1535 /* Check for the Timeout */
bogdanm 0:9b334a45a8ff 1536 if(Timeout != HAL_MAX_DELAY)
bogdanm 0:9b334a45a8ff 1537 {
bogdanm 0:9b334a45a8ff 1538 if((Timeout == 0)||((HAL_GetTick()-tickstart) >= Timeout))
bogdanm 0:9b334a45a8ff 1539 {
bogdanm 0:9b334a45a8ff 1540 /* Disable TXE, RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts for the interrupt process */
bogdanm 0:9b334a45a8ff 1541 __HAL_USART_DISABLE_IT(husart, USART_IT_TXE);
bogdanm 0:9b334a45a8ff 1542 __HAL_USART_DISABLE_IT(husart, USART_IT_RXNE);
bogdanm 0:9b334a45a8ff 1543 __HAL_USART_DISABLE_IT(husart, USART_IT_PE);
bogdanm 0:9b334a45a8ff 1544 __HAL_USART_DISABLE_IT(husart, USART_IT_ERR);
bogdanm 0:9b334a45a8ff 1545
bogdanm 0:9b334a45a8ff 1546 husart->State= HAL_USART_STATE_READY;
bogdanm 0:9b334a45a8ff 1547
bogdanm 0:9b334a45a8ff 1548 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 1549 __HAL_UNLOCK(husart);
bogdanm 0:9b334a45a8ff 1550
bogdanm 0:9b334a45a8ff 1551 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 1552 }
bogdanm 0:9b334a45a8ff 1553 }
bogdanm 0:9b334a45a8ff 1554 }
bogdanm 0:9b334a45a8ff 1555 }
bogdanm 0:9b334a45a8ff 1556 return HAL_OK;
bogdanm 0:9b334a45a8ff 1557 }
bogdanm 0:9b334a45a8ff 1558
bogdanm 0:9b334a45a8ff 1559
bogdanm 0:9b334a45a8ff 1560 /**
bogdanm 0:9b334a45a8ff 1561 * @brief DMA USART transmit process complete callback
bogdanm 0:9b334a45a8ff 1562 * @param hdma: DMA handle
bogdanm 0:9b334a45a8ff 1563 * @retval None
bogdanm 0:9b334a45a8ff 1564 */
bogdanm 0:9b334a45a8ff 1565 static void USART_DMATransmitCplt(DMA_HandleTypeDef *hdma)
bogdanm 0:9b334a45a8ff 1566 {
bogdanm 0:9b334a45a8ff 1567 USART_HandleTypeDef* husart = ( USART_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
bogdanm 0:9b334a45a8ff 1568
bogdanm 0:9b334a45a8ff 1569 /* DMA Normal mode */
bogdanm 0:9b334a45a8ff 1570 if((hdma->Instance->CR & DMA_SxCR_CIRC) == 0)
bogdanm 0:9b334a45a8ff 1571 {
bogdanm 0:9b334a45a8ff 1572 husart->TxXferCount = 0;
bogdanm 0:9b334a45a8ff 1573
bogdanm 0:9b334a45a8ff 1574 if(husart->State == HAL_USART_STATE_BUSY_TX)
bogdanm 0:9b334a45a8ff 1575 {
bogdanm 0:9b334a45a8ff 1576 /* Disable the DMA transfer for transmit request by resetting the DMAT bit
bogdanm 0:9b334a45a8ff 1577 in the USART CR3 register */
bogdanm 0:9b334a45a8ff 1578 husart->Instance->CR3 &= ~(USART_CR3_DMAT);
bogdanm 0:9b334a45a8ff 1579
bogdanm 0:9b334a45a8ff 1580 /* Enable the USART Transmit Complete Interrupt */
bogdanm 0:9b334a45a8ff 1581 __HAL_USART_ENABLE_IT(husart, USART_IT_TC);
bogdanm 0:9b334a45a8ff 1582 }
bogdanm 0:9b334a45a8ff 1583 }
bogdanm 0:9b334a45a8ff 1584 /* DMA Circular mode */
bogdanm 0:9b334a45a8ff 1585 else
bogdanm 0:9b334a45a8ff 1586 {
bogdanm 0:9b334a45a8ff 1587 if(husart->State == HAL_USART_STATE_BUSY_TX)
bogdanm 0:9b334a45a8ff 1588 {
bogdanm 0:9b334a45a8ff 1589 HAL_USART_TxCpltCallback(husart);
bogdanm 0:9b334a45a8ff 1590 }
bogdanm 0:9b334a45a8ff 1591 }
bogdanm 0:9b334a45a8ff 1592 }
bogdanm 0:9b334a45a8ff 1593
bogdanm 0:9b334a45a8ff 1594
bogdanm 0:9b334a45a8ff 1595 /**
bogdanm 0:9b334a45a8ff 1596 * @brief DMA USART transmit process half complete callback
bogdanm 0:9b334a45a8ff 1597 * @param hdma : DMA handle
bogdanm 0:9b334a45a8ff 1598 * @retval None
bogdanm 0:9b334a45a8ff 1599 */
bogdanm 0:9b334a45a8ff 1600 static void USART_DMATxHalfCplt(DMA_HandleTypeDef *hdma)
bogdanm 0:9b334a45a8ff 1601 {
bogdanm 0:9b334a45a8ff 1602 USART_HandleTypeDef* husart = (USART_HandleTypeDef*)((DMA_HandleTypeDef*)hdma)->Parent;
bogdanm 0:9b334a45a8ff 1603
bogdanm 0:9b334a45a8ff 1604 HAL_USART_TxHalfCpltCallback(husart);
bogdanm 0:9b334a45a8ff 1605 }
bogdanm 0:9b334a45a8ff 1606
bogdanm 0:9b334a45a8ff 1607 /**
bogdanm 0:9b334a45a8ff 1608 * @brief DMA USART receive process complete callback
bogdanm 0:9b334a45a8ff 1609 * @param hdma: DMA handle
bogdanm 0:9b334a45a8ff 1610 * @retval None
bogdanm 0:9b334a45a8ff 1611 */
bogdanm 0:9b334a45a8ff 1612 static void USART_DMAReceiveCplt(DMA_HandleTypeDef *hdma)
bogdanm 0:9b334a45a8ff 1613 {
bogdanm 0:9b334a45a8ff 1614 USART_HandleTypeDef* husart = ( USART_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
bogdanm 0:9b334a45a8ff 1615
bogdanm 0:9b334a45a8ff 1616 /* DMA Normal mode */
bogdanm 0:9b334a45a8ff 1617 if((hdma->Instance->CR & DMA_SxCR_CIRC) == 0)
bogdanm 0:9b334a45a8ff 1618 {
bogdanm 0:9b334a45a8ff 1619 husart->RxXferCount = 0;
bogdanm 0:9b334a45a8ff 1620
bogdanm 0:9b334a45a8ff 1621 /* Disable the DMA RX transfer for the receiver request by resetting the DMAR bit
bogdanm 0:9b334a45a8ff 1622 in USART CR3 register */
bogdanm 0:9b334a45a8ff 1623 husart->Instance->CR3 &= (uint32_t)~((uint32_t)USART_CR3_DMAR);
bogdanm 0:9b334a45a8ff 1624 /* similarly, disable the DMA TX transfer that was started to provide the
bogdanm 0:9b334a45a8ff 1625 clock to the slave device */
bogdanm 0:9b334a45a8ff 1626 husart->Instance->CR3 &= (uint32_t)~((uint32_t)USART_CR3_DMAT);
bogdanm 0:9b334a45a8ff 1627
bogdanm 0:9b334a45a8ff 1628 if(husart->State == HAL_USART_STATE_BUSY_RX)
bogdanm 0:9b334a45a8ff 1629 {
bogdanm 0:9b334a45a8ff 1630 HAL_USART_RxCpltCallback(husart);
bogdanm 0:9b334a45a8ff 1631 }
bogdanm 0:9b334a45a8ff 1632 /* The USART state is HAL_USART_STATE_BUSY_TX_RX */
bogdanm 0:9b334a45a8ff 1633 else
bogdanm 0:9b334a45a8ff 1634 {
bogdanm 0:9b334a45a8ff 1635 HAL_USART_TxRxCpltCallback(husart);
bogdanm 0:9b334a45a8ff 1636 }
bogdanm 0:9b334a45a8ff 1637 husart->State= HAL_USART_STATE_READY;
bogdanm 0:9b334a45a8ff 1638 }
bogdanm 0:9b334a45a8ff 1639 /* DMA circular mode */
bogdanm 0:9b334a45a8ff 1640 else
bogdanm 0:9b334a45a8ff 1641 {
bogdanm 0:9b334a45a8ff 1642 if(husart->State == HAL_USART_STATE_BUSY_RX)
bogdanm 0:9b334a45a8ff 1643 {
bogdanm 0:9b334a45a8ff 1644 HAL_USART_RxCpltCallback(husart);
bogdanm 0:9b334a45a8ff 1645 }
bogdanm 0:9b334a45a8ff 1646 /* The USART state is HAL_USART_STATE_BUSY_TX_RX */
bogdanm 0:9b334a45a8ff 1647 else
bogdanm 0:9b334a45a8ff 1648 {
bogdanm 0:9b334a45a8ff 1649 HAL_USART_TxRxCpltCallback(husart);
bogdanm 0:9b334a45a8ff 1650 }
bogdanm 0:9b334a45a8ff 1651 }
bogdanm 0:9b334a45a8ff 1652 }
bogdanm 0:9b334a45a8ff 1653
bogdanm 0:9b334a45a8ff 1654 /**
bogdanm 0:9b334a45a8ff 1655 * @brief DMA USART receive process half complete callback
bogdanm 0:9b334a45a8ff 1656 * @param hdma : DMA handle
bogdanm 0:9b334a45a8ff 1657 * @retval None
bogdanm 0:9b334a45a8ff 1658 */
bogdanm 0:9b334a45a8ff 1659 static void USART_DMARxHalfCplt(DMA_HandleTypeDef *hdma)
bogdanm 0:9b334a45a8ff 1660 {
bogdanm 0:9b334a45a8ff 1661 USART_HandleTypeDef* husart = (USART_HandleTypeDef*)((DMA_HandleTypeDef*)hdma)->Parent;
bogdanm 0:9b334a45a8ff 1662
bogdanm 0:9b334a45a8ff 1663 HAL_USART_RxHalfCpltCallback(husart);
bogdanm 0:9b334a45a8ff 1664 }
bogdanm 0:9b334a45a8ff 1665
bogdanm 0:9b334a45a8ff 1666 /**
bogdanm 0:9b334a45a8ff 1667 * @brief DMA USART communication error callback
bogdanm 0:9b334a45a8ff 1668 * @param hdma: DMA handle
bogdanm 0:9b334a45a8ff 1669 * @retval None
bogdanm 0:9b334a45a8ff 1670 */
bogdanm 0:9b334a45a8ff 1671 static void USART_DMAError(DMA_HandleTypeDef *hdma)
bogdanm 0:9b334a45a8ff 1672 {
bogdanm 0:9b334a45a8ff 1673 USART_HandleTypeDef* husart = ( USART_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
bogdanm 0:9b334a45a8ff 1674
bogdanm 0:9b334a45a8ff 1675 husart->RxXferCount = 0;
bogdanm 0:9b334a45a8ff 1676 husart->TxXferCount = 0;
bogdanm 0:9b334a45a8ff 1677 husart->ErrorCode |= HAL_USART_ERROR_DMA;
bogdanm 0:9b334a45a8ff 1678 husart->State= HAL_USART_STATE_READY;
bogdanm 0:9b334a45a8ff 1679
bogdanm 0:9b334a45a8ff 1680 HAL_USART_ErrorCallback(husart);
bogdanm 0:9b334a45a8ff 1681 }
bogdanm 0:9b334a45a8ff 1682
bogdanm 0:9b334a45a8ff 1683 /**
bogdanm 0:9b334a45a8ff 1684 * @brief Configure the USART peripheral
bogdanm 0:9b334a45a8ff 1685 * @param husart: USART handle
bogdanm 0:9b334a45a8ff 1686 * @retval None
bogdanm 0:9b334a45a8ff 1687 */
bogdanm 0:9b334a45a8ff 1688 static HAL_StatusTypeDef USART_SetConfig(USART_HandleTypeDef *husart)
bogdanm 0:9b334a45a8ff 1689 {
bogdanm 0:9b334a45a8ff 1690 uint32_t tmpreg = 0x0;
bogdanm 0:9b334a45a8ff 1691 USART_ClockSourceTypeDef clocksource = USART_CLOCKSOURCE_UNDEFINED;
bogdanm 0:9b334a45a8ff 1692 HAL_StatusTypeDef ret = HAL_OK;
bogdanm 0:9b334a45a8ff 1693 uint16_t brrtemp = 0x0000;
bogdanm 0:9b334a45a8ff 1694 uint16_t usartdiv = 0x0000;
bogdanm 0:9b334a45a8ff 1695
bogdanm 0:9b334a45a8ff 1696 /* Check the parameters */
bogdanm 0:9b334a45a8ff 1697 assert_param(IS_USART_POLARITY(husart->Init.CLKPolarity));
bogdanm 0:9b334a45a8ff 1698 assert_param(IS_USART_PHASE(husart->Init.CLKPhase));
bogdanm 0:9b334a45a8ff 1699 assert_param(IS_USART_LASTBIT(husart->Init.CLKLastBit));
bogdanm 0:9b334a45a8ff 1700 assert_param(IS_USART_BAUDRATE(husart->Init.BaudRate));
bogdanm 0:9b334a45a8ff 1701 assert_param(IS_USART_WORD_LENGTH(husart->Init.WordLength));
bogdanm 0:9b334a45a8ff 1702 assert_param(IS_USART_STOPBITS(husart->Init.StopBits));
bogdanm 0:9b334a45a8ff 1703 assert_param(IS_USART_PARITY(husart->Init.Parity));
bogdanm 0:9b334a45a8ff 1704 assert_param(IS_USART_MODE(husart->Init.Mode));
bogdanm 0:9b334a45a8ff 1705 assert_param(IS_USART_OVERSAMPLING(husart->Init.OverSampling));
bogdanm 0:9b334a45a8ff 1706
bogdanm 0:9b334a45a8ff 1707
bogdanm 0:9b334a45a8ff 1708 /*-------------------------- USART CR1 Configuration -----------------------*/
bogdanm 0:9b334a45a8ff 1709 /* Clear M, PCE, PS, TE and RE bits and configure
bogdanm 0:9b334a45a8ff 1710 * the USART Word Length, Parity, Mode and OverSampling:
bogdanm 0:9b334a45a8ff 1711 * set the M bits according to husart->Init.WordLength value
bogdanm 0:9b334a45a8ff 1712 * set PCE and PS bits according to husart->Init.Parity value
bogdanm 0:9b334a45a8ff 1713 * set TE and RE bits according to husart->Init.Mode value
bogdanm 0:9b334a45a8ff 1714 * force OVER8 to 1 to allow to reach the maximum speed (Fclock/8) */
bogdanm 0:9b334a45a8ff 1715 tmpreg = (uint32_t)husart->Init.WordLength | husart->Init.Parity | husart->Init.Mode | USART_CR1_OVER8;
bogdanm 0:9b334a45a8ff 1716 MODIFY_REG(husart->Instance->CR1, USART_CR1_FIELDS, tmpreg);
bogdanm 0:9b334a45a8ff 1717
bogdanm 0:9b334a45a8ff 1718 /*---------------------------- USART CR2 Configuration ---------------------*/
bogdanm 0:9b334a45a8ff 1719 /* Clear and configure the USART Clock, CPOL, CPHA, LBCL and STOP bits:
bogdanm 0:9b334a45a8ff 1720 * set CPOL bit according to husart->Init.CLKPolarity value
bogdanm 0:9b334a45a8ff 1721 * set CPHA bit according to husart->Init.CLKPhase value
bogdanm 0:9b334a45a8ff 1722 * set LBCL bit according to husart->Init.CLKLastBit value
bogdanm 0:9b334a45a8ff 1723 * set STOP[13:12] bits according to husart->Init.StopBits value */
bogdanm 0:9b334a45a8ff 1724 tmpreg = (uint32_t)(USART_CLOCK_ENABLE);
bogdanm 0:9b334a45a8ff 1725 tmpreg |= ((uint32_t)husart->Init.CLKPolarity | (uint32_t)husart->Init.CLKPhase);
bogdanm 0:9b334a45a8ff 1726 tmpreg |= ((uint32_t)husart->Init.CLKLastBit | (uint32_t)husart->Init.StopBits);
bogdanm 0:9b334a45a8ff 1727 MODIFY_REG(husart->Instance->CR2, USART_CR2_FIELDS, tmpreg);
bogdanm 0:9b334a45a8ff 1728
bogdanm 0:9b334a45a8ff 1729 /*-------------------------- USART CR3 Configuration -----------------------*/
bogdanm 0:9b334a45a8ff 1730 /* no CR3 register configuration */
bogdanm 0:9b334a45a8ff 1731
bogdanm 0:9b334a45a8ff 1732 /*-------------------------- USART BRR Configuration -----------------------*/
bogdanm 0:9b334a45a8ff 1733 /* BRR is filled-up according to OVER8 bit setting which is forced to 1 */
bogdanm 0:9b334a45a8ff 1734 USART_GETCLOCKSOURCE(husart, clocksource);
bogdanm 0:9b334a45a8ff 1735 switch (clocksource)
bogdanm 0:9b334a45a8ff 1736 {
bogdanm 0:9b334a45a8ff 1737 case USART_CLOCKSOURCE_PCLK1:
bogdanm 0:9b334a45a8ff 1738 usartdiv = (uint16_t)((2*HAL_RCC_GetPCLK1Freq()) / husart->Init.BaudRate);
bogdanm 0:9b334a45a8ff 1739 break;
bogdanm 0:9b334a45a8ff 1740 case USART_CLOCKSOURCE_PCLK2:
bogdanm 0:9b334a45a8ff 1741 usartdiv = (uint16_t)((2*HAL_RCC_GetPCLK2Freq()) / husart->Init.BaudRate);
bogdanm 0:9b334a45a8ff 1742 break;
bogdanm 0:9b334a45a8ff 1743 case USART_CLOCKSOURCE_HSI:
bogdanm 0:9b334a45a8ff 1744 usartdiv = (uint16_t)((2*HSI_VALUE) / husart->Init.BaudRate);
bogdanm 0:9b334a45a8ff 1745 break;
bogdanm 0:9b334a45a8ff 1746 case USART_CLOCKSOURCE_SYSCLK:
bogdanm 0:9b334a45a8ff 1747 usartdiv = (uint16_t)((2*HAL_RCC_GetSysClockFreq()) / husart->Init.BaudRate);
bogdanm 0:9b334a45a8ff 1748 break;
bogdanm 0:9b334a45a8ff 1749 case USART_CLOCKSOURCE_LSE:
bogdanm 0:9b334a45a8ff 1750 usartdiv = (uint16_t)((2*LSE_VALUE) / husart->Init.BaudRate);
bogdanm 0:9b334a45a8ff 1751 break;
bogdanm 0:9b334a45a8ff 1752 case USART_CLOCKSOURCE_UNDEFINED:
bogdanm 0:9b334a45a8ff 1753 default:
bogdanm 0:9b334a45a8ff 1754 ret = HAL_ERROR;
bogdanm 0:9b334a45a8ff 1755 break;
bogdanm 0:9b334a45a8ff 1756 }
bogdanm 0:9b334a45a8ff 1757
bogdanm 0:9b334a45a8ff 1758 brrtemp = usartdiv & 0xFFF0;
bogdanm 0:9b334a45a8ff 1759 brrtemp |= (uint16_t)((usartdiv & (uint16_t)0x000F) >> 1U);
bogdanm 0:9b334a45a8ff 1760 husart->Instance->BRR = brrtemp;
bogdanm 0:9b334a45a8ff 1761
bogdanm 0:9b334a45a8ff 1762 return ret;
bogdanm 0:9b334a45a8ff 1763 }
bogdanm 0:9b334a45a8ff 1764
bogdanm 0:9b334a45a8ff 1765 /**
bogdanm 0:9b334a45a8ff 1766 * @brief Check the USART Idle State
bogdanm 0:9b334a45a8ff 1767 * @param husart: USART handle
bogdanm 0:9b334a45a8ff 1768 * @retval HAL status
bogdanm 0:9b334a45a8ff 1769 */
bogdanm 0:9b334a45a8ff 1770 static HAL_StatusTypeDef USART_CheckIdleState(USART_HandleTypeDef *husart)
bogdanm 0:9b334a45a8ff 1771 {
bogdanm 0:9b334a45a8ff 1772 /* Initialize the USART ErrorCode */
bogdanm 0:9b334a45a8ff 1773 husart->ErrorCode = HAL_USART_ERROR_NONE;
bogdanm 0:9b334a45a8ff 1774
bogdanm 0:9b334a45a8ff 1775 /* Check if the Transmitter is enabled */
bogdanm 0:9b334a45a8ff 1776 if((husart->Instance->CR1 & USART_CR1_TE) == USART_CR1_TE)
bogdanm 0:9b334a45a8ff 1777 {
bogdanm 0:9b334a45a8ff 1778 /* Wait until TEACK flag is set */
bogdanm 0:9b334a45a8ff 1779 if(USART_WaitOnFlagUntilTimeout(husart, USART_ISR_TEACK, RESET, TEACK_REACK_TIMEOUT) != HAL_OK)
bogdanm 0:9b334a45a8ff 1780 {
bogdanm 0:9b334a45a8ff 1781 husart->State= HAL_USART_STATE_TIMEOUT;
bogdanm 0:9b334a45a8ff 1782 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 1783 }
bogdanm 0:9b334a45a8ff 1784 }
bogdanm 0:9b334a45a8ff 1785 /* Check if the Receiver is enabled */
bogdanm 0:9b334a45a8ff 1786 if((husart->Instance->CR1 & USART_CR1_RE) == USART_CR1_RE)
bogdanm 0:9b334a45a8ff 1787 {
bogdanm 0:9b334a45a8ff 1788 /* Wait until REACK flag is set */
bogdanm 0:9b334a45a8ff 1789 if(USART_WaitOnFlagUntilTimeout(husart, USART_ISR_REACK, RESET, TEACK_REACK_TIMEOUT) != HAL_OK)
bogdanm 0:9b334a45a8ff 1790 {
bogdanm 0:9b334a45a8ff 1791 husart->State= HAL_USART_STATE_TIMEOUT;
bogdanm 0:9b334a45a8ff 1792 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 1793 }
bogdanm 0:9b334a45a8ff 1794 }
bogdanm 0:9b334a45a8ff 1795
bogdanm 0:9b334a45a8ff 1796 /* Initialize the USART state*/
bogdanm 0:9b334a45a8ff 1797 husart->State= HAL_USART_STATE_READY;
bogdanm 0:9b334a45a8ff 1798
bogdanm 0:9b334a45a8ff 1799 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 1800 __HAL_UNLOCK(husart);
bogdanm 0:9b334a45a8ff 1801
bogdanm 0:9b334a45a8ff 1802 return HAL_OK;
bogdanm 0:9b334a45a8ff 1803 }
bogdanm 0:9b334a45a8ff 1804
bogdanm 0:9b334a45a8ff 1805 /**
bogdanm 0:9b334a45a8ff 1806 * @}
bogdanm 0:9b334a45a8ff 1807 */
bogdanm 0:9b334a45a8ff 1808
bogdanm 0:9b334a45a8ff 1809 #endif /* HAL_USART_MODULE_ENABLED */
bogdanm 0:9b334a45a8ff 1810 /**
bogdanm 0:9b334a45a8ff 1811 * @}
bogdanm 0:9b334a45a8ff 1812 */
bogdanm 0:9b334a45a8ff 1813
bogdanm 0:9b334a45a8ff 1814 /**
bogdanm 0:9b334a45a8ff 1815 * @}
bogdanm 0:9b334a45a8ff 1816 */
bogdanm 0:9b334a45a8ff 1817
bogdanm 0:9b334a45a8ff 1818 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/