001

Committer:
ganlikun
Date:
Sun Jun 12 14:02:44 2022 +0000
Revision:
0:13413ea9a877
00

Who changed what in which revision?

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