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