fix LPC812 PWM

Dependents:   IR_LED_Send

Fork of mbed-dev by mbed official

Committer:
bogdanm
Date:
Thu Oct 01 15:25:22 2015 +0300
Revision:
0:9b334a45a8ff
Initial commit on mbed-dev

Replaces mbed-src (now inactive)

Who changed what in which revision?

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