mbed library sources. Supersedes mbed-src.

Dependents:   Nucleo_Hello_Encoder BLE_iBeaconScan AM1805_DEMO DISCO-F429ZI_ExportTemplate1 ... more

Committer:
AnnaBridge
Date:
Wed Feb 20 22:31:08 2019 +0000
Revision:
189:f392fc9709a3
Parent:
186:707f6e361f3e
mbed library release version 165

Who changed what in which revision?

UserRevisionLine numberNew contents of line
<> 144:ef7eb2e8f9f7 1 /**
<> 144:ef7eb2e8f9f7 2 ******************************************************************************
<> 144:ef7eb2e8f9f7 3 * @file stm32l0xx_hal_usart.c
<> 144:ef7eb2e8f9f7 4 * @author MCD Application Team
<> 144:ef7eb2e8f9f7 5 * @brief USART HAL module driver.
Anna Bridge 186:707f6e361f3e 6 * This file provides firmware functions to manage the following
<> 144:ef7eb2e8f9f7 7 * functionalities of the Universal Synchronous/Asynchronous Receiver Transmitter
<> 144:ef7eb2e8f9f7 8 * Peripheral (USART).
<> 144:ef7eb2e8f9f7 9 * + Initialization and de-initialization functions
<> 144:ef7eb2e8f9f7 10 * + IO operation functions
<> 144:ef7eb2e8f9f7 11 * + Peripheral Control functions
Anna Bridge 186:707f6e361f3e 12 * + Peripheral State and Error functions
Anna Bridge 186:707f6e361f3e 13 *
Anna Bridge 186:707f6e361f3e 14 @verbatim
<> 144:ef7eb2e8f9f7 15 ===============================================================================
<> 144:ef7eb2e8f9f7 16 ##### How to use this driver #####
<> 144:ef7eb2e8f9f7 17 ===============================================================================
<> 144:ef7eb2e8f9f7 18 [..]
<> 144:ef7eb2e8f9f7 19 The USART HAL driver can be used as follows:
<> 144:ef7eb2e8f9f7 20
Anna Bridge 186:707f6e361f3e 21 (#) Declare a USART_HandleTypeDef handle structure (eg. USART_HandleTypeDef husart).
Anna Bridge 186:707f6e361f3e 22 (#) Initialize the USART low level resources by implementing the HAL_USART_MspInit() API:
Anna Bridge 186:707f6e361f3e 23 (++) Enable the USARTx interface clock.
Anna Bridge 186:707f6e361f3e 24 (++) USART pins configuration:
Anna Bridge 186:707f6e361f3e 25 (+++) Enable the clock for the USART GPIOs.
Anna Bridge 186:707f6e361f3e 26 (+++) Configure these USART pins as alternate function pull-up.
Anna Bridge 186:707f6e361f3e 27 (++) NVIC configuration if you need to use interrupt process (HAL_USART_Transmit_IT(),
<> 144:ef7eb2e8f9f7 28 HAL_USART_Receive_IT() and HAL_USART_TransmitReceive_IT() APIs):
Anna Bridge 186:707f6e361f3e 29 (+++) Configure the USARTx interrupt priority.
Anna Bridge 186:707f6e361f3e 30 (+++) Enable the NVIC USART IRQ handle.
Anna Bridge 186:707f6e361f3e 31 (++) USART interrupts handling:
Anna Bridge 186:707f6e361f3e 32 -@@- The specific USART interrupts (Transmission complete interrupt,
<> 144:ef7eb2e8f9f7 33 RXNE interrupt and Error Interrupts) will be managed using the macros
<> 144:ef7eb2e8f9f7 34 __HAL_USART_ENABLE_IT() and __HAL_USART_DISABLE_IT() inside the transmit and receive process.
Anna Bridge 186:707f6e361f3e 35 (++) DMA Configuration if you need to use DMA process (HAL_USART_Transmit_DMA()
Anna Bridge 186:707f6e361f3e 36 HAL_USART_Receive_DMA() and HAL_USART_TransmitReceive_DMA() APIs):
Anna Bridge 186:707f6e361f3e 37 (+++) Declare a DMA handle structure for the Tx/Rx channel.
Anna Bridge 186:707f6e361f3e 38 (+++) Enable the DMAx interface clock.
Anna Bridge 186:707f6e361f3e 39 (+++) Configure the declared DMA handle structure with the required Tx/Rx parameters.
Anna Bridge 186:707f6e361f3e 40 (+++) Configure the DMA Tx/Rx channel.
Anna Bridge 186:707f6e361f3e 41 (+++) Associate the initialized DMA handle to the USART DMA Tx/Rx handle.
Anna Bridge 186:707f6e361f3e 42 (+++) Configure the priority and enable the NVIC for the transfer complete interrupt on the DMA Tx/Rx channel.
<> 144:ef7eb2e8f9f7 43
Anna Bridge 186:707f6e361f3e 44 (#) Program the Baud Rate, Word Length, Stop Bit, Parity, Hardware
Anna Bridge 186:707f6e361f3e 45 flow control and Mode (Receiver/Transmitter) in the husart handle Init structure.
<> 144:ef7eb2e8f9f7 46
<> 144:ef7eb2e8f9f7 47 (#) Initialize the USART registers by calling the HAL_USART_Init() API:
Anna Bridge 186:707f6e361f3e 48 (++) This API configures also the low level Hardware GPIO, CLOCK, CORTEX...etc)
Anna Bridge 186:707f6e361f3e 49 by calling the customized HAL_USART_MspInit(&husart) API.
Anna Bridge 186:707f6e361f3e 50
<> 144:ef7eb2e8f9f7 51
<> 144:ef7eb2e8f9f7 52 @endverbatim
<> 144:ef7eb2e8f9f7 53 ******************************************************************************
<> 144:ef7eb2e8f9f7 54 * @attention
<> 144:ef7eb2e8f9f7 55 *
<> 144:ef7eb2e8f9f7 56 * <h2><center>&copy; COPYRIGHT(c) 2016 STMicroelectronics</center></h2>
<> 144:ef7eb2e8f9f7 57 *
<> 144:ef7eb2e8f9f7 58 * Redistribution and use in source and binary forms, with or without modification,
<> 144:ef7eb2e8f9f7 59 * are permitted provided that the following conditions are met:
<> 144:ef7eb2e8f9f7 60 * 1. Redistributions of source code must retain the above copyright notice,
<> 144:ef7eb2e8f9f7 61 * this list of conditions and the following disclaimer.
<> 144:ef7eb2e8f9f7 62 * 2. Redistributions in binary form must reproduce the above copyright notice,
<> 144:ef7eb2e8f9f7 63 * this list of conditions and the following disclaimer in the documentation
<> 144:ef7eb2e8f9f7 64 * and/or other materials provided with the distribution.
<> 144:ef7eb2e8f9f7 65 * 3. Neither the name of STMicroelectronics nor the names of its contributors
<> 144:ef7eb2e8f9f7 66 * may be used to endorse or promote products derived from this software
<> 144:ef7eb2e8f9f7 67 * without specific prior written permission.
<> 144:ef7eb2e8f9f7 68 *
<> 144:ef7eb2e8f9f7 69 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
<> 144:ef7eb2e8f9f7 70 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
<> 144:ef7eb2e8f9f7 71 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
<> 144:ef7eb2e8f9f7 72 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
<> 144:ef7eb2e8f9f7 73 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
<> 144:ef7eb2e8f9f7 74 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
<> 144:ef7eb2e8f9f7 75 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
<> 144:ef7eb2e8f9f7 76 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
<> 144:ef7eb2e8f9f7 77 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
<> 144:ef7eb2e8f9f7 78 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
<> 144:ef7eb2e8f9f7 79 *
Anna Bridge 186:707f6e361f3e 80 ******************************************************************************
<> 144:ef7eb2e8f9f7 81 */
<> 144:ef7eb2e8f9f7 82
<> 144:ef7eb2e8f9f7 83 /* Includes ------------------------------------------------------------------*/
<> 144:ef7eb2e8f9f7 84 #include "stm32l0xx_hal.h"
<> 144:ef7eb2e8f9f7 85
<> 144:ef7eb2e8f9f7 86 /** @addtogroup STM32L0xx_HAL_Driver
<> 144:ef7eb2e8f9f7 87 * @{
<> 144:ef7eb2e8f9f7 88 */
<> 144:ef7eb2e8f9f7 89
Anna Bridge 186:707f6e361f3e 90 /** @defgroup USART USART
Anna Bridge 186:707f6e361f3e 91 * @brief HAL USART Synchronous module driver
<> 144:ef7eb2e8f9f7 92 * @{
<> 144:ef7eb2e8f9f7 93 */
<> 144:ef7eb2e8f9f7 94
Anna Bridge 186:707f6e361f3e 95 #ifdef HAL_USART_MODULE_ENABLED
<> 144:ef7eb2e8f9f7 96
<> 144:ef7eb2e8f9f7 97 /* Private typedef -----------------------------------------------------------*/
<> 144:ef7eb2e8f9f7 98 /* Private define ------------------------------------------------------------*/
Anna Bridge 186:707f6e361f3e 99 /** @defgroup USART_Private_Constants USART Private Constants
Anna Bridge 186:707f6e361f3e 100 * @{
Anna Bridge 186:707f6e361f3e 101 */
Anna Bridge 186:707f6e361f3e 102 #define USART_DUMMY_DATA ((uint16_t) 0xFFFFU) /*!< USART transmitted dummy data */
Anna Bridge 186:707f6e361f3e 103 #define USART_TEACK_REACK_TIMEOUT ((uint32_t) 1000U) /*!< USART TX or RX enable acknowledge time-out value */
Anna Bridge 186:707f6e361f3e 104 #define USART_CR1_FIELDS ((uint32_t)(USART_CR1_M | USART_CR1_PCE | USART_CR1_PS | \
Anna Bridge 186:707f6e361f3e 105 USART_CR1_TE | USART_CR1_RE | USART_CR1_OVER8)) /*!< USART CR1 fields of parameters set by USART_SetConfig API */
Anna Bridge 186:707f6e361f3e 106 #define USART_CR2_FIELDS ((uint32_t)(USART_CR2_CPHA | USART_CR2_CPOL | \
Anna Bridge 186:707f6e361f3e 107 USART_CR2_CLKEN | USART_CR2_LBCL | USART_CR2_STOP)) /*!< USART CR2 fields of parameters set by USART_SetConfig API */
Anna Bridge 186:707f6e361f3e 108 /**
Anna Bridge 186:707f6e361f3e 109 * @}
Anna Bridge 186:707f6e361f3e 110 */
<> 144:ef7eb2e8f9f7 111
Anna Bridge 186:707f6e361f3e 112 /* Private macros ------------------------------------------------------------*/
<> 144:ef7eb2e8f9f7 113 /* Private variables ---------------------------------------------------------*/
<> 144:ef7eb2e8f9f7 114 /* Private function prototypes -----------------------------------------------*/
Anna Bridge 186:707f6e361f3e 115 /** @addtogroup USART_Private_Functions
Anna Bridge 186:707f6e361f3e 116 * @{
Anna Bridge 186:707f6e361f3e 117 */
Anna Bridge 186:707f6e361f3e 118 static void USART_EndTransfer(USART_HandleTypeDef *husart);
<> 144:ef7eb2e8f9f7 119 static void USART_DMATransmitCplt(DMA_HandleTypeDef *hdma);
Anna Bridge 186:707f6e361f3e 120 static void USART_DMAReceiveCplt(DMA_HandleTypeDef *hdma);
<> 144:ef7eb2e8f9f7 121 static void USART_DMATxHalfCplt(DMA_HandleTypeDef *hdma);
<> 144:ef7eb2e8f9f7 122 static void USART_DMARxHalfCplt(DMA_HandleTypeDef *hdma);
Anna Bridge 186:707f6e361f3e 123 static void USART_DMAError(DMA_HandleTypeDef *hdma);
Anna Bridge 186:707f6e361f3e 124 static void USART_DMAAbortOnError(DMA_HandleTypeDef *hdma);
Anna Bridge 186:707f6e361f3e 125 static void USART_DMATxAbortCallback(DMA_HandleTypeDef *hdma);
Anna Bridge 186:707f6e361f3e 126 static void USART_DMARxAbortCallback(DMA_HandleTypeDef *hdma);
Anna Bridge 186:707f6e361f3e 127 static HAL_StatusTypeDef USART_WaitOnFlagUntilTimeout(USART_HandleTypeDef *husart, uint32_t Flag, FlagStatus Status, uint32_t Tickstart, uint32_t Timeout);
Anna Bridge 186:707f6e361f3e 128 static HAL_StatusTypeDef USART_SetConfig(USART_HandleTypeDef *husart);
<> 144:ef7eb2e8f9f7 129 static HAL_StatusTypeDef USART_CheckIdleState(USART_HandleTypeDef *husart);
<> 144:ef7eb2e8f9f7 130 static HAL_StatusTypeDef USART_Transmit_IT(USART_HandleTypeDef *husart);
<> 144:ef7eb2e8f9f7 131 static HAL_StatusTypeDef USART_EndTransmit_IT(USART_HandleTypeDef *husart);
<> 144:ef7eb2e8f9f7 132 static HAL_StatusTypeDef USART_Receive_IT(USART_HandleTypeDef *husart);
<> 144:ef7eb2e8f9f7 133 static HAL_StatusTypeDef USART_TransmitReceive_IT(USART_HandleTypeDef *husart);
<> 144:ef7eb2e8f9f7 134 /**
<> 144:ef7eb2e8f9f7 135 * @}
<> 144:ef7eb2e8f9f7 136 */
<> 144:ef7eb2e8f9f7 137
Anna Bridge 186:707f6e361f3e 138 /* Exported functions --------------------------------------------------------*/
<> 144:ef7eb2e8f9f7 139
Anna Bridge 186:707f6e361f3e 140 /** @defgroup USART_Exported_Functions USART Exported Functions
<> 144:ef7eb2e8f9f7 141 * @{
<> 144:ef7eb2e8f9f7 142 */
<> 144:ef7eb2e8f9f7 143
Anna Bridge 186:707f6e361f3e 144 /** @defgroup USART_Exported_Functions_Group1 Initialization and de-initialization functions
Anna Bridge 186:707f6e361f3e 145 * @brief Initialization and Configuration functions
<> 144:ef7eb2e8f9f7 146 *
<> 144:ef7eb2e8f9f7 147 @verbatim
<> 144:ef7eb2e8f9f7 148 ===============================================================================
<> 144:ef7eb2e8f9f7 149 ##### Initialization and Configuration functions #####
<> 144:ef7eb2e8f9f7 150 ===============================================================================
<> 144:ef7eb2e8f9f7 151 [..]
Anna Bridge 186:707f6e361f3e 152 This subsection provides a set of functions allowing to initialize the USART
<> 144:ef7eb2e8f9f7 153 in asynchronous and in synchronous modes.
Anna Bridge 186:707f6e361f3e 154 (+) For the asynchronous mode only these parameters can be configured:
<> 144:ef7eb2e8f9f7 155 (++) Baud Rate
Anna Bridge 186:707f6e361f3e 156 (++) Word Length
<> 144:ef7eb2e8f9f7 157 (++) Stop Bit
<> 144:ef7eb2e8f9f7 158 (++) Parity: If the parity is enabled, then the MSB bit of the data written
<> 144:ef7eb2e8f9f7 159 in the data register is transmitted but is changed by the parity bit.
<> 151:5eaa88a5bcc7 160 (++) USART polarity
<> 151:5eaa88a5bcc7 161 (++) USART phase
<> 151:5eaa88a5bcc7 162 (++) USART LastBit
<> 151:5eaa88a5bcc7 163 (++) Receiver/transmitter modes
<> 151:5eaa88a5bcc7 164
<> 151:5eaa88a5bcc7 165 [..]
<> 151:5eaa88a5bcc7 166 The HAL_USART_Init() function follows the USART synchronous configuration
Anna Bridge 186:707f6e361f3e 167 procedure (details for the procedure are available in reference manual).
<> 151:5eaa88a5bcc7 168
<> 151:5eaa88a5bcc7 169 @endverbatim
<> 151:5eaa88a5bcc7 170
Anna Bridge 186:707f6e361f3e 171 Depending on the frame length defined by the M1 and M0 bits (7-bit,
Anna Bridge 186:707f6e361f3e 172 8-bit or 9-bit), the possible USART formats are listed in the
Anna Bridge 186:707f6e361f3e 173 following table.
Anna Bridge 186:707f6e361f3e 174
Anna Bridge 186:707f6e361f3e 175 Table 1. USART frame format.
Anna Bridge 186:707f6e361f3e 176 +-----------------------------------------------------------------------+
Anna Bridge 186:707f6e361f3e 177 | M1 bit | M0 bit | PCE bit | USART frame |
Anna Bridge 186:707f6e361f3e 178 |---------|---------|-----------|---------------------------------------|
Anna Bridge 186:707f6e361f3e 179 | 0 | 0 | 0 | | SB | 8 bit data | STB | |
Anna Bridge 186:707f6e361f3e 180 |---------|---------|-----------|---------------------------------------|
Anna Bridge 186:707f6e361f3e 181 | 0 | 0 | 1 | | SB | 7 bit data | PB | STB | |
Anna Bridge 186:707f6e361f3e 182 |---------|---------|-----------|---------------------------------------|
Anna Bridge 186:707f6e361f3e 183 | 0 | 1 | 0 | | SB | 9 bit data | STB | |
Anna Bridge 186:707f6e361f3e 184 |---------|---------|-----------|---------------------------------------|
Anna Bridge 186:707f6e361f3e 185 | 0 | 1 | 1 | | SB | 8 bit data | PB | STB | |
Anna Bridge 186:707f6e361f3e 186 |---------|---------|-----------|---------------------------------------|
Anna Bridge 186:707f6e361f3e 187 | 1 | 0 | 0 | | SB | 7 bit data | STB | |
Anna Bridge 186:707f6e361f3e 188 |---------|---------|-----------|---------------------------------------|
Anna Bridge 186:707f6e361f3e 189 | 1 | 0 | 1 | | SB | 6 bit data | PB | STB | |
Anna Bridge 186:707f6e361f3e 190 +-----------------------------------------------------------------------+
<> 144:ef7eb2e8f9f7 191
<> 144:ef7eb2e8f9f7 192 * @{
<> 144:ef7eb2e8f9f7 193 */
<> 144:ef7eb2e8f9f7 194
<> 144:ef7eb2e8f9f7 195 /**
Anna Bridge 186:707f6e361f3e 196 * @brief Initialize the USART mode according to the specified
Anna Bridge 186:707f6e361f3e 197 * parameters in the USART_InitTypeDef and initialize the associated handle.
Anna Bridge 186:707f6e361f3e 198 * @param husart USART handle.
<> 144:ef7eb2e8f9f7 199 * @retval HAL status
<> 144:ef7eb2e8f9f7 200 */
<> 144:ef7eb2e8f9f7 201 HAL_StatusTypeDef HAL_USART_Init(USART_HandleTypeDef *husart)
<> 144:ef7eb2e8f9f7 202 {
<> 144:ef7eb2e8f9f7 203 /* Check the USART handle allocation */
<> 144:ef7eb2e8f9f7 204 if(husart == NULL)
<> 144:ef7eb2e8f9f7 205 {
<> 144:ef7eb2e8f9f7 206 return HAL_ERROR;
<> 144:ef7eb2e8f9f7 207 }
<> 144:ef7eb2e8f9f7 208
<> 144:ef7eb2e8f9f7 209 /* Check the parameters */
<> 144:ef7eb2e8f9f7 210 assert_param(IS_USART_INSTANCE(husart->Instance));
<> 144:ef7eb2e8f9f7 211
<> 144:ef7eb2e8f9f7 212 if(husart->State == HAL_USART_STATE_RESET)
<> 144:ef7eb2e8f9f7 213 {
<> 144:ef7eb2e8f9f7 214 /* Allocate lock resource and initialize it */
<> 144:ef7eb2e8f9f7 215 husart->Lock = HAL_UNLOCKED;
<> 144:ef7eb2e8f9f7 216
Anna Bridge 186:707f6e361f3e 217 /* Init the low level hardware : GPIO, CLOCK */
<> 144:ef7eb2e8f9f7 218 HAL_USART_MspInit(husart);
<> 144:ef7eb2e8f9f7 219 }
Anna Bridge 186:707f6e361f3e 220
<> 144:ef7eb2e8f9f7 221 husart->State = HAL_USART_STATE_BUSY;
Anna Bridge 186:707f6e361f3e 222
<> 144:ef7eb2e8f9f7 223 /* Disable the Peripheral */
<> 144:ef7eb2e8f9f7 224 __HAL_USART_DISABLE(husart);
Anna Bridge 186:707f6e361f3e 225
<> 144:ef7eb2e8f9f7 226 /* Set the Usart Communication parameters */
<> 144:ef7eb2e8f9f7 227 if (USART_SetConfig(husart) == HAL_ERROR)
<> 144:ef7eb2e8f9f7 228 {
<> 144:ef7eb2e8f9f7 229 return HAL_ERROR;
<> 144:ef7eb2e8f9f7 230 }
Anna Bridge 186:707f6e361f3e 231
Anna Bridge 186:707f6e361f3e 232 /* In Synchronous mode, the following bits must be kept cleared:
<> 144:ef7eb2e8f9f7 233 - LINEN bit in the USART_CR2 register
<> 144:ef7eb2e8f9f7 234 - HDSEL, SCEN and IREN bits in the USART_CR3 register.*/
<> 144:ef7eb2e8f9f7 235 husart->Instance->CR2 &= ~USART_CR2_LINEN;
<> 144:ef7eb2e8f9f7 236 husart->Instance->CR3 &= ~(USART_CR3_SCEN | USART_CR3_HDSEL | USART_CR3_IREN);
Anna Bridge 186:707f6e361f3e 237
Anna Bridge 186:707f6e361f3e 238 /* Enable the Peripheral */
<> 144:ef7eb2e8f9f7 239 __HAL_USART_ENABLE(husart);
Anna Bridge 186:707f6e361f3e 240
<> 144:ef7eb2e8f9f7 241 /* TEACK and/or REACK to check before moving husart->State to Ready */
<> 144:ef7eb2e8f9f7 242 return (USART_CheckIdleState(husart));
<> 144:ef7eb2e8f9f7 243 }
<> 144:ef7eb2e8f9f7 244
<> 144:ef7eb2e8f9f7 245 /**
Anna Bridge 186:707f6e361f3e 246 * @brief DeInitialize the USART peripheral.
Anna Bridge 186:707f6e361f3e 247 * @param husart USART handle.
<> 144:ef7eb2e8f9f7 248 * @retval HAL status
<> 144:ef7eb2e8f9f7 249 */
<> 144:ef7eb2e8f9f7 250 HAL_StatusTypeDef HAL_USART_DeInit(USART_HandleTypeDef *husart)
<> 144:ef7eb2e8f9f7 251 {
Anna Bridge 186:707f6e361f3e 252 /* Check the USART handle allocation */
<> 144:ef7eb2e8f9f7 253 if(husart == NULL)
<> 144:ef7eb2e8f9f7 254 {
<> 144:ef7eb2e8f9f7 255 return HAL_ERROR;
<> 144:ef7eb2e8f9f7 256 }
<> 144:ef7eb2e8f9f7 257
<> 144:ef7eb2e8f9f7 258 /* Check the parameters */
<> 144:ef7eb2e8f9f7 259 assert_param(IS_USART_INSTANCE(husart->Instance));
<> 144:ef7eb2e8f9f7 260
<> 144:ef7eb2e8f9f7 261 husart->State = HAL_USART_STATE_BUSY;
Anna Bridge 186:707f6e361f3e 262
<> 151:5eaa88a5bcc7 263 husart->Instance->CR1 = 0x0U;
<> 151:5eaa88a5bcc7 264 husart->Instance->CR2 = 0x0U;
<> 151:5eaa88a5bcc7 265 husart->Instance->CR3 = 0x0U;
Anna Bridge 186:707f6e361f3e 266
<> 144:ef7eb2e8f9f7 267 /* DeInit the low level hardware */
<> 144:ef7eb2e8f9f7 268 HAL_USART_MspDeInit(husart);
<> 144:ef7eb2e8f9f7 269
<> 144:ef7eb2e8f9f7 270 husart->ErrorCode = HAL_USART_ERROR_NONE;
<> 144:ef7eb2e8f9f7 271 husart->State = HAL_USART_STATE_RESET;
Anna Bridge 186:707f6e361f3e 272
Anna Bridge 186:707f6e361f3e 273 /* Process Unlock */
<> 144:ef7eb2e8f9f7 274 __HAL_UNLOCK(husart);
Anna Bridge 186:707f6e361f3e 275
<> 144:ef7eb2e8f9f7 276 return HAL_OK;
<> 144:ef7eb2e8f9f7 277 }
<> 144:ef7eb2e8f9f7 278
<> 144:ef7eb2e8f9f7 279 /**
Anna Bridge 186:707f6e361f3e 280 * @brief Initialize the USART MSP.
Anna Bridge 186:707f6e361f3e 281 * @param husart: USART handle.
<> 144:ef7eb2e8f9f7 282 * @retval None
<> 144:ef7eb2e8f9f7 283 */
Anna Bridge 186:707f6e361f3e 284 __weak void HAL_USART_MspInit(USART_HandleTypeDef *husart)
<> 144:ef7eb2e8f9f7 285 {
<> 144:ef7eb2e8f9f7 286 /* Prevent unused argument(s) compilation warning */
<> 144:ef7eb2e8f9f7 287 UNUSED(husart);
<> 144:ef7eb2e8f9f7 288
Anna Bridge 186:707f6e361f3e 289 /* NOTE : This function should not be modified, when the callback is needed,
Anna Bridge 186:707f6e361f3e 290 the HAL_USART_MspInit can be implemented in the user file
Anna Bridge 186:707f6e361f3e 291 */
<> 144:ef7eb2e8f9f7 292 }
<> 144:ef7eb2e8f9f7 293
<> 144:ef7eb2e8f9f7 294 /**
Anna Bridge 186:707f6e361f3e 295 * @brief DeInitialize the USART MSP.
Anna Bridge 186:707f6e361f3e 296 * @param husart: USART handle.
<> 144:ef7eb2e8f9f7 297 * @retval None
<> 144:ef7eb2e8f9f7 298 */
Anna Bridge 186:707f6e361f3e 299 __weak void HAL_USART_MspDeInit(USART_HandleTypeDef *husart)
<> 144:ef7eb2e8f9f7 300 {
<> 144:ef7eb2e8f9f7 301 /* Prevent unused argument(s) compilation warning */
<> 144:ef7eb2e8f9f7 302 UNUSED(husart);
<> 144:ef7eb2e8f9f7 303
Anna Bridge 186:707f6e361f3e 304 /* NOTE : This function should not be modified, when the callback is needed,
Anna Bridge 186:707f6e361f3e 305 the HAL_USART_MspDeInit can be implemented in the user file
Anna Bridge 186:707f6e361f3e 306 */
<> 144:ef7eb2e8f9f7 307 }
<> 144:ef7eb2e8f9f7 308
<> 144:ef7eb2e8f9f7 309 /**
<> 144:ef7eb2e8f9f7 310 * @}
<> 144:ef7eb2e8f9f7 311 */
<> 144:ef7eb2e8f9f7 312
Anna Bridge 186:707f6e361f3e 313 /** @defgroup USART_Exported_Functions_Group2 IO operation functions
Anna Bridge 186:707f6e361f3e 314 * @brief USART Transmit and Receive functions
<> 144:ef7eb2e8f9f7 315 *
<> 144:ef7eb2e8f9f7 316 @verbatim
<> 144:ef7eb2e8f9f7 317 ===============================================================================
<> 144:ef7eb2e8f9f7 318 ##### IO operation functions #####
<> 144:ef7eb2e8f9f7 319 ===============================================================================
Anna Bridge 186:707f6e361f3e 320 [..] This subsection provides a set of functions allowing to manage the USART synchronous
<> 144:ef7eb2e8f9f7 321 data transfers.
Anna Bridge 186:707f6e361f3e 322
<> 144:ef7eb2e8f9f7 323 [..] The USART supports master mode only: it cannot receive or send data related to an input
<> 144:ef7eb2e8f9f7 324 clock (SCLK is always an output).
<> 144:ef7eb2e8f9f7 325
<> 144:ef7eb2e8f9f7 326 (#) There are two modes of transfer:
Anna Bridge 186:707f6e361f3e 327 (++) Blocking mode: The communication is performed in polling mode.
Anna Bridge 186:707f6e361f3e 328 The HAL status of all data processing is returned by the same function
Anna Bridge 186:707f6e361f3e 329 after finishing transfer.
Anna Bridge 186:707f6e361f3e 330 (++) No-Blocking mode: The communication is performed using Interrupts
<> 144:ef7eb2e8f9f7 331 or DMA, These API's return the HAL status.
Anna Bridge 186:707f6e361f3e 332 The end of the data processing will be indicated through the
Anna Bridge 186:707f6e361f3e 333 dedicated USART IRQ when using Interrupt mode or the DMA IRQ when
<> 144:ef7eb2e8f9f7 334 using DMA mode.
Anna Bridge 186:707f6e361f3e 335 The HAL_USART_TxCpltCallback(), HAL_USART_RxCpltCallback() and HAL_USART_TxRxCpltCallback() user callbacks
Anna Bridge 186:707f6e361f3e 336 will be executed respectively at the end of the transmit or Receive process
Anna Bridge 186:707f6e361f3e 337 The HAL_USART_ErrorCallback()user callback will be executed when a communication error is detected
<> 144:ef7eb2e8f9f7 338
<> 144:ef7eb2e8f9f7 339 (#) Blocking mode API's are :
<> 144:ef7eb2e8f9f7 340 (++) HAL_USART_Transmit()in simplex mode
<> 144:ef7eb2e8f9f7 341 (++) HAL_USART_Receive() in full duplex receive only
<> 144:ef7eb2e8f9f7 342 (++) HAL_USART_TransmitReceive() in full duplex mode
Anna Bridge 186:707f6e361f3e 343
<> 144:ef7eb2e8f9f7 344 (#) Non-Blocking mode API's with Interrupt are :
<> 144:ef7eb2e8f9f7 345 (++) HAL_USART_Transmit_IT()in simplex mode
<> 144:ef7eb2e8f9f7 346 (++) HAL_USART_Receive_IT() in full duplex receive only
<> 144:ef7eb2e8f9f7 347 (++) HAL_USART_TransmitReceive_IT()in full duplex mode
<> 144:ef7eb2e8f9f7 348 (++) HAL_USART_IRQHandler()
<> 144:ef7eb2e8f9f7 349
Anna Bridge 186:707f6e361f3e 350 (#) No-Blocking mode API's with DMA are :
<> 144:ef7eb2e8f9f7 351 (++) HAL_USART_Transmit_DMA()in simplex mode
<> 144:ef7eb2e8f9f7 352 (++) HAL_USART_Receive_DMA() in full duplex receive only
<> 144:ef7eb2e8f9f7 353 (++) HAL_USART_TransmitReceive_DMA() in full duplex mode
<> 144:ef7eb2e8f9f7 354 (++) HAL_USART_DMAPause()
<> 144:ef7eb2e8f9f7 355 (++) HAL_USART_DMAResume()
<> 144:ef7eb2e8f9f7 356 (++) HAL_USART_DMAStop()
<> 144:ef7eb2e8f9f7 357
Anna Bridge 186:707f6e361f3e 358 (#) A set of Transfer Complete Callbacks are provided in Non_Blocking mode:
<> 144:ef7eb2e8f9f7 359 (++) HAL_USART_TxCpltCallback()
<> 144:ef7eb2e8f9f7 360 (++) HAL_USART_RxCpltCallback()
<> 144:ef7eb2e8f9f7 361 (++) HAL_USART_TxHalfCpltCallback()
<> 144:ef7eb2e8f9f7 362 (++) HAL_USART_RxHalfCpltCallback()
<> 144:ef7eb2e8f9f7 363 (++) HAL_USART_ErrorCallback()
<> 144:ef7eb2e8f9f7 364 (++) HAL_USART_TxRxCpltCallback()
<> 144:ef7eb2e8f9f7 365
Anna Bridge 186:707f6e361f3e 366 (#) Non-Blocking mode transfers could be aborted using Abort API's :
Anna Bridge 186:707f6e361f3e 367 (+) HAL_USART_Abort()
Anna Bridge 186:707f6e361f3e 368 (+) HAL_USART_Abort_IT()
Anna Bridge 186:707f6e361f3e 369
Anna Bridge 186:707f6e361f3e 370 (#) For Abort services based on interrupts (HAL_USART_Abort_IT), a Abort Complete Callbacks is provided:
Anna Bridge 186:707f6e361f3e 371 (+) HAL_USART_AbortCpltCallback()
Anna Bridge 186:707f6e361f3e 372
Anna Bridge 186:707f6e361f3e 373 (#) In Non-Blocking mode transfers, possible errors are split into 2 categories.
Anna Bridge 186:707f6e361f3e 374 Errors are handled as follows :
Anna Bridge 186:707f6e361f3e 375 (+) Error is considered as Recoverable and non blocking : Transfer could go till end, but error severity is
Anna Bridge 186:707f6e361f3e 376 to be evaluated by user : this concerns Frame Error, Parity Error or Noise Error in Interrupt mode reception .
Anna Bridge 186:707f6e361f3e 377 Received character is then retrieved and stored in Rx buffer, Error code is set to allow user to identify error type,
Anna Bridge 186:707f6e361f3e 378 and HAL_USART_ErrorCallback() user callback is executed. Transfer is kept ongoing on USART side.
Anna Bridge 186:707f6e361f3e 379 If user wants to abort it, Abort services should be called by user.
Anna Bridge 186:707f6e361f3e 380 (+) Error is considered as Blocking : Transfer could not be completed properly and is aborted.
Anna Bridge 186:707f6e361f3e 381 This concerns Overrun Error In Interrupt mode reception and all errors in DMA mode.
Anna Bridge 186:707f6e361f3e 382 Error code is set to allow user to identify error type, and HAL_USART_ErrorCallback() user callback is executed.
Anna Bridge 186:707f6e361f3e 383
<> 144:ef7eb2e8f9f7 384 @endverbatim
<> 144:ef7eb2e8f9f7 385 * @{
<> 144:ef7eb2e8f9f7 386 */
<> 144:ef7eb2e8f9f7 387
<> 144:ef7eb2e8f9f7 388 /**
Anna Bridge 186:707f6e361f3e 389 * @brief Simplex send an amount of data in blocking mode.
Anna Bridge 186:707f6e361f3e 390 * @param husart USART handle.
Anna Bridge 186:707f6e361f3e 391 * @param pTxData Pointer to data buffer.
Anna Bridge 186:707f6e361f3e 392 * @param Size Amount of data to be sent.
Anna Bridge 186:707f6e361f3e 393 * @param Timeout Timeout duration.
Anna Bridge 186:707f6e361f3e 394 * @note When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01),
Anna Bridge 186:707f6e361f3e 395 * address of user data buffer containing data to be sent, should be aligned on a half word frontier (16 bits)
Anna Bridge 186:707f6e361f3e 396 * (as sent data will be handled using u16 pointer cast). Depending on compilation chain,
Anna Bridge 186:707f6e361f3e 397 * use of specific alignment compilation directives or pragmas might be required to ensure proper alignment for pTxData.
<> 144:ef7eb2e8f9f7 398 * @retval HAL status
<> 144:ef7eb2e8f9f7 399 */
<> 144:ef7eb2e8f9f7 400 HAL_StatusTypeDef HAL_USART_Transmit(USART_HandleTypeDef *husart, uint8_t *pTxData, uint16_t Size, uint32_t Timeout)
<> 144:ef7eb2e8f9f7 401 {
<> 144:ef7eb2e8f9f7 402 uint16_t* tmp;
Anna Bridge 186:707f6e361f3e 403 uint32_t tickstart = 0;
<> 144:ef7eb2e8f9f7 404
<> 144:ef7eb2e8f9f7 405 if(husart->State == HAL_USART_STATE_READY)
<> 144:ef7eb2e8f9f7 406 {
Anna Bridge 186:707f6e361f3e 407 if((pTxData == NULL) || (Size == 0U))
<> 144:ef7eb2e8f9f7 408 {
<> 144:ef7eb2e8f9f7 409 return HAL_ERROR;
<> 144:ef7eb2e8f9f7 410 }
<> 144:ef7eb2e8f9f7 411
Anna Bridge 186:707f6e361f3e 412 /* In case of 9bits/No Parity transfer, pTxData buffer provided as input paramter
Anna Bridge 186:707f6e361f3e 413 should be aligned on a u16 frontier, as data to be filled into TDR will be
Anna Bridge 186:707f6e361f3e 414 handled through a u16 cast. */
Anna Bridge 186:707f6e361f3e 415 if ((husart->Init.WordLength == USART_WORDLENGTH_9B) && (husart->Init.Parity == USART_PARITY_NONE))
Anna Bridge 186:707f6e361f3e 416 {
Anna Bridge 186:707f6e361f3e 417 if((((uint32_t)pTxData)&1) != 0)
Anna Bridge 186:707f6e361f3e 418 {
Anna Bridge 186:707f6e361f3e 419 return HAL_ERROR;
Anna Bridge 186:707f6e361f3e 420 }
Anna Bridge 186:707f6e361f3e 421 }
Anna Bridge 186:707f6e361f3e 422
<> 144:ef7eb2e8f9f7 423 /* Process Locked */
<> 144:ef7eb2e8f9f7 424 __HAL_LOCK(husart);
<> 144:ef7eb2e8f9f7 425
<> 144:ef7eb2e8f9f7 426 husart->ErrorCode = HAL_USART_ERROR_NONE;
<> 144:ef7eb2e8f9f7 427 husart->State = HAL_USART_STATE_BUSY_TX;
<> 144:ef7eb2e8f9f7 428
Anna Bridge 186:707f6e361f3e 429 /* Init tickstart for timeout managment*/
Anna Bridge 186:707f6e361f3e 430 tickstart = HAL_GetTick();
Anna Bridge 186:707f6e361f3e 431
<> 144:ef7eb2e8f9f7 432 husart->TxXferSize = Size;
<> 144:ef7eb2e8f9f7 433 husart->TxXferCount = Size;
Anna Bridge 186:707f6e361f3e 434
<> 144:ef7eb2e8f9f7 435 /* Check the remaining data to be sent */
<> 151:5eaa88a5bcc7 436 while(husart->TxXferCount > 0U)
<> 144:ef7eb2e8f9f7 437 {
<> 144:ef7eb2e8f9f7 438 husart->TxXferCount--;
Anna Bridge 186:707f6e361f3e 439 if(USART_WaitOnFlagUntilTimeout(husart, USART_FLAG_TXE, RESET, tickstart, Timeout) != HAL_OK)
Anna Bridge 186:707f6e361f3e 440 {
Anna Bridge 186:707f6e361f3e 441 return HAL_TIMEOUT;
Anna Bridge 186:707f6e361f3e 442 }
<> 144:ef7eb2e8f9f7 443 if((husart->Init.WordLength == USART_WORDLENGTH_9B) && (husart->Init.Parity == USART_PARITY_NONE))
<> 144:ef7eb2e8f9f7 444 {
<> 144:ef7eb2e8f9f7 445 tmp = (uint16_t*) pTxData;
<> 151:5eaa88a5bcc7 446 husart->Instance->TDR = (*tmp & (uint16_t)0x01FFU);
<> 151:5eaa88a5bcc7 447 pTxData += 2U;
Anna Bridge 186:707f6e361f3e 448 }
<> 144:ef7eb2e8f9f7 449 else
<> 144:ef7eb2e8f9f7 450 {
<> 151:5eaa88a5bcc7 451 husart->Instance->TDR = (*pTxData++ & (uint8_t)0xFFU);
<> 144:ef7eb2e8f9f7 452 }
<> 144:ef7eb2e8f9f7 453 }
<> 144:ef7eb2e8f9f7 454
Anna Bridge 186:707f6e361f3e 455 if(USART_WaitOnFlagUntilTimeout(husart, USART_FLAG_TC, RESET, tickstart, Timeout) != HAL_OK)
Anna Bridge 186:707f6e361f3e 456 {
<> 144:ef7eb2e8f9f7 457 return HAL_TIMEOUT;
<> 144:ef7eb2e8f9f7 458 }
<> 144:ef7eb2e8f9f7 459
Anna Bridge 186:707f6e361f3e 460 /* At end of Tx process, restore husart->State to Ready */
<> 144:ef7eb2e8f9f7 461 husart->State = HAL_USART_STATE_READY;
<> 144:ef7eb2e8f9f7 462
<> 144:ef7eb2e8f9f7 463 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 464 __HAL_UNLOCK(husart);
<> 144:ef7eb2e8f9f7 465
<> 144:ef7eb2e8f9f7 466 return HAL_OK;
<> 144:ef7eb2e8f9f7 467 }
<> 144:ef7eb2e8f9f7 468 else
<> 144:ef7eb2e8f9f7 469 {
<> 144:ef7eb2e8f9f7 470 return HAL_BUSY;
<> 144:ef7eb2e8f9f7 471 }
<> 144:ef7eb2e8f9f7 472 }
<> 144:ef7eb2e8f9f7 473
<> 144:ef7eb2e8f9f7 474 /**
Anna Bridge 186:707f6e361f3e 475 * @brief Receive an amount of data in blocking mode.
Anna Bridge 186:707f6e361f3e 476 * @note To receive synchronous data, dummy data are simultaneously transmitted.
Anna Bridge 186:707f6e361f3e 477 * @param husart USART handle.
Anna Bridge 186:707f6e361f3e 478 * @param pRxData Pointer to data buffer.
Anna Bridge 186:707f6e361f3e 479 * @param Size Amount of data to be received.
Anna Bridge 186:707f6e361f3e 480 * @param Timeout Timeout duration.
Anna Bridge 186:707f6e361f3e 481 * @note When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01),
Anna Bridge 186:707f6e361f3e 482 * address of user data buffer containing data to be sent, should be aligned on a half word frontier (16 bits)
Anna Bridge 186:707f6e361f3e 483 * (as sent data will be handled using u16 pointer cast). Depending on compilation chain,
Anna Bridge 186:707f6e361f3e 484 * use of specific alignment compilation directives or pragmas might be required to ensure proper alignment for pTxData.
<> 144:ef7eb2e8f9f7 485 * @retval HAL status
<> 144:ef7eb2e8f9f7 486 */
<> 144:ef7eb2e8f9f7 487 HAL_StatusTypeDef HAL_USART_Receive(USART_HandleTypeDef *husart, uint8_t *pRxData, uint16_t Size, uint32_t Timeout)
<> 144:ef7eb2e8f9f7 488 {
<> 144:ef7eb2e8f9f7 489 uint16_t* tmp;
<> 144:ef7eb2e8f9f7 490 uint16_t uhMask;
Anna Bridge 186:707f6e361f3e 491 uint32_t tickstart = 0;
Anna Bridge 186:707f6e361f3e 492
<> 144:ef7eb2e8f9f7 493 if(husart->State == HAL_USART_STATE_READY)
<> 144:ef7eb2e8f9f7 494 {
Anna Bridge 186:707f6e361f3e 495 if((pRxData == NULL) || (Size == 0U))
<> 144:ef7eb2e8f9f7 496 {
<> 144:ef7eb2e8f9f7 497 return HAL_ERROR;
<> 144:ef7eb2e8f9f7 498 }
Anna Bridge 186:707f6e361f3e 499
Anna Bridge 186:707f6e361f3e 500 /* In case of 9bits/No Parity transfer, pTxData buffer provided as input paramter
Anna Bridge 186:707f6e361f3e 501 should be aligned on a u16 frontier, as data to be filled into TDR will be
Anna Bridge 186:707f6e361f3e 502 handled through a u16 cast. */
Anna Bridge 186:707f6e361f3e 503 if ((husart->Init.WordLength == USART_WORDLENGTH_9B) && (husart->Init.Parity == USART_PARITY_NONE))
Anna Bridge 186:707f6e361f3e 504 {
Anna Bridge 186:707f6e361f3e 505 if((((uint32_t)pRxData)&1) != 0)
Anna Bridge 186:707f6e361f3e 506 {
Anna Bridge 186:707f6e361f3e 507 return HAL_ERROR;
Anna Bridge 186:707f6e361f3e 508 }
Anna Bridge 186:707f6e361f3e 509 }
Anna Bridge 186:707f6e361f3e 510
<> 144:ef7eb2e8f9f7 511 /* Process Locked */
<> 144:ef7eb2e8f9f7 512 __HAL_LOCK(husart);
<> 144:ef7eb2e8f9f7 513
<> 144:ef7eb2e8f9f7 514 husart->ErrorCode = HAL_USART_ERROR_NONE;
<> 144:ef7eb2e8f9f7 515 husart->State = HAL_USART_STATE_BUSY_RX;
<> 144:ef7eb2e8f9f7 516
Anna Bridge 186:707f6e361f3e 517 /* Init tickstart for timeout managment*/
Anna Bridge 186:707f6e361f3e 518 tickstart = HAL_GetTick();
Anna Bridge 186:707f6e361f3e 519
<> 144:ef7eb2e8f9f7 520 husart->RxXferSize = Size;
<> 144:ef7eb2e8f9f7 521 husart->RxXferCount = Size;
Anna Bridge 186:707f6e361f3e 522
<> 144:ef7eb2e8f9f7 523 /* Computation of USART mask to apply to RDR register */
<> 144:ef7eb2e8f9f7 524 USART_MASK_COMPUTATION(husart);
<> 144:ef7eb2e8f9f7 525 uhMask = husart->Mask;
Anna Bridge 186:707f6e361f3e 526
<> 144:ef7eb2e8f9f7 527 /* as long as data have to be received */
<> 151:5eaa88a5bcc7 528 while(husart->RxXferCount > 0U)
<> 144:ef7eb2e8f9f7 529 {
<> 144:ef7eb2e8f9f7 530 husart->RxXferCount--;
Anna Bridge 186:707f6e361f3e 531
Anna Bridge 186:707f6e361f3e 532 /* Wait until TXE flag is set to send dummy byte in order to generate the
<> 144:ef7eb2e8f9f7 533 * clock for the slave to send data.
Anna Bridge 186:707f6e361f3e 534 * Whatever the frame length (7, 8 or 9-bit long), the same dummy value
<> 144:ef7eb2e8f9f7 535 * can be written for all the cases. */
Anna Bridge 186:707f6e361f3e 536 if(USART_WaitOnFlagUntilTimeout(husart, USART_FLAG_TXE, RESET, tickstart, Timeout) != HAL_OK)
Anna Bridge 186:707f6e361f3e 537 {
<> 144:ef7eb2e8f9f7 538 return HAL_TIMEOUT;
<> 144:ef7eb2e8f9f7 539 }
Anna Bridge 186:707f6e361f3e 540 husart->Instance->TDR = (USART_DUMMY_DATA & (uint16_t)0x0FFU);
Anna Bridge 186:707f6e361f3e 541
Anna Bridge 186:707f6e361f3e 542 /* Wait for RXNE Flag */
Anna Bridge 186:707f6e361f3e 543 if(USART_WaitOnFlagUntilTimeout(husart, USART_FLAG_RXNE, RESET, tickstart, Timeout) != HAL_OK)
Anna Bridge 186:707f6e361f3e 544 {
Anna Bridge 186:707f6e361f3e 545 return HAL_TIMEOUT;
Anna Bridge 186:707f6e361f3e 546 }
Anna Bridge 186:707f6e361f3e 547
<> 144:ef7eb2e8f9f7 548 if((husart->Init.WordLength == USART_WORDLENGTH_9B) && (husart->Init.Parity == USART_PARITY_NONE))
<> 144:ef7eb2e8f9f7 549 {
<> 144:ef7eb2e8f9f7 550 tmp = (uint16_t*) pRxData ;
<> 144:ef7eb2e8f9f7 551 *tmp = (uint16_t)(husart->Instance->RDR & uhMask);
Anna Bridge 186:707f6e361f3e 552 pRxData +=2U;
Anna Bridge 186:707f6e361f3e 553 }
<> 144:ef7eb2e8f9f7 554 else
<> 144:ef7eb2e8f9f7 555 {
Anna Bridge 186:707f6e361f3e 556 *pRxData++ = (uint8_t)(husart->Instance->RDR & (uint8_t)uhMask);
Anna Bridge 186:707f6e361f3e 557 }
Anna Bridge 186:707f6e361f3e 558 }
Anna Bridge 186:707f6e361f3e 559
Anna Bridge 186:707f6e361f3e 560 /* At end of Rx process, restore husart->State to Ready */
Anna Bridge 186:707f6e361f3e 561 husart->State = HAL_USART_STATE_READY;
Anna Bridge 186:707f6e361f3e 562
Anna Bridge 186:707f6e361f3e 563 /* Process Unlocked */
Anna Bridge 186:707f6e361f3e 564 __HAL_UNLOCK(husart);
Anna Bridge 186:707f6e361f3e 565
Anna Bridge 186:707f6e361f3e 566 return HAL_OK;
Anna Bridge 186:707f6e361f3e 567 }
Anna Bridge 186:707f6e361f3e 568 else
Anna Bridge 186:707f6e361f3e 569 {
Anna Bridge 186:707f6e361f3e 570 return HAL_BUSY;
Anna Bridge 186:707f6e361f3e 571 }
Anna Bridge 186:707f6e361f3e 572 }
Anna Bridge 186:707f6e361f3e 573
Anna Bridge 186:707f6e361f3e 574 /**
Anna Bridge 186:707f6e361f3e 575 * @brief Full-Duplex Send and Receive an amount of data in blocking mode.
Anna Bridge 186:707f6e361f3e 576 * @param husart USART handle.
Anna Bridge 186:707f6e361f3e 577 * @param pTxData pointer to TX data buffer.
Anna Bridge 186:707f6e361f3e 578 * @param pRxData pointer to RX data buffer.
Anna Bridge 186:707f6e361f3e 579 * @param Size amount of data to be sent (same amount to be received).
Anna Bridge 186:707f6e361f3e 580 * @param Timeout Timeout duration.
Anna Bridge 186:707f6e361f3e 581 * @note When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01),
Anna Bridge 186:707f6e361f3e 582 * address of user data buffer containing data to be sent, should be aligned on a half word frontier (16 bits)
Anna Bridge 186:707f6e361f3e 583 * (as sent data will be handled using u16 pointer cast). Depending on compilation chain,
Anna Bridge 186:707f6e361f3e 584 * use of specific alignment compilation directives or pragmas might be required to ensure proper alignment for pTxData.
Anna Bridge 186:707f6e361f3e 585 * @retval HAL status
Anna Bridge 186:707f6e361f3e 586 */
Anna Bridge 186:707f6e361f3e 587 HAL_StatusTypeDef HAL_USART_TransmitReceive(USART_HandleTypeDef *husart, uint8_t *pTxData, uint8_t *pRxData, uint16_t Size, uint32_t Timeout)
Anna Bridge 186:707f6e361f3e 588 {
Anna Bridge 186:707f6e361f3e 589 uint16_t* tmp;
Anna Bridge 186:707f6e361f3e 590 uint16_t uhMask;
Anna Bridge 186:707f6e361f3e 591 uint32_t tickstart = 0;
Anna Bridge 186:707f6e361f3e 592
Anna Bridge 186:707f6e361f3e 593 if(husart->State == HAL_USART_STATE_READY)
Anna Bridge 186:707f6e361f3e 594 {
Anna Bridge 186:707f6e361f3e 595 if((pTxData == NULL) || (pRxData == NULL) || (Size == 0U))
Anna Bridge 186:707f6e361f3e 596 {
Anna Bridge 186:707f6e361f3e 597 return HAL_ERROR;
Anna Bridge 186:707f6e361f3e 598 }
Anna Bridge 186:707f6e361f3e 599
Anna Bridge 186:707f6e361f3e 600 /* In case of 9bits/No Parity transfer, pTxData and pRxData buffers provided as input paramter
Anna Bridge 186:707f6e361f3e 601 should be aligned on a u16 frontier, as data to be filled into TDR/retrieved from RDR will be
Anna Bridge 186:707f6e361f3e 602 handled through a u16 cast. */
Anna Bridge 186:707f6e361f3e 603 if ((husart->Init.WordLength == USART_WORDLENGTH_9B) && (husart->Init.Parity == USART_PARITY_NONE))
Anna Bridge 186:707f6e361f3e 604 {
Anna Bridge 186:707f6e361f3e 605 if(((((uint32_t)pTxData)&1) != 0) || ((((uint32_t)pRxData)&1) != 0))
Anna Bridge 186:707f6e361f3e 606 {
Anna Bridge 186:707f6e361f3e 607 return HAL_ERROR;
<> 144:ef7eb2e8f9f7 608 }
<> 144:ef7eb2e8f9f7 609 }
<> 144:ef7eb2e8f9f7 610
Anna Bridge 186:707f6e361f3e 611 /* Process Locked */
Anna Bridge 186:707f6e361f3e 612 __HAL_LOCK(husart);
Anna Bridge 186:707f6e361f3e 613
Anna Bridge 186:707f6e361f3e 614 husart->ErrorCode = HAL_USART_ERROR_NONE;
Anna Bridge 186:707f6e361f3e 615 husart->State = HAL_USART_STATE_BUSY_RX;
Anna Bridge 186:707f6e361f3e 616
Anna Bridge 186:707f6e361f3e 617 /* Init tickstart for timeout managment*/
Anna Bridge 186:707f6e361f3e 618 tickstart = HAL_GetTick();
Anna Bridge 186:707f6e361f3e 619
Anna Bridge 186:707f6e361f3e 620 husart->RxXferSize = Size;
Anna Bridge 186:707f6e361f3e 621 husart->TxXferSize = Size;
Anna Bridge 186:707f6e361f3e 622 husart->TxXferCount = Size;
Anna Bridge 186:707f6e361f3e 623 husart->RxXferCount = Size;
Anna Bridge 186:707f6e361f3e 624
Anna Bridge 186:707f6e361f3e 625 /* Computation of USART mask to apply to RDR register */
Anna Bridge 186:707f6e361f3e 626 USART_MASK_COMPUTATION(husart);
Anna Bridge 186:707f6e361f3e 627 uhMask = husart->Mask;
Anna Bridge 186:707f6e361f3e 628
Anna Bridge 186:707f6e361f3e 629 /* Check the remain data to be sent */
Anna Bridge 186:707f6e361f3e 630 while(husart->TxXferCount > 0U)
Anna Bridge 186:707f6e361f3e 631 {
Anna Bridge 186:707f6e361f3e 632 husart->TxXferCount--;
Anna Bridge 186:707f6e361f3e 633 husart->RxXferCount--;
Anna Bridge 186:707f6e361f3e 634
Anna Bridge 186:707f6e361f3e 635 /* Wait until TXE flag is set to send data */
Anna Bridge 186:707f6e361f3e 636 if(USART_WaitOnFlagUntilTimeout(husart, USART_FLAG_TXE, RESET, tickstart, Timeout) != HAL_OK)
Anna Bridge 186:707f6e361f3e 637 {
Anna Bridge 186:707f6e361f3e 638 return HAL_TIMEOUT;
Anna Bridge 186:707f6e361f3e 639 }
Anna Bridge 186:707f6e361f3e 640 if((husart->Init.WordLength == USART_WORDLENGTH_9B) && (husart->Init.Parity == USART_PARITY_NONE))
Anna Bridge 186:707f6e361f3e 641 {
Anna Bridge 186:707f6e361f3e 642 tmp = (uint16_t*) pTxData;
Anna Bridge 186:707f6e361f3e 643 husart->Instance->TDR = (*tmp & uhMask);
Anna Bridge 186:707f6e361f3e 644 pTxData += 2U;
Anna Bridge 186:707f6e361f3e 645 }
Anna Bridge 186:707f6e361f3e 646 else
Anna Bridge 186:707f6e361f3e 647 {
Anna Bridge 186:707f6e361f3e 648 husart->Instance->TDR = (*pTxData++ & (uint8_t)uhMask);
Anna Bridge 186:707f6e361f3e 649 }
Anna Bridge 186:707f6e361f3e 650
Anna Bridge 186:707f6e361f3e 651 /* Wait for RXNE Flag */
Anna Bridge 186:707f6e361f3e 652 if(USART_WaitOnFlagUntilTimeout(husart, USART_FLAG_RXNE, RESET, tickstart, Timeout) != HAL_OK)
Anna Bridge 186:707f6e361f3e 653 {
Anna Bridge 186:707f6e361f3e 654 return HAL_TIMEOUT;
Anna Bridge 186:707f6e361f3e 655 }
Anna Bridge 186:707f6e361f3e 656
Anna Bridge 186:707f6e361f3e 657 if((husart->Init.WordLength == USART_WORDLENGTH_9B) && (husart->Init.Parity == USART_PARITY_NONE))
Anna Bridge 186:707f6e361f3e 658 {
Anna Bridge 186:707f6e361f3e 659 tmp = (uint16_t*) pRxData ;
Anna Bridge 186:707f6e361f3e 660 *tmp = (uint16_t)(husart->Instance->RDR & uhMask);
Anna Bridge 186:707f6e361f3e 661 pRxData +=2U;
Anna Bridge 186:707f6e361f3e 662 }
Anna Bridge 186:707f6e361f3e 663 else
Anna Bridge 186:707f6e361f3e 664 {
Anna Bridge 186:707f6e361f3e 665 *pRxData++ = (uint8_t)(husart->Instance->RDR & (uint8_t)uhMask);
Anna Bridge 186:707f6e361f3e 666 }
Anna Bridge 186:707f6e361f3e 667 }
Anna Bridge 186:707f6e361f3e 668
Anna Bridge 186:707f6e361f3e 669 /* At end of TxRx process, restore husart->State to Ready */
<> 144:ef7eb2e8f9f7 670 husart->State = HAL_USART_STATE_READY;
<> 144:ef7eb2e8f9f7 671
<> 144:ef7eb2e8f9f7 672 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 673 __HAL_UNLOCK(husart);
<> 144:ef7eb2e8f9f7 674
<> 144:ef7eb2e8f9f7 675 return HAL_OK;
<> 144:ef7eb2e8f9f7 676 }
<> 144:ef7eb2e8f9f7 677 else
<> 144:ef7eb2e8f9f7 678 {
<> 144:ef7eb2e8f9f7 679 return HAL_BUSY;
<> 144:ef7eb2e8f9f7 680 }
<> 144:ef7eb2e8f9f7 681 }
<> 144:ef7eb2e8f9f7 682
<> 144:ef7eb2e8f9f7 683 /**
Anna Bridge 186:707f6e361f3e 684 * @brief Send an amount of data in interrupt mode.
Anna Bridge 186:707f6e361f3e 685 * @param husart USART handle.
Anna Bridge 186:707f6e361f3e 686 * @param pTxData pointer to data buffer.
Anna Bridge 186:707f6e361f3e 687 * @param Size amount of data to be sent.
Anna Bridge 186:707f6e361f3e 688 * @note When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01),
Anna Bridge 186:707f6e361f3e 689 * address of user data buffer containing data to be sent, should be aligned on a half word frontier (16 bits)
Anna Bridge 186:707f6e361f3e 690 * (as sent data will be handled using u16 pointer cast). Depending on compilation chain,
Anna Bridge 186:707f6e361f3e 691 * use of specific alignment compilation directives or pragmas might be required to ensure proper alignment for pTxData.
<> 144:ef7eb2e8f9f7 692 * @retval HAL status
<> 144:ef7eb2e8f9f7 693 */
<> 144:ef7eb2e8f9f7 694 HAL_StatusTypeDef HAL_USART_Transmit_IT(USART_HandleTypeDef *husart, uint8_t *pTxData, uint16_t Size)
<> 144:ef7eb2e8f9f7 695 {
<> 144:ef7eb2e8f9f7 696 if(husart->State == HAL_USART_STATE_READY)
<> 144:ef7eb2e8f9f7 697 {
Anna Bridge 186:707f6e361f3e 698 if((pTxData == NULL ) || (Size == 0U))
<> 144:ef7eb2e8f9f7 699 {
<> 144:ef7eb2e8f9f7 700 return HAL_ERROR;
<> 144:ef7eb2e8f9f7 701 }
<> 144:ef7eb2e8f9f7 702
Anna Bridge 186:707f6e361f3e 703 /* In case of 9bits/No Parity transfer, pTxData buffer provided as input paramter
Anna Bridge 186:707f6e361f3e 704 should be aligned on a u16 frontier, as data to be filled into TDR will be
Anna Bridge 186:707f6e361f3e 705 handled through a u16 cast. */
Anna Bridge 186:707f6e361f3e 706 if ((husart->Init.WordLength == USART_WORDLENGTH_9B) && (husart->Init.Parity == USART_PARITY_NONE))
Anna Bridge 186:707f6e361f3e 707 {
Anna Bridge 186:707f6e361f3e 708 if((((uint32_t)pTxData)&1) != 0)
Anna Bridge 186:707f6e361f3e 709 {
Anna Bridge 186:707f6e361f3e 710 return HAL_ERROR;
Anna Bridge 186:707f6e361f3e 711 }
Anna Bridge 186:707f6e361f3e 712 }
Anna Bridge 186:707f6e361f3e 713
<> 144:ef7eb2e8f9f7 714 /* Process Locked */
<> 144:ef7eb2e8f9f7 715 __HAL_LOCK(husart);
<> 144:ef7eb2e8f9f7 716
<> 144:ef7eb2e8f9f7 717 husart->pTxBuffPtr = pTxData;
<> 144:ef7eb2e8f9f7 718 husart->TxXferSize = Size;
<> 144:ef7eb2e8f9f7 719 husart->TxXferCount = Size;
<> 144:ef7eb2e8f9f7 720
<> 144:ef7eb2e8f9f7 721 husart->ErrorCode = HAL_USART_ERROR_NONE;
<> 144:ef7eb2e8f9f7 722 husart->State = HAL_USART_STATE_BUSY_TX;
<> 144:ef7eb2e8f9f7 723
Anna Bridge 186:707f6e361f3e 724 /* The USART Error Interrupts: (Frame error, noise error, overrun error)
<> 144:ef7eb2e8f9f7 725 are not managed by the USART Transmit Process to avoid the overrun interrupt
<> 144:ef7eb2e8f9f7 726 when the usart mode is configured for transmit and receive "USART_MODE_TX_RX"
Anna Bridge 186:707f6e361f3e 727 to benefit for the frame error and noise interrupts the usart mode should be
<> 144:ef7eb2e8f9f7 728 configured only for transmit "USART_MODE_TX" */
Anna Bridge 186:707f6e361f3e 729
<> 144:ef7eb2e8f9f7 730 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 731 __HAL_UNLOCK(husart);
<> 144:ef7eb2e8f9f7 732
Anna Bridge 186:707f6e361f3e 733 /* Enable the USART Transmit Data Register Empty Interrupt */
<> 144:ef7eb2e8f9f7 734 __HAL_USART_ENABLE_IT(husart, USART_IT_TXE);
<> 144:ef7eb2e8f9f7 735
<> 144:ef7eb2e8f9f7 736 return HAL_OK;
<> 144:ef7eb2e8f9f7 737 }
<> 144:ef7eb2e8f9f7 738 else
<> 144:ef7eb2e8f9f7 739 {
<> 144:ef7eb2e8f9f7 740 return HAL_BUSY;
<> 144:ef7eb2e8f9f7 741 }
<> 144:ef7eb2e8f9f7 742 }
<> 144:ef7eb2e8f9f7 743
<> 144:ef7eb2e8f9f7 744 /**
Anna Bridge 186:707f6e361f3e 745 * @brief Receive an amount of data in interrupt mode.
Anna Bridge 186:707f6e361f3e 746 * @note To receive synchronous data, dummy data are simultaneously transmitted.
Anna Bridge 186:707f6e361f3e 747 * @param husart USART handle.
Anna Bridge 186:707f6e361f3e 748 * @param pRxData pointer to data buffer.
Anna Bridge 186:707f6e361f3e 749 * @param Size amount of data to be received.
Anna Bridge 186:707f6e361f3e 750 * @note When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01),
Anna Bridge 186:707f6e361f3e 751 * address of user data buffer containing data to be sent, should be aligned on a half word frontier (16 bits)
Anna Bridge 186:707f6e361f3e 752 * (as sent data will be handled using u16 pointer cast). Depending on compilation chain,
Anna Bridge 186:707f6e361f3e 753 * use of specific alignment compilation directives or pragmas might be required to ensure proper alignment for pTxData.
<> 144:ef7eb2e8f9f7 754 * @retval HAL status
<> 144:ef7eb2e8f9f7 755 */
<> 144:ef7eb2e8f9f7 756 HAL_StatusTypeDef HAL_USART_Receive_IT(USART_HandleTypeDef *husart, uint8_t *pRxData, uint16_t Size)
<> 144:ef7eb2e8f9f7 757 {
<> 144:ef7eb2e8f9f7 758 if(husart->State == HAL_USART_STATE_READY)
<> 144:ef7eb2e8f9f7 759 {
Anna Bridge 186:707f6e361f3e 760 if((pRxData == NULL ) || (Size == 0U))
<> 144:ef7eb2e8f9f7 761 {
<> 144:ef7eb2e8f9f7 762 return HAL_ERROR;
<> 144:ef7eb2e8f9f7 763 }
Anna Bridge 186:707f6e361f3e 764
Anna Bridge 186:707f6e361f3e 765 /* In case of 9bits/No Parity transfer, pTxData buffer provided as input paramter
Anna Bridge 186:707f6e361f3e 766 should be aligned on a u16 frontier, as data to be filled into TDR will be
Anna Bridge 186:707f6e361f3e 767 handled through a u16 cast. */
Anna Bridge 186:707f6e361f3e 768 if ((husart->Init.WordLength == USART_WORDLENGTH_9B) && (husart->Init.Parity == USART_PARITY_NONE))
Anna Bridge 186:707f6e361f3e 769 {
Anna Bridge 186:707f6e361f3e 770 if((((uint32_t)pRxData)&1) != 0)
Anna Bridge 186:707f6e361f3e 771 {
Anna Bridge 186:707f6e361f3e 772 return HAL_ERROR;
Anna Bridge 186:707f6e361f3e 773 }
Anna Bridge 186:707f6e361f3e 774 }
Anna Bridge 186:707f6e361f3e 775
<> 144:ef7eb2e8f9f7 776 /* Process Locked */
<> 144:ef7eb2e8f9f7 777 __HAL_LOCK(husart);
<> 144:ef7eb2e8f9f7 778
<> 144:ef7eb2e8f9f7 779 husart->pRxBuffPtr = pRxData;
<> 144:ef7eb2e8f9f7 780 husart->RxXferSize = Size;
<> 144:ef7eb2e8f9f7 781 husart->RxXferCount = Size;
<> 144:ef7eb2e8f9f7 782
<> 144:ef7eb2e8f9f7 783 USART_MASK_COMPUTATION(husart);
Anna Bridge 186:707f6e361f3e 784
<> 144:ef7eb2e8f9f7 785 husart->ErrorCode = HAL_USART_ERROR_NONE;
<> 144:ef7eb2e8f9f7 786 husart->State = HAL_USART_STATE_BUSY_RX;
Anna Bridge 186:707f6e361f3e 787
Anna Bridge 186:707f6e361f3e 788 /* Process Unlocked */
Anna Bridge 186:707f6e361f3e 789 __HAL_UNLOCK(husart);
Anna Bridge 186:707f6e361f3e 790
Anna Bridge 186:707f6e361f3e 791 /* Enable the USART Parity Error and Data Register not empty Interrupts */
Anna Bridge 186:707f6e361f3e 792 SET_BIT(husart->Instance->CR1, USART_CR1_PEIE | USART_CR1_RXNEIE);
<> 144:ef7eb2e8f9f7 793
<> 144:ef7eb2e8f9f7 794 /* Enable the USART Error Interrupt: (Frame error, noise error, overrun error) */
Anna Bridge 186:707f6e361f3e 795 SET_BIT(husart->Instance->CR3, USART_CR3_EIE);
<> 144:ef7eb2e8f9f7 796
<> 144:ef7eb2e8f9f7 797 /* Send dummy byte in order to generate the clock for the Slave to send the next data */
<> 144:ef7eb2e8f9f7 798 if(husart->Init.WordLength == USART_WORDLENGTH_9B)
<> 144:ef7eb2e8f9f7 799 {
Anna Bridge 186:707f6e361f3e 800 husart->Instance->TDR = (USART_DUMMY_DATA & (uint16_t)0x01FFU);
Anna Bridge 186:707f6e361f3e 801 }
<> 144:ef7eb2e8f9f7 802 else
<> 144:ef7eb2e8f9f7 803 {
Anna Bridge 186:707f6e361f3e 804 husart->Instance->TDR = (USART_DUMMY_DATA & (uint16_t)0x00FFU);
<> 144:ef7eb2e8f9f7 805 }
Anna Bridge 186:707f6e361f3e 806
<> 144:ef7eb2e8f9f7 807 return HAL_OK;
<> 144:ef7eb2e8f9f7 808 }
<> 144:ef7eb2e8f9f7 809 else
<> 144:ef7eb2e8f9f7 810 {
<> 144:ef7eb2e8f9f7 811 return HAL_BUSY;
<> 144:ef7eb2e8f9f7 812 }
<> 144:ef7eb2e8f9f7 813 }
<> 144:ef7eb2e8f9f7 814
<> 144:ef7eb2e8f9f7 815 /**
Anna Bridge 186:707f6e361f3e 816 * @brief Full-Duplex Send and Receive an amount of data in interrupt mode.
Anna Bridge 186:707f6e361f3e 817 * @param husart USART handle.
Anna Bridge 186:707f6e361f3e 818 * @param pTxData pointer to TX data buffer.
Anna Bridge 186:707f6e361f3e 819 * @param pRxData pointer to RX data buffer.
Anna Bridge 186:707f6e361f3e 820 * @param Size amount of data to be sent (same amount to be received).
Anna Bridge 186:707f6e361f3e 821 * @note When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01),
Anna Bridge 186:707f6e361f3e 822 * address of user data buffer containing data to be sent, should be aligned on a half word frontier (16 bits)
Anna Bridge 186:707f6e361f3e 823 * (as sent data will be handled using u16 pointer cast). Depending on compilation chain,
Anna Bridge 186:707f6e361f3e 824 * use of specific alignment compilation directives or pragmas might be required to ensure proper alignment for pTxData.
<> 144:ef7eb2e8f9f7 825 * @retval HAL status
<> 144:ef7eb2e8f9f7 826 */
<> 144:ef7eb2e8f9f7 827 HAL_StatusTypeDef HAL_USART_TransmitReceive_IT(USART_HandleTypeDef *husart, uint8_t *pTxData, uint8_t *pRxData, uint16_t Size)
<> 144:ef7eb2e8f9f7 828 {
Anna Bridge 186:707f6e361f3e 829
<> 144:ef7eb2e8f9f7 830 if(husart->State == HAL_USART_STATE_READY)
<> 144:ef7eb2e8f9f7 831 {
Anna Bridge 186:707f6e361f3e 832 if((pTxData == NULL) || (pRxData == NULL) || (Size == 0U))
<> 144:ef7eb2e8f9f7 833 {
<> 144:ef7eb2e8f9f7 834 return HAL_ERROR;
<> 144:ef7eb2e8f9f7 835 }
Anna Bridge 186:707f6e361f3e 836
Anna Bridge 186:707f6e361f3e 837 /* In case of 9bits/No Parity transfer, pTxData and pRxData buffers provided as input paramter
Anna Bridge 186:707f6e361f3e 838 should be aligned on a u16 frontier, as data to be filled into TDR/retrieved from RDR will be
Anna Bridge 186:707f6e361f3e 839 handled through a u16 cast. */
Anna Bridge 186:707f6e361f3e 840 if ((husart->Init.WordLength == USART_WORDLENGTH_9B) && (husart->Init.Parity == USART_PARITY_NONE))
Anna Bridge 186:707f6e361f3e 841 {
Anna Bridge 186:707f6e361f3e 842 if(((((uint32_t)pTxData)&1) != 0) || ((((uint32_t)pRxData)&1) != 0))
Anna Bridge 186:707f6e361f3e 843 {
Anna Bridge 186:707f6e361f3e 844 return HAL_ERROR;
Anna Bridge 186:707f6e361f3e 845 }
Anna Bridge 186:707f6e361f3e 846 }
Anna Bridge 186:707f6e361f3e 847
<> 144:ef7eb2e8f9f7 848 /* Process Locked */
<> 144:ef7eb2e8f9f7 849 __HAL_LOCK(husart);
<> 144:ef7eb2e8f9f7 850
<> 144:ef7eb2e8f9f7 851 husart->pRxBuffPtr = pRxData;
<> 144:ef7eb2e8f9f7 852 husart->RxXferSize = Size;
<> 144:ef7eb2e8f9f7 853 husart->RxXferCount = Size;
<> 144:ef7eb2e8f9f7 854 husart->pTxBuffPtr = pTxData;
<> 144:ef7eb2e8f9f7 855 husart->TxXferSize = Size;
<> 144:ef7eb2e8f9f7 856 husart->TxXferCount = Size;
Anna Bridge 186:707f6e361f3e 857
<> 144:ef7eb2e8f9f7 858 /* Computation of USART mask to apply to RDR register */
<> 144:ef7eb2e8f9f7 859 USART_MASK_COMPUTATION(husart);
<> 144:ef7eb2e8f9f7 860
<> 144:ef7eb2e8f9f7 861 husart->ErrorCode = HAL_USART_ERROR_NONE;
<> 144:ef7eb2e8f9f7 862 husart->State = HAL_USART_STATE_BUSY_TX_RX;
<> 144:ef7eb2e8f9f7 863
<> 144:ef7eb2e8f9f7 864 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 865 __HAL_UNLOCK(husart);
<> 144:ef7eb2e8f9f7 866
Anna Bridge 186:707f6e361f3e 867 /* Enable the USART Error Interrupt: (Frame error, noise error, overrun error) */
Anna Bridge 186:707f6e361f3e 868 SET_BIT(husart->Instance->CR3, USART_CR3_EIE);
Anna Bridge 186:707f6e361f3e 869
Anna Bridge 186:707f6e361f3e 870 /* Enable the USART Parity Error and USART Data Register not empty Interrupts */
Anna Bridge 186:707f6e361f3e 871 SET_BIT(husart->Instance->CR1, USART_CR1_PEIE | USART_CR1_RXNEIE);
Anna Bridge 186:707f6e361f3e 872
Anna Bridge 186:707f6e361f3e 873 /* Enable the USART Transmit Data Register Empty Interrupt */
Anna Bridge 186:707f6e361f3e 874 SET_BIT(husart->Instance->CR1, USART_CR1_TXEIE);
<> 144:ef7eb2e8f9f7 875
<> 144:ef7eb2e8f9f7 876 return HAL_OK;
<> 144:ef7eb2e8f9f7 877 }
<> 144:ef7eb2e8f9f7 878 else
<> 144:ef7eb2e8f9f7 879 {
Anna Bridge 186:707f6e361f3e 880 return HAL_BUSY;
<> 144:ef7eb2e8f9f7 881 }
<> 144:ef7eb2e8f9f7 882 }
<> 144:ef7eb2e8f9f7 883
<> 144:ef7eb2e8f9f7 884 /**
Anna Bridge 186:707f6e361f3e 885 * @brief Send an amount of data in DMA mode.
Anna Bridge 186:707f6e361f3e 886 * @param husart USART handle.
Anna Bridge 186:707f6e361f3e 887 * @param pTxData pointer to data buffer.
Anna Bridge 186:707f6e361f3e 888 * @param Size amount of data to be sent.
Anna Bridge 186:707f6e361f3e 889 * @note When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01),
Anna Bridge 186:707f6e361f3e 890 * address of user data buffer containing data to be sent, should be aligned on a half word frontier (16 bits)
Anna Bridge 186:707f6e361f3e 891 * (as sent data will be handled using u16 pointer cast). Depending on compilation chain,
Anna Bridge 186:707f6e361f3e 892 * use of specific alignment compilation directives or pragmas might be required to ensure proper alignment for pTxData.
<> 144:ef7eb2e8f9f7 893 * @retval HAL status
<> 144:ef7eb2e8f9f7 894 */
<> 144:ef7eb2e8f9f7 895 HAL_StatusTypeDef HAL_USART_Transmit_DMA(USART_HandleTypeDef *husart, uint8_t *pTxData, uint16_t Size)
<> 144:ef7eb2e8f9f7 896 {
<> 144:ef7eb2e8f9f7 897 uint32_t *tmp;
Anna Bridge 186:707f6e361f3e 898
<> 144:ef7eb2e8f9f7 899 if(husart->State == HAL_USART_STATE_READY)
<> 144:ef7eb2e8f9f7 900 {
Anna Bridge 186:707f6e361f3e 901 if((pTxData == NULL ) || (Size == 0U))
<> 144:ef7eb2e8f9f7 902 {
<> 144:ef7eb2e8f9f7 903 return HAL_ERROR;
<> 144:ef7eb2e8f9f7 904 }
Anna Bridge 186:707f6e361f3e 905
Anna Bridge 186:707f6e361f3e 906 /* In case of 9bits/No Parity transfer, pTxData buffer provided as input paramter
Anna Bridge 186:707f6e361f3e 907 should be aligned on a u16 frontier, as data to be filled into TDR will be
Anna Bridge 186:707f6e361f3e 908 handled through a u16 cast. */
Anna Bridge 186:707f6e361f3e 909 if ((husart->Init.WordLength == USART_WORDLENGTH_9B) && (husart->Init.Parity == USART_PARITY_NONE))
Anna Bridge 186:707f6e361f3e 910 {
Anna Bridge 186:707f6e361f3e 911 if((((uint32_t)pTxData)&1) != 0)
Anna Bridge 186:707f6e361f3e 912 {
Anna Bridge 186:707f6e361f3e 913 return HAL_ERROR;
Anna Bridge 186:707f6e361f3e 914 }
Anna Bridge 186:707f6e361f3e 915 }
Anna Bridge 186:707f6e361f3e 916
<> 144:ef7eb2e8f9f7 917 /* Process Locked */
Anna Bridge 186:707f6e361f3e 918 __HAL_LOCK(husart);
<> 144:ef7eb2e8f9f7 919
<> 144:ef7eb2e8f9f7 920 husart->pTxBuffPtr = pTxData;
<> 144:ef7eb2e8f9f7 921 husart->TxXferSize = Size;
<> 144:ef7eb2e8f9f7 922 husart->TxXferCount = Size;
<> 144:ef7eb2e8f9f7 923
<> 144:ef7eb2e8f9f7 924 husart->ErrorCode = HAL_USART_ERROR_NONE;
<> 144:ef7eb2e8f9f7 925 husart->State = HAL_USART_STATE_BUSY_TX;
<> 144:ef7eb2e8f9f7 926
<> 144:ef7eb2e8f9f7 927 /* Set the USART DMA transfer complete callback */
<> 144:ef7eb2e8f9f7 928 husart->hdmatx->XferCpltCallback = USART_DMATransmitCplt;
<> 144:ef7eb2e8f9f7 929
<> 144:ef7eb2e8f9f7 930 /* Set the USART DMA Half transfer complete callback */
<> 144:ef7eb2e8f9f7 931 husart->hdmatx->XferHalfCpltCallback = USART_DMATxHalfCplt;
<> 144:ef7eb2e8f9f7 932
<> 144:ef7eb2e8f9f7 933 /* Set the DMA error callback */
<> 144:ef7eb2e8f9f7 934 husart->hdmatx->XferErrorCallback = USART_DMAError;
<> 144:ef7eb2e8f9f7 935
<> 144:ef7eb2e8f9f7 936 /* Enable the USART transmit DMA channel */
<> 144:ef7eb2e8f9f7 937 tmp = (uint32_t*)&pTxData;
<> 144:ef7eb2e8f9f7 938 HAL_DMA_Start_IT(husart->hdmatx, *(uint32_t*)tmp, (uint32_t)&husart->Instance->TDR, Size);
<> 144:ef7eb2e8f9f7 939
Anna Bridge 186:707f6e361f3e 940 /* Clear the TC flag in the ICR register */
Anna Bridge 186:707f6e361f3e 941 __HAL_USART_CLEAR_FLAG(husart, USART_CLEAR_TCF);
Anna Bridge 186:707f6e361f3e 942
Anna Bridge 186:707f6e361f3e 943 /* Process Unlocked */
Anna Bridge 186:707f6e361f3e 944 __HAL_UNLOCK(husart);
<> 144:ef7eb2e8f9f7 945
<> 144:ef7eb2e8f9f7 946 /* Enable the DMA transfer for transmit request by setting the DMAT bit
<> 144:ef7eb2e8f9f7 947 in the USART CR3 register */
Anna Bridge 186:707f6e361f3e 948 SET_BIT(husart->Instance->CR3, USART_CR3_DMAT);
<> 144:ef7eb2e8f9f7 949
<> 144:ef7eb2e8f9f7 950 return HAL_OK;
<> 144:ef7eb2e8f9f7 951 }
<> 144:ef7eb2e8f9f7 952 else
<> 144:ef7eb2e8f9f7 953 {
<> 144:ef7eb2e8f9f7 954 return HAL_BUSY;
<> 144:ef7eb2e8f9f7 955 }
<> 144:ef7eb2e8f9f7 956 }
<> 144:ef7eb2e8f9f7 957
<> 144:ef7eb2e8f9f7 958 /**
Anna Bridge 186:707f6e361f3e 959 * @brief Receive an amount of data in DMA mode.
Anna Bridge 186:707f6e361f3e 960 * @param husart USART handle.
Anna Bridge 186:707f6e361f3e 961 * @param pRxData pointer to data buffer.
Anna Bridge 186:707f6e361f3e 962 * @param Size amount of data to be received.
Anna Bridge 186:707f6e361f3e 963 * @note When the USART parity is enabled (PCE = 1), the received data contain
Anna Bridge 186:707f6e361f3e 964 * the parity bit (MSB position).
Anna Bridge 186:707f6e361f3e 965 * @note The USART DMA transmit channel must be configured in order to generate the clock for the slave.
Anna Bridge 186:707f6e361f3e 966 * @note When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01),
Anna Bridge 186:707f6e361f3e 967 * address of user data buffer containing data to be sent, should be aligned on a half word frontier (16 bits)
Anna Bridge 186:707f6e361f3e 968 * (as sent data will be handled using u16 pointer cast). Depending on compilation chain,
Anna Bridge 186:707f6e361f3e 969 * use of specific alignment compilation directives or pragmas might be required to ensure proper alignment for pTxData.
<> 144:ef7eb2e8f9f7 970 * @retval HAL status
<> 144:ef7eb2e8f9f7 971 */
<> 144:ef7eb2e8f9f7 972 HAL_StatusTypeDef HAL_USART_Receive_DMA(USART_HandleTypeDef *husart, uint8_t *pRxData, uint16_t Size)
<> 144:ef7eb2e8f9f7 973 {
<> 144:ef7eb2e8f9f7 974 uint32_t *tmp;
Anna Bridge 186:707f6e361f3e 975
Anna Bridge 186:707f6e361f3e 976 /* Check that a Rx process is not already ongoing */
<> 144:ef7eb2e8f9f7 977 if(husart->State == HAL_USART_STATE_READY)
<> 144:ef7eb2e8f9f7 978 {
Anna Bridge 186:707f6e361f3e 979 if((pRxData == NULL ) || (Size == 0U))
<> 144:ef7eb2e8f9f7 980 {
<> 144:ef7eb2e8f9f7 981 return HAL_ERROR;
<> 144:ef7eb2e8f9f7 982 }
<> 144:ef7eb2e8f9f7 983
Anna Bridge 186:707f6e361f3e 984 /* In case of 9bits/No Parity transfer, pTxData buffer provided as input paramter
Anna Bridge 186:707f6e361f3e 985 should be aligned on a u16 frontier, as data to be filled into TDR will be
Anna Bridge 186:707f6e361f3e 986 handled through a u16 cast. */
Anna Bridge 186:707f6e361f3e 987 if ((husart->Init.WordLength == USART_WORDLENGTH_9B) && (husart->Init.Parity == USART_PARITY_NONE))
Anna Bridge 186:707f6e361f3e 988 {
Anna Bridge 186:707f6e361f3e 989 if((((uint32_t)pRxData)&1) != 0)
Anna Bridge 186:707f6e361f3e 990 {
Anna Bridge 186:707f6e361f3e 991 return HAL_ERROR;
Anna Bridge 186:707f6e361f3e 992 }
Anna Bridge 186:707f6e361f3e 993 }
Anna Bridge 186:707f6e361f3e 994
<> 144:ef7eb2e8f9f7 995 /* Process Locked */
<> 144:ef7eb2e8f9f7 996 __HAL_LOCK(husart);
<> 144:ef7eb2e8f9f7 997
<> 144:ef7eb2e8f9f7 998 husart->pRxBuffPtr = pRxData;
<> 144:ef7eb2e8f9f7 999 husart->RxXferSize = Size;
<> 144:ef7eb2e8f9f7 1000 husart->pTxBuffPtr = pRxData;
<> 144:ef7eb2e8f9f7 1001 husart->TxXferSize = Size;
<> 144:ef7eb2e8f9f7 1002
<> 144:ef7eb2e8f9f7 1003 husart->ErrorCode = HAL_USART_ERROR_NONE;
<> 144:ef7eb2e8f9f7 1004 husart->State = HAL_USART_STATE_BUSY_RX;
<> 144:ef7eb2e8f9f7 1005
<> 144:ef7eb2e8f9f7 1006 /* Set the USART DMA Rx transfer complete callback */
<> 144:ef7eb2e8f9f7 1007 husart->hdmarx->XferCpltCallback = USART_DMAReceiveCplt;
<> 144:ef7eb2e8f9f7 1008
<> 144:ef7eb2e8f9f7 1009 /* Set the USART DMA Half transfer complete callback */
<> 144:ef7eb2e8f9f7 1010 husart->hdmarx->XferHalfCpltCallback = USART_DMARxHalfCplt;
<> 144:ef7eb2e8f9f7 1011
<> 144:ef7eb2e8f9f7 1012 /* Set the USART DMA Rx transfer error callback */
<> 144:ef7eb2e8f9f7 1013 husart->hdmarx->XferErrorCallback = USART_DMAError;
<> 144:ef7eb2e8f9f7 1014
Anna Bridge 186:707f6e361f3e 1015 /* Enable the USART receive DMA channel */
<> 144:ef7eb2e8f9f7 1016 tmp = (uint32_t*)&pRxData;
<> 144:ef7eb2e8f9f7 1017 HAL_DMA_Start_IT(husart->hdmarx, (uint32_t)&husart->Instance->RDR, *(uint32_t*)tmp, Size);
<> 144:ef7eb2e8f9f7 1018
<> 144:ef7eb2e8f9f7 1019 /* Enable the USART transmit DMA channel: the transmit channel is used in order
Anna Bridge 186:707f6e361f3e 1020 to generate in the non-blocking mode the clock to the slave device,
<> 144:ef7eb2e8f9f7 1021 this mode isn't a simplex receive mode but a full-duplex receive mode */
<> 144:ef7eb2e8f9f7 1022 tmp = (uint32_t*)&pRxData;
Anna Bridge 186:707f6e361f3e 1023 /* Set the USART DMA Tx Complete and Error callback to Null */
Anna Bridge 186:707f6e361f3e 1024 husart->hdmatx->XferErrorCallback = NULL;
Anna Bridge 186:707f6e361f3e 1025 husart->hdmatx->XferHalfCpltCallback = NULL;
Anna Bridge 186:707f6e361f3e 1026 husart->hdmatx->XferCpltCallback = NULL;
<> 144:ef7eb2e8f9f7 1027 HAL_DMA_Start_IT(husart->hdmatx, *(uint32_t*)tmp, (uint32_t)&husart->Instance->TDR, Size);
Anna Bridge 186:707f6e361f3e 1028
Anna Bridge 186:707f6e361f3e 1029 /* Process Unlocked */
Anna Bridge 186:707f6e361f3e 1030 __HAL_UNLOCK(husart);
Anna Bridge 186:707f6e361f3e 1031
Anna Bridge 186:707f6e361f3e 1032 /* Enable the USART Parity Error Interrupt */
Anna Bridge 186:707f6e361f3e 1033 SET_BIT(husart->Instance->CR1, USART_CR1_PEIE);
Anna Bridge 186:707f6e361f3e 1034
Anna Bridge 186:707f6e361f3e 1035 /* Enable the USART Error Interrupt: (Frame error, noise error, overrun error) */
Anna Bridge 186:707f6e361f3e 1036 SET_BIT(husart->Instance->CR3, USART_CR3_EIE);
Anna Bridge 186:707f6e361f3e 1037
Anna Bridge 186:707f6e361f3e 1038 /* Enable the DMA transfer for the receiver request by setting the DMAR bit
<> 144:ef7eb2e8f9f7 1039 in the USART CR3 register */
Anna Bridge 186:707f6e361f3e 1040 SET_BIT(husart->Instance->CR3, USART_CR3_DMAR);
<> 144:ef7eb2e8f9f7 1041
<> 144:ef7eb2e8f9f7 1042 /* Enable the DMA transfer for transmit request by setting the DMAT bit
<> 144:ef7eb2e8f9f7 1043 in the USART CR3 register */
Anna Bridge 186:707f6e361f3e 1044 SET_BIT(husart->Instance->CR3, USART_CR3_DMAT);
<> 144:ef7eb2e8f9f7 1045
<> 144:ef7eb2e8f9f7 1046 return HAL_OK;
<> 144:ef7eb2e8f9f7 1047 }
<> 144:ef7eb2e8f9f7 1048 else
<> 144:ef7eb2e8f9f7 1049 {
<> 144:ef7eb2e8f9f7 1050 return HAL_BUSY;
<> 144:ef7eb2e8f9f7 1051 }
<> 144:ef7eb2e8f9f7 1052 }
<> 144:ef7eb2e8f9f7 1053
<> 144:ef7eb2e8f9f7 1054 /**
Anna Bridge 186:707f6e361f3e 1055 * @brief Full-Duplex Transmit Receive an amount of data in non-blocking mode.
Anna Bridge 186:707f6e361f3e 1056 * @param husart USART handle.
Anna Bridge 186:707f6e361f3e 1057 * @param pTxData pointer to TX data buffer.
Anna Bridge 186:707f6e361f3e 1058 * @param pRxData pointer to RX data buffer.
Anna Bridge 186:707f6e361f3e 1059 * @param Size amount of data to be received/sent.
<> 144:ef7eb2e8f9f7 1060 * @note When the USART parity is enabled (PCE = 1) the data received contain the parity bit.
Anna Bridge 186:707f6e361f3e 1061 * @note When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01),
Anna Bridge 186:707f6e361f3e 1062 * address of user data buffer containing data to be sent, should be aligned on a half word frontier (16 bits)
Anna Bridge 186:707f6e361f3e 1063 * (as sent data will be handled using u16 pointer cast). Depending on compilation chain,
Anna Bridge 186:707f6e361f3e 1064 * use of specific alignment compilation directives or pragmas might be required to ensure proper alignment for pTxData.
<> 144:ef7eb2e8f9f7 1065 * @retval HAL status
<> 144:ef7eb2e8f9f7 1066 */
<> 144:ef7eb2e8f9f7 1067 HAL_StatusTypeDef HAL_USART_TransmitReceive_DMA(USART_HandleTypeDef *husart, uint8_t *pTxData, uint8_t *pRxData, uint16_t Size)
<> 144:ef7eb2e8f9f7 1068 {
<> 144:ef7eb2e8f9f7 1069 uint32_t *tmp;
Anna Bridge 186:707f6e361f3e 1070
<> 144:ef7eb2e8f9f7 1071 if(husart->State == HAL_USART_STATE_READY)
<> 144:ef7eb2e8f9f7 1072 {
Anna Bridge 186:707f6e361f3e 1073 if((pTxData == NULL) || (pRxData == NULL) || (Size == 0U))
<> 144:ef7eb2e8f9f7 1074 {
<> 144:ef7eb2e8f9f7 1075 return HAL_ERROR;
<> 144:ef7eb2e8f9f7 1076 }
Anna Bridge 186:707f6e361f3e 1077
Anna Bridge 186:707f6e361f3e 1078 /* In case of 9bits/No Parity transfer, pTxData and pRxData buffers provided as input paramter
Anna Bridge 186:707f6e361f3e 1079 should be aligned on a u16 frontier, as data to be filled into TDR/retrieved from RDR will be
Anna Bridge 186:707f6e361f3e 1080 handled through a u16 cast. */
Anna Bridge 186:707f6e361f3e 1081 if ((husart->Init.WordLength == USART_WORDLENGTH_9B) && (husart->Init.Parity == USART_PARITY_NONE))
Anna Bridge 186:707f6e361f3e 1082 {
Anna Bridge 186:707f6e361f3e 1083 if(((((uint32_t)pTxData)&1) != 0) || ((((uint32_t)pRxData)&1) != 0))
Anna Bridge 186:707f6e361f3e 1084 {
Anna Bridge 186:707f6e361f3e 1085 return HAL_ERROR;
Anna Bridge 186:707f6e361f3e 1086 }
Anna Bridge 186:707f6e361f3e 1087 }
Anna Bridge 186:707f6e361f3e 1088
<> 144:ef7eb2e8f9f7 1089 /* Process Locked */
<> 144:ef7eb2e8f9f7 1090 __HAL_LOCK(husart);
<> 144:ef7eb2e8f9f7 1091
<> 144:ef7eb2e8f9f7 1092 husart->pRxBuffPtr = pRxData;
<> 144:ef7eb2e8f9f7 1093 husart->RxXferSize = Size;
<> 144:ef7eb2e8f9f7 1094 husart->pTxBuffPtr = pTxData;
<> 144:ef7eb2e8f9f7 1095 husart->TxXferSize = Size;
<> 144:ef7eb2e8f9f7 1096
<> 144:ef7eb2e8f9f7 1097 husart->ErrorCode = HAL_USART_ERROR_NONE;
<> 144:ef7eb2e8f9f7 1098 husart->State = HAL_USART_STATE_BUSY_TX_RX;
<> 144:ef7eb2e8f9f7 1099
<> 144:ef7eb2e8f9f7 1100 /* Set the USART DMA Rx transfer complete callback */
<> 144:ef7eb2e8f9f7 1101 husart->hdmarx->XferCpltCallback = USART_DMAReceiveCplt;
<> 144:ef7eb2e8f9f7 1102
<> 144:ef7eb2e8f9f7 1103 /* Set the USART DMA Half transfer complete callback */
<> 144:ef7eb2e8f9f7 1104 husart->hdmarx->XferHalfCpltCallback = USART_DMARxHalfCplt;
<> 144:ef7eb2e8f9f7 1105
<> 144:ef7eb2e8f9f7 1106 /* Set the USART DMA Tx transfer complete callback */
<> 144:ef7eb2e8f9f7 1107 husart->hdmatx->XferCpltCallback = USART_DMATransmitCplt;
<> 144:ef7eb2e8f9f7 1108
<> 144:ef7eb2e8f9f7 1109 /* Set the USART DMA Half transfer complete callback */
<> 144:ef7eb2e8f9f7 1110 husart->hdmatx->XferHalfCpltCallback = USART_DMATxHalfCplt;
<> 144:ef7eb2e8f9f7 1111
<> 144:ef7eb2e8f9f7 1112 /* Set the USART DMA Tx transfer error callback */
<> 144:ef7eb2e8f9f7 1113 husart->hdmatx->XferErrorCallback = USART_DMAError;
<> 144:ef7eb2e8f9f7 1114
<> 144:ef7eb2e8f9f7 1115 /* Set the USART DMA Rx transfer error callback */
<> 144:ef7eb2e8f9f7 1116 husart->hdmarx->XferErrorCallback = USART_DMAError;
<> 144:ef7eb2e8f9f7 1117
Anna Bridge 186:707f6e361f3e 1118 /* Enable the USART receive DMA channel */
<> 144:ef7eb2e8f9f7 1119 tmp = (uint32_t*)&pRxData;
<> 144:ef7eb2e8f9f7 1120 HAL_DMA_Start_IT(husart->hdmarx, (uint32_t)&husart->Instance->RDR, *(uint32_t*)tmp, Size);
<> 144:ef7eb2e8f9f7 1121
Anna Bridge 186:707f6e361f3e 1122 /* Enable the USART transmit DMA channel */
<> 144:ef7eb2e8f9f7 1123 tmp = (uint32_t*)&pTxData;
<> 144:ef7eb2e8f9f7 1124 HAL_DMA_Start_IT(husart->hdmatx, *(uint32_t*)tmp, (uint32_t)&husart->Instance->TDR, Size);
Anna Bridge 186:707f6e361f3e 1125
Anna Bridge 186:707f6e361f3e 1126 /* Process Unlocked */
Anna Bridge 186:707f6e361f3e 1127 __HAL_UNLOCK(husart);
Anna Bridge 186:707f6e361f3e 1128
Anna Bridge 186:707f6e361f3e 1129 /* Enable the USART Parity Error Interrupt */
Anna Bridge 186:707f6e361f3e 1130 SET_BIT(husart->Instance->CR1, USART_CR1_PEIE);
Anna Bridge 186:707f6e361f3e 1131
Anna Bridge 186:707f6e361f3e 1132 /* Enable the USART Error Interrupt: (Frame error, noise error, overrun error) */
Anna Bridge 186:707f6e361f3e 1133 SET_BIT(husart->Instance->CR3, USART_CR3_EIE);
<> 144:ef7eb2e8f9f7 1134
Anna Bridge 186:707f6e361f3e 1135 /* Clear the Overrun flag: mandatory for the second transfer in circular mode */
Anna Bridge 186:707f6e361f3e 1136 __HAL_USART_CLEAR_FLAG(husart, USART_CLEAR_OREF);
Anna Bridge 186:707f6e361f3e 1137
Anna Bridge 186:707f6e361f3e 1138 /* Clear the TC flag in the ICR register */
Anna Bridge 186:707f6e361f3e 1139 __HAL_USART_CLEAR_FLAG(husart, USART_CLEAR_TCF);
Anna Bridge 186:707f6e361f3e 1140
Anna Bridge 186:707f6e361f3e 1141 /* Enable the DMA transfer for the receiver request by setting the DMAR bit
<> 144:ef7eb2e8f9f7 1142 in the USART CR3 register */
Anna Bridge 186:707f6e361f3e 1143 SET_BIT(husart->Instance->CR3, USART_CR3_DMAR);
<> 144:ef7eb2e8f9f7 1144
<> 144:ef7eb2e8f9f7 1145 /* Enable the DMA transfer for transmit request by setting the DMAT bit
<> 144:ef7eb2e8f9f7 1146 in the USART CR3 register */
Anna Bridge 186:707f6e361f3e 1147 SET_BIT(husart->Instance->CR3, USART_CR3_DMAT);
<> 144:ef7eb2e8f9f7 1148
<> 144:ef7eb2e8f9f7 1149 return HAL_OK;
<> 144:ef7eb2e8f9f7 1150 }
<> 144:ef7eb2e8f9f7 1151 else
<> 144:ef7eb2e8f9f7 1152 {
<> 144:ef7eb2e8f9f7 1153 return HAL_BUSY;
<> 144:ef7eb2e8f9f7 1154 }
<> 144:ef7eb2e8f9f7 1155 }
<> 144:ef7eb2e8f9f7 1156
<> 144:ef7eb2e8f9f7 1157 /**
Anna Bridge 186:707f6e361f3e 1158 * @brief Pause the DMA Transfer.
Anna Bridge 186:707f6e361f3e 1159 * @param husart USART handle.
Anna Bridge 186:707f6e361f3e 1160 * @retval HAL status
<> 144:ef7eb2e8f9f7 1161 */
<> 144:ef7eb2e8f9f7 1162 HAL_StatusTypeDef HAL_USART_DMAPause(USART_HandleTypeDef *husart)
<> 144:ef7eb2e8f9f7 1163 {
<> 144:ef7eb2e8f9f7 1164 /* Process Locked */
<> 144:ef7eb2e8f9f7 1165 __HAL_LOCK(husart);
<> 144:ef7eb2e8f9f7 1166
Anna Bridge 186:707f6e361f3e 1167 if( (husart->State == HAL_USART_STATE_BUSY_TX) &&
Anna Bridge 186:707f6e361f3e 1168 (HAL_IS_BIT_SET(husart->Instance->CR3, USART_CR3_DMAT)))
Anna Bridge 186:707f6e361f3e 1169 {
Anna Bridge 186:707f6e361f3e 1170 /* Disable the USART DMA Tx request */
Anna Bridge 186:707f6e361f3e 1171 CLEAR_BIT(husart->Instance->CR3, USART_CR3_DMAT);
Anna Bridge 186:707f6e361f3e 1172 }
Anna Bridge 186:707f6e361f3e 1173 else if( (husart->State == HAL_USART_STATE_BUSY_RX) ||
Anna Bridge 186:707f6e361f3e 1174 (husart->State == HAL_USART_STATE_BUSY_TX_RX) )
Anna Bridge 186:707f6e361f3e 1175 {
Anna Bridge 186:707f6e361f3e 1176 if (HAL_IS_BIT_SET(husart->Instance->CR3, USART_CR3_DMAT))
Anna Bridge 186:707f6e361f3e 1177 {
Anna Bridge 186:707f6e361f3e 1178 /* Disable the USART DMA Tx request */
Anna Bridge 186:707f6e361f3e 1179 CLEAR_BIT(husart->Instance->CR3, USART_CR3_DMAT);
Anna Bridge 186:707f6e361f3e 1180 }
Anna Bridge 186:707f6e361f3e 1181 if (HAL_IS_BIT_SET(husart->Instance->CR3, USART_CR3_DMAR))
Anna Bridge 186:707f6e361f3e 1182 {
Anna Bridge 186:707f6e361f3e 1183 /* Disable PE and ERR (Frame error, noise error, overrun error) interrupts */
Anna Bridge 186:707f6e361f3e 1184 CLEAR_BIT(husart->Instance->CR1, USART_CR1_PEIE);
Anna Bridge 186:707f6e361f3e 1185 CLEAR_BIT(husart->Instance->CR3, USART_CR3_EIE);
Anna Bridge 186:707f6e361f3e 1186
Anna Bridge 186:707f6e361f3e 1187 /* Disable the USART DMA Rx request */
Anna Bridge 186:707f6e361f3e 1188 CLEAR_BIT(husart->Instance->CR3, USART_CR3_DMAR);
Anna Bridge 186:707f6e361f3e 1189 }
Anna Bridge 186:707f6e361f3e 1190 }
<> 144:ef7eb2e8f9f7 1191
<> 144:ef7eb2e8f9f7 1192 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 1193 __HAL_UNLOCK(husart);
<> 144:ef7eb2e8f9f7 1194
Anna Bridge 186:707f6e361f3e 1195 return HAL_OK;
<> 144:ef7eb2e8f9f7 1196 }
<> 144:ef7eb2e8f9f7 1197
<> 144:ef7eb2e8f9f7 1198 /**
Anna Bridge 186:707f6e361f3e 1199 * @brief Resume the DMA Transfer.
Anna Bridge 186:707f6e361f3e 1200 * @param husart USART handle.
Anna Bridge 186:707f6e361f3e 1201 * @retval HAL status
<> 144:ef7eb2e8f9f7 1202 */
<> 144:ef7eb2e8f9f7 1203 HAL_StatusTypeDef HAL_USART_DMAResume(USART_HandleTypeDef *husart)
<> 144:ef7eb2e8f9f7 1204 {
<> 144:ef7eb2e8f9f7 1205 /* Process Locked */
<> 144:ef7eb2e8f9f7 1206 __HAL_LOCK(husart);
Anna Bridge 186:707f6e361f3e 1207
Anna Bridge 186:707f6e361f3e 1208 if(husart->State == HAL_USART_STATE_BUSY_TX)
Anna Bridge 186:707f6e361f3e 1209 {
Anna Bridge 186:707f6e361f3e 1210 /* Enable the USART DMA Tx request */
Anna Bridge 186:707f6e361f3e 1211 SET_BIT(husart->Instance->CR3, USART_CR3_DMAT);
Anna Bridge 186:707f6e361f3e 1212 }
Anna Bridge 186:707f6e361f3e 1213 else if( (husart->State == HAL_USART_STATE_BUSY_RX) ||
Anna Bridge 186:707f6e361f3e 1214 (husart->State == HAL_USART_STATE_BUSY_TX_RX) )
Anna Bridge 186:707f6e361f3e 1215 {
Anna Bridge 186:707f6e361f3e 1216 /* Clear the Overrun flag before resuming the Rx transfer*/
Anna Bridge 186:707f6e361f3e 1217 __HAL_USART_CLEAR_FLAG(husart, USART_CLEAR_OREF);
Anna Bridge 186:707f6e361f3e 1218
Anna Bridge 186:707f6e361f3e 1219 /* Reenable PE and ERR (Frame error, noise error, overrun error) interrupts */
Anna Bridge 186:707f6e361f3e 1220 SET_BIT(husart->Instance->CR1, USART_CR1_PEIE);
Anna Bridge 186:707f6e361f3e 1221 SET_BIT(husart->Instance->CR3, USART_CR3_EIE);
Anna Bridge 186:707f6e361f3e 1222
Anna Bridge 186:707f6e361f3e 1223 /* Enable the USART DMA Rx request before the DMA Tx request */
Anna Bridge 186:707f6e361f3e 1224 SET_BIT(husart->Instance->CR3, USART_CR3_DMAR);
Anna Bridge 186:707f6e361f3e 1225
Anna Bridge 186:707f6e361f3e 1226 /* Enable the USART DMA Tx request */
Anna Bridge 186:707f6e361f3e 1227 SET_BIT(husart->Instance->CR3, USART_CR3_DMAT);
Anna Bridge 186:707f6e361f3e 1228 }
<> 144:ef7eb2e8f9f7 1229
<> 144:ef7eb2e8f9f7 1230 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 1231 __HAL_UNLOCK(husart);
<> 144:ef7eb2e8f9f7 1232
<> 144:ef7eb2e8f9f7 1233 return HAL_OK;
<> 144:ef7eb2e8f9f7 1234 }
<> 144:ef7eb2e8f9f7 1235
<> 144:ef7eb2e8f9f7 1236 /**
Anna Bridge 186:707f6e361f3e 1237 * @brief Stop the DMA Transfer.
Anna Bridge 186:707f6e361f3e 1238 * @param husart USART handle.
Anna Bridge 186:707f6e361f3e 1239 * @retval HAL status
<> 144:ef7eb2e8f9f7 1240 */
<> 144:ef7eb2e8f9f7 1241 HAL_StatusTypeDef HAL_USART_DMAStop(USART_HandleTypeDef *husart)
<> 144:ef7eb2e8f9f7 1242 {
Anna Bridge 186:707f6e361f3e 1243 /* The Lock is not implemented on this API to allow the user application
Anna Bridge 186:707f6e361f3e 1244 to call the HAL USART API under callbacks HAL_USART_TxCpltCallback() / HAL_USART_RxCpltCallback() /
Anna Bridge 186:707f6e361f3e 1245 HAL_USART_TxHalfCpltCallback / HAL_USART_RxHalfCpltCallback:
Anna Bridge 186:707f6e361f3e 1246 indeed, when HAL_DMA_Abort() API is called, the DMA TX/RX Transfer or Half Transfer complete
Anna Bridge 186:707f6e361f3e 1247 interrupt is generated if the DMA transfer interruption occurs at the middle or at the end of
Anna Bridge 186:707f6e361f3e 1248 the stream and the corresponding call back is executed. */
<> 144:ef7eb2e8f9f7 1249
Anna Bridge 186:707f6e361f3e 1250 /* Disable the USART Tx/Rx DMA requests */
Anna Bridge 186:707f6e361f3e 1251 CLEAR_BIT(husart->Instance->CR3, USART_CR3_DMAT);
Anna Bridge 186:707f6e361f3e 1252 CLEAR_BIT(husart->Instance->CR3, USART_CR3_DMAR);
Anna Bridge 186:707f6e361f3e 1253
Anna Bridge 186:707f6e361f3e 1254 /* Abort the USART DMA tx channel */
<> 144:ef7eb2e8f9f7 1255 if(husart->hdmatx != NULL)
<> 144:ef7eb2e8f9f7 1256 {
<> 144:ef7eb2e8f9f7 1257 HAL_DMA_Abort(husart->hdmatx);
<> 144:ef7eb2e8f9f7 1258 }
Anna Bridge 186:707f6e361f3e 1259 /* Abort the USART DMA rx channel */
<> 144:ef7eb2e8f9f7 1260 if(husart->hdmarx != NULL)
<> 144:ef7eb2e8f9f7 1261 {
<> 144:ef7eb2e8f9f7 1262 HAL_DMA_Abort(husart->hdmarx);
<> 144:ef7eb2e8f9f7 1263 }
<> 144:ef7eb2e8f9f7 1264
Anna Bridge 186:707f6e361f3e 1265 USART_EndTransfer(husart);
<> 144:ef7eb2e8f9f7 1266 husart->State = HAL_USART_STATE_READY;
<> 144:ef7eb2e8f9f7 1267
<> 144:ef7eb2e8f9f7 1268 return HAL_OK;
<> 144:ef7eb2e8f9f7 1269 }
<> 144:ef7eb2e8f9f7 1270
<> 144:ef7eb2e8f9f7 1271 /**
Anna Bridge 186:707f6e361f3e 1272 * @brief Abort ongoing transfers (blocking mode).
Anna Bridge 186:707f6e361f3e 1273 * @param husart USART handle.
Anna Bridge 186:707f6e361f3e 1274 * @note This procedure could be used for aborting any ongoing transfer started in Interrupt or DMA mode.
Anna Bridge 186:707f6e361f3e 1275 * This procedure performs following operations :
Anna Bridge 186:707f6e361f3e 1276 * - Disable USART Interrupts (Tx and Rx)
Anna Bridge 186:707f6e361f3e 1277 * - Disable the DMA transfer in the peripheral register (if enabled)
Anna Bridge 186:707f6e361f3e 1278 * - Abort DMA transfer by calling HAL_DMA_Abort (in case of transfer in DMA mode)
Anna Bridge 186:707f6e361f3e 1279 * - Set handle State to READY
Anna Bridge 186:707f6e361f3e 1280 * @note This procedure is executed in blocking mode : when exiting function, Abort is considered as completed.
Anna Bridge 186:707f6e361f3e 1281 * @retval HAL status
Anna Bridge 186:707f6e361f3e 1282 */
Anna Bridge 186:707f6e361f3e 1283 HAL_StatusTypeDef HAL_USART_Abort(USART_HandleTypeDef *husart)
Anna Bridge 186:707f6e361f3e 1284 {
Anna Bridge 186:707f6e361f3e 1285 /* Disable TXEIE, TCIE, RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts */
Anna Bridge 186:707f6e361f3e 1286 CLEAR_BIT(husart->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE | USART_CR1_TXEIE | USART_CR1_TCIE));
Anna Bridge 186:707f6e361f3e 1287 CLEAR_BIT(husart->Instance->CR3, USART_CR3_EIE);
Anna Bridge 186:707f6e361f3e 1288
Anna Bridge 186:707f6e361f3e 1289 /* Disable the USART DMA Tx request if enabled */
Anna Bridge 186:707f6e361f3e 1290 if (HAL_IS_BIT_SET(husart->Instance->CR3, USART_CR3_DMAT))
Anna Bridge 186:707f6e361f3e 1291 {
Anna Bridge 186:707f6e361f3e 1292 CLEAR_BIT(husart->Instance->CR3, USART_CR3_DMAT);
Anna Bridge 186:707f6e361f3e 1293
Anna Bridge 186:707f6e361f3e 1294 /* Abort the USART DMA Tx channel : use blocking DMA Abort API (no callback) */
Anna Bridge 186:707f6e361f3e 1295 if(husart->hdmatx != NULL)
Anna Bridge 186:707f6e361f3e 1296 {
Anna Bridge 186:707f6e361f3e 1297 /* Set the USART DMA Abort callback to Null.
Anna Bridge 186:707f6e361f3e 1298 No call back execution at end of DMA abort procedure */
Anna Bridge 186:707f6e361f3e 1299 husart->hdmatx->XferAbortCallback = NULL;
Anna Bridge 186:707f6e361f3e 1300
Anna Bridge 186:707f6e361f3e 1301 HAL_DMA_Abort(husart->hdmatx);
Anna Bridge 186:707f6e361f3e 1302 }
Anna Bridge 186:707f6e361f3e 1303 }
Anna Bridge 186:707f6e361f3e 1304
Anna Bridge 186:707f6e361f3e 1305 /* Disable the USART DMA Rx request if enabled */
Anna Bridge 186:707f6e361f3e 1306 if (HAL_IS_BIT_SET(husart->Instance->CR3, USART_CR3_DMAR))
Anna Bridge 186:707f6e361f3e 1307 {
Anna Bridge 186:707f6e361f3e 1308 CLEAR_BIT(husart->Instance->CR3, USART_CR3_DMAR);
Anna Bridge 186:707f6e361f3e 1309
Anna Bridge 186:707f6e361f3e 1310 /* Abort the USART DMA Rx channel : use blocking DMA Abort API (no callback) */
Anna Bridge 186:707f6e361f3e 1311 if(husart->hdmarx != NULL)
Anna Bridge 186:707f6e361f3e 1312 {
Anna Bridge 186:707f6e361f3e 1313 /* Set the USART DMA Abort callback to Null.
Anna Bridge 186:707f6e361f3e 1314 No call back execution at end of DMA abort procedure */
Anna Bridge 186:707f6e361f3e 1315 husart->hdmarx->XferAbortCallback = NULL;
Anna Bridge 186:707f6e361f3e 1316
Anna Bridge 186:707f6e361f3e 1317 HAL_DMA_Abort(husart->hdmarx);
Anna Bridge 186:707f6e361f3e 1318 }
Anna Bridge 186:707f6e361f3e 1319 }
Anna Bridge 186:707f6e361f3e 1320
Anna Bridge 186:707f6e361f3e 1321 /* Reset Tx and Rx transfer counters */
Anna Bridge 186:707f6e361f3e 1322 husart->TxXferCount = 0;
Anna Bridge 186:707f6e361f3e 1323 husart->RxXferCount = 0;
Anna Bridge 186:707f6e361f3e 1324
Anna Bridge 186:707f6e361f3e 1325 /* Clear the Error flags in the ICR register */
Anna Bridge 186:707f6e361f3e 1326 __HAL_USART_CLEAR_FLAG(husart, USART_CLEAR_OREF | USART_CLEAR_NEF | USART_CLEAR_PEF | USART_CLEAR_FEF);
Anna Bridge 186:707f6e361f3e 1327
Anna Bridge 186:707f6e361f3e 1328 /* Restore husart->State to Ready */
Anna Bridge 186:707f6e361f3e 1329 husart->State = HAL_USART_STATE_READY;
Anna Bridge 186:707f6e361f3e 1330
Anna Bridge 186:707f6e361f3e 1331 /* Reset Handle ErrorCode to No Error */
Anna Bridge 186:707f6e361f3e 1332 husart->ErrorCode = HAL_USART_ERROR_NONE;
Anna Bridge 186:707f6e361f3e 1333
Anna Bridge 186:707f6e361f3e 1334 return HAL_OK;
Anna Bridge 186:707f6e361f3e 1335 }
Anna Bridge 186:707f6e361f3e 1336
Anna Bridge 186:707f6e361f3e 1337 /**
Anna Bridge 186:707f6e361f3e 1338 * @brief Abort ongoing transfers (Interrupt mode).
Anna Bridge 186:707f6e361f3e 1339 * @param husart USART handle.
Anna Bridge 186:707f6e361f3e 1340 * @note This procedure could be used for aborting any ongoing transfer started in Interrupt or DMA mode.
Anna Bridge 186:707f6e361f3e 1341 * This procedure performs following operations :
Anna Bridge 186:707f6e361f3e 1342 * - Disable USART Interrupts (Tx and Rx)
Anna Bridge 186:707f6e361f3e 1343 * - Disable the DMA transfer in the peripheral register (if enabled)
Anna Bridge 186:707f6e361f3e 1344 * - Abort DMA transfer by calling HAL_DMA_Abort_IT (in case of transfer in DMA mode)
Anna Bridge 186:707f6e361f3e 1345 * - Set handle State to READY
Anna Bridge 186:707f6e361f3e 1346 * - At abort completion, call user abort complete callback
Anna Bridge 186:707f6e361f3e 1347 * @note This procedure is executed in Interrupt mode, meaning that abort procedure could be
Anna Bridge 186:707f6e361f3e 1348 * considered as completed only when user abort complete callback is executed (not when exiting function).
Anna Bridge 186:707f6e361f3e 1349 * @retval HAL status
Anna Bridge 186:707f6e361f3e 1350 */
Anna Bridge 186:707f6e361f3e 1351 HAL_StatusTypeDef HAL_USART_Abort_IT(USART_HandleTypeDef *husart)
Anna Bridge 186:707f6e361f3e 1352 {
Anna Bridge 186:707f6e361f3e 1353 uint32_t abortcplt = 1;
Anna Bridge 186:707f6e361f3e 1354
Anna Bridge 186:707f6e361f3e 1355 /* Disable TXEIE, TCIE, RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts */
Anna Bridge 186:707f6e361f3e 1356 CLEAR_BIT(husart->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE | USART_CR1_TXEIE | USART_CR1_TCIE));
Anna Bridge 186:707f6e361f3e 1357 CLEAR_BIT(husart->Instance->CR3, USART_CR3_EIE);
Anna Bridge 186:707f6e361f3e 1358
Anna Bridge 186:707f6e361f3e 1359 /* If DMA Tx and/or DMA Rx Handles are associated to USART Handle, DMA Abort complete callbacks should be initialised
Anna Bridge 186:707f6e361f3e 1360 before any call to DMA Abort functions */
Anna Bridge 186:707f6e361f3e 1361 /* DMA Tx Handle is valid */
Anna Bridge 186:707f6e361f3e 1362 if(husart->hdmatx != NULL)
Anna Bridge 186:707f6e361f3e 1363 {
Anna Bridge 186:707f6e361f3e 1364 /* Set DMA Abort Complete callback if USART DMA Tx request if enabled.
Anna Bridge 186:707f6e361f3e 1365 Otherwise, set it to NULL */
Anna Bridge 186:707f6e361f3e 1366 if(HAL_IS_BIT_SET(husart->Instance->CR3, USART_CR3_DMAT))
Anna Bridge 186:707f6e361f3e 1367 {
Anna Bridge 186:707f6e361f3e 1368 husart->hdmatx->XferAbortCallback = USART_DMATxAbortCallback;
Anna Bridge 186:707f6e361f3e 1369 }
Anna Bridge 186:707f6e361f3e 1370 else
Anna Bridge 186:707f6e361f3e 1371 {
Anna Bridge 186:707f6e361f3e 1372 husart->hdmatx->XferAbortCallback = NULL;
Anna Bridge 186:707f6e361f3e 1373 }
Anna Bridge 186:707f6e361f3e 1374 }
Anna Bridge 186:707f6e361f3e 1375 /* DMA Rx Handle is valid */
Anna Bridge 186:707f6e361f3e 1376 if(husart->hdmarx != NULL)
Anna Bridge 186:707f6e361f3e 1377 {
Anna Bridge 186:707f6e361f3e 1378 /* Set DMA Abort Complete callback if USART DMA Rx request if enabled.
Anna Bridge 186:707f6e361f3e 1379 Otherwise, set it to NULL */
Anna Bridge 186:707f6e361f3e 1380 if(HAL_IS_BIT_SET(husart->Instance->CR3, USART_CR3_DMAR))
Anna Bridge 186:707f6e361f3e 1381 {
Anna Bridge 186:707f6e361f3e 1382 husart->hdmarx->XferAbortCallback = USART_DMARxAbortCallback;
Anna Bridge 186:707f6e361f3e 1383 }
Anna Bridge 186:707f6e361f3e 1384 else
Anna Bridge 186:707f6e361f3e 1385 {
Anna Bridge 186:707f6e361f3e 1386 husart->hdmarx->XferAbortCallback = NULL;
Anna Bridge 186:707f6e361f3e 1387 }
Anna Bridge 186:707f6e361f3e 1388 }
Anna Bridge 186:707f6e361f3e 1389
Anna Bridge 186:707f6e361f3e 1390 /* Disable the USART DMA Tx request if enabled */
Anna Bridge 186:707f6e361f3e 1391 if(HAL_IS_BIT_SET(husart->Instance->CR3, USART_CR3_DMAT))
Anna Bridge 186:707f6e361f3e 1392 {
Anna Bridge 186:707f6e361f3e 1393 /* Disable DMA Tx at USART level */
Anna Bridge 186:707f6e361f3e 1394 CLEAR_BIT(husart->Instance->CR3, USART_CR3_DMAT);
Anna Bridge 186:707f6e361f3e 1395
Anna Bridge 186:707f6e361f3e 1396 /* Abort the USART DMA Tx channel : use non blocking DMA Abort API (callback) */
Anna Bridge 186:707f6e361f3e 1397 if(husart->hdmatx != NULL)
Anna Bridge 186:707f6e361f3e 1398 {
Anna Bridge 186:707f6e361f3e 1399 /* USART Tx DMA Abort callback has already been initialised :
Anna Bridge 186:707f6e361f3e 1400 will lead to call HAL_USART_AbortCpltCallback() at end of DMA abort procedure */
Anna Bridge 186:707f6e361f3e 1401
Anna Bridge 186:707f6e361f3e 1402 /* Abort DMA TX */
Anna Bridge 186:707f6e361f3e 1403 if(HAL_DMA_Abort_IT(husart->hdmatx) != HAL_OK)
Anna Bridge 186:707f6e361f3e 1404 {
Anna Bridge 186:707f6e361f3e 1405 husart->hdmatx->XferAbortCallback = NULL;
Anna Bridge 186:707f6e361f3e 1406 }
Anna Bridge 186:707f6e361f3e 1407 else
Anna Bridge 186:707f6e361f3e 1408 {
Anna Bridge 186:707f6e361f3e 1409 abortcplt = 0;
Anna Bridge 186:707f6e361f3e 1410 }
Anna Bridge 186:707f6e361f3e 1411 }
Anna Bridge 186:707f6e361f3e 1412 }
Anna Bridge 186:707f6e361f3e 1413
Anna Bridge 186:707f6e361f3e 1414 /* Disable the USART DMA Rx request if enabled */
Anna Bridge 186:707f6e361f3e 1415 if (HAL_IS_BIT_SET(husart->Instance->CR3, USART_CR3_DMAR))
Anna Bridge 186:707f6e361f3e 1416 {
Anna Bridge 186:707f6e361f3e 1417 CLEAR_BIT(husart->Instance->CR3, USART_CR3_DMAR);
Anna Bridge 186:707f6e361f3e 1418
Anna Bridge 186:707f6e361f3e 1419 /* Abort the USART DMA Rx channel : use non blocking DMA Abort API (callback) */
Anna Bridge 186:707f6e361f3e 1420 if(husart->hdmarx != NULL)
Anna Bridge 186:707f6e361f3e 1421 {
Anna Bridge 186:707f6e361f3e 1422 /* USART Rx DMA Abort callback has already been initialised :
Anna Bridge 186:707f6e361f3e 1423 will lead to call HAL_USART_AbortCpltCallback() at end of DMA abort procedure */
Anna Bridge 186:707f6e361f3e 1424
Anna Bridge 186:707f6e361f3e 1425 /* Abort DMA RX */
Anna Bridge 186:707f6e361f3e 1426 if(HAL_DMA_Abort_IT(husart->hdmarx) != HAL_OK)
Anna Bridge 186:707f6e361f3e 1427 {
Anna Bridge 186:707f6e361f3e 1428 husart->hdmarx->XferAbortCallback = NULL;
Anna Bridge 186:707f6e361f3e 1429 abortcplt = 1;
Anna Bridge 186:707f6e361f3e 1430 }
Anna Bridge 186:707f6e361f3e 1431 else
Anna Bridge 186:707f6e361f3e 1432 {
Anna Bridge 186:707f6e361f3e 1433 abortcplt = 0;
Anna Bridge 186:707f6e361f3e 1434 }
Anna Bridge 186:707f6e361f3e 1435 }
Anna Bridge 186:707f6e361f3e 1436 }
Anna Bridge 186:707f6e361f3e 1437
Anna Bridge 186:707f6e361f3e 1438 /* if no DMA abort complete callback execution is required => call user Abort Complete callback */
Anna Bridge 186:707f6e361f3e 1439 if (abortcplt == 1)
Anna Bridge 186:707f6e361f3e 1440 {
Anna Bridge 186:707f6e361f3e 1441 /* Reset Tx and Rx transfer counters */
Anna Bridge 186:707f6e361f3e 1442 husart->TxXferCount = 0;
Anna Bridge 186:707f6e361f3e 1443 husart->RxXferCount = 0;
Anna Bridge 186:707f6e361f3e 1444
Anna Bridge 186:707f6e361f3e 1445 /* Reset errorCode */
Anna Bridge 186:707f6e361f3e 1446 husart->ErrorCode = HAL_USART_ERROR_NONE;
Anna Bridge 186:707f6e361f3e 1447
Anna Bridge 186:707f6e361f3e 1448 /* Clear the Error flags in the ICR register */
Anna Bridge 186:707f6e361f3e 1449 __HAL_USART_CLEAR_FLAG(husart, USART_CLEAR_OREF | USART_CLEAR_NEF | USART_CLEAR_PEF | USART_CLEAR_FEF);
Anna Bridge 186:707f6e361f3e 1450
Anna Bridge 186:707f6e361f3e 1451 /* Restore husart->State to Ready */
Anna Bridge 186:707f6e361f3e 1452 husart->State = HAL_USART_STATE_READY;
Anna Bridge 186:707f6e361f3e 1453
Anna Bridge 186:707f6e361f3e 1454 /* As no DMA to be aborted, call directly user Abort complete callback */
Anna Bridge 186:707f6e361f3e 1455 HAL_USART_AbortCpltCallback(husart);
Anna Bridge 186:707f6e361f3e 1456 }
Anna Bridge 186:707f6e361f3e 1457
Anna Bridge 186:707f6e361f3e 1458 return HAL_OK;
Anna Bridge 186:707f6e361f3e 1459 }
Anna Bridge 186:707f6e361f3e 1460
Anna Bridge 186:707f6e361f3e 1461 /**
Anna Bridge 186:707f6e361f3e 1462 * @brief Handle USART interrupt request.
Anna Bridge 186:707f6e361f3e 1463 * @param husart USART handle.
<> 144:ef7eb2e8f9f7 1464 * @retval None
<> 144:ef7eb2e8f9f7 1465 */
<> 144:ef7eb2e8f9f7 1466 void HAL_USART_IRQHandler(USART_HandleTypeDef *husart)
<> 144:ef7eb2e8f9f7 1467 {
Anna Bridge 186:707f6e361f3e 1468 uint32_t isrflags = READ_REG(husart->Instance->ISR);
Anna Bridge 186:707f6e361f3e 1469 uint32_t cr1its = READ_REG(husart->Instance->CR1);
Anna Bridge 186:707f6e361f3e 1470 uint32_t cr3its;
Anna Bridge 186:707f6e361f3e 1471 uint32_t errorflags;
Anna Bridge 186:707f6e361f3e 1472
Anna Bridge 186:707f6e361f3e 1473 /* If no error occurs */
Anna Bridge 186:707f6e361f3e 1474 errorflags = (isrflags & (uint32_t)(USART_ISR_PE | USART_ISR_FE | USART_ISR_ORE | USART_ISR_NE));
Anna Bridge 186:707f6e361f3e 1475 if (errorflags == RESET)
<> 144:ef7eb2e8f9f7 1476 {
Anna Bridge 186:707f6e361f3e 1477 /* USART in mode Receiver ---------------------------------------------------*/
Anna Bridge 186:707f6e361f3e 1478 if(((isrflags & USART_ISR_RXNE) != RESET) && ((cr1its & USART_CR1_RXNEIE) != RESET))
<> 144:ef7eb2e8f9f7 1479 {
Anna Bridge 186:707f6e361f3e 1480 if(husart->State == HAL_USART_STATE_BUSY_RX)
Anna Bridge 186:707f6e361f3e 1481 {
Anna Bridge 186:707f6e361f3e 1482 USART_Receive_IT(husart);
Anna Bridge 186:707f6e361f3e 1483 }
Anna Bridge 186:707f6e361f3e 1484 else
Anna Bridge 186:707f6e361f3e 1485 {
Anna Bridge 186:707f6e361f3e 1486 USART_TransmitReceive_IT(husart);
Anna Bridge 186:707f6e361f3e 1487 }
Anna Bridge 186:707f6e361f3e 1488 return;
<> 144:ef7eb2e8f9f7 1489 }
<> 144:ef7eb2e8f9f7 1490 }
Anna Bridge 186:707f6e361f3e 1491
Anna Bridge 186:707f6e361f3e 1492 /* If some errors occur */
Anna Bridge 186:707f6e361f3e 1493 cr3its = READ_REG(husart->Instance->CR3);
Anna Bridge 186:707f6e361f3e 1494 if( (errorflags != RESET)
Anna Bridge 186:707f6e361f3e 1495 && ( ((cr3its & USART_CR3_EIE) != RESET)
Anna Bridge 186:707f6e361f3e 1496 || ((cr1its & (USART_CR1_RXNEIE | USART_CR1_PEIE)) != RESET)) )
Anna Bridge 186:707f6e361f3e 1497 {
Anna Bridge 186:707f6e361f3e 1498 /* USART parity error interrupt occurred -------------------------------------*/
Anna Bridge 186:707f6e361f3e 1499 if(((isrflags & USART_ISR_PE) != RESET) && ((cr1its & USART_CR1_PEIE) != RESET))
Anna Bridge 186:707f6e361f3e 1500 {
Anna Bridge 186:707f6e361f3e 1501 __HAL_USART_CLEAR_IT(husart, USART_CLEAR_PEF);
Anna Bridge 186:707f6e361f3e 1502
Anna Bridge 186:707f6e361f3e 1503 husart->ErrorCode |= HAL_USART_ERROR_PE;
Anna Bridge 186:707f6e361f3e 1504 }
Anna Bridge 186:707f6e361f3e 1505
Anna Bridge 186:707f6e361f3e 1506 /* USART frame error interrupt occurred --------------------------------------*/
Anna Bridge 186:707f6e361f3e 1507 if(((isrflags & USART_ISR_FE) != RESET) && ((cr3its & USART_CR3_EIE) != RESET))
Anna Bridge 186:707f6e361f3e 1508 {
Anna Bridge 186:707f6e361f3e 1509 __HAL_USART_CLEAR_IT(husart, USART_CLEAR_FEF);
Anna Bridge 186:707f6e361f3e 1510
Anna Bridge 186:707f6e361f3e 1511 husart->ErrorCode |= HAL_USART_ERROR_FE;
Anna Bridge 186:707f6e361f3e 1512 }
Anna Bridge 186:707f6e361f3e 1513
Anna Bridge 186:707f6e361f3e 1514 /* USART noise error interrupt occurred --------------------------------------*/
Anna Bridge 186:707f6e361f3e 1515 if(((isrflags & USART_ISR_NE) != RESET) && ((cr3its & USART_CR3_EIE) != RESET))
Anna Bridge 186:707f6e361f3e 1516 {
Anna Bridge 186:707f6e361f3e 1517 __HAL_USART_CLEAR_IT(husart, USART_CLEAR_NEF);
Anna Bridge 186:707f6e361f3e 1518
Anna Bridge 186:707f6e361f3e 1519 husart->ErrorCode |= HAL_USART_ERROR_NE;
Anna Bridge 186:707f6e361f3e 1520 }
Anna Bridge 186:707f6e361f3e 1521
Anna Bridge 186:707f6e361f3e 1522 /* USART Over-Run interrupt occurred -----------------------------------------*/
Anna Bridge 186:707f6e361f3e 1523 if(((isrflags & USART_ISR_ORE) != RESET) &&
Anna Bridge 186:707f6e361f3e 1524 (((cr1its & USART_CR1_RXNEIE) != RESET) || ((cr3its & USART_CR3_EIE) != RESET)))
Anna Bridge 186:707f6e361f3e 1525 {
Anna Bridge 186:707f6e361f3e 1526 __HAL_USART_CLEAR_IT(husart, USART_CLEAR_OREF);
Anna Bridge 186:707f6e361f3e 1527
Anna Bridge 186:707f6e361f3e 1528 husart->ErrorCode |= HAL_USART_ERROR_ORE;
Anna Bridge 186:707f6e361f3e 1529 }
Anna Bridge 186:707f6e361f3e 1530
Anna Bridge 186:707f6e361f3e 1531 /* Call USART Error Call back function if need be --------------------------*/
Anna Bridge 186:707f6e361f3e 1532 if(husart->ErrorCode != HAL_USART_ERROR_NONE)
Anna Bridge 186:707f6e361f3e 1533 {
Anna Bridge 186:707f6e361f3e 1534 /* USART in mode Receiver ---------------------------------------------------*/
Anna Bridge 186:707f6e361f3e 1535 if(((isrflags & USART_ISR_RXNE) != RESET) && ((cr1its & USART_CR1_RXNEIE) != RESET))
Anna Bridge 186:707f6e361f3e 1536 {
Anna Bridge 186:707f6e361f3e 1537 if(husart->State == HAL_USART_STATE_BUSY_RX)
Anna Bridge 186:707f6e361f3e 1538 {
Anna Bridge 186:707f6e361f3e 1539 USART_Receive_IT(husart);
Anna Bridge 186:707f6e361f3e 1540 }
Anna Bridge 186:707f6e361f3e 1541 else
Anna Bridge 186:707f6e361f3e 1542 {
Anna Bridge 186:707f6e361f3e 1543 USART_TransmitReceive_IT(husart);
Anna Bridge 186:707f6e361f3e 1544 }
Anna Bridge 186:707f6e361f3e 1545 }
Anna Bridge 186:707f6e361f3e 1546
Anna Bridge 186:707f6e361f3e 1547 /* If Overrun error occurs, or if any error occurs in DMA mode reception,
Anna Bridge 186:707f6e361f3e 1548 consider error as blocking */
Anna Bridge 186:707f6e361f3e 1549 if (((husart->ErrorCode & HAL_USART_ERROR_ORE) != RESET) ||
Anna Bridge 186:707f6e361f3e 1550 (HAL_IS_BIT_SET(husart->Instance->CR3, USART_CR3_DMAR)))
Anna Bridge 186:707f6e361f3e 1551 {
Anna Bridge 186:707f6e361f3e 1552 /* Blocking error : transfer is aborted
Anna Bridge 186:707f6e361f3e 1553 Set the USART state ready to be able to start again the process,
Anna Bridge 186:707f6e361f3e 1554 Disable Interrupts, and disable DMA requests, if ongoing */
Anna Bridge 186:707f6e361f3e 1555 USART_EndTransfer(husart);
Anna Bridge 186:707f6e361f3e 1556
Anna Bridge 186:707f6e361f3e 1557 /* Disable the USART DMA Rx request if enabled */
Anna Bridge 186:707f6e361f3e 1558 if (HAL_IS_BIT_SET(husart->Instance->CR3, USART_CR3_DMAR))
Anna Bridge 186:707f6e361f3e 1559 {
Anna Bridge 186:707f6e361f3e 1560 CLEAR_BIT(husart->Instance->CR3, USART_CR3_DMAR | USART_CR3_DMAR);
Anna Bridge 186:707f6e361f3e 1561
Anna Bridge 186:707f6e361f3e 1562 /* Abort the USART DMA Tx channel */
Anna Bridge 186:707f6e361f3e 1563 if(husart->hdmatx != NULL)
Anna Bridge 186:707f6e361f3e 1564 {
Anna Bridge 186:707f6e361f3e 1565 /* Set the USART Tx DMA Abort callback to NULL : no callback
Anna Bridge 186:707f6e361f3e 1566 executed at end of DMA abort procedure */
Anna Bridge 186:707f6e361f3e 1567 husart->hdmatx->XferAbortCallback = NULL;
Anna Bridge 186:707f6e361f3e 1568
Anna Bridge 186:707f6e361f3e 1569 /* Abort DMA TX */
Anna Bridge 186:707f6e361f3e 1570 HAL_DMA_Abort_IT(husart->hdmatx);
Anna Bridge 186:707f6e361f3e 1571 }
Anna Bridge 186:707f6e361f3e 1572
Anna Bridge 186:707f6e361f3e 1573 /* Abort the USART DMA Rx channel */
Anna Bridge 186:707f6e361f3e 1574 if(husart->hdmarx != NULL)
Anna Bridge 186:707f6e361f3e 1575 {
Anna Bridge 186:707f6e361f3e 1576 /* Set the USART Rx DMA Abort callback :
Anna Bridge 186:707f6e361f3e 1577 will lead to call HAL_USART_ErrorCallback() at end of DMA abort procedure */
Anna Bridge 186:707f6e361f3e 1578 husart->hdmarx->XferAbortCallback = USART_DMAAbortOnError;
Anna Bridge 186:707f6e361f3e 1579
Anna Bridge 186:707f6e361f3e 1580 /* Abort DMA RX */
Anna Bridge 186:707f6e361f3e 1581 if(HAL_DMA_Abort_IT(husart->hdmarx) != HAL_OK)
Anna Bridge 186:707f6e361f3e 1582 {
Anna Bridge 186:707f6e361f3e 1583 /* Call Directly husart->hdmarx->XferAbortCallback function in case of error */
Anna Bridge 186:707f6e361f3e 1584 husart->hdmarx->XferAbortCallback(husart->hdmarx);
Anna Bridge 186:707f6e361f3e 1585 }
Anna Bridge 186:707f6e361f3e 1586 }
Anna Bridge 186:707f6e361f3e 1587 else
Anna Bridge 186:707f6e361f3e 1588 {
Anna Bridge 186:707f6e361f3e 1589 /* Call user error callback */
Anna Bridge 186:707f6e361f3e 1590 HAL_USART_ErrorCallback(husart);
Anna Bridge 186:707f6e361f3e 1591 }
Anna Bridge 186:707f6e361f3e 1592 }
Anna Bridge 186:707f6e361f3e 1593 else
Anna Bridge 186:707f6e361f3e 1594 {
Anna Bridge 186:707f6e361f3e 1595 /* Call user error callback */
Anna Bridge 186:707f6e361f3e 1596 HAL_USART_ErrorCallback(husart);
Anna Bridge 186:707f6e361f3e 1597 }
Anna Bridge 186:707f6e361f3e 1598 }
Anna Bridge 186:707f6e361f3e 1599 else
Anna Bridge 186:707f6e361f3e 1600 {
Anna Bridge 186:707f6e361f3e 1601 /* Non Blocking error : transfer could go on.
Anna Bridge 186:707f6e361f3e 1602 Error is notified to user through user error callback */
Anna Bridge 186:707f6e361f3e 1603 HAL_USART_ErrorCallback(husart);
Anna Bridge 186:707f6e361f3e 1604 husart->ErrorCode = HAL_USART_ERROR_NONE;
Anna Bridge 186:707f6e361f3e 1605 }
Anna Bridge 186:707f6e361f3e 1606 }
Anna Bridge 186:707f6e361f3e 1607 return;
Anna Bridge 186:707f6e361f3e 1608
Anna Bridge 186:707f6e361f3e 1609 } /* End if some error occurs */
Anna Bridge 186:707f6e361f3e 1610
Anna Bridge 186:707f6e361f3e 1611
Anna Bridge 186:707f6e361f3e 1612 /* USART in mode Transmitter ------------------------------------------------*/
Anna Bridge 186:707f6e361f3e 1613 if(((isrflags & USART_ISR_TXE) != RESET) && ((cr1its & USART_CR1_TXEIE) != RESET))
Anna Bridge 186:707f6e361f3e 1614 {
<> 144:ef7eb2e8f9f7 1615 if(husart->State == HAL_USART_STATE_BUSY_TX)
<> 144:ef7eb2e8f9f7 1616 {
<> 144:ef7eb2e8f9f7 1617 USART_Transmit_IT(husart);
<> 144:ef7eb2e8f9f7 1618 }
<> 144:ef7eb2e8f9f7 1619 else
<> 144:ef7eb2e8f9f7 1620 {
<> 144:ef7eb2e8f9f7 1621 USART_TransmitReceive_IT(husart);
<> 144:ef7eb2e8f9f7 1622 }
Anna Bridge 186:707f6e361f3e 1623 return;
<> 144:ef7eb2e8f9f7 1624 }
Anna Bridge 186:707f6e361f3e 1625
Anna Bridge 186:707f6e361f3e 1626 /* USART in mode Transmitter (transmission end) -----------------------------*/
Anna Bridge 186:707f6e361f3e 1627 if(((isrflags & USART_ISR_TC) != RESET) && ((cr1its & USART_CR1_TCIE) != RESET))
<> 144:ef7eb2e8f9f7 1628 {
<> 144:ef7eb2e8f9f7 1629 USART_EndTransmit_IT(husart);
Anna Bridge 186:707f6e361f3e 1630 return;
Anna Bridge 186:707f6e361f3e 1631 }
Anna Bridge 186:707f6e361f3e 1632
<> 144:ef7eb2e8f9f7 1633 }
<> 144:ef7eb2e8f9f7 1634
<> 144:ef7eb2e8f9f7 1635 /**
Anna Bridge 186:707f6e361f3e 1636 * @brief Tx Transfer completed callback.
Anna Bridge 186:707f6e361f3e 1637 * @param husart: USART handle.
<> 144:ef7eb2e8f9f7 1638 * @retval None
<> 144:ef7eb2e8f9f7 1639 */
Anna Bridge 186:707f6e361f3e 1640 __weak void HAL_USART_TxCpltCallback(USART_HandleTypeDef *husart)
<> 144:ef7eb2e8f9f7 1641 {
<> 144:ef7eb2e8f9f7 1642 /* Prevent unused argument(s) compilation warning */
<> 144:ef7eb2e8f9f7 1643 UNUSED(husart);
<> 144:ef7eb2e8f9f7 1644
Anna Bridge 186:707f6e361f3e 1645 /* NOTE : This function should not be modified, when the callback is needed,
Anna Bridge 186:707f6e361f3e 1646 the HAL_USART_TxCpltCallback can be implemented in the user file.
<> 144:ef7eb2e8f9f7 1647 */
<> 144:ef7eb2e8f9f7 1648 }
<> 144:ef7eb2e8f9f7 1649
<> 144:ef7eb2e8f9f7 1650 /**
Anna Bridge 186:707f6e361f3e 1651 * @brief Tx Half Transfer completed callback.
Anna Bridge 186:707f6e361f3e 1652 * @param husart: USART handle.
<> 144:ef7eb2e8f9f7 1653 * @retval None
<> 144:ef7eb2e8f9f7 1654 */
Anna Bridge 186:707f6e361f3e 1655 __weak void HAL_USART_TxHalfCpltCallback(USART_HandleTypeDef *husart)
<> 144:ef7eb2e8f9f7 1656 {
<> 144:ef7eb2e8f9f7 1657 /* Prevent unused argument(s) compilation warning */
<> 144:ef7eb2e8f9f7 1658 UNUSED(husart);
<> 144:ef7eb2e8f9f7 1659
Anna Bridge 186:707f6e361f3e 1660 /* NOTE: This function should not be modified, when the callback is needed,
Anna Bridge 186:707f6e361f3e 1661 the HAL_USART_TxHalfCpltCallback can be implemented in the user file.
<> 144:ef7eb2e8f9f7 1662 */
<> 144:ef7eb2e8f9f7 1663 }
<> 144:ef7eb2e8f9f7 1664
<> 144:ef7eb2e8f9f7 1665 /**
Anna Bridge 186:707f6e361f3e 1666 * @brief Rx Transfer completed callback.
Anna Bridge 186:707f6e361f3e 1667 * @param husart: USART handle.
<> 144:ef7eb2e8f9f7 1668 * @retval None
<> 144:ef7eb2e8f9f7 1669 */
<> 144:ef7eb2e8f9f7 1670 __weak void HAL_USART_RxCpltCallback(USART_HandleTypeDef *husart)
<> 144:ef7eb2e8f9f7 1671 {
<> 144:ef7eb2e8f9f7 1672 /* Prevent unused argument(s) compilation warning */
<> 144:ef7eb2e8f9f7 1673 UNUSED(husart);
<> 144:ef7eb2e8f9f7 1674
Anna Bridge 186:707f6e361f3e 1675 /* NOTE: This function should not be modified, when the callback is needed,
Anna Bridge 186:707f6e361f3e 1676 the HAL_USART_RxCpltCallback can be implemented in the user file.
<> 144:ef7eb2e8f9f7 1677 */
<> 144:ef7eb2e8f9f7 1678 }
<> 144:ef7eb2e8f9f7 1679
<> 144:ef7eb2e8f9f7 1680 /**
Anna Bridge 186:707f6e361f3e 1681 * @brief Rx Half Transfer completed callback.
Anna Bridge 186:707f6e361f3e 1682 * @param husart: USART handle.
<> 144:ef7eb2e8f9f7 1683 * @retval None
<> 144:ef7eb2e8f9f7 1684 */
<> 144:ef7eb2e8f9f7 1685 __weak void HAL_USART_RxHalfCpltCallback(USART_HandleTypeDef *husart)
<> 144:ef7eb2e8f9f7 1686 {
<> 144:ef7eb2e8f9f7 1687 /* Prevent unused argument(s) compilation warning */
<> 144:ef7eb2e8f9f7 1688 UNUSED(husart);
<> 144:ef7eb2e8f9f7 1689
Anna Bridge 186:707f6e361f3e 1690 /* NOTE : This function should not be modified, when the callback is needed,
Anna Bridge 186:707f6e361f3e 1691 the HAL_USART_RxHalfCpltCallback can be implemented in the user file
<> 144:ef7eb2e8f9f7 1692 */
<> 144:ef7eb2e8f9f7 1693 }
<> 144:ef7eb2e8f9f7 1694
<> 144:ef7eb2e8f9f7 1695 /**
Anna Bridge 186:707f6e361f3e 1696 * @brief Tx/Rx Transfers completed callback for the non-blocking process.
Anna Bridge 186:707f6e361f3e 1697 * @param husart: USART handle.
<> 144:ef7eb2e8f9f7 1698 * @retval None
<> 144:ef7eb2e8f9f7 1699 */
<> 144:ef7eb2e8f9f7 1700 __weak void HAL_USART_TxRxCpltCallback(USART_HandleTypeDef *husart)
<> 144:ef7eb2e8f9f7 1701 {
<> 144:ef7eb2e8f9f7 1702 /* Prevent unused argument(s) compilation warning */
<> 144:ef7eb2e8f9f7 1703 UNUSED(husart);
<> 144:ef7eb2e8f9f7 1704
Anna Bridge 186:707f6e361f3e 1705 /* NOTE : This function should not be modified, when the callback is needed,
Anna Bridge 186:707f6e361f3e 1706 the HAL_USART_TxRxCpltCallback can be implemented in the user file
<> 144:ef7eb2e8f9f7 1707 */
<> 144:ef7eb2e8f9f7 1708 }
<> 144:ef7eb2e8f9f7 1709
<> 144:ef7eb2e8f9f7 1710 /**
Anna Bridge 186:707f6e361f3e 1711 * @brief USART error callback.
Anna Bridge 186:707f6e361f3e 1712 * @param husart: USART handle.
<> 144:ef7eb2e8f9f7 1713 * @retval None
<> 144:ef7eb2e8f9f7 1714 */
Anna Bridge 186:707f6e361f3e 1715 __weak void HAL_USART_ErrorCallback(USART_HandleTypeDef *husart)
Anna Bridge 186:707f6e361f3e 1716 {
Anna Bridge 186:707f6e361f3e 1717 /* Prevent unused argument(s) compilation warning */
Anna Bridge 186:707f6e361f3e 1718 UNUSED(husart);
Anna Bridge 186:707f6e361f3e 1719
Anna Bridge 186:707f6e361f3e 1720 /* NOTE : This function should not be modified, when the callback is needed,
Anna Bridge 186:707f6e361f3e 1721 the HAL_USART_ErrorCallback can be implemented in the user file.
Anna Bridge 186:707f6e361f3e 1722 */
Anna Bridge 186:707f6e361f3e 1723 }
Anna Bridge 186:707f6e361f3e 1724
Anna Bridge 186:707f6e361f3e 1725 /**
Anna Bridge 186:707f6e361f3e 1726 * @brief USART Abort Complete callback.
Anna Bridge 186:707f6e361f3e 1727 * @param husart USART handle.
Anna Bridge 186:707f6e361f3e 1728 * @retval None
Anna Bridge 186:707f6e361f3e 1729 */
Anna Bridge 186:707f6e361f3e 1730 __weak void HAL_USART_AbortCpltCallback (USART_HandleTypeDef *husart)
<> 144:ef7eb2e8f9f7 1731 {
<> 144:ef7eb2e8f9f7 1732 /* Prevent unused argument(s) compilation warning */
<> 144:ef7eb2e8f9f7 1733 UNUSED(husart);
<> 144:ef7eb2e8f9f7 1734
Anna Bridge 186:707f6e361f3e 1735 /* NOTE : This function should not be modified, when the callback is needed,
Anna Bridge 186:707f6e361f3e 1736 the HAL_USART_AbortCpltCallback can be implemented in the user file.
Anna Bridge 186:707f6e361f3e 1737 */
<> 144:ef7eb2e8f9f7 1738 }
Anna Bridge 186:707f6e361f3e 1739
<> 144:ef7eb2e8f9f7 1740 /**
<> 144:ef7eb2e8f9f7 1741 * @}
<> 144:ef7eb2e8f9f7 1742 */
<> 144:ef7eb2e8f9f7 1743
Anna Bridge 186:707f6e361f3e 1744 /** @defgroup USART_Exported_Functions_Group4 Peripheral State and Error functions
Anna Bridge 186:707f6e361f3e 1745 * @brief USART Peripheral State and Error functions
Anna Bridge 186:707f6e361f3e 1746 *
Anna Bridge 186:707f6e361f3e 1747 @verbatim
Anna Bridge 186:707f6e361f3e 1748 ==============================================================================
Anna Bridge 186:707f6e361f3e 1749 ##### Peripheral State and Error functions #####
Anna Bridge 186:707f6e361f3e 1750 ==============================================================================
<> 144:ef7eb2e8f9f7 1751 [..]
Anna Bridge 186:707f6e361f3e 1752 This subsection provides functions allowing to :
Anna Bridge 186:707f6e361f3e 1753 (+) Return the USART handle state
Anna Bridge 186:707f6e361f3e 1754 (+) Return the USART handle error code
Anna Bridge 186:707f6e361f3e 1755
<> 144:ef7eb2e8f9f7 1756 @endverbatim
<> 144:ef7eb2e8f9f7 1757 * @{
<> 144:ef7eb2e8f9f7 1758 */
<> 144:ef7eb2e8f9f7 1759
Anna Bridge 186:707f6e361f3e 1760
<> 144:ef7eb2e8f9f7 1761 /**
Anna Bridge 186:707f6e361f3e 1762 * @brief Return the USART handle state.
Anna Bridge 186:707f6e361f3e 1763 * @param husart : pointer to a USART_HandleTypeDef structure that contains
Anna Bridge 186:707f6e361f3e 1764 * the configuration information for the specified USART.
Anna Bridge 186:707f6e361f3e 1765 * @retval USART handle state
<> 144:ef7eb2e8f9f7 1766 */
<> 144:ef7eb2e8f9f7 1767 HAL_USART_StateTypeDef HAL_USART_GetState(USART_HandleTypeDef *husart)
<> 144:ef7eb2e8f9f7 1768 {
<> 144:ef7eb2e8f9f7 1769 return husart->State;
<> 144:ef7eb2e8f9f7 1770 }
<> 144:ef7eb2e8f9f7 1771
<> 144:ef7eb2e8f9f7 1772 /**
Anna Bridge 186:707f6e361f3e 1773 * @brief Return the USART error code.
Anna Bridge 186:707f6e361f3e 1774 * @param husart : pointer to a USART_HandleTypeDef structure that contains
<> 144:ef7eb2e8f9f7 1775 * the configuration information for the specified USART.
Anna Bridge 186:707f6e361f3e 1776 * @retval USART handle Error Code
<> 144:ef7eb2e8f9f7 1777 */
<> 144:ef7eb2e8f9f7 1778 uint32_t HAL_USART_GetError(USART_HandleTypeDef *husart)
<> 144:ef7eb2e8f9f7 1779 {
<> 144:ef7eb2e8f9f7 1780 return husart->ErrorCode;
<> 144:ef7eb2e8f9f7 1781 }
<> 144:ef7eb2e8f9f7 1782
<> 144:ef7eb2e8f9f7 1783 /**
<> 144:ef7eb2e8f9f7 1784 * @}
<> 144:ef7eb2e8f9f7 1785 */
<> 144:ef7eb2e8f9f7 1786
<> 144:ef7eb2e8f9f7 1787 /**
<> 144:ef7eb2e8f9f7 1788 * @}
<> 144:ef7eb2e8f9f7 1789 */
<> 144:ef7eb2e8f9f7 1790
Anna Bridge 186:707f6e361f3e 1791 /** @defgroup USART_Private_Functions USART Private Functions
Anna Bridge 186:707f6e361f3e 1792 * @{
Anna Bridge 186:707f6e361f3e 1793 */
<> 144:ef7eb2e8f9f7 1794
Anna Bridge 186:707f6e361f3e 1795 /**
Anna Bridge 186:707f6e361f3e 1796 * @brief End ongoing transfer on USART peripheral (following error detection or Transfer completion).
Anna Bridge 186:707f6e361f3e 1797 * @param husart USART handle.
Anna Bridge 186:707f6e361f3e 1798 * @retval None
Anna Bridge 186:707f6e361f3e 1799 */
Anna Bridge 186:707f6e361f3e 1800 static void USART_EndTransfer(USART_HandleTypeDef *husart)
Anna Bridge 186:707f6e361f3e 1801 {
Anna Bridge 186:707f6e361f3e 1802 /* Disable TXEIE and TCIE interrupts */
Anna Bridge 186:707f6e361f3e 1803 /* Disable RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts */
Anna Bridge 186:707f6e361f3e 1804 CLEAR_BIT(husart->Instance->CR1, (USART_CR1_TXEIE | USART_CR1_TCIE | USART_CR1_RXNEIE | USART_CR1_PEIE));
Anna Bridge 186:707f6e361f3e 1805 CLEAR_BIT(husart->Instance->CR3, USART_CR3_EIE);
<> 144:ef7eb2e8f9f7 1806
Anna Bridge 186:707f6e361f3e 1807 /* At end of process, restore husart->State to Ready */
Anna Bridge 186:707f6e361f3e 1808 husart->State = HAL_USART_STATE_READY;
<> 144:ef7eb2e8f9f7 1809 }
<> 144:ef7eb2e8f9f7 1810
<> 144:ef7eb2e8f9f7 1811 /**
Anna Bridge 186:707f6e361f3e 1812 * @brief DMA USART transmit process complete callback.
Anna Bridge 186:707f6e361f3e 1813 * @param hdma DMA handle.
<> 144:ef7eb2e8f9f7 1814 * @retval None
<> 144:ef7eb2e8f9f7 1815 */
<> 144:ef7eb2e8f9f7 1816 static void USART_DMATransmitCplt(DMA_HandleTypeDef *hdma)
<> 144:ef7eb2e8f9f7 1817 {
Anna Bridge 186:707f6e361f3e 1818 USART_HandleTypeDef* husart = (USART_HandleTypeDef*)(hdma->Parent);
<> 144:ef7eb2e8f9f7 1819
<> 144:ef7eb2e8f9f7 1820 /* DMA Normal mode */
<> 144:ef7eb2e8f9f7 1821 if ( HAL_IS_BIT_CLR(hdma->Instance->CCR, DMA_CCR_CIRC) )
<> 144:ef7eb2e8f9f7 1822 {
<> 151:5eaa88a5bcc7 1823 husart->TxXferCount = 0U;
<> 144:ef7eb2e8f9f7 1824
<> 144:ef7eb2e8f9f7 1825 if(husart->State == HAL_USART_STATE_BUSY_TX)
<> 144:ef7eb2e8f9f7 1826 {
<> 144:ef7eb2e8f9f7 1827 /* Disable the DMA transfer for transmit request by resetting the DMAT bit
<> 144:ef7eb2e8f9f7 1828 in the USART CR3 register */
Anna Bridge 186:707f6e361f3e 1829 CLEAR_BIT(husart->Instance->CR3, USART_CR3_DMAT);
<> 144:ef7eb2e8f9f7 1830
<> 144:ef7eb2e8f9f7 1831 /* Enable the USART Transmit Complete Interrupt */
<> 144:ef7eb2e8f9f7 1832 __HAL_USART_ENABLE_IT(husart, USART_IT_TC);
<> 144:ef7eb2e8f9f7 1833 }
<> 144:ef7eb2e8f9f7 1834 }
<> 144:ef7eb2e8f9f7 1835 /* DMA Circular mode */
<> 144:ef7eb2e8f9f7 1836 else
<> 144:ef7eb2e8f9f7 1837 {
<> 144:ef7eb2e8f9f7 1838 if(husart->State == HAL_USART_STATE_BUSY_TX)
<> 144:ef7eb2e8f9f7 1839 {
<> 144:ef7eb2e8f9f7 1840 HAL_USART_TxCpltCallback(husart);
<> 144:ef7eb2e8f9f7 1841 }
<> 144:ef7eb2e8f9f7 1842 }
<> 144:ef7eb2e8f9f7 1843 }
<> 144:ef7eb2e8f9f7 1844
<> 144:ef7eb2e8f9f7 1845 /**
Anna Bridge 186:707f6e361f3e 1846 * @brief DMA USART transmit process half complete callback.
Anna Bridge 186:707f6e361f3e 1847 * @param hdma DMA handle.
<> 144:ef7eb2e8f9f7 1848 * @retval None
<> 144:ef7eb2e8f9f7 1849 */
<> 144:ef7eb2e8f9f7 1850 static void USART_DMATxHalfCplt(DMA_HandleTypeDef *hdma)
<> 144:ef7eb2e8f9f7 1851 {
Anna Bridge 186:707f6e361f3e 1852 USART_HandleTypeDef* husart = (USART_HandleTypeDef*)(hdma->Parent);
<> 144:ef7eb2e8f9f7 1853
<> 144:ef7eb2e8f9f7 1854 HAL_USART_TxHalfCpltCallback(husart);
<> 144:ef7eb2e8f9f7 1855 }
<> 144:ef7eb2e8f9f7 1856
<> 144:ef7eb2e8f9f7 1857 /**
Anna Bridge 186:707f6e361f3e 1858 * @brief DMA USART receive process complete callback.
Anna Bridge 186:707f6e361f3e 1859 * @param hdma DMA handle.
<> 144:ef7eb2e8f9f7 1860 * @retval None
<> 144:ef7eb2e8f9f7 1861 */
Anna Bridge 186:707f6e361f3e 1862 static void USART_DMAReceiveCplt(DMA_HandleTypeDef *hdma)
<> 144:ef7eb2e8f9f7 1863 {
Anna Bridge 186:707f6e361f3e 1864 USART_HandleTypeDef* husart = (USART_HandleTypeDef*)(hdma->Parent);
Anna Bridge 186:707f6e361f3e 1865
<> 144:ef7eb2e8f9f7 1866 /* DMA Normal mode */
Anna Bridge 186:707f6e361f3e 1867 if ( HAL_IS_BIT_CLR(hdma->Instance->CCR, DMA_CCR_CIRC) )
<> 144:ef7eb2e8f9f7 1868 {
Anna Bridge 186:707f6e361f3e 1869 husart->RxXferCount = 0;
Anna Bridge 186:707f6e361f3e 1870
Anna Bridge 186:707f6e361f3e 1871 /* Disable PE and ERR (Frame error, noise error, overrun error) interrupts */
Anna Bridge 186:707f6e361f3e 1872 CLEAR_BIT(husart->Instance->CR1, USART_CR1_PEIE);
Anna Bridge 186:707f6e361f3e 1873 CLEAR_BIT(husart->Instance->CR3, USART_CR3_EIE);
Anna Bridge 186:707f6e361f3e 1874
Anna Bridge 186:707f6e361f3e 1875 /* Disable the DMA RX transfer for the receiver request by resetting the DMAR bit
Anna Bridge 186:707f6e361f3e 1876 in USART CR3 register */
Anna Bridge 186:707f6e361f3e 1877 CLEAR_BIT(husart->Instance->CR3, USART_CR3_DMAR);
Anna Bridge 186:707f6e361f3e 1878 /* similarly, disable the DMA TX transfer that was started to provide the
Anna Bridge 186:707f6e361f3e 1879 clock to the slave device */
Anna Bridge 186:707f6e361f3e 1880 CLEAR_BIT(husart->Instance->CR3, USART_CR3_DMAT);
<> 144:ef7eb2e8f9f7 1881
<> 144:ef7eb2e8f9f7 1882 if(husart->State == HAL_USART_STATE_BUSY_RX)
<> 144:ef7eb2e8f9f7 1883 {
<> 144:ef7eb2e8f9f7 1884 HAL_USART_RxCpltCallback(husart);
<> 144:ef7eb2e8f9f7 1885 }
Anna Bridge 186:707f6e361f3e 1886 /* The USART state is HAL_USART_STATE_BUSY_TX_RX */
<> 144:ef7eb2e8f9f7 1887 else
<> 144:ef7eb2e8f9f7 1888 {
<> 144:ef7eb2e8f9f7 1889 HAL_USART_TxRxCpltCallback(husart);
<> 144:ef7eb2e8f9f7 1890 }
Anna Bridge 186:707f6e361f3e 1891 husart->State= HAL_USART_STATE_READY;
<> 144:ef7eb2e8f9f7 1892 }
<> 144:ef7eb2e8f9f7 1893 /* DMA circular mode */
<> 144:ef7eb2e8f9f7 1894 else
<> 144:ef7eb2e8f9f7 1895 {
<> 144:ef7eb2e8f9f7 1896 if(husart->State == HAL_USART_STATE_BUSY_RX)
<> 144:ef7eb2e8f9f7 1897 {
<> 144:ef7eb2e8f9f7 1898 HAL_USART_RxCpltCallback(husart);
<> 144:ef7eb2e8f9f7 1899 }
Anna Bridge 186:707f6e361f3e 1900 /* The USART state is HAL_USART_STATE_BUSY_TX_RX */
<> 144:ef7eb2e8f9f7 1901 else
<> 144:ef7eb2e8f9f7 1902 {
<> 144:ef7eb2e8f9f7 1903 HAL_USART_TxRxCpltCallback(husart);
<> 144:ef7eb2e8f9f7 1904 }
Anna Bridge 186:707f6e361f3e 1905 }
Anna Bridge 186:707f6e361f3e 1906
<> 144:ef7eb2e8f9f7 1907 }
<> 144:ef7eb2e8f9f7 1908
<> 144:ef7eb2e8f9f7 1909 /**
Anna Bridge 186:707f6e361f3e 1910 * @brief DMA USART receive process half complete callback.
Anna Bridge 186:707f6e361f3e 1911 * @param hdma DMA handle.
<> 144:ef7eb2e8f9f7 1912 * @retval None
<> 144:ef7eb2e8f9f7 1913 */
<> 144:ef7eb2e8f9f7 1914 static void USART_DMARxHalfCplt(DMA_HandleTypeDef *hdma)
<> 144:ef7eb2e8f9f7 1915 {
Anna Bridge 186:707f6e361f3e 1916 USART_HandleTypeDef* husart = (USART_HandleTypeDef*)(hdma->Parent);
<> 144:ef7eb2e8f9f7 1917
Anna Bridge 186:707f6e361f3e 1918 HAL_USART_RxHalfCpltCallback(husart);
<> 144:ef7eb2e8f9f7 1919 }
<> 144:ef7eb2e8f9f7 1920
<> 144:ef7eb2e8f9f7 1921 /**
Anna Bridge 186:707f6e361f3e 1922 * @brief DMA USART communication error callback.
Anna Bridge 186:707f6e361f3e 1923 * @param hdma: DMA handle.
<> 144:ef7eb2e8f9f7 1924 * @retval None
<> 144:ef7eb2e8f9f7 1925 */
Anna Bridge 186:707f6e361f3e 1926 static void USART_DMAError(DMA_HandleTypeDef *hdma)
<> 144:ef7eb2e8f9f7 1927 {
Anna Bridge 186:707f6e361f3e 1928 USART_HandleTypeDef* husart = (USART_HandleTypeDef*)(hdma->Parent);
<> 144:ef7eb2e8f9f7 1929
Anna Bridge 186:707f6e361f3e 1930 husart->RxXferCount = 0;
Anna Bridge 186:707f6e361f3e 1931 husart->TxXferCount = 0;
Anna Bridge 186:707f6e361f3e 1932 USART_EndTransfer(husart);
Anna Bridge 186:707f6e361f3e 1933
<> 144:ef7eb2e8f9f7 1934 husart->ErrorCode |= HAL_USART_ERROR_DMA;
<> 144:ef7eb2e8f9f7 1935 husart->State= HAL_USART_STATE_READY;
Anna Bridge 186:707f6e361f3e 1936
Anna Bridge 186:707f6e361f3e 1937 HAL_USART_ErrorCallback(husart);
Anna Bridge 186:707f6e361f3e 1938 }
Anna Bridge 186:707f6e361f3e 1939
Anna Bridge 186:707f6e361f3e 1940 /**
Anna Bridge 186:707f6e361f3e 1941 * @brief DMA USART communication abort callback, when initiated by HAL services on Error
Anna Bridge 186:707f6e361f3e 1942 * (To be called at end of DMA Abort procedure following error occurrence).
Anna Bridge 186:707f6e361f3e 1943 * @param hdma DMA handle.
Anna Bridge 186:707f6e361f3e 1944 * @retval None
Anna Bridge 186:707f6e361f3e 1945 */
Anna Bridge 186:707f6e361f3e 1946 static void USART_DMAAbortOnError(DMA_HandleTypeDef *hdma)
Anna Bridge 186:707f6e361f3e 1947 {
Anna Bridge 186:707f6e361f3e 1948 USART_HandleTypeDef* husart = (USART_HandleTypeDef*)(hdma->Parent);
Anna Bridge 186:707f6e361f3e 1949 husart->RxXferCount = 0;
Anna Bridge 186:707f6e361f3e 1950 husart->TxXferCount = 0;
Anna Bridge 186:707f6e361f3e 1951
<> 144:ef7eb2e8f9f7 1952 HAL_USART_ErrorCallback(husart);
<> 144:ef7eb2e8f9f7 1953 }
<> 144:ef7eb2e8f9f7 1954
<> 144:ef7eb2e8f9f7 1955 /**
Anna Bridge 186:707f6e361f3e 1956 * @brief DMA USART Tx communication abort callback, when initiated by user
Anna Bridge 186:707f6e361f3e 1957 * (To be called at end of DMA Tx Abort procedure following user abort request).
Anna Bridge 186:707f6e361f3e 1958 * @note When this callback is executed, User Abort complete call back is called only if no
Anna Bridge 186:707f6e361f3e 1959 * Abort still ongoing for Rx DMA Handle.
Anna Bridge 186:707f6e361f3e 1960 * @param hdma DMA handle.
Anna Bridge 186:707f6e361f3e 1961 * @retval None
<> 144:ef7eb2e8f9f7 1962 */
Anna Bridge 186:707f6e361f3e 1963 static void USART_DMATxAbortCallback(DMA_HandleTypeDef *hdma)
<> 144:ef7eb2e8f9f7 1964 {
Anna Bridge 186:707f6e361f3e 1965 USART_HandleTypeDef* husart = (USART_HandleTypeDef* )(hdma->Parent);
Anna Bridge 186:707f6e361f3e 1966
Anna Bridge 186:707f6e361f3e 1967 husart->hdmatx->XferAbortCallback = NULL;
Anna Bridge 186:707f6e361f3e 1968
Anna Bridge 186:707f6e361f3e 1969 /* Check if an Abort process is still ongoing */
Anna Bridge 186:707f6e361f3e 1970 if(husart->hdmarx != NULL)
<> 144:ef7eb2e8f9f7 1971 {
Anna Bridge 186:707f6e361f3e 1972 if(husart->hdmarx->XferAbortCallback != NULL)
<> 144:ef7eb2e8f9f7 1973 {
Anna Bridge 186:707f6e361f3e 1974 return;
<> 144:ef7eb2e8f9f7 1975 }
<> 144:ef7eb2e8f9f7 1976 }
Anna Bridge 186:707f6e361f3e 1977
Anna Bridge 186:707f6e361f3e 1978 /* No Abort process still ongoing : All DMA channels are aborted, call user Abort Complete callback */
Anna Bridge 186:707f6e361f3e 1979 husart->TxXferCount = 0;
Anna Bridge 186:707f6e361f3e 1980 husart->RxXferCount = 0;
Anna Bridge 186:707f6e361f3e 1981
Anna Bridge 186:707f6e361f3e 1982 /* Reset errorCode */
Anna Bridge 186:707f6e361f3e 1983 husart->ErrorCode = HAL_USART_ERROR_NONE;
Anna Bridge 186:707f6e361f3e 1984
Anna Bridge 186:707f6e361f3e 1985 /* Clear the Error flags in the ICR register */
Anna Bridge 186:707f6e361f3e 1986 __HAL_USART_CLEAR_FLAG(husart, USART_CLEAR_OREF | USART_CLEAR_NEF | USART_CLEAR_PEF | USART_CLEAR_FEF);
Anna Bridge 186:707f6e361f3e 1987
Anna Bridge 186:707f6e361f3e 1988 /* Restore husart->State to Ready */
Anna Bridge 186:707f6e361f3e 1989 husart->State = HAL_USART_STATE_READY;
Anna Bridge 186:707f6e361f3e 1990
Anna Bridge 186:707f6e361f3e 1991 /* Call user Abort complete callback */
Anna Bridge 186:707f6e361f3e 1992 HAL_USART_AbortCpltCallback(husart);
<> 144:ef7eb2e8f9f7 1993 }
<> 144:ef7eb2e8f9f7 1994
Anna Bridge 186:707f6e361f3e 1995
<> 144:ef7eb2e8f9f7 1996 /**
Anna Bridge 186:707f6e361f3e 1997 * @brief DMA USART Rx communication abort callback, when initiated by user
Anna Bridge 186:707f6e361f3e 1998 * (To be called at end of DMA Rx Abort procedure following user abort request).
Anna Bridge 186:707f6e361f3e 1999 * @note When this callback is executed, User Abort complete call back is called only if no
Anna Bridge 186:707f6e361f3e 2000 * Abort still ongoing for Tx DMA Handle.
Anna Bridge 186:707f6e361f3e 2001 * @param hdma DMA handle.
Anna Bridge 186:707f6e361f3e 2002 * @retval None
Anna Bridge 186:707f6e361f3e 2003 */
Anna Bridge 186:707f6e361f3e 2004 static void USART_DMARxAbortCallback(DMA_HandleTypeDef *hdma)
Anna Bridge 186:707f6e361f3e 2005 {
Anna Bridge 186:707f6e361f3e 2006 USART_HandleTypeDef* husart = (USART_HandleTypeDef* )(hdma->Parent);
Anna Bridge 186:707f6e361f3e 2007
Anna Bridge 186:707f6e361f3e 2008 husart->hdmarx->XferAbortCallback = NULL;
Anna Bridge 186:707f6e361f3e 2009
Anna Bridge 186:707f6e361f3e 2010 /* Check if an Abort process is still ongoing */
Anna Bridge 186:707f6e361f3e 2011 if(husart->hdmatx != NULL)
Anna Bridge 186:707f6e361f3e 2012 {
Anna Bridge 186:707f6e361f3e 2013 if(husart->hdmatx->XferAbortCallback != NULL)
Anna Bridge 186:707f6e361f3e 2014 {
Anna Bridge 186:707f6e361f3e 2015 return;
Anna Bridge 186:707f6e361f3e 2016 }
Anna Bridge 186:707f6e361f3e 2017 }
Anna Bridge 186:707f6e361f3e 2018
Anna Bridge 186:707f6e361f3e 2019 /* No Abort process still ongoing : All DMA channels are aborted, call user Abort Complete callback */
Anna Bridge 186:707f6e361f3e 2020 husart->TxXferCount = 0;
Anna Bridge 186:707f6e361f3e 2021 husart->RxXferCount = 0;
Anna Bridge 186:707f6e361f3e 2022
Anna Bridge 186:707f6e361f3e 2023 /* Reset errorCode */
Anna Bridge 186:707f6e361f3e 2024 husart->ErrorCode = HAL_USART_ERROR_NONE;
Anna Bridge 186:707f6e361f3e 2025
Anna Bridge 186:707f6e361f3e 2026 /* Clear the Error flags in the ICR register */
Anna Bridge 186:707f6e361f3e 2027 __HAL_USART_CLEAR_FLAG(husart, USART_CLEAR_OREF | USART_CLEAR_NEF | USART_CLEAR_PEF | USART_CLEAR_FEF);
Anna Bridge 186:707f6e361f3e 2028
Anna Bridge 186:707f6e361f3e 2029 /* Restore husart->State to Ready */
Anna Bridge 186:707f6e361f3e 2030 husart->State = HAL_USART_STATE_READY;
Anna Bridge 186:707f6e361f3e 2031
Anna Bridge 186:707f6e361f3e 2032 /* Call user Abort complete callback */
Anna Bridge 186:707f6e361f3e 2033 HAL_USART_AbortCpltCallback(husart);
Anna Bridge 186:707f6e361f3e 2034 }
Anna Bridge 186:707f6e361f3e 2035
Anna Bridge 186:707f6e361f3e 2036
Anna Bridge 186:707f6e361f3e 2037 /**
Anna Bridge 186:707f6e361f3e 2038 * @brief Handle USART Communication Timeout.
Anna Bridge 186:707f6e361f3e 2039 * @param husart USART handle.
Anna Bridge 186:707f6e361f3e 2040 * @param Flag Specifies the USART flag to check.
Anna Bridge 186:707f6e361f3e 2041 * @param Status the Flag status (SET or RESET).
Anna Bridge 186:707f6e361f3e 2042 * @param Tickstart Tick start value
Anna Bridge 186:707f6e361f3e 2043 * @param Timeout timeout duration.
<> 144:ef7eb2e8f9f7 2044 * @retval HAL status
<> 144:ef7eb2e8f9f7 2045 */
Anna Bridge 186:707f6e361f3e 2046 static HAL_StatusTypeDef USART_WaitOnFlagUntilTimeout(USART_HandleTypeDef *husart, uint32_t Flag, FlagStatus Status, uint32_t Tickstart, uint32_t Timeout)
<> 144:ef7eb2e8f9f7 2047 {
Anna Bridge 186:707f6e361f3e 2048 /* Wait until flag is set */
Anna Bridge 186:707f6e361f3e 2049 while((__HAL_USART_GET_FLAG(husart, Flag) ? SET : RESET) == Status)
Anna Bridge 186:707f6e361f3e 2050 {
Anna Bridge 186:707f6e361f3e 2051 /* Check for the Timeout */
Anna Bridge 186:707f6e361f3e 2052 if(Timeout != HAL_MAX_DELAY)
Anna Bridge 186:707f6e361f3e 2053 {
Anna Bridge 186:707f6e361f3e 2054 if((Timeout == 0) || ((HAL_GetTick()-Tickstart) > Timeout))
Anna Bridge 186:707f6e361f3e 2055 {
Anna Bridge 186:707f6e361f3e 2056 /* Disable TXE, RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts for the interrupt process */
Anna Bridge 186:707f6e361f3e 2057 CLEAR_BIT(husart->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE | USART_CR1_TXEIE));
Anna Bridge 186:707f6e361f3e 2058 CLEAR_BIT(husart->Instance->CR3, USART_CR3_EIE);
Anna Bridge 186:707f6e361f3e 2059
Anna Bridge 186:707f6e361f3e 2060 husart->State= HAL_USART_STATE_READY;
Anna Bridge 186:707f6e361f3e 2061
Anna Bridge 186:707f6e361f3e 2062 /* Process Unlocked */
Anna Bridge 186:707f6e361f3e 2063 __HAL_UNLOCK(husart);
Anna Bridge 186:707f6e361f3e 2064
Anna Bridge 186:707f6e361f3e 2065 return HAL_TIMEOUT;
Anna Bridge 186:707f6e361f3e 2066 }
Anna Bridge 186:707f6e361f3e 2067 }
Anna Bridge 186:707f6e361f3e 2068 }
<> 144:ef7eb2e8f9f7 2069 return HAL_OK;
<> 144:ef7eb2e8f9f7 2070 }
<> 144:ef7eb2e8f9f7 2071
<> 144:ef7eb2e8f9f7 2072 /**
Anna Bridge 186:707f6e361f3e 2073 * @brief Configure the USART peripheral.
Anna Bridge 186:707f6e361f3e 2074 * @param husart: USART handle.
<> 144:ef7eb2e8f9f7 2075 * @retval HAL status
<> 144:ef7eb2e8f9f7 2076 */
<> 144:ef7eb2e8f9f7 2077 static HAL_StatusTypeDef USART_SetConfig(USART_HandleTypeDef *husart)
<> 144:ef7eb2e8f9f7 2078 {
Anna Bridge 186:707f6e361f3e 2079 uint32_t tmpreg = 0x0U;
Anna Bridge 186:707f6e361f3e 2080 USART_ClockSourceTypeDef clocksource = USART_CLOCKSOURCE_UNDEFINED;
Anna Bridge 186:707f6e361f3e 2081 HAL_StatusTypeDef ret = HAL_OK;
Anna Bridge 186:707f6e361f3e 2082 uint16_t brrtemp = 0x0000U;
Anna Bridge 186:707f6e361f3e 2083 uint16_t usartdiv = 0x0000U;
<> 144:ef7eb2e8f9f7 2084
<> 144:ef7eb2e8f9f7 2085 /* Check the parameters */
<> 144:ef7eb2e8f9f7 2086 assert_param(IS_USART_INSTANCE(husart->Instance));
<> 144:ef7eb2e8f9f7 2087 assert_param(IS_USART_POLARITY(husart->Init.CLKPolarity));
<> 144:ef7eb2e8f9f7 2088 assert_param(IS_USART_PHASE(husart->Init.CLKPhase));
<> 144:ef7eb2e8f9f7 2089 assert_param(IS_USART_LASTBIT(husart->Init.CLKLastBit));
Anna Bridge 186:707f6e361f3e 2090 assert_param(IS_USART_BAUDRATE(husart->Init.BaudRate));
<> 144:ef7eb2e8f9f7 2091 assert_param(IS_USART_WORD_LENGTH(husart->Init.WordLength));
<> 144:ef7eb2e8f9f7 2092 assert_param(IS_USART_STOPBITS(husart->Init.StopBits));
<> 144:ef7eb2e8f9f7 2093 assert_param(IS_USART_PARITY(husart->Init.Parity));
<> 144:ef7eb2e8f9f7 2094 assert_param(IS_USART_MODE(husart->Init.Mode));
<> 144:ef7eb2e8f9f7 2095
Anna Bridge 186:707f6e361f3e 2096
<> 144:ef7eb2e8f9f7 2097 /*-------------------------- USART CR1 Configuration -----------------------*/
Anna Bridge 186:707f6e361f3e 2098 /* Clear M, PCE, PS, TE and RE bits and configure
Anna Bridge 186:707f6e361f3e 2099 * the USART Word Length, Parity and Mode:
Anna Bridge 186:707f6e361f3e 2100 * set the M bits according to husart->Init.WordLength value
<> 144:ef7eb2e8f9f7 2101 * set PCE and PS bits according to husart->Init.Parity value
Anna Bridge 186:707f6e361f3e 2102 * set TE and RE bits according to husart->Init.Mode value
Anna Bridge 186:707f6e361f3e 2103 * force OVER8 to 1 to allow to reach the maximum speed (Fclock/8) */
<> 144:ef7eb2e8f9f7 2104 tmpreg = (uint32_t)husart->Init.WordLength | husart->Init.Parity | husart->Init.Mode | USART_CR1_OVER8;
<> 144:ef7eb2e8f9f7 2105 MODIFY_REG(husart->Instance->CR1, USART_CR1_FIELDS, tmpreg);
Anna Bridge 186:707f6e361f3e 2106
<> 144:ef7eb2e8f9f7 2107 /*---------------------------- USART CR2 Configuration ---------------------*/
<> 144:ef7eb2e8f9f7 2108 /* Clear and configure the USART Clock, CPOL, CPHA, LBCL and STOP bits:
<> 144:ef7eb2e8f9f7 2109 * set CPOL bit according to husart->Init.CLKPolarity value
<> 144:ef7eb2e8f9f7 2110 * set CPHA bit according to husart->Init.CLKPhase value
<> 144:ef7eb2e8f9f7 2111 * set LBCL bit according to husart->Init.CLKLastBit value
<> 144:ef7eb2e8f9f7 2112 * set STOP[13:12] bits according to husart->Init.StopBits value */
<> 144:ef7eb2e8f9f7 2113 tmpreg = (uint32_t)(USART_CLOCK_ENABLE);
Anna Bridge 186:707f6e361f3e 2114 tmpreg |= ((uint32_t)husart->Init.CLKPolarity | (uint32_t)husart->Init.CLKPhase);
Anna Bridge 186:707f6e361f3e 2115 tmpreg |= ((uint32_t)husart->Init.CLKLastBit | (uint32_t)husart->Init.StopBits);
<> 144:ef7eb2e8f9f7 2116 MODIFY_REG(husart->Instance->CR2, USART_CR2_FIELDS, tmpreg);
<> 144:ef7eb2e8f9f7 2117
<> 144:ef7eb2e8f9f7 2118 /*-------------------------- USART CR3 Configuration -----------------------*/
<> 144:ef7eb2e8f9f7 2119 /* no CR3 register configuration */
<> 144:ef7eb2e8f9f7 2120
<> 144:ef7eb2e8f9f7 2121 /*-------------------------- USART BRR Configuration -----------------------*/
Anna Bridge 186:707f6e361f3e 2122 /* BRR is filled-up according to OVER8 bit setting which is forced to 1 */
<> 144:ef7eb2e8f9f7 2123 USART_GETCLOCKSOURCE(husart, clocksource);
<> 144:ef7eb2e8f9f7 2124 switch (clocksource)
<> 144:ef7eb2e8f9f7 2125 {
<> 144:ef7eb2e8f9f7 2126 case USART_CLOCKSOURCE_PCLK1:
<> 151:5eaa88a5bcc7 2127 usartdiv = (uint16_t)(((2U*HAL_RCC_GetPCLK1Freq()) + (husart->Init.BaudRate/2U)) / husart->Init.BaudRate);
<> 144:ef7eb2e8f9f7 2128 break;
<> 144:ef7eb2e8f9f7 2129 case USART_CLOCKSOURCE_PCLK2:
<> 151:5eaa88a5bcc7 2130 usartdiv = (uint16_t)(((2U*HAL_RCC_GetPCLK2Freq()) + (husart->Init.BaudRate/2U)) / husart->Init.BaudRate);
<> 144:ef7eb2e8f9f7 2131 break;
<> 144:ef7eb2e8f9f7 2132 case USART_CLOCKSOURCE_HSI:
<> 151:5eaa88a5bcc7 2133 usartdiv = (uint16_t)(((2U*HSI_VALUE) + (husart->Init.BaudRate/2U)) / husart->Init.BaudRate);
<> 144:ef7eb2e8f9f7 2134 break;
<> 144:ef7eb2e8f9f7 2135 case USART_CLOCKSOURCE_SYSCLK:
<> 151:5eaa88a5bcc7 2136 usartdiv = (uint16_t)(((2U*HAL_RCC_GetSysClockFreq()) + (husart->Init.BaudRate/2U)) / husart->Init.BaudRate);
<> 144:ef7eb2e8f9f7 2137 break;
<> 144:ef7eb2e8f9f7 2138 case USART_CLOCKSOURCE_LSE:
<> 151:5eaa88a5bcc7 2139 usartdiv = (uint16_t)(((2U*LSE_VALUE) + (husart->Init.BaudRate/2U)) / husart->Init.BaudRate);
<> 144:ef7eb2e8f9f7 2140 break;
<> 144:ef7eb2e8f9f7 2141 case USART_CLOCKSOURCE_UNDEFINED:
<> 144:ef7eb2e8f9f7 2142 default:
<> 144:ef7eb2e8f9f7 2143 ret = HAL_ERROR;
<> 144:ef7eb2e8f9f7 2144 break;
<> 144:ef7eb2e8f9f7 2145 }
Anna Bridge 186:707f6e361f3e 2146
<> 151:5eaa88a5bcc7 2147 brrtemp = usartdiv & 0xFFF0U;
<> 151:5eaa88a5bcc7 2148 brrtemp |= (uint16_t)((usartdiv & (uint16_t)0x000FU) >> 1U);
<> 144:ef7eb2e8f9f7 2149 husart->Instance->BRR = brrtemp;
<> 144:ef7eb2e8f9f7 2150
Anna Bridge 186:707f6e361f3e 2151 return ret;
<> 144:ef7eb2e8f9f7 2152 }
<> 144:ef7eb2e8f9f7 2153
<> 144:ef7eb2e8f9f7 2154 /**
Anna Bridge 186:707f6e361f3e 2155 * @brief Check the USART Idle State.
Anna Bridge 186:707f6e361f3e 2156 * @param husart: USART handle.
<> 144:ef7eb2e8f9f7 2157 * @retval HAL status
<> 144:ef7eb2e8f9f7 2158 */
<> 144:ef7eb2e8f9f7 2159 static HAL_StatusTypeDef USART_CheckIdleState(USART_HandleTypeDef *husart)
<> 144:ef7eb2e8f9f7 2160 {
Anna Bridge 186:707f6e361f3e 2161 uint32_t tickstart = 0;
Anna Bridge 186:707f6e361f3e 2162
Anna Bridge 186:707f6e361f3e 2163 /* Initialize the USART ErrorCode */
<> 144:ef7eb2e8f9f7 2164 husart->ErrorCode = HAL_USART_ERROR_NONE;
Anna Bridge 186:707f6e361f3e 2165
Anna Bridge 186:707f6e361f3e 2166 /* Init tickstart for timeout managment*/
Anna Bridge 186:707f6e361f3e 2167 tickstart = HAL_GetTick();
Anna Bridge 186:707f6e361f3e 2168
<> 144:ef7eb2e8f9f7 2169 /* Check if the Transmitter is enabled */
<> 144:ef7eb2e8f9f7 2170 if((husart->Instance->CR1 & USART_CR1_TE) == USART_CR1_TE)
<> 144:ef7eb2e8f9f7 2171 {
<> 144:ef7eb2e8f9f7 2172 /* Wait until TEACK flag is set */
Anna Bridge 186:707f6e361f3e 2173 if(USART_WaitOnFlagUntilTimeout(husart, USART_ISR_TEACK, RESET, tickstart, USART_TEACK_REACK_TIMEOUT) != HAL_OK)
Anna Bridge 186:707f6e361f3e 2174 {
Anna Bridge 186:707f6e361f3e 2175 /* Timeout occurred */
<> 144:ef7eb2e8f9f7 2176 return HAL_TIMEOUT;
Anna Bridge 186:707f6e361f3e 2177 }
<> 144:ef7eb2e8f9f7 2178 }
<> 144:ef7eb2e8f9f7 2179 /* Check if the Receiver is enabled */
<> 144:ef7eb2e8f9f7 2180 if((husart->Instance->CR1 & USART_CR1_RE) == USART_CR1_RE)
<> 144:ef7eb2e8f9f7 2181 {
<> 144:ef7eb2e8f9f7 2182 /* Wait until REACK flag is set */
Anna Bridge 186:707f6e361f3e 2183 if(USART_WaitOnFlagUntilTimeout(husart, USART_ISR_REACK, RESET, tickstart, USART_TEACK_REACK_TIMEOUT) != HAL_OK)
Anna Bridge 186:707f6e361f3e 2184 {
Anna Bridge 186:707f6e361f3e 2185 /* Timeout occurred */
<> 144:ef7eb2e8f9f7 2186 return HAL_TIMEOUT;
<> 144:ef7eb2e8f9f7 2187 }
<> 144:ef7eb2e8f9f7 2188 }
Anna Bridge 186:707f6e361f3e 2189
Anna Bridge 186:707f6e361f3e 2190 /* Initialize the USART state*/
Anna Bridge 186:707f6e361f3e 2191 husart->State= HAL_USART_STATE_READY;
Anna Bridge 186:707f6e361f3e 2192
<> 144:ef7eb2e8f9f7 2193 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 2194 __HAL_UNLOCK(husart);
Anna Bridge 186:707f6e361f3e 2195
Anna Bridge 186:707f6e361f3e 2196 return HAL_OK;
Anna Bridge 186:707f6e361f3e 2197 }
Anna Bridge 186:707f6e361f3e 2198
Anna Bridge 186:707f6e361f3e 2199 /**
Anna Bridge 186:707f6e361f3e 2200 * @brief Simplex send an amount of data in non-blocking mode.
Anna Bridge 186:707f6e361f3e 2201 * @note Function called under interruption only, once
Anna Bridge 186:707f6e361f3e 2202 * interruptions have been enabled by HAL_USART_Transmit_IT().
Anna Bridge 186:707f6e361f3e 2203 * @note The USART errors are not managed to avoid the overrun error.
Anna Bridge 186:707f6e361f3e 2204 * @param husart USART handle.
Anna Bridge 186:707f6e361f3e 2205 * @retval HAL status
Anna Bridge 186:707f6e361f3e 2206 */
Anna Bridge 186:707f6e361f3e 2207 static HAL_StatusTypeDef USART_Transmit_IT(USART_HandleTypeDef *husart)
Anna Bridge 186:707f6e361f3e 2208 {
Anna Bridge 186:707f6e361f3e 2209 uint16_t* tmp = 0U;
Anna Bridge 186:707f6e361f3e 2210
Anna Bridge 186:707f6e361f3e 2211 /* Check that a Tx process is ongoing */
Anna Bridge 186:707f6e361f3e 2212 if(husart->State == HAL_USART_STATE_BUSY_TX)
Anna Bridge 186:707f6e361f3e 2213 {
Anna Bridge 186:707f6e361f3e 2214 if(husart->TxXferCount == 0U)
Anna Bridge 186:707f6e361f3e 2215 {
Anna Bridge 186:707f6e361f3e 2216 /* Disable the USART Transmit data register empty interrupt */
Anna Bridge 186:707f6e361f3e 2217 __HAL_USART_DISABLE_IT(husart, USART_IT_TXE);
Anna Bridge 186:707f6e361f3e 2218
Anna Bridge 186:707f6e361f3e 2219 /* Enable the USART Transmit Complete Interrupt */
Anna Bridge 186:707f6e361f3e 2220 __HAL_USART_ENABLE_IT(husart, USART_IT_TC);
Anna Bridge 186:707f6e361f3e 2221
Anna Bridge 186:707f6e361f3e 2222 return HAL_OK;
Anna Bridge 186:707f6e361f3e 2223 }
Anna Bridge 186:707f6e361f3e 2224 else
Anna Bridge 186:707f6e361f3e 2225 {
Anna Bridge 186:707f6e361f3e 2226 if((husart->Init.WordLength == USART_WORDLENGTH_9B) && (husart->Init.Parity == USART_PARITY_NONE))
Anna Bridge 186:707f6e361f3e 2227 {
Anna Bridge 186:707f6e361f3e 2228 tmp = (uint16_t*) husart->pTxBuffPtr;
Anna Bridge 186:707f6e361f3e 2229 husart->Instance->TDR = (*tmp & (uint16_t)0x01FFU);
Anna Bridge 186:707f6e361f3e 2230 husart->pTxBuffPtr += 2U;
Anna Bridge 186:707f6e361f3e 2231 }
Anna Bridge 186:707f6e361f3e 2232 else
Anna Bridge 186:707f6e361f3e 2233 {
Anna Bridge 186:707f6e361f3e 2234 husart->Instance->TDR = (uint8_t)(*husart->pTxBuffPtr++ & (uint8_t)0xFFU);
Anna Bridge 186:707f6e361f3e 2235 }
Anna Bridge 186:707f6e361f3e 2236
Anna Bridge 186:707f6e361f3e 2237 husart->TxXferCount--;
Anna Bridge 186:707f6e361f3e 2238
Anna Bridge 186:707f6e361f3e 2239 return HAL_OK;
Anna Bridge 186:707f6e361f3e 2240 }
Anna Bridge 186:707f6e361f3e 2241 }
Anna Bridge 186:707f6e361f3e 2242 else
Anna Bridge 186:707f6e361f3e 2243 {
Anna Bridge 186:707f6e361f3e 2244 return HAL_BUSY;
Anna Bridge 186:707f6e361f3e 2245 }
Anna Bridge 186:707f6e361f3e 2246 }
Anna Bridge 186:707f6e361f3e 2247
Anna Bridge 186:707f6e361f3e 2248
Anna Bridge 186:707f6e361f3e 2249 /**
Anna Bridge 186:707f6e361f3e 2250 * @brief Wraps up transmission in non-blocking mode.
Anna Bridge 186:707f6e361f3e 2251 * @param husart Pointer to a USART_HandleTypeDef structure that contains
Anna Bridge 186:707f6e361f3e 2252 * the configuration information for the specified USART module.
Anna Bridge 186:707f6e361f3e 2253 * @retval HAL status
Anna Bridge 186:707f6e361f3e 2254 */
Anna Bridge 186:707f6e361f3e 2255 static HAL_StatusTypeDef USART_EndTransmit_IT(USART_HandleTypeDef *husart)
Anna Bridge 186:707f6e361f3e 2256 {
Anna Bridge 186:707f6e361f3e 2257 /* Disable the USART Transmit Complete Interrupt */
Anna Bridge 186:707f6e361f3e 2258 __HAL_USART_DISABLE_IT(husart, USART_IT_TC);
Anna Bridge 186:707f6e361f3e 2259
Anna Bridge 186:707f6e361f3e 2260 /* Disable the USART Error Interrupt: (Frame error, noise error, overrun error) */
Anna Bridge 186:707f6e361f3e 2261 __HAL_USART_DISABLE_IT(husart, USART_IT_ERR);
Anna Bridge 186:707f6e361f3e 2262
Anna Bridge 186:707f6e361f3e 2263 /* Tx process is ended, restore husart->State to Ready */
Anna Bridge 186:707f6e361f3e 2264 husart->State = HAL_USART_STATE_READY;
Anna Bridge 186:707f6e361f3e 2265
Anna Bridge 186:707f6e361f3e 2266 HAL_USART_TxCpltCallback(husart);
Anna Bridge 186:707f6e361f3e 2267
Anna Bridge 186:707f6e361f3e 2268 return HAL_OK;
<> 144:ef7eb2e8f9f7 2269 }
<> 144:ef7eb2e8f9f7 2270
<> 144:ef7eb2e8f9f7 2271
<> 144:ef7eb2e8f9f7 2272 /**
Anna Bridge 186:707f6e361f3e 2273 * @brief Simplex receive an amount of data in non-blocking mode.
Anna Bridge 186:707f6e361f3e 2274 * @note Function called under interruption only, once
Anna Bridge 186:707f6e361f3e 2275 * interruptions have been enabled by HAL_USART_Receive_IT().
Anna Bridge 186:707f6e361f3e 2276 * @param husart USART handle
Anna Bridge 186:707f6e361f3e 2277 * @retval HAL status
Anna Bridge 186:707f6e361f3e 2278 */
Anna Bridge 186:707f6e361f3e 2279 static HAL_StatusTypeDef USART_Receive_IT(USART_HandleTypeDef *husart)
Anna Bridge 186:707f6e361f3e 2280 {
Anna Bridge 186:707f6e361f3e 2281 uint16_t* tmp;
Anna Bridge 186:707f6e361f3e 2282 uint16_t uhMask = husart->Mask;
Anna Bridge 186:707f6e361f3e 2283
Anna Bridge 186:707f6e361f3e 2284 if(husart->State == HAL_USART_STATE_BUSY_RX)
Anna Bridge 186:707f6e361f3e 2285 {
Anna Bridge 186:707f6e361f3e 2286
Anna Bridge 186:707f6e361f3e 2287 if((husart->Init.WordLength == USART_WORDLENGTH_9B) && (husart->Init.Parity == USART_PARITY_NONE))
Anna Bridge 186:707f6e361f3e 2288 {
Anna Bridge 186:707f6e361f3e 2289 tmp = (uint16_t*) husart->pRxBuffPtr;
Anna Bridge 186:707f6e361f3e 2290 *tmp = (uint16_t)(husart->Instance->RDR & uhMask);
Anna Bridge 186:707f6e361f3e 2291 husart->pRxBuffPtr += 2U;
Anna Bridge 186:707f6e361f3e 2292 }
Anna Bridge 186:707f6e361f3e 2293 else
Anna Bridge 186:707f6e361f3e 2294 {
Anna Bridge 186:707f6e361f3e 2295 *husart->pRxBuffPtr++ = (uint8_t)(husart->Instance->RDR & (uint8_t)uhMask);
Anna Bridge 186:707f6e361f3e 2296 }
Anna Bridge 186:707f6e361f3e 2297 /* Send dummy byte in order to generate the clock for the Slave to Send the next data */
Anna Bridge 186:707f6e361f3e 2298 husart->Instance->TDR = (USART_DUMMY_DATA & (uint16_t)0x00FFU);
Anna Bridge 186:707f6e361f3e 2299
Anna Bridge 186:707f6e361f3e 2300 if(--husart->RxXferCount == 0U)
Anna Bridge 186:707f6e361f3e 2301 {
Anna Bridge 186:707f6e361f3e 2302 /* Disable the USART Parity Error Interrupt and RXNE interrupt*/
Anna Bridge 186:707f6e361f3e 2303 CLEAR_BIT(husart->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE));
Anna Bridge 186:707f6e361f3e 2304
Anna Bridge 186:707f6e361f3e 2305 /* Disable the USART Error Interrupt: (Frame error, noise error, overrun error) */
Anna Bridge 186:707f6e361f3e 2306 CLEAR_BIT(husart->Instance->CR3, USART_CR3_EIE);
Anna Bridge 186:707f6e361f3e 2307
Anna Bridge 186:707f6e361f3e 2308 /* Rx process is completed, restore husart->State to Ready */
Anna Bridge 186:707f6e361f3e 2309 husart->State = HAL_USART_STATE_READY;
Anna Bridge 186:707f6e361f3e 2310
Anna Bridge 186:707f6e361f3e 2311 HAL_USART_RxCpltCallback(husart);
Anna Bridge 186:707f6e361f3e 2312
Anna Bridge 186:707f6e361f3e 2313 return HAL_OK;
Anna Bridge 186:707f6e361f3e 2314 }
Anna Bridge 186:707f6e361f3e 2315
Anna Bridge 186:707f6e361f3e 2316 return HAL_OK;
Anna Bridge 186:707f6e361f3e 2317 }
Anna Bridge 186:707f6e361f3e 2318 else
Anna Bridge 186:707f6e361f3e 2319 {
Anna Bridge 186:707f6e361f3e 2320 return HAL_BUSY;
Anna Bridge 186:707f6e361f3e 2321 }
Anna Bridge 186:707f6e361f3e 2322 }
Anna Bridge 186:707f6e361f3e 2323
Anna Bridge 186:707f6e361f3e 2324 /**
Anna Bridge 186:707f6e361f3e 2325 * @brief Full-Duplex Send receive an amount of data in full-duplex mode (non-blocking).
Anna Bridge 186:707f6e361f3e 2326 * @note Function called under interruption only, once
Anna Bridge 186:707f6e361f3e 2327 * interruptions have been enabled by HAL_USART_TransmitReceive_IT().
Anna Bridge 186:707f6e361f3e 2328 * @param husart: USART handle.
Anna Bridge 186:707f6e361f3e 2329 * @retval HAL status
Anna Bridge 186:707f6e361f3e 2330 */
Anna Bridge 186:707f6e361f3e 2331 static HAL_StatusTypeDef USART_TransmitReceive_IT(USART_HandleTypeDef *husart)
Anna Bridge 186:707f6e361f3e 2332 {
Anna Bridge 186:707f6e361f3e 2333 uint16_t* tmp;
Anna Bridge 186:707f6e361f3e 2334 uint16_t uhMask = husart->Mask;
Anna Bridge 186:707f6e361f3e 2335
Anna Bridge 186:707f6e361f3e 2336 if(husart->State == HAL_USART_STATE_BUSY_TX_RX)
Anna Bridge 186:707f6e361f3e 2337 {
Anna Bridge 186:707f6e361f3e 2338
Anna Bridge 186:707f6e361f3e 2339 if(husart->TxXferCount != 0x00U)
Anna Bridge 186:707f6e361f3e 2340 {
Anna Bridge 186:707f6e361f3e 2341 if(__HAL_USART_GET_FLAG(husart, USART_FLAG_TXE) != RESET)
Anna Bridge 186:707f6e361f3e 2342 {
Anna Bridge 186:707f6e361f3e 2343 if((husart->Init.WordLength == USART_WORDLENGTH_9B) && (husart->Init.Parity == USART_PARITY_NONE))
Anna Bridge 186:707f6e361f3e 2344 {
Anna Bridge 186:707f6e361f3e 2345 tmp = (uint16_t*) husart->pTxBuffPtr;
Anna Bridge 186:707f6e361f3e 2346 husart->Instance->TDR = (uint16_t)(*tmp & uhMask);
Anna Bridge 186:707f6e361f3e 2347 husart->pTxBuffPtr += 2U;
Anna Bridge 186:707f6e361f3e 2348 }
Anna Bridge 186:707f6e361f3e 2349 else
Anna Bridge 186:707f6e361f3e 2350 {
Anna Bridge 186:707f6e361f3e 2351 husart->Instance->TDR = (uint8_t)(*husart->pTxBuffPtr++ & (uint8_t)uhMask);
Anna Bridge 186:707f6e361f3e 2352 }
Anna Bridge 186:707f6e361f3e 2353 husart->TxXferCount--;
Anna Bridge 186:707f6e361f3e 2354
Anna Bridge 186:707f6e361f3e 2355 /* Check the latest data transmitted */
Anna Bridge 186:707f6e361f3e 2356 if(husart->TxXferCount == 0U)
Anna Bridge 186:707f6e361f3e 2357 {
Anna Bridge 186:707f6e361f3e 2358 __HAL_USART_DISABLE_IT(husart, USART_IT_TXE);
Anna Bridge 186:707f6e361f3e 2359 }
Anna Bridge 186:707f6e361f3e 2360 }
Anna Bridge 186:707f6e361f3e 2361 }
Anna Bridge 186:707f6e361f3e 2362
Anna Bridge 186:707f6e361f3e 2363 if(husart->RxXferCount != 0x00U)
Anna Bridge 186:707f6e361f3e 2364 {
Anna Bridge 186:707f6e361f3e 2365 if(__HAL_USART_GET_FLAG(husart, USART_FLAG_RXNE) != RESET)
Anna Bridge 186:707f6e361f3e 2366 {
Anna Bridge 186:707f6e361f3e 2367 if((husart->Init.WordLength == USART_WORDLENGTH_9B) && (husart->Init.Parity == USART_PARITY_NONE))
Anna Bridge 186:707f6e361f3e 2368 {
Anna Bridge 186:707f6e361f3e 2369 tmp = (uint16_t*) husart->pRxBuffPtr;
Anna Bridge 186:707f6e361f3e 2370 *tmp = (uint16_t)(husart->Instance->RDR & uhMask);
Anna Bridge 186:707f6e361f3e 2371 husart->pRxBuffPtr += 2U;
Anna Bridge 186:707f6e361f3e 2372 }
Anna Bridge 186:707f6e361f3e 2373 else
Anna Bridge 186:707f6e361f3e 2374 {
Anna Bridge 186:707f6e361f3e 2375 *husart->pRxBuffPtr++ = (uint8_t)(husart->Instance->RDR & (uint8_t)uhMask);
Anna Bridge 186:707f6e361f3e 2376 }
Anna Bridge 186:707f6e361f3e 2377 husart->RxXferCount--;
Anna Bridge 186:707f6e361f3e 2378 }
Anna Bridge 186:707f6e361f3e 2379 }
Anna Bridge 186:707f6e361f3e 2380
Anna Bridge 186:707f6e361f3e 2381 /* Check the latest data received */
Anna Bridge 186:707f6e361f3e 2382 if(husart->RxXferCount == 0U)
Anna Bridge 186:707f6e361f3e 2383 {
Anna Bridge 186:707f6e361f3e 2384 /* Disable the USART Parity Error Interrupt and RXNE interrupt*/
Anna Bridge 186:707f6e361f3e 2385 CLEAR_BIT(husart->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE));
Anna Bridge 186:707f6e361f3e 2386
Anna Bridge 186:707f6e361f3e 2387 /* Disable the USART Error Interrupt: (Frame error, noise error, overrun error) */
Anna Bridge 186:707f6e361f3e 2388 CLEAR_BIT(husart->Instance->CR3, USART_CR3_EIE);
Anna Bridge 186:707f6e361f3e 2389
Anna Bridge 186:707f6e361f3e 2390 /* Rx process is completed, restore husart->State to Ready */
Anna Bridge 186:707f6e361f3e 2391 husart->State = HAL_USART_STATE_READY;
Anna Bridge 186:707f6e361f3e 2392
Anna Bridge 186:707f6e361f3e 2393 HAL_USART_TxRxCpltCallback(husart);
Anna Bridge 186:707f6e361f3e 2394
Anna Bridge 186:707f6e361f3e 2395 return HAL_OK;
Anna Bridge 186:707f6e361f3e 2396 }
Anna Bridge 186:707f6e361f3e 2397
Anna Bridge 186:707f6e361f3e 2398 return HAL_OK;
Anna Bridge 186:707f6e361f3e 2399 }
Anna Bridge 186:707f6e361f3e 2400 else
Anna Bridge 186:707f6e361f3e 2401 {
Anna Bridge 186:707f6e361f3e 2402 return HAL_BUSY;
Anna Bridge 186:707f6e361f3e 2403 }
Anna Bridge 186:707f6e361f3e 2404 }
Anna Bridge 186:707f6e361f3e 2405
Anna Bridge 186:707f6e361f3e 2406 /**
Anna Bridge 186:707f6e361f3e 2407 * @}
Anna Bridge 186:707f6e361f3e 2408 */
Anna Bridge 186:707f6e361f3e 2409
Anna Bridge 186:707f6e361f3e 2410 #endif /* HAL_USART_MODULE_ENABLED */
Anna Bridge 186:707f6e361f3e 2411 /**
<> 144:ef7eb2e8f9f7 2412 * @}
<> 144:ef7eb2e8f9f7 2413 */
<> 144:ef7eb2e8f9f7 2414
<> 144:ef7eb2e8f9f7 2415 /**
<> 144:ef7eb2e8f9f7 2416 * @}
<> 144:ef7eb2e8f9f7 2417 */
<> 144:ef7eb2e8f9f7 2418
<> 144:ef7eb2e8f9f7 2419 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
<> 144:ef7eb2e8f9f7 2420