SPKT

Dependents:   WAV

Committer:
phungductung
Date:
Tue Jun 04 21:51:46 2019 +0000
Revision:
0:e87aa4c49e95
libray

Who changed what in which revision?

UserRevisionLine numberNew contents of line
phungductung 0:e87aa4c49e95 1 /**
phungductung 0:e87aa4c49e95 2 ******************************************************************************
phungductung 0:e87aa4c49e95 3 * @file stm32f7xx_hal_uart.c
phungductung 0:e87aa4c49e95 4 * @author MCD Application Team
phungductung 0:e87aa4c49e95 5 * @version V1.0.4
phungductung 0:e87aa4c49e95 6 * @date 09-December-2015
phungductung 0:e87aa4c49e95 7 * @brief UART HAL module driver.
phungductung 0:e87aa4c49e95 8 * This file provides firmware functions to manage the following
phungductung 0:e87aa4c49e95 9 * functionalities of the Universal Asynchronous Receiver Transmitter (UART) peripheral:
phungductung 0:e87aa4c49e95 10 * + Initialization and de-initialization functions
phungductung 0:e87aa4c49e95 11 * + IO operation functions
phungductung 0:e87aa4c49e95 12 * + Peripheral Control functions
phungductung 0:e87aa4c49e95 13 * + Peripheral State and Errors functions
phungductung 0:e87aa4c49e95 14 *
phungductung 0:e87aa4c49e95 15 @verbatim
phungductung 0:e87aa4c49e95 16 ==============================================================================
phungductung 0:e87aa4c49e95 17 ##### How to use this driver #####
phungductung 0:e87aa4c49e95 18 ==============================================================================
phungductung 0:e87aa4c49e95 19 [..]
phungductung 0:e87aa4c49e95 20 The UART HAL driver can be used as follows:
phungductung 0:e87aa4c49e95 21
phungductung 0:e87aa4c49e95 22 (#) Declare a UART_HandleTypeDef handle structure.
phungductung 0:e87aa4c49e95 23
phungductung 0:e87aa4c49e95 24 (#) Initialize the UART low level resources by implementing the HAL_UART_MspInit() API:
phungductung 0:e87aa4c49e95 25 (##) Enable the USARTx interface clock.
phungductung 0:e87aa4c49e95 26 (##) UART pins configuration:
phungductung 0:e87aa4c49e95 27 (+++) Enable the clock for the UART GPIOs.
phungductung 0:e87aa4c49e95 28 (+++) Configure these UART pins as alternate function pull-up.
phungductung 0:e87aa4c49e95 29 (##) NVIC configuration if you need to use interrupt process (HAL_UART_Transmit_IT()
phungductung 0:e87aa4c49e95 30 and HAL_UART_Receive_IT() APIs):
phungductung 0:e87aa4c49e95 31 (+++) Configure the USARTx interrupt priority.
phungductung 0:e87aa4c49e95 32 (+++) Enable the NVIC USART IRQ handle.
phungductung 0:e87aa4c49e95 33 (##) DMA Configuration if you need to use DMA process (HAL_UART_Transmit_DMA()
phungductung 0:e87aa4c49e95 34 and HAL_UART_Receive_DMA() APIs):
phungductung 0:e87aa4c49e95 35 (+++) Declare a DMA handle structure for the Tx/Rx stream.
phungductung 0:e87aa4c49e95 36 (+++) Enable the DMAx interface clock.
phungductung 0:e87aa4c49e95 37 (+++) Configure the declared DMA handle structure with the required
phungductung 0:e87aa4c49e95 38 Tx/Rx parameters.
phungductung 0:e87aa4c49e95 39 (+++) Configure the DMA Tx/Rx Stream.
phungductung 0:e87aa4c49e95 40 (+++) Associate the initialized DMA handle to the UART DMA Tx/Rx handle.
phungductung 0:e87aa4c49e95 41 (+++) Configure the priority and enable the NVIC for the transfer complete
phungductung 0:e87aa4c49e95 42 interrupt on the DMA Tx/Rx Stream.
phungductung 0:e87aa4c49e95 43
phungductung 0:e87aa4c49e95 44 (#) Program the Baud Rate, Word Length, Stop Bit, Parity, Hardware
phungductung 0:e87aa4c49e95 45 flow control and Mode(Receiver/Transmitter) in the Init structure.
phungductung 0:e87aa4c49e95 46
phungductung 0:e87aa4c49e95 47 (#) For the UART asynchronous mode, initialize the UART registers by calling
phungductung 0:e87aa4c49e95 48 the HAL_UART_Init() API.
phungductung 0:e87aa4c49e95 49
phungductung 0:e87aa4c49e95 50 (#) For the UART Half duplex mode, initialize the UART registers by calling
phungductung 0:e87aa4c49e95 51 the HAL_HalfDuplex_Init() API.
phungductung 0:e87aa4c49e95 52
phungductung 0:e87aa4c49e95 53 (#) For the LIN mode, initialize the UART registers by calling the HAL_LIN_Init() API.
phungductung 0:e87aa4c49e95 54
phungductung 0:e87aa4c49e95 55 (#) For the Multi-Processor mode, initialize the UART registers by calling
phungductung 0:e87aa4c49e95 56 the HAL_MultiProcessor_Init() API.
phungductung 0:e87aa4c49e95 57
phungductung 0:e87aa4c49e95 58 [..]
phungductung 0:e87aa4c49e95 59 (@) The specific UART interrupts (Transmission complete interrupt,
phungductung 0:e87aa4c49e95 60 RXNE interrupt and Error Interrupts) will be managed using the macros
phungductung 0:e87aa4c49e95 61 __HAL_UART_ENABLE_IT() and __HAL_UART_DISABLE_IT() inside the transmit
phungductung 0:e87aa4c49e95 62 and receive process.
phungductung 0:e87aa4c49e95 63
phungductung 0:e87aa4c49e95 64 [..]
phungductung 0:e87aa4c49e95 65 (@) These APIs (HAL_UART_Init() and HAL_HalfDuplex_Init()) configure also the
phungductung 0:e87aa4c49e95 66 low level Hardware GPIO, CLOCK, CORTEX...etc) by calling the customized
phungductung 0:e87aa4c49e95 67 HAL_UART_MspInit() API.
phungductung 0:e87aa4c49e95 68
phungductung 0:e87aa4c49e95 69 [..]
phungductung 0:e87aa4c49e95 70 Three operation modes are available within this driver :
phungductung 0:e87aa4c49e95 71
phungductung 0:e87aa4c49e95 72 *** Polling mode IO operation ***
phungductung 0:e87aa4c49e95 73 =================================
phungductung 0:e87aa4c49e95 74 [..]
phungductung 0:e87aa4c49e95 75 (+) Send an amount of data in blocking mode using HAL_UART_Transmit()
phungductung 0:e87aa4c49e95 76 (+) Receive an amount of data in blocking mode using HAL_UART_Receive()
phungductung 0:e87aa4c49e95 77
phungductung 0:e87aa4c49e95 78 *** Interrupt mode IO operation ***
phungductung 0:e87aa4c49e95 79 ===================================
phungductung 0:e87aa4c49e95 80 [..]
phungductung 0:e87aa4c49e95 81 (+) Send an amount of data in non blocking mode using HAL_UART_Transmit_IT()
phungductung 0:e87aa4c49e95 82 (+) At transmission end of transfer HAL_UART_TxCpltCallback is executed and user can
phungductung 0:e87aa4c49e95 83 add his own code by customization of function pointer HAL_UART_TxCpltCallback
phungductung 0:e87aa4c49e95 84 (+) Receive an amount of data in non blocking mode using HAL_UART_Receive_IT()
phungductung 0:e87aa4c49e95 85 (+) At reception end of transfer HAL_UART_RxCpltCallback is executed and user can
phungductung 0:e87aa4c49e95 86 add his own code by customization of function pointer HAL_UART_RxCpltCallback
phungductung 0:e87aa4c49e95 87 (+) In case of transfer Error, HAL_UART_ErrorCallback() function is executed and user can
phungductung 0:e87aa4c49e95 88 add his own code by customization of function pointer HAL_UART_ErrorCallback
phungductung 0:e87aa4c49e95 89
phungductung 0:e87aa4c49e95 90 *** DMA mode IO operation ***
phungductung 0:e87aa4c49e95 91 ==============================
phungductung 0:e87aa4c49e95 92 [..]
phungductung 0:e87aa4c49e95 93 (+) Send an amount of data in non blocking mode (DMA) using HAL_UART_Transmit_DMA()
phungductung 0:e87aa4c49e95 94 (+) At transmission end of half transfer HAL_UART_TxHalfCpltCallback is executed and user can
phungductung 0:e87aa4c49e95 95 add his own code by customization of function pointer HAL_UART_TxHalfCpltCallback
phungductung 0:e87aa4c49e95 96 (+) At transmission end of transfer HAL_UART_TxCpltCallback is executed and user can
phungductung 0:e87aa4c49e95 97 add his own code by customization of function pointer HAL_UART_TxCpltCallback
phungductung 0:e87aa4c49e95 98 (+) Receive an amount of data in non blocking mode (DMA) using HAL_UART_Receive_DMA()
phungductung 0:e87aa4c49e95 99 (+) At reception end of half transfer HAL_UART_RxHalfCpltCallback is executed and user can
phungductung 0:e87aa4c49e95 100 add his own code by customization of function pointer HAL_UART_RxHalfCpltCallback
phungductung 0:e87aa4c49e95 101 (+) At reception end of transfer HAL_UART_RxCpltCallback is executed and user can
phungductung 0:e87aa4c49e95 102 add his own code by customization of function pointer HAL_UART_RxCpltCallback
phungductung 0:e87aa4c49e95 103 (+) In case of transfer Error, HAL_UART_ErrorCallback() function is executed and user can
phungductung 0:e87aa4c49e95 104 add his own code by customization of function pointer HAL_UART_ErrorCallback
phungductung 0:e87aa4c49e95 105 (+) Pause the DMA Transfer using HAL_UART_DMAPause()
phungductung 0:e87aa4c49e95 106 (+) Resume the DMA Transfer using HAL_UART_DMAResume()
phungductung 0:e87aa4c49e95 107 (+) Stop the DMA Transfer using HAL_UART_DMAStop()
phungductung 0:e87aa4c49e95 108
phungductung 0:e87aa4c49e95 109 *** UART HAL driver macros list ***
phungductung 0:e87aa4c49e95 110 =============================================
phungductung 0:e87aa4c49e95 111 [..]
phungductung 0:e87aa4c49e95 112 Below the list of most used macros in UART HAL driver.
phungductung 0:e87aa4c49e95 113
phungductung 0:e87aa4c49e95 114 (+) __HAL_UART_ENABLE: Enable the UART peripheral
phungductung 0:e87aa4c49e95 115 (+) __HAL_UART_DISABLE: Disable the UART peripheral
phungductung 0:e87aa4c49e95 116 (+) __HAL_UART_GET_FLAG : Check whether the specified UART flag is set or not
phungductung 0:e87aa4c49e95 117 (+) __HAL_UART_CLEAR_IT : Clears the specified UART ISR flag
phungductung 0:e87aa4c49e95 118 (+) __HAL_UART_ENABLE_IT: Enable the specified UART interrupt
phungductung 0:e87aa4c49e95 119 (+) __HAL_UART_DISABLE_IT: Disable the specified UART interrupt
phungductung 0:e87aa4c49e95 120 (+) __HAL_UART_GET_IT_SOURCE: Check whether the specified UART interrupt has occurred or not
phungductung 0:e87aa4c49e95 121
phungductung 0:e87aa4c49e95 122 [..]
phungductung 0:e87aa4c49e95 123 (@) You can refer to the UART HAL driver header file for more useful macros
phungductung 0:e87aa4c49e95 124
phungductung 0:e87aa4c49e95 125 @endverbatim
phungductung 0:e87aa4c49e95 126 ******************************************************************************
phungductung 0:e87aa4c49e95 127 * @attention
phungductung 0:e87aa4c49e95 128 *
phungductung 0:e87aa4c49e95 129 * <h2><center>&copy; COPYRIGHT(c) 2015 STMicroelectronics</center></h2>
phungductung 0:e87aa4c49e95 130 *
phungductung 0:e87aa4c49e95 131 * Redistribution and use in source and binary forms, with or without modification,
phungductung 0:e87aa4c49e95 132 * are permitted provided that the following conditions are met:
phungductung 0:e87aa4c49e95 133 * 1. Redistributions of source code must retain the above copyright notice,
phungductung 0:e87aa4c49e95 134 * this list of conditions and the following disclaimer.
phungductung 0:e87aa4c49e95 135 * 2. Redistributions in binary form must reproduce the above copyright notice,
phungductung 0:e87aa4c49e95 136 * this list of conditions and the following disclaimer in the documentation
phungductung 0:e87aa4c49e95 137 * and/or other materials provided with the distribution.
phungductung 0:e87aa4c49e95 138 * 3. Neither the name of STMicroelectronics nor the names of its contributors
phungductung 0:e87aa4c49e95 139 * may be used to endorse or promote products derived from this software
phungductung 0:e87aa4c49e95 140 * without specific prior written permission.
phungductung 0:e87aa4c49e95 141 *
phungductung 0:e87aa4c49e95 142 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
phungductung 0:e87aa4c49e95 143 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
phungductung 0:e87aa4c49e95 144 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
phungductung 0:e87aa4c49e95 145 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
phungductung 0:e87aa4c49e95 146 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
phungductung 0:e87aa4c49e95 147 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
phungductung 0:e87aa4c49e95 148 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
phungductung 0:e87aa4c49e95 149 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
phungductung 0:e87aa4c49e95 150 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
phungductung 0:e87aa4c49e95 151 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
phungductung 0:e87aa4c49e95 152 *
phungductung 0:e87aa4c49e95 153 ******************************************************************************
phungductung 0:e87aa4c49e95 154 */
phungductung 0:e87aa4c49e95 155
phungductung 0:e87aa4c49e95 156 /* Includes ------------------------------------------------------------------*/
phungductung 0:e87aa4c49e95 157 #include "stm32f7xx_hal.h"
phungductung 0:e87aa4c49e95 158
phungductung 0:e87aa4c49e95 159 /** @addtogroup STM32F7xx_HAL_Driver
phungductung 0:e87aa4c49e95 160 * @{
phungductung 0:e87aa4c49e95 161 */
phungductung 0:e87aa4c49e95 162
phungductung 0:e87aa4c49e95 163 /** @defgroup UART UART
phungductung 0:e87aa4c49e95 164 * @brief HAL UART module driver
phungductung 0:e87aa4c49e95 165 * @{
phungductung 0:e87aa4c49e95 166 */
phungductung 0:e87aa4c49e95 167 #ifdef HAL_UART_MODULE_ENABLED
phungductung 0:e87aa4c49e95 168
phungductung 0:e87aa4c49e95 169 /* Private typedef -----------------------------------------------------------*/
phungductung 0:e87aa4c49e95 170 /* Private define ------------------------------------------------------------*/
phungductung 0:e87aa4c49e95 171 #define UART_CR1_FIELDS ((uint32_t)(USART_CR1_M | USART_CR1_PCE | USART_CR1_PS | \
phungductung 0:e87aa4c49e95 172 USART_CR1_TE | USART_CR1_RE | USART_CR1_OVER8))
phungductung 0:e87aa4c49e95 173 /* Private macro -------------------------------------------------------------*/
phungductung 0:e87aa4c49e95 174 /* Private variables ---------------------------------------------------------*/
phungductung 0:e87aa4c49e95 175 /* Private function prototypes -----------------------------------------------*/
phungductung 0:e87aa4c49e95 176 static void UART_DMATransmitCplt(DMA_HandleTypeDef *hdma);
phungductung 0:e87aa4c49e95 177 static void UART_DMAReceiveCplt(DMA_HandleTypeDef *hdma);
phungductung 0:e87aa4c49e95 178 static void UART_DMARxHalfCplt(DMA_HandleTypeDef *hdma);
phungductung 0:e87aa4c49e95 179 static void UART_DMATxHalfCplt(DMA_HandleTypeDef *hdma);
phungductung 0:e87aa4c49e95 180 static void UART_DMAError(DMA_HandleTypeDef *hdma);
phungductung 0:e87aa4c49e95 181 static HAL_StatusTypeDef UART_Transmit_IT(UART_HandleTypeDef *huart);
phungductung 0:e87aa4c49e95 182 static HAL_StatusTypeDef UART_EndTransmit_IT(UART_HandleTypeDef *huart);
phungductung 0:e87aa4c49e95 183 static HAL_StatusTypeDef UART_Receive_IT(UART_HandleTypeDef *huart);
phungductung 0:e87aa4c49e95 184 /* Private functions ---------------------------------------------------------*/
phungductung 0:e87aa4c49e95 185
phungductung 0:e87aa4c49e95 186 /** @defgroup UART_Exported_Functions UART Exported Functions
phungductung 0:e87aa4c49e95 187 * @{
phungductung 0:e87aa4c49e95 188 */
phungductung 0:e87aa4c49e95 189
phungductung 0:e87aa4c49e95 190 /** @defgroup UART_Exported_Functions_Group1 Initialization and de-initialization functions
phungductung 0:e87aa4c49e95 191 * @brief Initialization and Configuration functions
phungductung 0:e87aa4c49e95 192 *
phungductung 0:e87aa4c49e95 193 @verbatim
phungductung 0:e87aa4c49e95 194 ===============================================================================
phungductung 0:e87aa4c49e95 195 ##### Initialization and Configuration functions #####
phungductung 0:e87aa4c49e95 196 ===============================================================================
phungductung 0:e87aa4c49e95 197 [..]
phungductung 0:e87aa4c49e95 198 This subsection provides a set of functions allowing to initialize the USARTx or the UARTy
phungductung 0:e87aa4c49e95 199 in asynchronous mode.
phungductung 0:e87aa4c49e95 200 (+) For the asynchronous mode only these parameters can be configured:
phungductung 0:e87aa4c49e95 201 (++) Baud Rate
phungductung 0:e87aa4c49e95 202 (++) Word Length
phungductung 0:e87aa4c49e95 203 (++) Stop Bit
phungductung 0:e87aa4c49e95 204 (++) Parity: If the parity is enabled, then the MSB bit of the data written
phungductung 0:e87aa4c49e95 205 in the data register is transmitted but is changed by the parity bit.
phungductung 0:e87aa4c49e95 206 Depending on the frame length defined by the M bit (8-bits or 9-bits),
phungductung 0:e87aa4c49e95 207 please refer to Reference manual for possible UART frame formats.
phungductung 0:e87aa4c49e95 208 (++) Hardware flow control
phungductung 0:e87aa4c49e95 209 (++) Receiver/transmitter modes
phungductung 0:e87aa4c49e95 210 (++) Over Sampling Method
phungductung 0:e87aa4c49e95 211 [..]
phungductung 0:e87aa4c49e95 212 The HAL_UART_Init(), HAL_HalfDuplex_Init(), HAL_LIN_Init() and HAL_MultiProcessor_Init() APIs
phungductung 0:e87aa4c49e95 213 follow respectively the UART asynchronous, UART Half duplex, LIN and Multi-Processor
phungductung 0:e87aa4c49e95 214 configuration procedures (details for the procedures are available in reference manual (RM0329)).
phungductung 0:e87aa4c49e95 215
phungductung 0:e87aa4c49e95 216 @endverbatim
phungductung 0:e87aa4c49e95 217 * @{
phungductung 0:e87aa4c49e95 218 */
phungductung 0:e87aa4c49e95 219
phungductung 0:e87aa4c49e95 220 /**
phungductung 0:e87aa4c49e95 221 * @brief Initializes the UART mode according to the specified
phungductung 0:e87aa4c49e95 222 * parameters in the UART_InitTypeDef and creates the associated handle .
phungductung 0:e87aa4c49e95 223 * @param huart: uart handle
phungductung 0:e87aa4c49e95 224 * @retval HAL status
phungductung 0:e87aa4c49e95 225 */
phungductung 0:e87aa4c49e95 226 HAL_StatusTypeDef HAL_UART_Init(UART_HandleTypeDef *huart)
phungductung 0:e87aa4c49e95 227 {
phungductung 0:e87aa4c49e95 228 /* Check the UART handle allocation */
phungductung 0:e87aa4c49e95 229 if(huart == NULL)
phungductung 0:e87aa4c49e95 230 {
phungductung 0:e87aa4c49e95 231 return HAL_ERROR;
phungductung 0:e87aa4c49e95 232 }
phungductung 0:e87aa4c49e95 233
phungductung 0:e87aa4c49e95 234 if(huart->Init.HwFlowCtl != UART_HWCONTROL_NONE)
phungductung 0:e87aa4c49e95 235 {
phungductung 0:e87aa4c49e95 236 /* Check the parameters */
phungductung 0:e87aa4c49e95 237 assert_param(IS_UART_HWFLOW_INSTANCE(huart->Instance));
phungductung 0:e87aa4c49e95 238 }
phungductung 0:e87aa4c49e95 239 else
phungductung 0:e87aa4c49e95 240 {
phungductung 0:e87aa4c49e95 241 /* Check the parameters */
phungductung 0:e87aa4c49e95 242 assert_param(IS_UART_INSTANCE(huart->Instance));
phungductung 0:e87aa4c49e95 243 }
phungductung 0:e87aa4c49e95 244
phungductung 0:e87aa4c49e95 245 if(huart->State == HAL_UART_STATE_RESET)
phungductung 0:e87aa4c49e95 246 {
phungductung 0:e87aa4c49e95 247 /* Allocate lock resource and initialize it */
phungductung 0:e87aa4c49e95 248 huart->Lock = HAL_UNLOCKED;
phungductung 0:e87aa4c49e95 249
phungductung 0:e87aa4c49e95 250 /* Init the low level hardware : GPIO, CLOCK */
phungductung 0:e87aa4c49e95 251 HAL_UART_MspInit(huart);
phungductung 0:e87aa4c49e95 252 }
phungductung 0:e87aa4c49e95 253
phungductung 0:e87aa4c49e95 254 huart->State = HAL_UART_STATE_BUSY;
phungductung 0:e87aa4c49e95 255
phungductung 0:e87aa4c49e95 256 /* Disable the Peripheral */
phungductung 0:e87aa4c49e95 257 __HAL_UART_DISABLE(huart);
phungductung 0:e87aa4c49e95 258
phungductung 0:e87aa4c49e95 259 /* Set the UART Communication parameters */
phungductung 0:e87aa4c49e95 260 if (UART_SetConfig(huart) == HAL_ERROR)
phungductung 0:e87aa4c49e95 261 {
phungductung 0:e87aa4c49e95 262 return HAL_ERROR;
phungductung 0:e87aa4c49e95 263 }
phungductung 0:e87aa4c49e95 264
phungductung 0:e87aa4c49e95 265 if (huart->AdvancedInit.AdvFeatureInit != UART_ADVFEATURE_NO_INIT)
phungductung 0:e87aa4c49e95 266 {
phungductung 0:e87aa4c49e95 267 UART_AdvFeatureConfig(huart);
phungductung 0:e87aa4c49e95 268 }
phungductung 0:e87aa4c49e95 269
phungductung 0:e87aa4c49e95 270 /* In asynchronous mode, the following bits must be kept cleared:
phungductung 0:e87aa4c49e95 271 - LINEN and CLKEN bits in the USART_CR2 register,
phungductung 0:e87aa4c49e95 272 - SCEN, HDSEL and IREN bits in the USART_CR3 register.*/
phungductung 0:e87aa4c49e95 273 huart->Instance->CR2 &= ~(USART_CR2_LINEN | USART_CR2_CLKEN);
phungductung 0:e87aa4c49e95 274 huart->Instance->CR3 &= ~(USART_CR3_SCEN | USART_CR3_HDSEL | USART_CR3_IREN);
phungductung 0:e87aa4c49e95 275
phungductung 0:e87aa4c49e95 276 /* Enable the Peripheral */
phungductung 0:e87aa4c49e95 277 __HAL_UART_ENABLE(huart);
phungductung 0:e87aa4c49e95 278
phungductung 0:e87aa4c49e95 279 /* TEACK and/or REACK to check before moving huart->State to Ready */
phungductung 0:e87aa4c49e95 280 return (UART_CheckIdleState(huart));
phungductung 0:e87aa4c49e95 281 }
phungductung 0:e87aa4c49e95 282
phungductung 0:e87aa4c49e95 283 /**
phungductung 0:e87aa4c49e95 284 * @brief Initializes the half-duplex mode according to the specified
phungductung 0:e87aa4c49e95 285 * parameters in the UART_InitTypeDef and creates the associated handle .
phungductung 0:e87aa4c49e95 286 * @param huart: UART handle
phungductung 0:e87aa4c49e95 287 * @retval HAL status
phungductung 0:e87aa4c49e95 288 */
phungductung 0:e87aa4c49e95 289 HAL_StatusTypeDef HAL_HalfDuplex_Init(UART_HandleTypeDef *huart)
phungductung 0:e87aa4c49e95 290 {
phungductung 0:e87aa4c49e95 291 /* Check the UART handle allocation */
phungductung 0:e87aa4c49e95 292 if(huart == NULL)
phungductung 0:e87aa4c49e95 293 {
phungductung 0:e87aa4c49e95 294 return HAL_ERROR;
phungductung 0:e87aa4c49e95 295 }
phungductung 0:e87aa4c49e95 296
phungductung 0:e87aa4c49e95 297 if(huart->State == HAL_UART_STATE_RESET)
phungductung 0:e87aa4c49e95 298 {
phungductung 0:e87aa4c49e95 299 /* Allocate lock resource and initialize it */
phungductung 0:e87aa4c49e95 300 huart->Lock = HAL_UNLOCKED;
phungductung 0:e87aa4c49e95 301 /* Init the low level hardware : GPIO, CLOCK */
phungductung 0:e87aa4c49e95 302 HAL_UART_MspInit(huart);
phungductung 0:e87aa4c49e95 303 }
phungductung 0:e87aa4c49e95 304
phungductung 0:e87aa4c49e95 305 huart->State = HAL_UART_STATE_BUSY;
phungductung 0:e87aa4c49e95 306
phungductung 0:e87aa4c49e95 307 /* Disable the Peripheral */
phungductung 0:e87aa4c49e95 308 __HAL_UART_DISABLE(huart);
phungductung 0:e87aa4c49e95 309
phungductung 0:e87aa4c49e95 310 /* Set the UART Communication parameters */
phungductung 0:e87aa4c49e95 311 if (UART_SetConfig(huart) == HAL_ERROR)
phungductung 0:e87aa4c49e95 312 {
phungductung 0:e87aa4c49e95 313 return HAL_ERROR;
phungductung 0:e87aa4c49e95 314 }
phungductung 0:e87aa4c49e95 315
phungductung 0:e87aa4c49e95 316 if (huart->AdvancedInit.AdvFeatureInit != UART_ADVFEATURE_NO_INIT)
phungductung 0:e87aa4c49e95 317 {
phungductung 0:e87aa4c49e95 318 UART_AdvFeatureConfig(huart);
phungductung 0:e87aa4c49e95 319 }
phungductung 0:e87aa4c49e95 320
phungductung 0:e87aa4c49e95 321 /* In half-duplex mode, the following bits must be kept cleared:
phungductung 0:e87aa4c49e95 322 - LINEN and CLKEN bits in the USART_CR2 register,
phungductung 0:e87aa4c49e95 323 - SCEN and IREN bits in the USART_CR3 register.*/
phungductung 0:e87aa4c49e95 324 huart->Instance->CR2 &= ~(USART_CR2_LINEN | USART_CR2_CLKEN);
phungductung 0:e87aa4c49e95 325 huart->Instance->CR3 &= ~(USART_CR3_IREN | USART_CR3_SCEN);
phungductung 0:e87aa4c49e95 326
phungductung 0:e87aa4c49e95 327 /* Enable the Half-Duplex mode by setting the HDSEL bit in the CR3 register */
phungductung 0:e87aa4c49e95 328 huart->Instance->CR3 |= USART_CR3_HDSEL;
phungductung 0:e87aa4c49e95 329
phungductung 0:e87aa4c49e95 330 /* Enable the Peripheral */
phungductung 0:e87aa4c49e95 331 __HAL_UART_ENABLE(huart);
phungductung 0:e87aa4c49e95 332
phungductung 0:e87aa4c49e95 333 /* TEACK and/or REACK to check before moving huart->State to Ready */
phungductung 0:e87aa4c49e95 334 return (UART_CheckIdleState(huart));
phungductung 0:e87aa4c49e95 335 }
phungductung 0:e87aa4c49e95 336
phungductung 0:e87aa4c49e95 337
phungductung 0:e87aa4c49e95 338 /**
phungductung 0:e87aa4c49e95 339 * @brief Initializes the LIN mode according to the specified
phungductung 0:e87aa4c49e95 340 * parameters in the UART_InitTypeDef and creates the associated handle .
phungductung 0:e87aa4c49e95 341 * @param huart: uart handle
phungductung 0:e87aa4c49e95 342 * @param BreakDetectLength: specifies the LIN break detection length.
phungductung 0:e87aa4c49e95 343 * This parameter can be one of the following values:
phungductung 0:e87aa4c49e95 344 * @arg UART_LINBREAKDETECTLENGTH_10B: 10-bit break detection
phungductung 0:e87aa4c49e95 345 * @arg UART_LINBREAKDETECTLENGTH_11B: 11-bit break detection
phungductung 0:e87aa4c49e95 346 * @retval HAL status
phungductung 0:e87aa4c49e95 347 */
phungductung 0:e87aa4c49e95 348 HAL_StatusTypeDef HAL_LIN_Init(UART_HandleTypeDef *huart, uint32_t BreakDetectLength)
phungductung 0:e87aa4c49e95 349 {
phungductung 0:e87aa4c49e95 350 /* Check the UART handle allocation */
phungductung 0:e87aa4c49e95 351 if(huart == NULL)
phungductung 0:e87aa4c49e95 352 {
phungductung 0:e87aa4c49e95 353 return HAL_ERROR;
phungductung 0:e87aa4c49e95 354 }
phungductung 0:e87aa4c49e95 355
phungductung 0:e87aa4c49e95 356 /* Check the parameters */
phungductung 0:e87aa4c49e95 357 assert_param(IS_UART_INSTANCE(huart->Instance));
phungductung 0:e87aa4c49e95 358 assert_param(IS_UART_LIN_BREAK_DETECT_LENGTH(BreakDetectLength));
phungductung 0:e87aa4c49e95 359 assert_param(IS_LIN_WORD_LENGTH(huart->Init.WordLength));
phungductung 0:e87aa4c49e95 360
phungductung 0:e87aa4c49e95 361 if(huart->State == HAL_UART_STATE_RESET)
phungductung 0:e87aa4c49e95 362 {
phungductung 0:e87aa4c49e95 363 /* Allocate lock resource and initialize it */
phungductung 0:e87aa4c49e95 364 huart->Lock = HAL_UNLOCKED;
phungductung 0:e87aa4c49e95 365 /* Init the low level hardware : GPIO, CLOCK */
phungductung 0:e87aa4c49e95 366 HAL_UART_MspInit(huart);
phungductung 0:e87aa4c49e95 367 }
phungductung 0:e87aa4c49e95 368
phungductung 0:e87aa4c49e95 369 huart->State = HAL_UART_STATE_BUSY;
phungductung 0:e87aa4c49e95 370
phungductung 0:e87aa4c49e95 371 /* Disable the Peripheral */
phungductung 0:e87aa4c49e95 372 __HAL_UART_DISABLE(huart);
phungductung 0:e87aa4c49e95 373
phungductung 0:e87aa4c49e95 374 /* Set the UART Communication parameters */
phungductung 0:e87aa4c49e95 375 if (UART_SetConfig(huart) == HAL_ERROR)
phungductung 0:e87aa4c49e95 376 {
phungductung 0:e87aa4c49e95 377 return HAL_ERROR;
phungductung 0:e87aa4c49e95 378 }
phungductung 0:e87aa4c49e95 379
phungductung 0:e87aa4c49e95 380 if (huart->AdvancedInit.AdvFeatureInit != UART_ADVFEATURE_NO_INIT)
phungductung 0:e87aa4c49e95 381 {
phungductung 0:e87aa4c49e95 382 UART_AdvFeatureConfig(huart);
phungductung 0:e87aa4c49e95 383 }
phungductung 0:e87aa4c49e95 384
phungductung 0:e87aa4c49e95 385 /* In LIN mode, the following bits must be kept cleared:
phungductung 0:e87aa4c49e95 386 - LINEN and CLKEN bits in the USART_CR2 register,
phungductung 0:e87aa4c49e95 387 - SCEN and IREN bits in the USART_CR3 register.*/
phungductung 0:e87aa4c49e95 388 huart->Instance->CR2 &= ~(USART_CR2_CLKEN);
phungductung 0:e87aa4c49e95 389 huart->Instance->CR3 &= ~(USART_CR3_HDSEL | USART_CR3_IREN | USART_CR3_SCEN);
phungductung 0:e87aa4c49e95 390
phungductung 0:e87aa4c49e95 391 /* Enable the LIN mode by setting the LINEN bit in the CR2 register */
phungductung 0:e87aa4c49e95 392 huart->Instance->CR2 |= USART_CR2_LINEN;
phungductung 0:e87aa4c49e95 393
phungductung 0:e87aa4c49e95 394 /* Set the USART LIN Break detection length. */
phungductung 0:e87aa4c49e95 395 MODIFY_REG(huart->Instance->CR2, USART_CR2_LBDL, BreakDetectLength);
phungductung 0:e87aa4c49e95 396
phungductung 0:e87aa4c49e95 397 /* Enable the Peripheral */
phungductung 0:e87aa4c49e95 398 __HAL_UART_ENABLE(huart);
phungductung 0:e87aa4c49e95 399
phungductung 0:e87aa4c49e95 400 /* TEACK and/or REACK to check before moving huart->State to Ready */
phungductung 0:e87aa4c49e95 401 return (UART_CheckIdleState(huart));
phungductung 0:e87aa4c49e95 402 }
phungductung 0:e87aa4c49e95 403
phungductung 0:e87aa4c49e95 404
phungductung 0:e87aa4c49e95 405
phungductung 0:e87aa4c49e95 406 /**
phungductung 0:e87aa4c49e95 407 * @brief Initializes the multiprocessor mode according to the specified
phungductung 0:e87aa4c49e95 408 * parameters in the UART_InitTypeDef and creates the associated handle.
phungductung 0:e87aa4c49e95 409 * @param huart: UART handle
phungductung 0:e87aa4c49e95 410 * @param Address: UART node address (4-, 6-, 7- or 8-bit long)
phungductung 0:e87aa4c49e95 411 * @param WakeUpMethod: specifies the UART wakeup method.
phungductung 0:e87aa4c49e95 412 * This parameter can be one of the following values:
phungductung 0:e87aa4c49e95 413 * @arg UART_WAKEUPMETHOD_IDLELINE: WakeUp by an idle line detection
phungductung 0:e87aa4c49e95 414 * @arg UART_WAKEUPMETHOD_ADDRESSMARK: WakeUp by an address mark
phungductung 0:e87aa4c49e95 415 * @note If the user resorts to idle line detection wake up, the Address parameter
phungductung 0:e87aa4c49e95 416 * is useless and ignored by the initialization function.
phungductung 0:e87aa4c49e95 417 * @note If the user resorts to address mark wake up, the address length detection
phungductung 0:e87aa4c49e95 418 * is configured by default to 4 bits only. For the UART to be able to
phungductung 0:e87aa4c49e95 419 * manage 6-, 7- or 8-bit long addresses detection
phungductung 0:e87aa4c49e95 420 * @retval HAL status
phungductung 0:e87aa4c49e95 421 */
phungductung 0:e87aa4c49e95 422 HAL_StatusTypeDef HAL_MultiProcessor_Init(UART_HandleTypeDef *huart, uint8_t Address, uint32_t WakeUpMethod)
phungductung 0:e87aa4c49e95 423 {
phungductung 0:e87aa4c49e95 424 /* Check the UART handle allocation */
phungductung 0:e87aa4c49e95 425 if(huart == NULL)
phungductung 0:e87aa4c49e95 426 {
phungductung 0:e87aa4c49e95 427 return HAL_ERROR;
phungductung 0:e87aa4c49e95 428 }
phungductung 0:e87aa4c49e95 429
phungductung 0:e87aa4c49e95 430 /* Check the wake up method parameter */
phungductung 0:e87aa4c49e95 431 assert_param(IS_UART_WAKEUPMETHOD(WakeUpMethod));
phungductung 0:e87aa4c49e95 432
phungductung 0:e87aa4c49e95 433 if(huart->State == HAL_UART_STATE_RESET)
phungductung 0:e87aa4c49e95 434 {
phungductung 0:e87aa4c49e95 435 /* Allocate lock resource and initialize it */
phungductung 0:e87aa4c49e95 436 huart->Lock = HAL_UNLOCKED;
phungductung 0:e87aa4c49e95 437 /* Init the low level hardware : GPIO, CLOCK */
phungductung 0:e87aa4c49e95 438 HAL_UART_MspInit(huart);
phungductung 0:e87aa4c49e95 439 }
phungductung 0:e87aa4c49e95 440
phungductung 0:e87aa4c49e95 441 huart->State = HAL_UART_STATE_BUSY;
phungductung 0:e87aa4c49e95 442
phungductung 0:e87aa4c49e95 443 /* Disable the Peripheral */
phungductung 0:e87aa4c49e95 444 __HAL_UART_DISABLE(huart);
phungductung 0:e87aa4c49e95 445
phungductung 0:e87aa4c49e95 446 /* Set the UART Communication parameters */
phungductung 0:e87aa4c49e95 447 if (UART_SetConfig(huart) == HAL_ERROR)
phungductung 0:e87aa4c49e95 448 {
phungductung 0:e87aa4c49e95 449 return HAL_ERROR;
phungductung 0:e87aa4c49e95 450 }
phungductung 0:e87aa4c49e95 451
phungductung 0:e87aa4c49e95 452 if (huart->AdvancedInit.AdvFeatureInit != UART_ADVFEATURE_NO_INIT)
phungductung 0:e87aa4c49e95 453 {
phungductung 0:e87aa4c49e95 454 UART_AdvFeatureConfig(huart);
phungductung 0:e87aa4c49e95 455 }
phungductung 0:e87aa4c49e95 456
phungductung 0:e87aa4c49e95 457 /* In multiprocessor mode, the following bits must be kept cleared:
phungductung 0:e87aa4c49e95 458 - LINEN and CLKEN bits in the USART_CR2 register,
phungductung 0:e87aa4c49e95 459 - SCEN, HDSEL and IREN bits in the USART_CR3 register. */
phungductung 0:e87aa4c49e95 460 huart->Instance->CR2 &= ~(USART_CR2_LINEN | USART_CR2_CLKEN);
phungductung 0:e87aa4c49e95 461 huart->Instance->CR3 &= ~(USART_CR3_SCEN | USART_CR3_HDSEL | USART_CR3_IREN);
phungductung 0:e87aa4c49e95 462
phungductung 0:e87aa4c49e95 463 if (WakeUpMethod == UART_WAKEUPMETHOD_ADDRESSMARK)
phungductung 0:e87aa4c49e95 464 {
phungductung 0:e87aa4c49e95 465 /* If address mark wake up method is chosen, set the USART address node */
phungductung 0:e87aa4c49e95 466 MODIFY_REG(huart->Instance->CR2, USART_CR2_ADD, ((uint32_t)Address << UART_CR2_ADDRESS_LSB_POS));
phungductung 0:e87aa4c49e95 467 }
phungductung 0:e87aa4c49e95 468
phungductung 0:e87aa4c49e95 469 /* Set the wake up method by setting the WAKE bit in the CR1 register */
phungductung 0:e87aa4c49e95 470 MODIFY_REG(huart->Instance->CR1, USART_CR1_WAKE, WakeUpMethod);
phungductung 0:e87aa4c49e95 471
phungductung 0:e87aa4c49e95 472 /* Enable the Peripheral */
phungductung 0:e87aa4c49e95 473 __HAL_UART_ENABLE(huart);
phungductung 0:e87aa4c49e95 474
phungductung 0:e87aa4c49e95 475 /* TEACK and/or REACK to check before moving huart->State to Ready */
phungductung 0:e87aa4c49e95 476 return (UART_CheckIdleState(huart));
phungductung 0:e87aa4c49e95 477 }
phungductung 0:e87aa4c49e95 478
phungductung 0:e87aa4c49e95 479
phungductung 0:e87aa4c49e95 480
phungductung 0:e87aa4c49e95 481
phungductung 0:e87aa4c49e95 482 /**
phungductung 0:e87aa4c49e95 483 * @brief DeInitializes the UART peripheral
phungductung 0:e87aa4c49e95 484 * @param huart: uart handle
phungductung 0:e87aa4c49e95 485 * @retval HAL status
phungductung 0:e87aa4c49e95 486 */
phungductung 0:e87aa4c49e95 487 HAL_StatusTypeDef HAL_UART_DeInit(UART_HandleTypeDef *huart)
phungductung 0:e87aa4c49e95 488 {
phungductung 0:e87aa4c49e95 489 /* Check the UART handle allocation */
phungductung 0:e87aa4c49e95 490 if(huart == NULL)
phungductung 0:e87aa4c49e95 491 {
phungductung 0:e87aa4c49e95 492 return HAL_ERROR;
phungductung 0:e87aa4c49e95 493 }
phungductung 0:e87aa4c49e95 494
phungductung 0:e87aa4c49e95 495 /* Check the parameters */
phungductung 0:e87aa4c49e95 496 assert_param(IS_UART_INSTANCE(huart->Instance));
phungductung 0:e87aa4c49e95 497
phungductung 0:e87aa4c49e95 498 huart->State = HAL_UART_STATE_BUSY;
phungductung 0:e87aa4c49e95 499
phungductung 0:e87aa4c49e95 500 /* Disable the Peripheral */
phungductung 0:e87aa4c49e95 501 __HAL_UART_DISABLE(huart);
phungductung 0:e87aa4c49e95 502
phungductung 0:e87aa4c49e95 503 huart->Instance->CR1 = 0x0;
phungductung 0:e87aa4c49e95 504 huart->Instance->CR2 = 0x0;
phungductung 0:e87aa4c49e95 505 huart->Instance->CR3 = 0x0;
phungductung 0:e87aa4c49e95 506
phungductung 0:e87aa4c49e95 507 /* DeInit the low level hardware */
phungductung 0:e87aa4c49e95 508 HAL_UART_MspDeInit(huart);
phungductung 0:e87aa4c49e95 509
phungductung 0:e87aa4c49e95 510 huart->ErrorCode = HAL_UART_ERROR_NONE;
phungductung 0:e87aa4c49e95 511 huart->State = HAL_UART_STATE_RESET;
phungductung 0:e87aa4c49e95 512
phungductung 0:e87aa4c49e95 513 /* Process Unlock */
phungductung 0:e87aa4c49e95 514 __HAL_UNLOCK(huart);
phungductung 0:e87aa4c49e95 515
phungductung 0:e87aa4c49e95 516 return HAL_OK;
phungductung 0:e87aa4c49e95 517 }
phungductung 0:e87aa4c49e95 518
phungductung 0:e87aa4c49e95 519 /**
phungductung 0:e87aa4c49e95 520 * @brief UART MSP Init
phungductung 0:e87aa4c49e95 521 * @param huart: uart handle
phungductung 0:e87aa4c49e95 522 * @retval None
phungductung 0:e87aa4c49e95 523 */
phungductung 0:e87aa4c49e95 524 __weak void HAL_UART_MspInit(UART_HandleTypeDef *huart)
phungductung 0:e87aa4c49e95 525 {
phungductung 0:e87aa4c49e95 526 /* Prevent unused argument(s) compilation warning */
phungductung 0:e87aa4c49e95 527 UNUSED(huart);
phungductung 0:e87aa4c49e95 528
phungductung 0:e87aa4c49e95 529 /* NOTE : This function should not be modified, when the callback is needed,
phungductung 0:e87aa4c49e95 530 the HAL_UART_MspInit can be implemented in the user file
phungductung 0:e87aa4c49e95 531 */
phungductung 0:e87aa4c49e95 532 }
phungductung 0:e87aa4c49e95 533
phungductung 0:e87aa4c49e95 534 /**
phungductung 0:e87aa4c49e95 535 * @brief UART MSP DeInit
phungductung 0:e87aa4c49e95 536 * @param huart: uart handle
phungductung 0:e87aa4c49e95 537 * @retval None
phungductung 0:e87aa4c49e95 538 */
phungductung 0:e87aa4c49e95 539 __weak void HAL_UART_MspDeInit(UART_HandleTypeDef *huart)
phungductung 0:e87aa4c49e95 540 {
phungductung 0:e87aa4c49e95 541 /* Prevent unused argument(s) compilation warning */
phungductung 0:e87aa4c49e95 542 UNUSED(huart);
phungductung 0:e87aa4c49e95 543
phungductung 0:e87aa4c49e95 544 /* NOTE : This function should not be modified, when the callback is needed,
phungductung 0:e87aa4c49e95 545 the HAL_UART_MspDeInit can be implemented in the user file
phungductung 0:e87aa4c49e95 546 */
phungductung 0:e87aa4c49e95 547 }
phungductung 0:e87aa4c49e95 548
phungductung 0:e87aa4c49e95 549 /**
phungductung 0:e87aa4c49e95 550 * @}
phungductung 0:e87aa4c49e95 551 */
phungductung 0:e87aa4c49e95 552
phungductung 0:e87aa4c49e95 553 /** @defgroup UART_Exported_Functions_Group2 IO operation functions
phungductung 0:e87aa4c49e95 554 * @brief UART Transmit/Receive functions
phungductung 0:e87aa4c49e95 555 *
phungductung 0:e87aa4c49e95 556 @verbatim
phungductung 0:e87aa4c49e95 557 ===============================================================================
phungductung 0:e87aa4c49e95 558 ##### IO operation functions #####
phungductung 0:e87aa4c49e95 559 ===============================================================================
phungductung 0:e87aa4c49e95 560 This subsection provides a set of functions allowing to manage the UART asynchronous
phungductung 0:e87aa4c49e95 561 and Half duplex data transfers.
phungductung 0:e87aa4c49e95 562
phungductung 0:e87aa4c49e95 563 (#) There are two mode of transfer:
phungductung 0:e87aa4c49e95 564 (+) Blocking mode: The communication is performed in polling mode.
phungductung 0:e87aa4c49e95 565 The HAL status of all data processing is returned by the same function
phungductung 0:e87aa4c49e95 566 after finishing transfer.
phungductung 0:e87aa4c49e95 567 (+) No-Blocking mode: The communication is performed using Interrupts
phungductung 0:e87aa4c49e95 568 or DMA, These API's return the HAL status.
phungductung 0:e87aa4c49e95 569 The end of the data processing will be indicated through the
phungductung 0:e87aa4c49e95 570 dedicated UART IRQ when using Interrupt mode or the DMA IRQ when
phungductung 0:e87aa4c49e95 571 using DMA mode.
phungductung 0:e87aa4c49e95 572 The HAL_UART_TxCpltCallback(), HAL_UART_RxCpltCallback() user callbacks
phungductung 0:e87aa4c49e95 573 will be executed respectively at the end of the transmit or Receive process
phungductung 0:e87aa4c49e95 574 The HAL_UART_ErrorCallback()user callback will be executed when a communication error is detected
phungductung 0:e87aa4c49e95 575
phungductung 0:e87aa4c49e95 576 (#) Blocking mode API's are :
phungductung 0:e87aa4c49e95 577 (+) HAL_UART_Transmit()
phungductung 0:e87aa4c49e95 578 (+) HAL_UART_Receive()
phungductung 0:e87aa4c49e95 579
phungductung 0:e87aa4c49e95 580 (#) Non-Blocking mode API's with Interrupt are :
phungductung 0:e87aa4c49e95 581 (+) HAL_UART_Transmit_IT()
phungductung 0:e87aa4c49e95 582 (+) HAL_UART_Receive_IT()
phungductung 0:e87aa4c49e95 583 (+) HAL_UART_IRQHandler()
phungductung 0:e87aa4c49e95 584 (+) UART_Transmit_IT()
phungductung 0:e87aa4c49e95 585 (+) UART_Receive_IT()
phungductung 0:e87aa4c49e95 586
phungductung 0:e87aa4c49e95 587 (#) No-Blocking mode API's with DMA are :
phungductung 0:e87aa4c49e95 588 (+) HAL_UART_Transmit_DMA()
phungductung 0:e87aa4c49e95 589 (+) HAL_UART_Receive_DMA()
phungductung 0:e87aa4c49e95 590 (+) HAL_UART_DMAPause()
phungductung 0:e87aa4c49e95 591 (+) HAL_UART_DMAResume()
phungductung 0:e87aa4c49e95 592 (+) HAL_UART_DMAStop()
phungductung 0:e87aa4c49e95 593
phungductung 0:e87aa4c49e95 594 (#) A set of Transfer Complete Callbacks are provided in No_Blocking mode:
phungductung 0:e87aa4c49e95 595 (+) HAL_UART_TxHalfCpltCallback()
phungductung 0:e87aa4c49e95 596 (+) HAL_UART_TxCpltCallback()
phungductung 0:e87aa4c49e95 597 (+) HAL_UART_RxHalfCpltCallback()
phungductung 0:e87aa4c49e95 598 (+) HAL_UART_RxCpltCallback()
phungductung 0:e87aa4c49e95 599 (+) HAL_UART_ErrorCallback()
phungductung 0:e87aa4c49e95 600
phungductung 0:e87aa4c49e95 601
phungductung 0:e87aa4c49e95 602 -@- In the Half duplex communication, it is forbidden to run the transmit
phungductung 0:e87aa4c49e95 603 and receive process in parallel, the UART state HAL_UART_STATE_BUSY_TX_RX can't be useful.
phungductung 0:e87aa4c49e95 604
phungductung 0:e87aa4c49e95 605 @endverbatim
phungductung 0:e87aa4c49e95 606 * @{
phungductung 0:e87aa4c49e95 607 */
phungductung 0:e87aa4c49e95 608
phungductung 0:e87aa4c49e95 609 /**
phungductung 0:e87aa4c49e95 610 * @brief Send an amount of data in blocking mode
phungductung 0:e87aa4c49e95 611 * @param huart: uart handle
phungductung 0:e87aa4c49e95 612 * @param pData: pointer to data buffer
phungductung 0:e87aa4c49e95 613 * @param Size: amount of data to be sent
phungductung 0:e87aa4c49e95 614 * @param Timeout : Timeout duration
phungductung 0:e87aa4c49e95 615 * @retval HAL status
phungductung 0:e87aa4c49e95 616 */
phungductung 0:e87aa4c49e95 617 HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
phungductung 0:e87aa4c49e95 618 {
phungductung 0:e87aa4c49e95 619 uint16_t* tmp;
phungductung 0:e87aa4c49e95 620
phungductung 0:e87aa4c49e95 621 if((huart->State == HAL_UART_STATE_READY) || (huart->State == HAL_UART_STATE_BUSY_RX))
phungductung 0:e87aa4c49e95 622 {
phungductung 0:e87aa4c49e95 623 if((pData == NULL ) || (Size == 0))
phungductung 0:e87aa4c49e95 624 {
phungductung 0:e87aa4c49e95 625 return HAL_ERROR;
phungductung 0:e87aa4c49e95 626 }
phungductung 0:e87aa4c49e95 627
phungductung 0:e87aa4c49e95 628 /* Process Locked */
phungductung 0:e87aa4c49e95 629 __HAL_LOCK(huart);
phungductung 0:e87aa4c49e95 630
phungductung 0:e87aa4c49e95 631 huart->ErrorCode = HAL_UART_ERROR_NONE;
phungductung 0:e87aa4c49e95 632 /* Check if a non-blocking receive process is ongoing or not */
phungductung 0:e87aa4c49e95 633 if(huart->State == HAL_UART_STATE_BUSY_RX)
phungductung 0:e87aa4c49e95 634 {
phungductung 0:e87aa4c49e95 635 huart->State = HAL_UART_STATE_BUSY_TX_RX;
phungductung 0:e87aa4c49e95 636 }
phungductung 0:e87aa4c49e95 637 else
phungductung 0:e87aa4c49e95 638 {
phungductung 0:e87aa4c49e95 639 huart->State = HAL_UART_STATE_BUSY_TX;
phungductung 0:e87aa4c49e95 640 }
phungductung 0:e87aa4c49e95 641
phungductung 0:e87aa4c49e95 642 huart->TxXferSize = Size;
phungductung 0:e87aa4c49e95 643 huart->TxXferCount = Size;
phungductung 0:e87aa4c49e95 644 while(huart->TxXferCount > 0)
phungductung 0:e87aa4c49e95 645 {
phungductung 0:e87aa4c49e95 646 huart->TxXferCount--;
phungductung 0:e87aa4c49e95 647 if(UART_WaitOnFlagUntilTimeout(huart, UART_FLAG_TXE, RESET, Timeout) != HAL_OK)
phungductung 0:e87aa4c49e95 648 {
phungductung 0:e87aa4c49e95 649 return HAL_TIMEOUT;
phungductung 0:e87aa4c49e95 650 }
phungductung 0:e87aa4c49e95 651 if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE))
phungductung 0:e87aa4c49e95 652 {
phungductung 0:e87aa4c49e95 653 tmp = (uint16_t*) pData;
phungductung 0:e87aa4c49e95 654 huart->Instance->TDR = (*tmp & (uint16_t)0x01FF);
phungductung 0:e87aa4c49e95 655 pData += 2;
phungductung 0:e87aa4c49e95 656 }
phungductung 0:e87aa4c49e95 657 else
phungductung 0:e87aa4c49e95 658 {
phungductung 0:e87aa4c49e95 659 huart->Instance->TDR = (*pData++ & (uint8_t)0xFF);
phungductung 0:e87aa4c49e95 660 }
phungductung 0:e87aa4c49e95 661 }
phungductung 0:e87aa4c49e95 662 if(UART_WaitOnFlagUntilTimeout(huart, UART_FLAG_TC, RESET, Timeout) != HAL_OK)
phungductung 0:e87aa4c49e95 663 {
phungductung 0:e87aa4c49e95 664 return HAL_TIMEOUT;
phungductung 0:e87aa4c49e95 665 }
phungductung 0:e87aa4c49e95 666 /* Check if a non-blocking receive Process is ongoing or not */
phungductung 0:e87aa4c49e95 667 if(huart->State == HAL_UART_STATE_BUSY_TX_RX)
phungductung 0:e87aa4c49e95 668 {
phungductung 0:e87aa4c49e95 669 huart->State = HAL_UART_STATE_BUSY_RX;
phungductung 0:e87aa4c49e95 670 }
phungductung 0:e87aa4c49e95 671 else
phungductung 0:e87aa4c49e95 672 {
phungductung 0:e87aa4c49e95 673 huart->State = HAL_UART_STATE_READY;
phungductung 0:e87aa4c49e95 674 }
phungductung 0:e87aa4c49e95 675
phungductung 0:e87aa4c49e95 676 /* Process Unlocked */
phungductung 0:e87aa4c49e95 677 __HAL_UNLOCK(huart);
phungductung 0:e87aa4c49e95 678
phungductung 0:e87aa4c49e95 679 return HAL_OK;
phungductung 0:e87aa4c49e95 680 }
phungductung 0:e87aa4c49e95 681 else
phungductung 0:e87aa4c49e95 682 {
phungductung 0:e87aa4c49e95 683 return HAL_BUSY;
phungductung 0:e87aa4c49e95 684 }
phungductung 0:e87aa4c49e95 685 }
phungductung 0:e87aa4c49e95 686
phungductung 0:e87aa4c49e95 687 /**
phungductung 0:e87aa4c49e95 688 * @brief Receive an amount of data in blocking mode
phungductung 0:e87aa4c49e95 689 * @param huart: uart handle
phungductung 0:e87aa4c49e95 690 * @param pData: pointer to data buffer
phungductung 0:e87aa4c49e95 691 * @param Size: amount of data to be received
phungductung 0:e87aa4c49e95 692 * @param Timeout : Timeout duration
phungductung 0:e87aa4c49e95 693 * @retval HAL status
phungductung 0:e87aa4c49e95 694 */
phungductung 0:e87aa4c49e95 695 HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
phungductung 0:e87aa4c49e95 696 {
phungductung 0:e87aa4c49e95 697 uint16_t* tmp;
phungductung 0:e87aa4c49e95 698 uint16_t uhMask;
phungductung 0:e87aa4c49e95 699
phungductung 0:e87aa4c49e95 700 if((huart->State == HAL_UART_STATE_READY) || (huart->State == HAL_UART_STATE_BUSY_TX))
phungductung 0:e87aa4c49e95 701 {
phungductung 0:e87aa4c49e95 702 if((pData == NULL ) || (Size == 0))
phungductung 0:e87aa4c49e95 703 {
phungductung 0:e87aa4c49e95 704 return HAL_ERROR;
phungductung 0:e87aa4c49e95 705 }
phungductung 0:e87aa4c49e95 706
phungductung 0:e87aa4c49e95 707 /* Process Locked */
phungductung 0:e87aa4c49e95 708 __HAL_LOCK(huart);
phungductung 0:e87aa4c49e95 709
phungductung 0:e87aa4c49e95 710 huart->ErrorCode = HAL_UART_ERROR_NONE;
phungductung 0:e87aa4c49e95 711 /* Check if a non-blocking transmit process is ongoing or not */
phungductung 0:e87aa4c49e95 712 if(huart->State == HAL_UART_STATE_BUSY_TX)
phungductung 0:e87aa4c49e95 713 {
phungductung 0:e87aa4c49e95 714 huart->State = HAL_UART_STATE_BUSY_TX_RX;
phungductung 0:e87aa4c49e95 715 }
phungductung 0:e87aa4c49e95 716 else
phungductung 0:e87aa4c49e95 717 {
phungductung 0:e87aa4c49e95 718 huart->State = HAL_UART_STATE_BUSY_RX;
phungductung 0:e87aa4c49e95 719 }
phungductung 0:e87aa4c49e95 720
phungductung 0:e87aa4c49e95 721 huart->RxXferSize = Size;
phungductung 0:e87aa4c49e95 722 huart->RxXferCount = Size;
phungductung 0:e87aa4c49e95 723
phungductung 0:e87aa4c49e95 724 /* Computation of UART mask to apply to RDR register */
phungductung 0:e87aa4c49e95 725 UART_MASK_COMPUTATION(huart);
phungductung 0:e87aa4c49e95 726 uhMask = huart->Mask;
phungductung 0:e87aa4c49e95 727
phungductung 0:e87aa4c49e95 728 /* as long as data have to be received */
phungductung 0:e87aa4c49e95 729 while(huart->RxXferCount > 0)
phungductung 0:e87aa4c49e95 730 {
phungductung 0:e87aa4c49e95 731 huart->RxXferCount--;
phungductung 0:e87aa4c49e95 732 if(UART_WaitOnFlagUntilTimeout(huart, UART_FLAG_RXNE, RESET, Timeout) != HAL_OK)
phungductung 0:e87aa4c49e95 733 {
phungductung 0:e87aa4c49e95 734 return HAL_TIMEOUT;
phungductung 0:e87aa4c49e95 735 }
phungductung 0:e87aa4c49e95 736 if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE))
phungductung 0:e87aa4c49e95 737 {
phungductung 0:e87aa4c49e95 738 tmp = (uint16_t*) pData ;
phungductung 0:e87aa4c49e95 739 *tmp = (uint16_t)(huart->Instance->RDR & uhMask);
phungductung 0:e87aa4c49e95 740 pData +=2;
phungductung 0:e87aa4c49e95 741 }
phungductung 0:e87aa4c49e95 742 else
phungductung 0:e87aa4c49e95 743 {
phungductung 0:e87aa4c49e95 744 *pData++ = (uint8_t)(huart->Instance->RDR & (uint8_t)uhMask);
phungductung 0:e87aa4c49e95 745 }
phungductung 0:e87aa4c49e95 746 }
phungductung 0:e87aa4c49e95 747
phungductung 0:e87aa4c49e95 748 /* Check if a non-blocking transmit Process is ongoing or not */
phungductung 0:e87aa4c49e95 749 if(huart->State == HAL_UART_STATE_BUSY_TX_RX)
phungductung 0:e87aa4c49e95 750 {
phungductung 0:e87aa4c49e95 751 huart->State = HAL_UART_STATE_BUSY_TX;
phungductung 0:e87aa4c49e95 752 }
phungductung 0:e87aa4c49e95 753 else
phungductung 0:e87aa4c49e95 754 {
phungductung 0:e87aa4c49e95 755 huart->State = HAL_UART_STATE_READY;
phungductung 0:e87aa4c49e95 756 }
phungductung 0:e87aa4c49e95 757 /* Process Unlocked */
phungductung 0:e87aa4c49e95 758 __HAL_UNLOCK(huart);
phungductung 0:e87aa4c49e95 759
phungductung 0:e87aa4c49e95 760 return HAL_OK;
phungductung 0:e87aa4c49e95 761 }
phungductung 0:e87aa4c49e95 762 else
phungductung 0:e87aa4c49e95 763 {
phungductung 0:e87aa4c49e95 764 return HAL_BUSY;
phungductung 0:e87aa4c49e95 765 }
phungductung 0:e87aa4c49e95 766 }
phungductung 0:e87aa4c49e95 767
phungductung 0:e87aa4c49e95 768 /**
phungductung 0:e87aa4c49e95 769 * @brief Send an amount of data in interrupt mode
phungductung 0:e87aa4c49e95 770 * @param huart: uart handle
phungductung 0:e87aa4c49e95 771 * @param pData: pointer to data buffer
phungductung 0:e87aa4c49e95 772 * @param Size: amount of data to be sent
phungductung 0:e87aa4c49e95 773 * @retval HAL status
phungductung 0:e87aa4c49e95 774 */
phungductung 0:e87aa4c49e95 775 HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
phungductung 0:e87aa4c49e95 776 {
phungductung 0:e87aa4c49e95 777 if((huart->State == HAL_UART_STATE_READY) || (huart->State == HAL_UART_STATE_BUSY_RX))
phungductung 0:e87aa4c49e95 778 {
phungductung 0:e87aa4c49e95 779 if((pData == NULL ) || (Size == 0))
phungductung 0:e87aa4c49e95 780 {
phungductung 0:e87aa4c49e95 781 return HAL_ERROR;
phungductung 0:e87aa4c49e95 782 }
phungductung 0:e87aa4c49e95 783
phungductung 0:e87aa4c49e95 784 /* Process Locked */
phungductung 0:e87aa4c49e95 785 __HAL_LOCK(huart);
phungductung 0:e87aa4c49e95 786
phungductung 0:e87aa4c49e95 787 huart->pTxBuffPtr = pData;
phungductung 0:e87aa4c49e95 788 huart->TxXferSize = Size;
phungductung 0:e87aa4c49e95 789 huart->TxXferCount = Size;
phungductung 0:e87aa4c49e95 790
phungductung 0:e87aa4c49e95 791 huart->ErrorCode = HAL_UART_ERROR_NONE;
phungductung 0:e87aa4c49e95 792 /* Check if a receive process is ongoing or not */
phungductung 0:e87aa4c49e95 793 if(huart->State == HAL_UART_STATE_BUSY_RX)
phungductung 0:e87aa4c49e95 794 {
phungductung 0:e87aa4c49e95 795 huart->State = HAL_UART_STATE_BUSY_TX_RX;
phungductung 0:e87aa4c49e95 796 }
phungductung 0:e87aa4c49e95 797 else
phungductung 0:e87aa4c49e95 798 {
phungductung 0:e87aa4c49e95 799 huart->State = HAL_UART_STATE_BUSY_TX;
phungductung 0:e87aa4c49e95 800 }
phungductung 0:e87aa4c49e95 801
phungductung 0:e87aa4c49e95 802 /* Enable the UART Error Interrupt: (Frame error, noise error, overrun error) */
phungductung 0:e87aa4c49e95 803 __HAL_UART_ENABLE_IT(huart, UART_IT_ERR);
phungductung 0:e87aa4c49e95 804
phungductung 0:e87aa4c49e95 805 /* Process Unlocked */
phungductung 0:e87aa4c49e95 806 __HAL_UNLOCK(huart);
phungductung 0:e87aa4c49e95 807
phungductung 0:e87aa4c49e95 808 /* Enable the UART Transmit Data Register Empty Interrupt */
phungductung 0:e87aa4c49e95 809 __HAL_UART_ENABLE_IT(huart, UART_IT_TXE);
phungductung 0:e87aa4c49e95 810
phungductung 0:e87aa4c49e95 811 return HAL_OK;
phungductung 0:e87aa4c49e95 812 }
phungductung 0:e87aa4c49e95 813 else
phungductung 0:e87aa4c49e95 814 {
phungductung 0:e87aa4c49e95 815 return HAL_BUSY;
phungductung 0:e87aa4c49e95 816 }
phungductung 0:e87aa4c49e95 817 }
phungductung 0:e87aa4c49e95 818
phungductung 0:e87aa4c49e95 819 /**
phungductung 0:e87aa4c49e95 820 * @brief Receive an amount of data in interrupt mode
phungductung 0:e87aa4c49e95 821 * @param huart: uart handle
phungductung 0:e87aa4c49e95 822 * @param pData: pointer to data buffer
phungductung 0:e87aa4c49e95 823 * @param Size: amount of data to be received
phungductung 0:e87aa4c49e95 824 * @retval HAL status
phungductung 0:e87aa4c49e95 825 */
phungductung 0:e87aa4c49e95 826 HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
phungductung 0:e87aa4c49e95 827 {
phungductung 0:e87aa4c49e95 828 if((huart->State == HAL_UART_STATE_READY) || (huart->State == HAL_UART_STATE_BUSY_TX))
phungductung 0:e87aa4c49e95 829 {
phungductung 0:e87aa4c49e95 830 if((pData == NULL ) || (Size == 0))
phungductung 0:e87aa4c49e95 831 {
phungductung 0:e87aa4c49e95 832 return HAL_ERROR;
phungductung 0:e87aa4c49e95 833 }
phungductung 0:e87aa4c49e95 834
phungductung 0:e87aa4c49e95 835 /* Process Locked */
phungductung 0:e87aa4c49e95 836 __HAL_LOCK(huart);
phungductung 0:e87aa4c49e95 837
phungductung 0:e87aa4c49e95 838 huart->pRxBuffPtr = pData;
phungductung 0:e87aa4c49e95 839 huart->RxXferSize = Size;
phungductung 0:e87aa4c49e95 840 huart->RxXferCount = Size;
phungductung 0:e87aa4c49e95 841
phungductung 0:e87aa4c49e95 842 /* Computation of UART mask to apply to RDR register */
phungductung 0:e87aa4c49e95 843 UART_MASK_COMPUTATION(huart);
phungductung 0:e87aa4c49e95 844
phungductung 0:e87aa4c49e95 845 huart->ErrorCode = HAL_UART_ERROR_NONE;
phungductung 0:e87aa4c49e95 846 /* Check if a transmit process is ongoing or not */
phungductung 0:e87aa4c49e95 847 if(huart->State == HAL_UART_STATE_BUSY_TX)
phungductung 0:e87aa4c49e95 848 {
phungductung 0:e87aa4c49e95 849 huart->State = HAL_UART_STATE_BUSY_TX_RX;
phungductung 0:e87aa4c49e95 850 }
phungductung 0:e87aa4c49e95 851 else
phungductung 0:e87aa4c49e95 852 {
phungductung 0:e87aa4c49e95 853 huart->State = HAL_UART_STATE_BUSY_RX;
phungductung 0:e87aa4c49e95 854 }
phungductung 0:e87aa4c49e95 855
phungductung 0:e87aa4c49e95 856 /* Enable the UART Parity Error Interrupt */
phungductung 0:e87aa4c49e95 857 __HAL_UART_ENABLE_IT(huart, UART_IT_PE);
phungductung 0:e87aa4c49e95 858
phungductung 0:e87aa4c49e95 859 /* Enable the UART Error Interrupt: (Frame error, noise error, overrun error) */
phungductung 0:e87aa4c49e95 860 __HAL_UART_ENABLE_IT(huart, UART_IT_ERR);
phungductung 0:e87aa4c49e95 861
phungductung 0:e87aa4c49e95 862 /* Process Unlocked */
phungductung 0:e87aa4c49e95 863 __HAL_UNLOCK(huart);
phungductung 0:e87aa4c49e95 864
phungductung 0:e87aa4c49e95 865 /* Enable the UART Data Register not empty Interrupt */
phungductung 0:e87aa4c49e95 866 __HAL_UART_ENABLE_IT(huart, UART_IT_RXNE);
phungductung 0:e87aa4c49e95 867
phungductung 0:e87aa4c49e95 868 return HAL_OK;
phungductung 0:e87aa4c49e95 869 }
phungductung 0:e87aa4c49e95 870 else
phungductung 0:e87aa4c49e95 871 {
phungductung 0:e87aa4c49e95 872 return HAL_BUSY;
phungductung 0:e87aa4c49e95 873 }
phungductung 0:e87aa4c49e95 874 }
phungductung 0:e87aa4c49e95 875
phungductung 0:e87aa4c49e95 876 /**
phungductung 0:e87aa4c49e95 877 * @brief Send an amount of data in DMA mode
phungductung 0:e87aa4c49e95 878 * @param huart: uart handle
phungductung 0:e87aa4c49e95 879 * @param pData: pointer to data buffer
phungductung 0:e87aa4c49e95 880 * @param Size: amount of data to be sent
phungductung 0:e87aa4c49e95 881 * @retval HAL status
phungductung 0:e87aa4c49e95 882 */
phungductung 0:e87aa4c49e95 883 HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
phungductung 0:e87aa4c49e95 884 {
phungductung 0:e87aa4c49e95 885 uint32_t *tmp;
phungductung 0:e87aa4c49e95 886
phungductung 0:e87aa4c49e95 887 if((huart->State == HAL_UART_STATE_READY) || (huart->State == HAL_UART_STATE_BUSY_RX))
phungductung 0:e87aa4c49e95 888 {
phungductung 0:e87aa4c49e95 889 if((pData == NULL ) || (Size == 0))
phungductung 0:e87aa4c49e95 890 {
phungductung 0:e87aa4c49e95 891 return HAL_ERROR;
phungductung 0:e87aa4c49e95 892 }
phungductung 0:e87aa4c49e95 893
phungductung 0:e87aa4c49e95 894 /* Process Locked */
phungductung 0:e87aa4c49e95 895 __HAL_LOCK(huart);
phungductung 0:e87aa4c49e95 896
phungductung 0:e87aa4c49e95 897 huart->pTxBuffPtr = pData;
phungductung 0:e87aa4c49e95 898 huart->TxXferSize = Size;
phungductung 0:e87aa4c49e95 899 huart->TxXferCount = Size;
phungductung 0:e87aa4c49e95 900
phungductung 0:e87aa4c49e95 901 huart->ErrorCode = HAL_UART_ERROR_NONE;
phungductung 0:e87aa4c49e95 902 /* Check if a receive process is ongoing or not */
phungductung 0:e87aa4c49e95 903 if(huart->State == HAL_UART_STATE_BUSY_RX)
phungductung 0:e87aa4c49e95 904 {
phungductung 0:e87aa4c49e95 905 huart->State = HAL_UART_STATE_BUSY_TX_RX;
phungductung 0:e87aa4c49e95 906 }
phungductung 0:e87aa4c49e95 907 else
phungductung 0:e87aa4c49e95 908 {
phungductung 0:e87aa4c49e95 909 huart->State = HAL_UART_STATE_BUSY_TX;
phungductung 0:e87aa4c49e95 910 }
phungductung 0:e87aa4c49e95 911
phungductung 0:e87aa4c49e95 912 /* Set the UART DMA transfer complete callback */
phungductung 0:e87aa4c49e95 913 huart->hdmatx->XferCpltCallback = UART_DMATransmitCplt;
phungductung 0:e87aa4c49e95 914
phungductung 0:e87aa4c49e95 915 /* Set the UART DMA Half transfer complete callback */
phungductung 0:e87aa4c49e95 916 huart->hdmatx->XferHalfCpltCallback = UART_DMATxHalfCplt;
phungductung 0:e87aa4c49e95 917
phungductung 0:e87aa4c49e95 918 /* Set the DMA error callback */
phungductung 0:e87aa4c49e95 919 huart->hdmatx->XferErrorCallback = UART_DMAError;
phungductung 0:e87aa4c49e95 920
phungductung 0:e87aa4c49e95 921 /* Enable the UART transmit DMA channel */
phungductung 0:e87aa4c49e95 922 tmp = (uint32_t*)&pData;
phungductung 0:e87aa4c49e95 923 HAL_DMA_Start_IT(huart->hdmatx, *(uint32_t*)tmp, (uint32_t)&huart->Instance->TDR, Size);
phungductung 0:e87aa4c49e95 924
phungductung 0:e87aa4c49e95 925 /* Clear the TC flag in the SR register by writing 0 to it */
phungductung 0:e87aa4c49e95 926 __HAL_UART_CLEAR_IT(huart, UART_FLAG_TC);
phungductung 0:e87aa4c49e95 927
phungductung 0:e87aa4c49e95 928
phungductung 0:e87aa4c49e95 929 /* Enable the DMA transfer for transmit request by setting the DMAT bit
phungductung 0:e87aa4c49e95 930 in the UART CR3 register */
phungductung 0:e87aa4c49e95 931 huart->Instance->CR3 |= USART_CR3_DMAT;
phungductung 0:e87aa4c49e95 932
phungductung 0:e87aa4c49e95 933 /* Process Unlocked */
phungductung 0:e87aa4c49e95 934 __HAL_UNLOCK(huart);
phungductung 0:e87aa4c49e95 935
phungductung 0:e87aa4c49e95 936 return HAL_OK;
phungductung 0:e87aa4c49e95 937 }
phungductung 0:e87aa4c49e95 938 else
phungductung 0:e87aa4c49e95 939 {
phungductung 0:e87aa4c49e95 940 return HAL_BUSY;
phungductung 0:e87aa4c49e95 941 }
phungductung 0:e87aa4c49e95 942 }
phungductung 0:e87aa4c49e95 943
phungductung 0:e87aa4c49e95 944 /**
phungductung 0:e87aa4c49e95 945 * @brief Receive an amount of data in DMA mode
phungductung 0:e87aa4c49e95 946 * @param huart: uart handle
phungductung 0:e87aa4c49e95 947 * @param pData: pointer to data buffer
phungductung 0:e87aa4c49e95 948 * @param Size: amount of data to be received
phungductung 0:e87aa4c49e95 949 * @note When the UART parity is enabled (PCE = 1), the received data contain
phungductung 0:e87aa4c49e95 950 * the parity bit (MSB position)
phungductung 0:e87aa4c49e95 951 * @retval HAL status
phungductung 0:e87aa4c49e95 952 */
phungductung 0:e87aa4c49e95 953 HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
phungductung 0:e87aa4c49e95 954 {
phungductung 0:e87aa4c49e95 955 uint32_t *tmp;
phungductung 0:e87aa4c49e95 956
phungductung 0:e87aa4c49e95 957 if((huart->State == HAL_UART_STATE_READY) || (huart->State == HAL_UART_STATE_BUSY_TX))
phungductung 0:e87aa4c49e95 958 {
phungductung 0:e87aa4c49e95 959 if((pData == NULL ) || (Size == 0))
phungductung 0:e87aa4c49e95 960 {
phungductung 0:e87aa4c49e95 961 return HAL_ERROR;
phungductung 0:e87aa4c49e95 962 }
phungductung 0:e87aa4c49e95 963
phungductung 0:e87aa4c49e95 964 /* Process Locked */
phungductung 0:e87aa4c49e95 965 __HAL_LOCK(huart);
phungductung 0:e87aa4c49e95 966
phungductung 0:e87aa4c49e95 967 huart->pRxBuffPtr = pData;
phungductung 0:e87aa4c49e95 968 huart->RxXferSize = Size;
phungductung 0:e87aa4c49e95 969
phungductung 0:e87aa4c49e95 970 huart->ErrorCode = HAL_UART_ERROR_NONE;
phungductung 0:e87aa4c49e95 971 /* Check if a transmit process is ongoing or not */
phungductung 0:e87aa4c49e95 972 if(huart->State == HAL_UART_STATE_BUSY_TX)
phungductung 0:e87aa4c49e95 973 {
phungductung 0:e87aa4c49e95 974 huart->State = HAL_UART_STATE_BUSY_TX_RX;
phungductung 0:e87aa4c49e95 975 }
phungductung 0:e87aa4c49e95 976 else
phungductung 0:e87aa4c49e95 977 {
phungductung 0:e87aa4c49e95 978 huart->State = HAL_UART_STATE_BUSY_RX;
phungductung 0:e87aa4c49e95 979 }
phungductung 0:e87aa4c49e95 980
phungductung 0:e87aa4c49e95 981 /* Set the UART DMA transfer complete callback */
phungductung 0:e87aa4c49e95 982 huart->hdmarx->XferCpltCallback = UART_DMAReceiveCplt;
phungductung 0:e87aa4c49e95 983
phungductung 0:e87aa4c49e95 984 /* Set the UART DMA Half transfer complete callback */
phungductung 0:e87aa4c49e95 985 huart->hdmarx->XferHalfCpltCallback = UART_DMARxHalfCplt;
phungductung 0:e87aa4c49e95 986
phungductung 0:e87aa4c49e95 987 /* Set the DMA error callback */
phungductung 0:e87aa4c49e95 988 huart->hdmarx->XferErrorCallback = UART_DMAError;
phungductung 0:e87aa4c49e95 989
phungductung 0:e87aa4c49e95 990 /* Enable the DMA channel */
phungductung 0:e87aa4c49e95 991 tmp = (uint32_t*)&pData;
phungductung 0:e87aa4c49e95 992 HAL_DMA_Start_IT(huart->hdmarx, (uint32_t)&huart->Instance->RDR, *(uint32_t*)tmp, Size);
phungductung 0:e87aa4c49e95 993
phungductung 0:e87aa4c49e95 994 /* Enable the DMA transfer for the receiver request by setting the DMAR bit
phungductung 0:e87aa4c49e95 995 in the UART CR3 register */
phungductung 0:e87aa4c49e95 996 huart->Instance->CR3 |= USART_CR3_DMAR;
phungductung 0:e87aa4c49e95 997
phungductung 0:e87aa4c49e95 998 /* Process Unlocked */
phungductung 0:e87aa4c49e95 999 __HAL_UNLOCK(huart);
phungductung 0:e87aa4c49e95 1000
phungductung 0:e87aa4c49e95 1001 return HAL_OK;
phungductung 0:e87aa4c49e95 1002 }
phungductung 0:e87aa4c49e95 1003 else
phungductung 0:e87aa4c49e95 1004 {
phungductung 0:e87aa4c49e95 1005 return HAL_BUSY;
phungductung 0:e87aa4c49e95 1006 }
phungductung 0:e87aa4c49e95 1007 }
phungductung 0:e87aa4c49e95 1008
phungductung 0:e87aa4c49e95 1009 /**
phungductung 0:e87aa4c49e95 1010 * @brief Pauses the DMA Transfer.
phungductung 0:e87aa4c49e95 1011 * @param huart: UART handle
phungductung 0:e87aa4c49e95 1012 * @retval None
phungductung 0:e87aa4c49e95 1013 */
phungductung 0:e87aa4c49e95 1014 HAL_StatusTypeDef HAL_UART_DMAPause(UART_HandleTypeDef *huart)
phungductung 0:e87aa4c49e95 1015 {
phungductung 0:e87aa4c49e95 1016 /* Process Locked */
phungductung 0:e87aa4c49e95 1017 __HAL_LOCK(huart);
phungductung 0:e87aa4c49e95 1018
phungductung 0:e87aa4c49e95 1019 if(huart->State == HAL_UART_STATE_BUSY_TX)
phungductung 0:e87aa4c49e95 1020 {
phungductung 0:e87aa4c49e95 1021 /* Disable the UART DMA Tx request */
phungductung 0:e87aa4c49e95 1022 huart->Instance->CR3 &= (uint32_t)(~USART_CR3_DMAT);
phungductung 0:e87aa4c49e95 1023 }
phungductung 0:e87aa4c49e95 1024 else if(huart->State == HAL_UART_STATE_BUSY_RX)
phungductung 0:e87aa4c49e95 1025 {
phungductung 0:e87aa4c49e95 1026 /* Disable the UART DMA Rx request */
phungductung 0:e87aa4c49e95 1027 huart->Instance->CR3 &= (uint32_t)(~USART_CR3_DMAR);
phungductung 0:e87aa4c49e95 1028 }
phungductung 0:e87aa4c49e95 1029 else if(huart->State == HAL_UART_STATE_BUSY_TX_RX)
phungductung 0:e87aa4c49e95 1030 {
phungductung 0:e87aa4c49e95 1031 /* Disable the UART DMA Tx request */
phungductung 0:e87aa4c49e95 1032 huart->Instance->CR3 &= (uint32_t)(~USART_CR3_DMAT);
phungductung 0:e87aa4c49e95 1033 /* Disable the UART DMA Rx request */
phungductung 0:e87aa4c49e95 1034 huart->Instance->CR3 &= (uint32_t)(~USART_CR3_DMAR);
phungductung 0:e87aa4c49e95 1035 }
phungductung 0:e87aa4c49e95 1036
phungductung 0:e87aa4c49e95 1037 /* Process Unlocked */
phungductung 0:e87aa4c49e95 1038 __HAL_UNLOCK(huart);
phungductung 0:e87aa4c49e95 1039
phungductung 0:e87aa4c49e95 1040 return HAL_OK;
phungductung 0:e87aa4c49e95 1041 }
phungductung 0:e87aa4c49e95 1042
phungductung 0:e87aa4c49e95 1043 /**
phungductung 0:e87aa4c49e95 1044 * @brief Resumes the DMA Transfer.
phungductung 0:e87aa4c49e95 1045 * @param huart: UART handle
phungductung 0:e87aa4c49e95 1046 * @retval None
phungductung 0:e87aa4c49e95 1047 */
phungductung 0:e87aa4c49e95 1048 HAL_StatusTypeDef HAL_UART_DMAResume(UART_HandleTypeDef *huart)
phungductung 0:e87aa4c49e95 1049 {
phungductung 0:e87aa4c49e95 1050 /* Process Locked */
phungductung 0:e87aa4c49e95 1051 __HAL_LOCK(huart);
phungductung 0:e87aa4c49e95 1052
phungductung 0:e87aa4c49e95 1053 if(huart->State == HAL_UART_STATE_BUSY_TX)
phungductung 0:e87aa4c49e95 1054 {
phungductung 0:e87aa4c49e95 1055 /* Enable the UART DMA Tx request */
phungductung 0:e87aa4c49e95 1056 huart->Instance->CR3 |= USART_CR3_DMAT;
phungductung 0:e87aa4c49e95 1057 }
phungductung 0:e87aa4c49e95 1058 else if(huart->State == HAL_UART_STATE_BUSY_RX)
phungductung 0:e87aa4c49e95 1059 {
phungductung 0:e87aa4c49e95 1060 /* Clear the Overrun flag before resuming the Rx transfer*/
phungductung 0:e87aa4c49e95 1061 __HAL_UART_CLEAR_IT(huart, UART_CLEAR_OREF);
phungductung 0:e87aa4c49e95 1062
phungductung 0:e87aa4c49e95 1063 /* Enable the UART DMA Rx request */
phungductung 0:e87aa4c49e95 1064 huart->Instance->CR3 |= USART_CR3_DMAR;
phungductung 0:e87aa4c49e95 1065 }
phungductung 0:e87aa4c49e95 1066 else if(huart->State == HAL_UART_STATE_BUSY_TX_RX)
phungductung 0:e87aa4c49e95 1067 {
phungductung 0:e87aa4c49e95 1068 /* Clear the Overrun flag before resuming the Rx transfer*/
phungductung 0:e87aa4c49e95 1069 __HAL_UART_CLEAR_IT(huart, UART_CLEAR_OREF);
phungductung 0:e87aa4c49e95 1070
phungductung 0:e87aa4c49e95 1071 /* Enable the UART DMA Rx request before the DMA Tx request */
phungductung 0:e87aa4c49e95 1072 huart->Instance->CR3 |= USART_CR3_DMAR;
phungductung 0:e87aa4c49e95 1073
phungductung 0:e87aa4c49e95 1074 /* Enable the UART DMA Tx request */
phungductung 0:e87aa4c49e95 1075 huart->Instance->CR3 |= USART_CR3_DMAT;
phungductung 0:e87aa4c49e95 1076 }
phungductung 0:e87aa4c49e95 1077
phungductung 0:e87aa4c49e95 1078 /* If the UART peripheral is still not enabled, enable it */
phungductung 0:e87aa4c49e95 1079 if ((huart->Instance->CR1 & USART_CR1_UE) == 0)
phungductung 0:e87aa4c49e95 1080 {
phungductung 0:e87aa4c49e95 1081 /* Enable UART peripheral */
phungductung 0:e87aa4c49e95 1082 __HAL_UART_ENABLE(huart);
phungductung 0:e87aa4c49e95 1083 }
phungductung 0:e87aa4c49e95 1084
phungductung 0:e87aa4c49e95 1085 return HAL_OK;
phungductung 0:e87aa4c49e95 1086 }
phungductung 0:e87aa4c49e95 1087
phungductung 0:e87aa4c49e95 1088 /**
phungductung 0:e87aa4c49e95 1089 * @brief Stops the DMA Transfer.
phungductung 0:e87aa4c49e95 1090 * @param huart: UART handle
phungductung 0:e87aa4c49e95 1091 * @retval None
phungductung 0:e87aa4c49e95 1092 */
phungductung 0:e87aa4c49e95 1093 HAL_StatusTypeDef HAL_UART_DMAStop(UART_HandleTypeDef *huart)
phungductung 0:e87aa4c49e95 1094 {
phungductung 0:e87aa4c49e95 1095 /* The Lock is not implemented on this API to allow the user application
phungductung 0:e87aa4c49e95 1096 to call the HAL UART API under callbacks HAL_UART_TxCpltCallback() / HAL_UART_RxCpltCallback() /
phungductung 0:e87aa4c49e95 1097 HAL_UART_TxHalfCpltCallback / HAL_UART_RxHalfCpltCallback:
phungductung 0:e87aa4c49e95 1098 indeed, when HAL_DMA_Abort() API is called, the DMA TX/RX Transfer or Half Transfer complete
phungductung 0:e87aa4c49e95 1099 interrupt is generated if the DMA transfer interruption occurs at the middle or at the end of
phungductung 0:e87aa4c49e95 1100 the stream and the corresponding call back is executed. */
phungductung 0:e87aa4c49e95 1101
phungductung 0:e87aa4c49e95 1102 /* Disable the UART Tx/Rx DMA requests */
phungductung 0:e87aa4c49e95 1103 huart->Instance->CR3 &= ~USART_CR3_DMAT;
phungductung 0:e87aa4c49e95 1104 huart->Instance->CR3 &= ~USART_CR3_DMAR;
phungductung 0:e87aa4c49e95 1105
phungductung 0:e87aa4c49e95 1106 /* Abort the UART DMA tx channel */
phungductung 0:e87aa4c49e95 1107 if(huart->hdmatx != NULL)
phungductung 0:e87aa4c49e95 1108 {
phungductung 0:e87aa4c49e95 1109 HAL_DMA_Abort(huart->hdmatx);
phungductung 0:e87aa4c49e95 1110 }
phungductung 0:e87aa4c49e95 1111 /* Abort the UART DMA rx channel */
phungductung 0:e87aa4c49e95 1112 if(huart->hdmarx != NULL)
phungductung 0:e87aa4c49e95 1113 {
phungductung 0:e87aa4c49e95 1114 HAL_DMA_Abort(huart->hdmarx);
phungductung 0:e87aa4c49e95 1115 }
phungductung 0:e87aa4c49e95 1116
phungductung 0:e87aa4c49e95 1117 huart->State = HAL_UART_STATE_READY;
phungductung 0:e87aa4c49e95 1118
phungductung 0:e87aa4c49e95 1119 return HAL_OK;
phungductung 0:e87aa4c49e95 1120 }
phungductung 0:e87aa4c49e95 1121
phungductung 0:e87aa4c49e95 1122 /**
phungductung 0:e87aa4c49e95 1123 * @brief This function handles UART interrupt request.
phungductung 0:e87aa4c49e95 1124 * @param huart: uart handle
phungductung 0:e87aa4c49e95 1125 * @retval None
phungductung 0:e87aa4c49e95 1126 */
phungductung 0:e87aa4c49e95 1127 void HAL_UART_IRQHandler(UART_HandleTypeDef *huart)
phungductung 0:e87aa4c49e95 1128 {
phungductung 0:e87aa4c49e95 1129 /* UART parity error interrupt occurred -------------------------------------*/
phungductung 0:e87aa4c49e95 1130 if((__HAL_UART_GET_IT(huart, UART_IT_PE) != RESET) && (__HAL_UART_GET_IT_SOURCE(huart, UART_IT_PE) != RESET))
phungductung 0:e87aa4c49e95 1131 {
phungductung 0:e87aa4c49e95 1132 __HAL_UART_CLEAR_PEFLAG(huart);
phungductung 0:e87aa4c49e95 1133
phungductung 0:e87aa4c49e95 1134 huart->ErrorCode |= HAL_UART_ERROR_PE;
phungductung 0:e87aa4c49e95 1135 /* Set the UART state ready to be able to start again the process */
phungductung 0:e87aa4c49e95 1136 huart->State = HAL_UART_STATE_READY;
phungductung 0:e87aa4c49e95 1137 }
phungductung 0:e87aa4c49e95 1138
phungductung 0:e87aa4c49e95 1139 /* UART frame error interrupt occurred --------------------------------------*/
phungductung 0:e87aa4c49e95 1140 if((__HAL_UART_GET_IT(huart, UART_IT_FE) != RESET) && (__HAL_UART_GET_IT_SOURCE(huart, UART_IT_ERR) != RESET))
phungductung 0:e87aa4c49e95 1141 {
phungductung 0:e87aa4c49e95 1142 __HAL_UART_CLEAR_FEFLAG(huart);
phungductung 0:e87aa4c49e95 1143
phungductung 0:e87aa4c49e95 1144 huart->ErrorCode |= HAL_UART_ERROR_FE;
phungductung 0:e87aa4c49e95 1145 /* Set the UART state ready to be able to start again the process */
phungductung 0:e87aa4c49e95 1146 huart->State = HAL_UART_STATE_READY;
phungductung 0:e87aa4c49e95 1147 }
phungductung 0:e87aa4c49e95 1148
phungductung 0:e87aa4c49e95 1149 /* UART noise error interrupt occurred --------------------------------------*/
phungductung 0:e87aa4c49e95 1150 if((__HAL_UART_GET_IT(huart, UART_IT_NE) != RESET) && (__HAL_UART_GET_IT_SOURCE(huart, UART_IT_ERR) != RESET))
phungductung 0:e87aa4c49e95 1151 {
phungductung 0:e87aa4c49e95 1152 __HAL_UART_CLEAR_NEFLAG(huart);
phungductung 0:e87aa4c49e95 1153
phungductung 0:e87aa4c49e95 1154 huart->ErrorCode |= HAL_UART_ERROR_NE;
phungductung 0:e87aa4c49e95 1155 /* Set the UART state ready to be able to start again the process */
phungductung 0:e87aa4c49e95 1156 huart->State = HAL_UART_STATE_READY;
phungductung 0:e87aa4c49e95 1157 }
phungductung 0:e87aa4c49e95 1158
phungductung 0:e87aa4c49e95 1159 /* UART Over-Run interrupt occurred -----------------------------------------*/
phungductung 0:e87aa4c49e95 1160 if((__HAL_UART_GET_IT(huart, UART_IT_ORE) != RESET) && (__HAL_UART_GET_IT_SOURCE(huart, UART_IT_ERR) != RESET))
phungductung 0:e87aa4c49e95 1161 {
phungductung 0:e87aa4c49e95 1162 __HAL_UART_CLEAR_OREFLAG(huart);
phungductung 0:e87aa4c49e95 1163
phungductung 0:e87aa4c49e95 1164 huart->ErrorCode |= HAL_UART_ERROR_ORE;
phungductung 0:e87aa4c49e95 1165 /* Set the UART state ready to be able to start again the process */
phungductung 0:e87aa4c49e95 1166 huart->State = HAL_UART_STATE_READY;
phungductung 0:e87aa4c49e95 1167 }
phungductung 0:e87aa4c49e95 1168
phungductung 0:e87aa4c49e95 1169 /* Call UART Error Call back function if need be --------------------------*/
phungductung 0:e87aa4c49e95 1170 if(huart->ErrorCode != HAL_UART_ERROR_NONE)
phungductung 0:e87aa4c49e95 1171 {
phungductung 0:e87aa4c49e95 1172 HAL_UART_ErrorCallback(huart);
phungductung 0:e87aa4c49e95 1173 }
phungductung 0:e87aa4c49e95 1174
phungductung 0:e87aa4c49e95 1175 /* UART in mode Receiver ---------------------------------------------------*/
phungductung 0:e87aa4c49e95 1176 if((__HAL_UART_GET_IT(huart, UART_IT_RXNE) != RESET) && (__HAL_UART_GET_IT_SOURCE(huart, UART_IT_RXNE) != RESET))
phungductung 0:e87aa4c49e95 1177 {
phungductung 0:e87aa4c49e95 1178 UART_Receive_IT(huart);
phungductung 0:e87aa4c49e95 1179 /* Clear RXNE interrupt flag */
phungductung 0:e87aa4c49e95 1180 __HAL_UART_SEND_REQ(huart, UART_RXDATA_FLUSH_REQUEST);
phungductung 0:e87aa4c49e95 1181 }
phungductung 0:e87aa4c49e95 1182
phungductung 0:e87aa4c49e95 1183
phungductung 0:e87aa4c49e95 1184 /* UART in mode Transmitter ------------------------------------------------*/
phungductung 0:e87aa4c49e95 1185 if((__HAL_UART_GET_IT(huart, UART_IT_TXE) != RESET) &&(__HAL_UART_GET_IT_SOURCE(huart, UART_IT_TXE) != RESET))
phungductung 0:e87aa4c49e95 1186 {
phungductung 0:e87aa4c49e95 1187 UART_Transmit_IT(huart);
phungductung 0:e87aa4c49e95 1188 }
phungductung 0:e87aa4c49e95 1189
phungductung 0:e87aa4c49e95 1190 /* UART in mode Transmitter (transmission end) -----------------------------*/
phungductung 0:e87aa4c49e95 1191 if((__HAL_UART_GET_IT(huart, UART_IT_TC) != RESET) &&(__HAL_UART_GET_IT_SOURCE(huart, UART_IT_TC) != RESET))
phungductung 0:e87aa4c49e95 1192 {
phungductung 0:e87aa4c49e95 1193 UART_EndTransmit_IT(huart);
phungductung 0:e87aa4c49e95 1194 }
phungductung 0:e87aa4c49e95 1195
phungductung 0:e87aa4c49e95 1196 }
phungductung 0:e87aa4c49e95 1197
phungductung 0:e87aa4c49e95 1198
phungductung 0:e87aa4c49e95 1199 /**
phungductung 0:e87aa4c49e95 1200 * @brief This function handles UART Communication Timeout.
phungductung 0:e87aa4c49e95 1201 * @param huart: UART handle
phungductung 0:e87aa4c49e95 1202 * @param Flag: specifies the UART flag to check.
phungductung 0:e87aa4c49e95 1203 * @param Status: The new Flag status (SET or RESET).
phungductung 0:e87aa4c49e95 1204 * @param Timeout: Timeout duration
phungductung 0:e87aa4c49e95 1205 * @retval HAL status
phungductung 0:e87aa4c49e95 1206 */
phungductung 0:e87aa4c49e95 1207 HAL_StatusTypeDef UART_WaitOnFlagUntilTimeout(UART_HandleTypeDef *huart, uint32_t Flag, FlagStatus Status, uint32_t Timeout)
phungductung 0:e87aa4c49e95 1208 {
phungductung 0:e87aa4c49e95 1209 uint32_t tickstart = HAL_GetTick();
phungductung 0:e87aa4c49e95 1210
phungductung 0:e87aa4c49e95 1211 /* Wait until flag is set */
phungductung 0:e87aa4c49e95 1212 if(Status == RESET)
phungductung 0:e87aa4c49e95 1213 {
phungductung 0:e87aa4c49e95 1214 while(__HAL_UART_GET_FLAG(huart, Flag) == RESET)
phungductung 0:e87aa4c49e95 1215 {
phungductung 0:e87aa4c49e95 1216 /* Check for the Timeout */
phungductung 0:e87aa4c49e95 1217 if(Timeout != HAL_MAX_DELAY)
phungductung 0:e87aa4c49e95 1218 {
phungductung 0:e87aa4c49e95 1219 if((Timeout == 0)||((HAL_GetTick()-tickstart) >= Timeout))
phungductung 0:e87aa4c49e95 1220 {
phungductung 0:e87aa4c49e95 1221 /* Disable TXE, RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts for the interrupt process */
phungductung 0:e87aa4c49e95 1222 __HAL_UART_DISABLE_IT(huart, UART_IT_TXE);
phungductung 0:e87aa4c49e95 1223 __HAL_UART_DISABLE_IT(huart, UART_IT_RXNE);
phungductung 0:e87aa4c49e95 1224 __HAL_UART_DISABLE_IT(huart, UART_IT_PE);
phungductung 0:e87aa4c49e95 1225 __HAL_UART_DISABLE_IT(huart, UART_IT_ERR);
phungductung 0:e87aa4c49e95 1226
phungductung 0:e87aa4c49e95 1227 huart->State= HAL_UART_STATE_READY;
phungductung 0:e87aa4c49e95 1228
phungductung 0:e87aa4c49e95 1229 /* Process Unlocked */
phungductung 0:e87aa4c49e95 1230 __HAL_UNLOCK(huart);
phungductung 0:e87aa4c49e95 1231
phungductung 0:e87aa4c49e95 1232 return HAL_TIMEOUT;
phungductung 0:e87aa4c49e95 1233 }
phungductung 0:e87aa4c49e95 1234 }
phungductung 0:e87aa4c49e95 1235 }
phungductung 0:e87aa4c49e95 1236 }
phungductung 0:e87aa4c49e95 1237 else
phungductung 0:e87aa4c49e95 1238 {
phungductung 0:e87aa4c49e95 1239 while(__HAL_UART_GET_FLAG(huart, Flag) != RESET)
phungductung 0:e87aa4c49e95 1240 {
phungductung 0:e87aa4c49e95 1241 /* Check for the Timeout */
phungductung 0:e87aa4c49e95 1242 if(Timeout != HAL_MAX_DELAY)
phungductung 0:e87aa4c49e95 1243 {
phungductung 0:e87aa4c49e95 1244 if((Timeout == 0)||((HAL_GetTick()-tickstart) >= Timeout))
phungductung 0:e87aa4c49e95 1245 {
phungductung 0:e87aa4c49e95 1246 /* Disable TXE, RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts for the interrupt process */
phungductung 0:e87aa4c49e95 1247 __HAL_UART_DISABLE_IT(huart, UART_IT_TXE);
phungductung 0:e87aa4c49e95 1248 __HAL_UART_DISABLE_IT(huart, UART_IT_RXNE);
phungductung 0:e87aa4c49e95 1249 __HAL_UART_DISABLE_IT(huart, UART_IT_PE);
phungductung 0:e87aa4c49e95 1250 __HAL_UART_DISABLE_IT(huart, UART_IT_ERR);
phungductung 0:e87aa4c49e95 1251
phungductung 0:e87aa4c49e95 1252 huart->State= HAL_UART_STATE_READY;
phungductung 0:e87aa4c49e95 1253
phungductung 0:e87aa4c49e95 1254 /* Process Unlocked */
phungductung 0:e87aa4c49e95 1255 __HAL_UNLOCK(huart);
phungductung 0:e87aa4c49e95 1256
phungductung 0:e87aa4c49e95 1257 return HAL_TIMEOUT;
phungductung 0:e87aa4c49e95 1258 }
phungductung 0:e87aa4c49e95 1259 }
phungductung 0:e87aa4c49e95 1260 }
phungductung 0:e87aa4c49e95 1261 }
phungductung 0:e87aa4c49e95 1262 return HAL_OK;
phungductung 0:e87aa4c49e95 1263 }
phungductung 0:e87aa4c49e95 1264
phungductung 0:e87aa4c49e95 1265
phungductung 0:e87aa4c49e95 1266
phungductung 0:e87aa4c49e95 1267 /**
phungductung 0:e87aa4c49e95 1268 * @brief DMA UART transmit process complete callback
phungductung 0:e87aa4c49e95 1269 * @param hdma: DMA handle
phungductung 0:e87aa4c49e95 1270 * @retval None
phungductung 0:e87aa4c49e95 1271 */
phungductung 0:e87aa4c49e95 1272 static void UART_DMATransmitCplt(DMA_HandleTypeDef *hdma)
phungductung 0:e87aa4c49e95 1273 {
phungductung 0:e87aa4c49e95 1274 UART_HandleTypeDef* huart = ( UART_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
phungductung 0:e87aa4c49e95 1275
phungductung 0:e87aa4c49e95 1276 /* DMA Normal mode*/
phungductung 0:e87aa4c49e95 1277 if((hdma->Instance->CR & DMA_SxCR_CIRC) == 0)
phungductung 0:e87aa4c49e95 1278 {
phungductung 0:e87aa4c49e95 1279 huart->TxXferCount = 0;
phungductung 0:e87aa4c49e95 1280
phungductung 0:e87aa4c49e95 1281 /* Disable the DMA transfer for transmit request by setting the DMAT bit
phungductung 0:e87aa4c49e95 1282 in the UART CR3 register */
phungductung 0:e87aa4c49e95 1283 huart->Instance->CR3 &= (uint32_t)~((uint32_t)USART_CR3_DMAT);
phungductung 0:e87aa4c49e95 1284
phungductung 0:e87aa4c49e95 1285 /* Enable the UART Transmit Complete Interrupt */
phungductung 0:e87aa4c49e95 1286 __HAL_UART_ENABLE_IT(huart, UART_IT_TC);
phungductung 0:e87aa4c49e95 1287 }
phungductung 0:e87aa4c49e95 1288 /* DMA Circular mode */
phungductung 0:e87aa4c49e95 1289 else
phungductung 0:e87aa4c49e95 1290 {
phungductung 0:e87aa4c49e95 1291 HAL_UART_TxCpltCallback(huart);
phungductung 0:e87aa4c49e95 1292 }
phungductung 0:e87aa4c49e95 1293 }
phungductung 0:e87aa4c49e95 1294
phungductung 0:e87aa4c49e95 1295 /**
phungductung 0:e87aa4c49e95 1296 * @brief DMA UART transmit process half complete callback
phungductung 0:e87aa4c49e95 1297 * @param hdma : DMA handle
phungductung 0:e87aa4c49e95 1298 * @retval None
phungductung 0:e87aa4c49e95 1299 */
phungductung 0:e87aa4c49e95 1300 static void UART_DMATxHalfCplt(DMA_HandleTypeDef *hdma)
phungductung 0:e87aa4c49e95 1301 {
phungductung 0:e87aa4c49e95 1302 UART_HandleTypeDef* huart = (UART_HandleTypeDef*)((DMA_HandleTypeDef*)hdma)->Parent;
phungductung 0:e87aa4c49e95 1303
phungductung 0:e87aa4c49e95 1304 HAL_UART_TxHalfCpltCallback(huart);
phungductung 0:e87aa4c49e95 1305 }
phungductung 0:e87aa4c49e95 1306
phungductung 0:e87aa4c49e95 1307 /**
phungductung 0:e87aa4c49e95 1308 * @brief DMA UART receive process complete callback
phungductung 0:e87aa4c49e95 1309 * @param hdma: DMA handle
phungductung 0:e87aa4c49e95 1310 * @retval None
phungductung 0:e87aa4c49e95 1311 */
phungductung 0:e87aa4c49e95 1312 static void UART_DMAReceiveCplt(DMA_HandleTypeDef *hdma)
phungductung 0:e87aa4c49e95 1313 {
phungductung 0:e87aa4c49e95 1314 UART_HandleTypeDef* huart = ( UART_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
phungductung 0:e87aa4c49e95 1315
phungductung 0:e87aa4c49e95 1316 /* DMA Normal mode */
phungductung 0:e87aa4c49e95 1317 if((hdma->Instance->CR & DMA_SxCR_CIRC) == 0)
phungductung 0:e87aa4c49e95 1318 {
phungductung 0:e87aa4c49e95 1319 huart->RxXferCount = 0;
phungductung 0:e87aa4c49e95 1320
phungductung 0:e87aa4c49e95 1321 /* Disable the DMA transfer for the receiver request by setting the DMAR bit
phungductung 0:e87aa4c49e95 1322 in the UART CR3 register */
phungductung 0:e87aa4c49e95 1323 huart->Instance->CR3 &= (uint32_t)~((uint32_t)USART_CR3_DMAR);
phungductung 0:e87aa4c49e95 1324
phungductung 0:e87aa4c49e95 1325 /* Check if a transmit Process is ongoing or not */
phungductung 0:e87aa4c49e95 1326 if(huart->State == HAL_UART_STATE_BUSY_TX_RX)
phungductung 0:e87aa4c49e95 1327 {
phungductung 0:e87aa4c49e95 1328 huart->State = HAL_UART_STATE_BUSY_TX;
phungductung 0:e87aa4c49e95 1329 }
phungductung 0:e87aa4c49e95 1330 else
phungductung 0:e87aa4c49e95 1331 {
phungductung 0:e87aa4c49e95 1332 huart->State = HAL_UART_STATE_READY;
phungductung 0:e87aa4c49e95 1333 }
phungductung 0:e87aa4c49e95 1334 }
phungductung 0:e87aa4c49e95 1335 HAL_UART_RxCpltCallback(huart);
phungductung 0:e87aa4c49e95 1336 }
phungductung 0:e87aa4c49e95 1337
phungductung 0:e87aa4c49e95 1338 /**
phungductung 0:e87aa4c49e95 1339 * @brief DMA UART receive process half complete callback
phungductung 0:e87aa4c49e95 1340 * @param hdma : DMA handle
phungductung 0:e87aa4c49e95 1341 * @retval None
phungductung 0:e87aa4c49e95 1342 */
phungductung 0:e87aa4c49e95 1343 static void UART_DMARxHalfCplt(DMA_HandleTypeDef *hdma)
phungductung 0:e87aa4c49e95 1344 {
phungductung 0:e87aa4c49e95 1345 UART_HandleTypeDef* huart = (UART_HandleTypeDef*)((DMA_HandleTypeDef*)hdma)->Parent;
phungductung 0:e87aa4c49e95 1346
phungductung 0:e87aa4c49e95 1347 HAL_UART_RxHalfCpltCallback(huart);
phungductung 0:e87aa4c49e95 1348 }
phungductung 0:e87aa4c49e95 1349
phungductung 0:e87aa4c49e95 1350 /**
phungductung 0:e87aa4c49e95 1351 * @brief DMA UART communication error callback
phungductung 0:e87aa4c49e95 1352 * @param hdma: DMA handle
phungductung 0:e87aa4c49e95 1353 * @retval None
phungductung 0:e87aa4c49e95 1354 */
phungductung 0:e87aa4c49e95 1355 static void UART_DMAError(DMA_HandleTypeDef *hdma)
phungductung 0:e87aa4c49e95 1356 {
phungductung 0:e87aa4c49e95 1357 UART_HandleTypeDef* huart = ( UART_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
phungductung 0:e87aa4c49e95 1358 huart->RxXferCount = 0;
phungductung 0:e87aa4c49e95 1359 huart->TxXferCount = 0;
phungductung 0:e87aa4c49e95 1360 huart->State= HAL_UART_STATE_READY;
phungductung 0:e87aa4c49e95 1361 huart->ErrorCode |= HAL_UART_ERROR_DMA;
phungductung 0:e87aa4c49e95 1362 HAL_UART_ErrorCallback(huart);
phungductung 0:e87aa4c49e95 1363 }
phungductung 0:e87aa4c49e95 1364
phungductung 0:e87aa4c49e95 1365 /**
phungductung 0:e87aa4c49e95 1366 * @brief Tx Transfer completed callbacks
phungductung 0:e87aa4c49e95 1367 * @param huart: uart handle
phungductung 0:e87aa4c49e95 1368 * @retval None
phungductung 0:e87aa4c49e95 1369 */
phungductung 0:e87aa4c49e95 1370 __weak void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
phungductung 0:e87aa4c49e95 1371 {
phungductung 0:e87aa4c49e95 1372 /* Prevent unused argument(s) compilation warning */
phungductung 0:e87aa4c49e95 1373 UNUSED(huart);
phungductung 0:e87aa4c49e95 1374
phungductung 0:e87aa4c49e95 1375 /* NOTE : This function should not be modified, when the callback is needed,
phungductung 0:e87aa4c49e95 1376 the HAL_UART_TxCpltCallback can be implemented in the user file
phungductung 0:e87aa4c49e95 1377 */
phungductung 0:e87aa4c49e95 1378 }
phungductung 0:e87aa4c49e95 1379
phungductung 0:e87aa4c49e95 1380 /**
phungductung 0:e87aa4c49e95 1381 * @brief Tx Half Transfer completed callbacks.
phungductung 0:e87aa4c49e95 1382 * @param huart: UART handle
phungductung 0:e87aa4c49e95 1383 * @retval None
phungductung 0:e87aa4c49e95 1384 */
phungductung 0:e87aa4c49e95 1385 __weak void HAL_UART_TxHalfCpltCallback(UART_HandleTypeDef *huart)
phungductung 0:e87aa4c49e95 1386 {
phungductung 0:e87aa4c49e95 1387 /* Prevent unused argument(s) compilation warning */
phungductung 0:e87aa4c49e95 1388 UNUSED(huart);
phungductung 0:e87aa4c49e95 1389
phungductung 0:e87aa4c49e95 1390 /* NOTE: This function should not be modified, when the callback is needed,
phungductung 0:e87aa4c49e95 1391 the HAL_UART_TxHalfCpltCallback can be implemented in the user file
phungductung 0:e87aa4c49e95 1392 */
phungductung 0:e87aa4c49e95 1393 }
phungductung 0:e87aa4c49e95 1394
phungductung 0:e87aa4c49e95 1395 /**
phungductung 0:e87aa4c49e95 1396 * @brief Rx Transfer completed callbacks
phungductung 0:e87aa4c49e95 1397 * @param huart: uart handle
phungductung 0:e87aa4c49e95 1398 * @retval None
phungductung 0:e87aa4c49e95 1399 */
phungductung 0:e87aa4c49e95 1400 __weak void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
phungductung 0:e87aa4c49e95 1401 {
phungductung 0:e87aa4c49e95 1402 /* Prevent unused argument(s) compilation warning */
phungductung 0:e87aa4c49e95 1403 UNUSED(huart);
phungductung 0:e87aa4c49e95 1404
phungductung 0:e87aa4c49e95 1405 /* NOTE : This function should not be modified, when the callback is needed,
phungductung 0:e87aa4c49e95 1406 the HAL_UART_RxCpltCallback can be implemented in the user file
phungductung 0:e87aa4c49e95 1407 */
phungductung 0:e87aa4c49e95 1408 }
phungductung 0:e87aa4c49e95 1409
phungductung 0:e87aa4c49e95 1410 /**
phungductung 0:e87aa4c49e95 1411 * @brief Rx Half Transfer completed callbacks.
phungductung 0:e87aa4c49e95 1412 * @param huart: UART handle
phungductung 0:e87aa4c49e95 1413 * @retval None
phungductung 0:e87aa4c49e95 1414 */
phungductung 0:e87aa4c49e95 1415 __weak void HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *huart)
phungductung 0:e87aa4c49e95 1416 {
phungductung 0:e87aa4c49e95 1417 /* Prevent unused argument(s) compilation warning */
phungductung 0:e87aa4c49e95 1418 UNUSED(huart);
phungductung 0:e87aa4c49e95 1419
phungductung 0:e87aa4c49e95 1420 /* NOTE: This function should not be modified, when the callback is needed,
phungductung 0:e87aa4c49e95 1421 the HAL_UART_RxHalfCpltCallback can be implemented in the user file
phungductung 0:e87aa4c49e95 1422 */
phungductung 0:e87aa4c49e95 1423 }
phungductung 0:e87aa4c49e95 1424
phungductung 0:e87aa4c49e95 1425 /**
phungductung 0:e87aa4c49e95 1426 * @brief UART error callbacks
phungductung 0:e87aa4c49e95 1427 * @param huart: uart handle
phungductung 0:e87aa4c49e95 1428 * @retval None
phungductung 0:e87aa4c49e95 1429 */
phungductung 0:e87aa4c49e95 1430 __weak void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
phungductung 0:e87aa4c49e95 1431 {
phungductung 0:e87aa4c49e95 1432 /* Prevent unused argument(s) compilation warning */
phungductung 0:e87aa4c49e95 1433 UNUSED(huart);
phungductung 0:e87aa4c49e95 1434
phungductung 0:e87aa4c49e95 1435 /* NOTE : This function should not be modified, when the callback is needed,
phungductung 0:e87aa4c49e95 1436 the HAL_UART_ErrorCallback can be implemented in the user file
phungductung 0:e87aa4c49e95 1437 */
phungductung 0:e87aa4c49e95 1438 }
phungductung 0:e87aa4c49e95 1439
phungductung 0:e87aa4c49e95 1440 /**
phungductung 0:e87aa4c49e95 1441 * @brief Send an amount of data in interrupt mode
phungductung 0:e87aa4c49e95 1442 * Function called under interruption only, once
phungductung 0:e87aa4c49e95 1443 * interruptions have been enabled by HAL_UART_Transmit_IT()
phungductung 0:e87aa4c49e95 1444 * @param huart: UART handle
phungductung 0:e87aa4c49e95 1445 * @retval HAL status
phungductung 0:e87aa4c49e95 1446 */
phungductung 0:e87aa4c49e95 1447 static HAL_StatusTypeDef UART_Transmit_IT(UART_HandleTypeDef *huart)
phungductung 0:e87aa4c49e95 1448 {
phungductung 0:e87aa4c49e95 1449 uint16_t* tmp;
phungductung 0:e87aa4c49e95 1450
phungductung 0:e87aa4c49e95 1451 if ((huart->State == HAL_UART_STATE_BUSY_TX) || (huart->State == HAL_UART_STATE_BUSY_TX_RX))
phungductung 0:e87aa4c49e95 1452 {
phungductung 0:e87aa4c49e95 1453
phungductung 0:e87aa4c49e95 1454 if(huart->TxXferCount == 0)
phungductung 0:e87aa4c49e95 1455 {
phungductung 0:e87aa4c49e95 1456 /* Disable the UART Transmit Data Register Empty Interrupt */
phungductung 0:e87aa4c49e95 1457 __HAL_UART_DISABLE_IT(huart, UART_IT_TXE);
phungductung 0:e87aa4c49e95 1458
phungductung 0:e87aa4c49e95 1459 /* Check if a receive Process is ongoing or not */
phungductung 0:e87aa4c49e95 1460 if(huart->State == HAL_UART_STATE_BUSY_TX_RX)
phungductung 0:e87aa4c49e95 1461 {
phungductung 0:e87aa4c49e95 1462 huart->State = HAL_UART_STATE_BUSY_RX;
phungductung 0:e87aa4c49e95 1463 }
phungductung 0:e87aa4c49e95 1464 else
phungductung 0:e87aa4c49e95 1465 {
phungductung 0:e87aa4c49e95 1466 huart->State = HAL_UART_STATE_READY;
phungductung 0:e87aa4c49e95 1467 }
phungductung 0:e87aa4c49e95 1468
phungductung 0:e87aa4c49e95 1469 /* Wait on TC flag to be able to start a second transfer */
phungductung 0:e87aa4c49e95 1470 if(UART_WaitOnFlagUntilTimeout(huart, UART_FLAG_TC, RESET, HAL_UART_TIMEOUT_VALUE) != HAL_OK)
phungductung 0:e87aa4c49e95 1471 {
phungductung 0:e87aa4c49e95 1472 return HAL_TIMEOUT;
phungductung 0:e87aa4c49e95 1473 }
phungductung 0:e87aa4c49e95 1474
phungductung 0:e87aa4c49e95 1475 HAL_UART_TxCpltCallback(huart);
phungductung 0:e87aa4c49e95 1476
phungductung 0:e87aa4c49e95 1477 return HAL_OK;
phungductung 0:e87aa4c49e95 1478 }
phungductung 0:e87aa4c49e95 1479 else
phungductung 0:e87aa4c49e95 1480 {
phungductung 0:e87aa4c49e95 1481 if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE))
phungductung 0:e87aa4c49e95 1482 {
phungductung 0:e87aa4c49e95 1483 tmp = (uint16_t*) huart->pTxBuffPtr;
phungductung 0:e87aa4c49e95 1484 huart->Instance->TDR = (*tmp & (uint16_t)0x01FF);
phungductung 0:e87aa4c49e95 1485 huart->pTxBuffPtr += 2;
phungductung 0:e87aa4c49e95 1486 }
phungductung 0:e87aa4c49e95 1487 else
phungductung 0:e87aa4c49e95 1488 {
phungductung 0:e87aa4c49e95 1489 huart->Instance->TDR = (uint8_t)(*huart->pTxBuffPtr++ & (uint8_t)0xFF);
phungductung 0:e87aa4c49e95 1490 }
phungductung 0:e87aa4c49e95 1491
phungductung 0:e87aa4c49e95 1492 huart->TxXferCount--;
phungductung 0:e87aa4c49e95 1493
phungductung 0:e87aa4c49e95 1494 return HAL_OK;
phungductung 0:e87aa4c49e95 1495 }
phungductung 0:e87aa4c49e95 1496 }
phungductung 0:e87aa4c49e95 1497 else
phungductung 0:e87aa4c49e95 1498 {
phungductung 0:e87aa4c49e95 1499 return HAL_BUSY;
phungductung 0:e87aa4c49e95 1500 }
phungductung 0:e87aa4c49e95 1501 }
phungductung 0:e87aa4c49e95 1502
phungductung 0:e87aa4c49e95 1503 /**
phungductung 0:e87aa4c49e95 1504 * @brief Wrap up transmission in non-blocking mode.
phungductung 0:e87aa4c49e95 1505 * @param huart: pointer to a UART_HandleTypeDef structure that contains
phungductung 0:e87aa4c49e95 1506 * the configuration information for the specified UART module.
phungductung 0:e87aa4c49e95 1507 * @retval HAL status
phungductung 0:e87aa4c49e95 1508 */
phungductung 0:e87aa4c49e95 1509 static HAL_StatusTypeDef UART_EndTransmit_IT(UART_HandleTypeDef *huart)
phungductung 0:e87aa4c49e95 1510 {
phungductung 0:e87aa4c49e95 1511 /* Disable the UART Transmit Complete Interrupt */
phungductung 0:e87aa4c49e95 1512 __HAL_UART_DISABLE_IT(huart, UART_IT_TC);
phungductung 0:e87aa4c49e95 1513
phungductung 0:e87aa4c49e95 1514 /* Check if a receive process is ongoing or not */
phungductung 0:e87aa4c49e95 1515 if(huart->State == HAL_UART_STATE_BUSY_TX_RX)
phungductung 0:e87aa4c49e95 1516 {
phungductung 0:e87aa4c49e95 1517 huart->State = HAL_UART_STATE_BUSY_RX;
phungductung 0:e87aa4c49e95 1518 }
phungductung 0:e87aa4c49e95 1519 else
phungductung 0:e87aa4c49e95 1520 {
phungductung 0:e87aa4c49e95 1521 huart->State = HAL_UART_STATE_READY;
phungductung 0:e87aa4c49e95 1522 }
phungductung 0:e87aa4c49e95 1523
phungductung 0:e87aa4c49e95 1524 HAL_UART_TxCpltCallback(huart);
phungductung 0:e87aa4c49e95 1525
phungductung 0:e87aa4c49e95 1526 return HAL_OK;
phungductung 0:e87aa4c49e95 1527 }
phungductung 0:e87aa4c49e95 1528
phungductung 0:e87aa4c49e95 1529 /**
phungductung 0:e87aa4c49e95 1530 * @brief Receive an amount of data in interrupt mode
phungductung 0:e87aa4c49e95 1531 * Function called under interruption only, once
phungductung 0:e87aa4c49e95 1532 * interruptions have been enabled by HAL_UART_Receive_IT()
phungductung 0:e87aa4c49e95 1533 * @param huart: UART handle
phungductung 0:e87aa4c49e95 1534 * @retval HAL status
phungductung 0:e87aa4c49e95 1535 */
phungductung 0:e87aa4c49e95 1536 static HAL_StatusTypeDef UART_Receive_IT(UART_HandleTypeDef *huart)
phungductung 0:e87aa4c49e95 1537 {
phungductung 0:e87aa4c49e95 1538 uint16_t* tmp;
phungductung 0:e87aa4c49e95 1539 uint16_t uhMask = huart->Mask;
phungductung 0:e87aa4c49e95 1540
phungductung 0:e87aa4c49e95 1541 if((huart->State == HAL_UART_STATE_BUSY_RX) || (huart->State == HAL_UART_STATE_BUSY_TX_RX))
phungductung 0:e87aa4c49e95 1542 {
phungductung 0:e87aa4c49e95 1543
phungductung 0:e87aa4c49e95 1544 if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE))
phungductung 0:e87aa4c49e95 1545 {
phungductung 0:e87aa4c49e95 1546 tmp = (uint16_t*) huart->pRxBuffPtr ;
phungductung 0:e87aa4c49e95 1547 *tmp = (uint16_t)(huart->Instance->RDR & uhMask);
phungductung 0:e87aa4c49e95 1548 huart->pRxBuffPtr +=2;
phungductung 0:e87aa4c49e95 1549 }
phungductung 0:e87aa4c49e95 1550 else
phungductung 0:e87aa4c49e95 1551 {
phungductung 0:e87aa4c49e95 1552 *huart->pRxBuffPtr++ = (uint8_t)(huart->Instance->RDR & (uint8_t)uhMask);
phungductung 0:e87aa4c49e95 1553 }
phungductung 0:e87aa4c49e95 1554
phungductung 0:e87aa4c49e95 1555 if(--huart->RxXferCount == 0)
phungductung 0:e87aa4c49e95 1556 {
phungductung 0:e87aa4c49e95 1557 __HAL_UART_DISABLE_IT(huart, UART_IT_RXNE);
phungductung 0:e87aa4c49e95 1558
phungductung 0:e87aa4c49e95 1559 /* Check if a transmit Process is ongoing or not */
phungductung 0:e87aa4c49e95 1560 if(huart->State == HAL_UART_STATE_BUSY_TX_RX)
phungductung 0:e87aa4c49e95 1561 {
phungductung 0:e87aa4c49e95 1562 huart->State = HAL_UART_STATE_BUSY_TX;
phungductung 0:e87aa4c49e95 1563 }
phungductung 0:e87aa4c49e95 1564 else
phungductung 0:e87aa4c49e95 1565 {
phungductung 0:e87aa4c49e95 1566 /* Disable the UART Parity Error Interrupt */
phungductung 0:e87aa4c49e95 1567 __HAL_UART_DISABLE_IT(huart, UART_IT_PE);
phungductung 0:e87aa4c49e95 1568
phungductung 0:e87aa4c49e95 1569 /* Disable the UART Error Interrupt: (Frame error, noise error, overrun error) */
phungductung 0:e87aa4c49e95 1570 __HAL_UART_DISABLE_IT(huart, UART_IT_ERR);
phungductung 0:e87aa4c49e95 1571
phungductung 0:e87aa4c49e95 1572 huart->State = HAL_UART_STATE_READY;
phungductung 0:e87aa4c49e95 1573 }
phungductung 0:e87aa4c49e95 1574
phungductung 0:e87aa4c49e95 1575 HAL_UART_RxCpltCallback(huart);
phungductung 0:e87aa4c49e95 1576
phungductung 0:e87aa4c49e95 1577 return HAL_OK;
phungductung 0:e87aa4c49e95 1578 }
phungductung 0:e87aa4c49e95 1579
phungductung 0:e87aa4c49e95 1580 return HAL_OK;
phungductung 0:e87aa4c49e95 1581 }
phungductung 0:e87aa4c49e95 1582 else
phungductung 0:e87aa4c49e95 1583 {
phungductung 0:e87aa4c49e95 1584 return HAL_BUSY;
phungductung 0:e87aa4c49e95 1585 }
phungductung 0:e87aa4c49e95 1586 }
phungductung 0:e87aa4c49e95 1587
phungductung 0:e87aa4c49e95 1588 /**
phungductung 0:e87aa4c49e95 1589 * @}
phungductung 0:e87aa4c49e95 1590 */
phungductung 0:e87aa4c49e95 1591
phungductung 0:e87aa4c49e95 1592 /** @defgroup UART_Exported_Functions_Group3 Peripheral Control functions
phungductung 0:e87aa4c49e95 1593 * @brief UART control functions
phungductung 0:e87aa4c49e95 1594 *
phungductung 0:e87aa4c49e95 1595 @verbatim
phungductung 0:e87aa4c49e95 1596 ===============================================================================
phungductung 0:e87aa4c49e95 1597 ##### Peripheral Control functions #####
phungductung 0:e87aa4c49e95 1598 ===============================================================================
phungductung 0:e87aa4c49e95 1599 [..]
phungductung 0:e87aa4c49e95 1600 This subsection provides a set of functions allowing to control the UART.
phungductung 0:e87aa4c49e95 1601 (+) HAL_UART_GetState() API is helpful to check in run-time the state of the UART peripheral.
phungductung 0:e87aa4c49e95 1602 (+) HAL_MultiProcessor_EnableMuteMode() API enables mute mode
phungductung 0:e87aa4c49e95 1603 (+) HAL_MultiProcessor_DisableMuteMode() API disables mute mode
phungductung 0:e87aa4c49e95 1604 (+) HAL_MultiProcessor_EnterMuteMode() API enters mute mode
phungductung 0:e87aa4c49e95 1605 (+) HAL_MultiProcessor_EnableMuteMode() API enables mute mode
phungductung 0:e87aa4c49e95 1606 (+) UART_SetConfig() API configures the UART peripheral
phungductung 0:e87aa4c49e95 1607 (+) UART_AdvFeatureConfig() API optionally configures the UART advanced features
phungductung 0:e87aa4c49e95 1608 (+) UART_CheckIdleState() API ensures that TEACK and/or REACK are set after initialization
phungductung 0:e87aa4c49e95 1609 (+) HAL_HalfDuplex_EnableTransmitter() API disables receiver and enables transmitter
phungductung 0:e87aa4c49e95 1610 (+) HAL_HalfDuplex_EnableReceiver() API disables transmitter and enables receiver
phungductung 0:e87aa4c49e95 1611 (+) HAL_LIN_SendBreak() API transmits the break characters
phungductung 0:e87aa4c49e95 1612 @endverbatim
phungductung 0:e87aa4c49e95 1613 * @{
phungductung 0:e87aa4c49e95 1614 */
phungductung 0:e87aa4c49e95 1615
phungductung 0:e87aa4c49e95 1616 /**
phungductung 0:e87aa4c49e95 1617 * @brief Enable UART in mute mode (doesn't mean UART enters mute mode;
phungductung 0:e87aa4c49e95 1618 * to enter mute mode, HAL_MultiProcessor_EnterMuteMode() API must be called)
phungductung 0:e87aa4c49e95 1619 * @param huart: UART handle
phungductung 0:e87aa4c49e95 1620 * @retval HAL status
phungductung 0:e87aa4c49e95 1621 */
phungductung 0:e87aa4c49e95 1622 HAL_StatusTypeDef HAL_MultiProcessor_EnableMuteMode(UART_HandleTypeDef *huart)
phungductung 0:e87aa4c49e95 1623 {
phungductung 0:e87aa4c49e95 1624 /* Process Locked */
phungductung 0:e87aa4c49e95 1625 __HAL_LOCK(huart);
phungductung 0:e87aa4c49e95 1626
phungductung 0:e87aa4c49e95 1627 huart->State = HAL_UART_STATE_BUSY;
phungductung 0:e87aa4c49e95 1628
phungductung 0:e87aa4c49e95 1629 /* Enable USART mute mode by setting the MME bit in the CR1 register */
phungductung 0:e87aa4c49e95 1630 huart->Instance->CR1 |= USART_CR1_MME;
phungductung 0:e87aa4c49e95 1631
phungductung 0:e87aa4c49e95 1632 huart->State = HAL_UART_STATE_READY;
phungductung 0:e87aa4c49e95 1633
phungductung 0:e87aa4c49e95 1634 return (UART_CheckIdleState(huart));
phungductung 0:e87aa4c49e95 1635 }
phungductung 0:e87aa4c49e95 1636
phungductung 0:e87aa4c49e95 1637 /**
phungductung 0:e87aa4c49e95 1638 * @brief Disable UART mute mode (doesn't mean it actually wakes up the software,
phungductung 0:e87aa4c49e95 1639 * as it may not have been in mute mode at this very moment).
phungductung 0:e87aa4c49e95 1640 * @param huart: uart handle
phungductung 0:e87aa4c49e95 1641 * @retval HAL status
phungductung 0:e87aa4c49e95 1642 */
phungductung 0:e87aa4c49e95 1643 HAL_StatusTypeDef HAL_MultiProcessor_DisableMuteMode(UART_HandleTypeDef *huart)
phungductung 0:e87aa4c49e95 1644 {
phungductung 0:e87aa4c49e95 1645 /* Process Locked */
phungductung 0:e87aa4c49e95 1646 __HAL_LOCK(huart);
phungductung 0:e87aa4c49e95 1647
phungductung 0:e87aa4c49e95 1648 huart->State = HAL_UART_STATE_BUSY;
phungductung 0:e87aa4c49e95 1649
phungductung 0:e87aa4c49e95 1650 /* Disable USART mute mode by clearing the MME bit in the CR1 register */
phungductung 0:e87aa4c49e95 1651 huart->Instance->CR1 &= ~(USART_CR1_MME);
phungductung 0:e87aa4c49e95 1652
phungductung 0:e87aa4c49e95 1653 huart->State = HAL_UART_STATE_READY;
phungductung 0:e87aa4c49e95 1654
phungductung 0:e87aa4c49e95 1655 return (UART_CheckIdleState(huart));
phungductung 0:e87aa4c49e95 1656 }
phungductung 0:e87aa4c49e95 1657
phungductung 0:e87aa4c49e95 1658 /**
phungductung 0:e87aa4c49e95 1659 * @brief Enter UART mute mode (means UART actually enters mute mode).
phungductung 0:e87aa4c49e95 1660 * To exit from mute mode, HAL_MultiProcessor_DisableMuteMode() API must be called.
phungductung 0:e87aa4c49e95 1661 * @param huart: uart handle
phungductung 0:e87aa4c49e95 1662 * @retval HAL status
phungductung 0:e87aa4c49e95 1663 */
phungductung 0:e87aa4c49e95 1664 void HAL_MultiProcessor_EnterMuteMode(UART_HandleTypeDef *huart)
phungductung 0:e87aa4c49e95 1665 {
phungductung 0:e87aa4c49e95 1666 __HAL_UART_SEND_REQ(huart, UART_MUTE_MODE_REQUEST);
phungductung 0:e87aa4c49e95 1667 }
phungductung 0:e87aa4c49e95 1668
phungductung 0:e87aa4c49e95 1669
phungductung 0:e87aa4c49e95 1670
phungductung 0:e87aa4c49e95 1671 /**
phungductung 0:e87aa4c49e95 1672 * @brief return the UART state
phungductung 0:e87aa4c49e95 1673 * @param huart: uart handle
phungductung 0:e87aa4c49e95 1674 * @retval HAL state
phungductung 0:e87aa4c49e95 1675 */
phungductung 0:e87aa4c49e95 1676 HAL_UART_StateTypeDef HAL_UART_GetState(UART_HandleTypeDef *huart)
phungductung 0:e87aa4c49e95 1677 {
phungductung 0:e87aa4c49e95 1678 return huart->State;
phungductung 0:e87aa4c49e95 1679 }
phungductung 0:e87aa4c49e95 1680
phungductung 0:e87aa4c49e95 1681 /**
phungductung 0:e87aa4c49e95 1682 * @brief Return the UART error code
phungductung 0:e87aa4c49e95 1683 * @param huart : pointer to a UART_HandleTypeDef structure that contains
phungductung 0:e87aa4c49e95 1684 * the configuration information for the specified UART.
phungductung 0:e87aa4c49e95 1685 * @retval UART Error Code
phungductung 0:e87aa4c49e95 1686 */
phungductung 0:e87aa4c49e95 1687 uint32_t HAL_UART_GetError(UART_HandleTypeDef *huart)
phungductung 0:e87aa4c49e95 1688 {
phungductung 0:e87aa4c49e95 1689 return huart->ErrorCode;
phungductung 0:e87aa4c49e95 1690 }
phungductung 0:e87aa4c49e95 1691
phungductung 0:e87aa4c49e95 1692 /**
phungductung 0:e87aa4c49e95 1693 * @brief Configure the UART peripheral
phungductung 0:e87aa4c49e95 1694 * @param huart: uart handle
phungductung 0:e87aa4c49e95 1695 * @retval None
phungductung 0:e87aa4c49e95 1696 */
phungductung 0:e87aa4c49e95 1697 HAL_StatusTypeDef UART_SetConfig(UART_HandleTypeDef *huart)
phungductung 0:e87aa4c49e95 1698 {
phungductung 0:e87aa4c49e95 1699 uint32_t tmpreg = 0x00000000;
phungductung 0:e87aa4c49e95 1700 UART_ClockSourceTypeDef clocksource = UART_CLOCKSOURCE_UNDEFINED;
phungductung 0:e87aa4c49e95 1701 uint16_t brrtemp = 0x0000;
phungductung 0:e87aa4c49e95 1702 uint16_t usartdiv = 0x0000;
phungductung 0:e87aa4c49e95 1703 HAL_StatusTypeDef ret = HAL_OK;
phungductung 0:e87aa4c49e95 1704
phungductung 0:e87aa4c49e95 1705 /* Check the parameters */
phungductung 0:e87aa4c49e95 1706 assert_param(IS_UART_BAUDRATE(huart->Init.BaudRate));
phungductung 0:e87aa4c49e95 1707 assert_param(IS_UART_WORD_LENGTH(huart->Init.WordLength));
phungductung 0:e87aa4c49e95 1708 assert_param(IS_UART_STOPBITS(huart->Init.StopBits));
phungductung 0:e87aa4c49e95 1709 assert_param(IS_UART_PARITY(huart->Init.Parity));
phungductung 0:e87aa4c49e95 1710 assert_param(IS_UART_MODE(huart->Init.Mode));
phungductung 0:e87aa4c49e95 1711 assert_param(IS_UART_HARDWARE_FLOW_CONTROL(huart->Init.HwFlowCtl));
phungductung 0:e87aa4c49e95 1712 assert_param(IS_UART_ONE_BIT_SAMPLE(huart->Init.OneBitSampling));
phungductung 0:e87aa4c49e95 1713
phungductung 0:e87aa4c49e95 1714
phungductung 0:e87aa4c49e95 1715 /*-------------------------- USART CR1 Configuration -----------------------*/
phungductung 0:e87aa4c49e95 1716 /* Clear M, PCE, PS, TE, RE and OVER8 bits and configure
phungductung 0:e87aa4c49e95 1717 * the UART Word Length, Parity, Mode and oversampling:
phungductung 0:e87aa4c49e95 1718 * set the M bits according to huart->Init.WordLength value
phungductung 0:e87aa4c49e95 1719 * set PCE and PS bits according to huart->Init.Parity value
phungductung 0:e87aa4c49e95 1720 * set TE and RE bits according to huart->Init.Mode value
phungductung 0:e87aa4c49e95 1721 * set OVER8 bit according to huart->Init.OverSampling value */
phungductung 0:e87aa4c49e95 1722 tmpreg = (uint32_t)huart->Init.WordLength | huart->Init.Parity | huart->Init.Mode | huart->Init.OverSampling ;
phungductung 0:e87aa4c49e95 1723 MODIFY_REG(huart->Instance->CR1, UART_CR1_FIELDS, tmpreg);
phungductung 0:e87aa4c49e95 1724
phungductung 0:e87aa4c49e95 1725 /*-------------------------- USART CR2 Configuration -----------------------*/
phungductung 0:e87aa4c49e95 1726 /* Configure the UART Stop Bits: Set STOP[13:12] bits according
phungductung 0:e87aa4c49e95 1727 * to huart->Init.StopBits value */
phungductung 0:e87aa4c49e95 1728 MODIFY_REG(huart->Instance->CR2, USART_CR2_STOP, huart->Init.StopBits);
phungductung 0:e87aa4c49e95 1729
phungductung 0:e87aa4c49e95 1730 /*-------------------------- USART CR3 Configuration -----------------------*/
phungductung 0:e87aa4c49e95 1731 /* Configure
phungductung 0:e87aa4c49e95 1732 * - UART HardWare Flow Control: set CTSE and RTSE bits according
phungductung 0:e87aa4c49e95 1733 * to huart->Init.HwFlowCtl value
phungductung 0:e87aa4c49e95 1734 * - one-bit sampling method versus three samples' majority rule according
phungductung 0:e87aa4c49e95 1735 * to huart->Init.OneBitSampling */
phungductung 0:e87aa4c49e95 1736 tmpreg = (uint32_t)huart->Init.HwFlowCtl | huart->Init.OneBitSampling ;
phungductung 0:e87aa4c49e95 1737 MODIFY_REG(huart->Instance->CR3, (USART_CR3_RTSE | USART_CR3_CTSE | USART_CR3_ONEBIT), tmpreg);
phungductung 0:e87aa4c49e95 1738
phungductung 0:e87aa4c49e95 1739 /*-------------------------- USART BRR Configuration -----------------------*/
phungductung 0:e87aa4c49e95 1740 UART_GETCLOCKSOURCE(huart, clocksource);
phungductung 0:e87aa4c49e95 1741
phungductung 0:e87aa4c49e95 1742 /* Check UART Over Sampling to set Baud Rate Register */
phungductung 0:e87aa4c49e95 1743 if (huart->Init.OverSampling == UART_OVERSAMPLING_8)
phungductung 0:e87aa4c49e95 1744 {
phungductung 0:e87aa4c49e95 1745 switch (clocksource)
phungductung 0:e87aa4c49e95 1746 {
phungductung 0:e87aa4c49e95 1747 case UART_CLOCKSOURCE_PCLK1:
phungductung 0:e87aa4c49e95 1748 usartdiv = (uint16_t)(UART_DIV_SAMPLING8(HAL_RCC_GetPCLK1Freq(), huart->Init.BaudRate));
phungductung 0:e87aa4c49e95 1749 break;
phungductung 0:e87aa4c49e95 1750 case UART_CLOCKSOURCE_PCLK2:
phungductung 0:e87aa4c49e95 1751 usartdiv = (uint16_t)(UART_DIV_SAMPLING8(HAL_RCC_GetPCLK2Freq(), huart->Init.BaudRate));
phungductung 0:e87aa4c49e95 1752 break;
phungductung 0:e87aa4c49e95 1753 case UART_CLOCKSOURCE_HSI:
phungductung 0:e87aa4c49e95 1754 usartdiv = (uint16_t)(UART_DIV_SAMPLING8(HSI_VALUE, huart->Init.BaudRate));
phungductung 0:e87aa4c49e95 1755 break;
phungductung 0:e87aa4c49e95 1756 case UART_CLOCKSOURCE_SYSCLK:
phungductung 0:e87aa4c49e95 1757 usartdiv = (uint16_t)(UART_DIV_SAMPLING8(HAL_RCC_GetSysClockFreq(), huart->Init.BaudRate));
phungductung 0:e87aa4c49e95 1758 break;
phungductung 0:e87aa4c49e95 1759 case UART_CLOCKSOURCE_LSE:
phungductung 0:e87aa4c49e95 1760 usartdiv = (uint16_t)(UART_DIV_SAMPLING8(LSE_VALUE, huart->Init.BaudRate));
phungductung 0:e87aa4c49e95 1761 break;
phungductung 0:e87aa4c49e95 1762 case UART_CLOCKSOURCE_UNDEFINED:
phungductung 0:e87aa4c49e95 1763 default:
phungductung 0:e87aa4c49e95 1764 ret = HAL_ERROR;
phungductung 0:e87aa4c49e95 1765 break;
phungductung 0:e87aa4c49e95 1766 }
phungductung 0:e87aa4c49e95 1767
phungductung 0:e87aa4c49e95 1768 brrtemp = usartdiv & 0xFFF0;
phungductung 0:e87aa4c49e95 1769 brrtemp |= (uint16_t)((usartdiv & (uint16_t)0x000F) >> 1U);
phungductung 0:e87aa4c49e95 1770 huart->Instance->BRR = brrtemp;
phungductung 0:e87aa4c49e95 1771 }
phungductung 0:e87aa4c49e95 1772 else
phungductung 0:e87aa4c49e95 1773 {
phungductung 0:e87aa4c49e95 1774 switch (clocksource)
phungductung 0:e87aa4c49e95 1775 {
phungductung 0:e87aa4c49e95 1776 case UART_CLOCKSOURCE_PCLK1:
phungductung 0:e87aa4c49e95 1777 huart->Instance->BRR = (uint16_t)(UART_DIV_SAMPLING16(HAL_RCC_GetPCLK1Freq(), huart->Init.BaudRate));
phungductung 0:e87aa4c49e95 1778 break;
phungductung 0:e87aa4c49e95 1779 case UART_CLOCKSOURCE_PCLK2:
phungductung 0:e87aa4c49e95 1780 huart->Instance->BRR = (uint16_t)(UART_DIV_SAMPLING16(HAL_RCC_GetPCLK2Freq(), huart->Init.BaudRate));
phungductung 0:e87aa4c49e95 1781 break;
phungductung 0:e87aa4c49e95 1782 case UART_CLOCKSOURCE_HSI:
phungductung 0:e87aa4c49e95 1783 huart->Instance->BRR = (uint16_t)(UART_DIV_SAMPLING16(HSI_VALUE, huart->Init.BaudRate));
phungductung 0:e87aa4c49e95 1784 break;
phungductung 0:e87aa4c49e95 1785 case UART_CLOCKSOURCE_SYSCLK:
phungductung 0:e87aa4c49e95 1786 huart->Instance->BRR = (uint16_t)(UART_DIV_SAMPLING16(HAL_RCC_GetSysClockFreq(), huart->Init.BaudRate));
phungductung 0:e87aa4c49e95 1787 break;
phungductung 0:e87aa4c49e95 1788 case UART_CLOCKSOURCE_LSE:
phungductung 0:e87aa4c49e95 1789 huart->Instance->BRR = (uint16_t)(UART_DIV_SAMPLING16(LSE_VALUE, huart->Init.BaudRate));
phungductung 0:e87aa4c49e95 1790 break;
phungductung 0:e87aa4c49e95 1791 case UART_CLOCKSOURCE_UNDEFINED:
phungductung 0:e87aa4c49e95 1792 default:
phungductung 0:e87aa4c49e95 1793 ret = HAL_ERROR;
phungductung 0:e87aa4c49e95 1794 break;
phungductung 0:e87aa4c49e95 1795 }
phungductung 0:e87aa4c49e95 1796 }
phungductung 0:e87aa4c49e95 1797
phungductung 0:e87aa4c49e95 1798 return ret;
phungductung 0:e87aa4c49e95 1799
phungductung 0:e87aa4c49e95 1800 }
phungductung 0:e87aa4c49e95 1801
phungductung 0:e87aa4c49e95 1802
phungductung 0:e87aa4c49e95 1803 /**
phungductung 0:e87aa4c49e95 1804 * @brief Configure the UART peripheral advanced features
phungductung 0:e87aa4c49e95 1805 * @param huart: uart handle
phungductung 0:e87aa4c49e95 1806 * @retval None
phungductung 0:e87aa4c49e95 1807 */
phungductung 0:e87aa4c49e95 1808 void UART_AdvFeatureConfig(UART_HandleTypeDef *huart)
phungductung 0:e87aa4c49e95 1809 {
phungductung 0:e87aa4c49e95 1810 /* Check whether the set of advanced features to configure is properly set */
phungductung 0:e87aa4c49e95 1811 assert_param(IS_UART_ADVFEATURE_INIT(huart->AdvancedInit.AdvFeatureInit));
phungductung 0:e87aa4c49e95 1812
phungductung 0:e87aa4c49e95 1813 /* if required, configure TX pin active level inversion */
phungductung 0:e87aa4c49e95 1814 if(HAL_IS_BIT_SET(huart->AdvancedInit.AdvFeatureInit, UART_ADVFEATURE_TXINVERT_INIT))
phungductung 0:e87aa4c49e95 1815 {
phungductung 0:e87aa4c49e95 1816 assert_param(IS_UART_ADVFEATURE_TXINV(huart->AdvancedInit.TxPinLevelInvert));
phungductung 0:e87aa4c49e95 1817 MODIFY_REG(huart->Instance->CR2, USART_CR2_TXINV, huart->AdvancedInit.TxPinLevelInvert);
phungductung 0:e87aa4c49e95 1818 }
phungductung 0:e87aa4c49e95 1819
phungductung 0:e87aa4c49e95 1820 /* if required, configure RX pin active level inversion */
phungductung 0:e87aa4c49e95 1821 if(HAL_IS_BIT_SET(huart->AdvancedInit.AdvFeatureInit, UART_ADVFEATURE_RXINVERT_INIT))
phungductung 0:e87aa4c49e95 1822 {
phungductung 0:e87aa4c49e95 1823 assert_param(IS_UART_ADVFEATURE_RXINV(huart->AdvancedInit.RxPinLevelInvert));
phungductung 0:e87aa4c49e95 1824 MODIFY_REG(huart->Instance->CR2, USART_CR2_RXINV, huart->AdvancedInit.RxPinLevelInvert);
phungductung 0:e87aa4c49e95 1825 }
phungductung 0:e87aa4c49e95 1826
phungductung 0:e87aa4c49e95 1827 /* if required, configure data inversion */
phungductung 0:e87aa4c49e95 1828 if(HAL_IS_BIT_SET(huart->AdvancedInit.AdvFeatureInit, UART_ADVFEATURE_DATAINVERT_INIT))
phungductung 0:e87aa4c49e95 1829 {
phungductung 0:e87aa4c49e95 1830 assert_param(IS_UART_ADVFEATURE_DATAINV(huart->AdvancedInit.DataInvert));
phungductung 0:e87aa4c49e95 1831 MODIFY_REG(huart->Instance->CR2, USART_CR2_DATAINV, huart->AdvancedInit.DataInvert);
phungductung 0:e87aa4c49e95 1832 }
phungductung 0:e87aa4c49e95 1833
phungductung 0:e87aa4c49e95 1834 /* if required, configure RX/TX pins swap */
phungductung 0:e87aa4c49e95 1835 if(HAL_IS_BIT_SET(huart->AdvancedInit.AdvFeatureInit, UART_ADVFEATURE_SWAP_INIT))
phungductung 0:e87aa4c49e95 1836 {
phungductung 0:e87aa4c49e95 1837 assert_param(IS_UART_ADVFEATURE_SWAP(huart->AdvancedInit.Swap));
phungductung 0:e87aa4c49e95 1838 MODIFY_REG(huart->Instance->CR2, USART_CR2_SWAP, huart->AdvancedInit.Swap);
phungductung 0:e87aa4c49e95 1839 }
phungductung 0:e87aa4c49e95 1840
phungductung 0:e87aa4c49e95 1841 /* if required, configure RX overrun detection disabling */
phungductung 0:e87aa4c49e95 1842 if(HAL_IS_BIT_SET(huart->AdvancedInit.AdvFeatureInit, UART_ADVFEATURE_RXOVERRUNDISABLE_INIT))
phungductung 0:e87aa4c49e95 1843 {
phungductung 0:e87aa4c49e95 1844 assert_param(IS_UART_OVERRUN(huart->AdvancedInit.OverrunDisable));
phungductung 0:e87aa4c49e95 1845 MODIFY_REG(huart->Instance->CR3, USART_CR3_OVRDIS, huart->AdvancedInit.OverrunDisable);
phungductung 0:e87aa4c49e95 1846 }
phungductung 0:e87aa4c49e95 1847
phungductung 0:e87aa4c49e95 1848 /* if required, configure DMA disabling on reception error */
phungductung 0:e87aa4c49e95 1849 if(HAL_IS_BIT_SET(huart->AdvancedInit.AdvFeatureInit, UART_ADVFEATURE_DMADISABLEONERROR_INIT))
phungductung 0:e87aa4c49e95 1850 {
phungductung 0:e87aa4c49e95 1851 assert_param(IS_UART_ADVFEATURE_DMAONRXERROR(huart->AdvancedInit.DMADisableonRxError));
phungductung 0:e87aa4c49e95 1852 MODIFY_REG(huart->Instance->CR3, USART_CR3_DDRE, huart->AdvancedInit.DMADisableonRxError);
phungductung 0:e87aa4c49e95 1853 }
phungductung 0:e87aa4c49e95 1854
phungductung 0:e87aa4c49e95 1855 /* if required, configure auto Baud rate detection scheme */
phungductung 0:e87aa4c49e95 1856 if(HAL_IS_BIT_SET(huart->AdvancedInit.AdvFeatureInit, UART_ADVFEATURE_AUTOBAUDRATE_INIT))
phungductung 0:e87aa4c49e95 1857 {
phungductung 0:e87aa4c49e95 1858 assert_param(IS_UART_ADVFEATURE_AUTOBAUDRATE(huart->AdvancedInit.AutoBaudRateEnable));
phungductung 0:e87aa4c49e95 1859 MODIFY_REG(huart->Instance->CR2, USART_CR2_ABREN, huart->AdvancedInit.AutoBaudRateEnable);
phungductung 0:e87aa4c49e95 1860 /* set auto Baudrate detection parameters if detection is enabled */
phungductung 0:e87aa4c49e95 1861 if(huart->AdvancedInit.AutoBaudRateEnable == UART_ADVFEATURE_AUTOBAUDRATE_ENABLE)
phungductung 0:e87aa4c49e95 1862 {
phungductung 0:e87aa4c49e95 1863 assert_param(IS_UART_ADVFEATURE_AUTOBAUDRATEMODE(huart->AdvancedInit.AutoBaudRateMode));
phungductung 0:e87aa4c49e95 1864 MODIFY_REG(huart->Instance->CR2, USART_CR2_ABRMODE, huart->AdvancedInit.AutoBaudRateMode);
phungductung 0:e87aa4c49e95 1865 }
phungductung 0:e87aa4c49e95 1866 }
phungductung 0:e87aa4c49e95 1867
phungductung 0:e87aa4c49e95 1868 /* if required, configure MSB first on communication line */
phungductung 0:e87aa4c49e95 1869 if(HAL_IS_BIT_SET(huart->AdvancedInit.AdvFeatureInit, UART_ADVFEATURE_MSBFIRST_INIT))
phungductung 0:e87aa4c49e95 1870 {
phungductung 0:e87aa4c49e95 1871 assert_param(IS_UART_ADVFEATURE_MSBFIRST(huart->AdvancedInit.MSBFirst));
phungductung 0:e87aa4c49e95 1872 MODIFY_REG(huart->Instance->CR2, USART_CR2_MSBFIRST, huart->AdvancedInit.MSBFirst);
phungductung 0:e87aa4c49e95 1873 }
phungductung 0:e87aa4c49e95 1874 }
phungductung 0:e87aa4c49e95 1875
phungductung 0:e87aa4c49e95 1876
phungductung 0:e87aa4c49e95 1877
phungductung 0:e87aa4c49e95 1878 /**
phungductung 0:e87aa4c49e95 1879 * @brief Check the UART Idle State
phungductung 0:e87aa4c49e95 1880 * @param huart: uart handle
phungductung 0:e87aa4c49e95 1881 * @retval HAL status
phungductung 0:e87aa4c49e95 1882 */
phungductung 0:e87aa4c49e95 1883 HAL_StatusTypeDef UART_CheckIdleState(UART_HandleTypeDef *huart)
phungductung 0:e87aa4c49e95 1884 {
phungductung 0:e87aa4c49e95 1885 /* Initialize the UART ErrorCode */
phungductung 0:e87aa4c49e95 1886 huart->ErrorCode = HAL_UART_ERROR_NONE;
phungductung 0:e87aa4c49e95 1887
phungductung 0:e87aa4c49e95 1888 /* Check if the Transmitter is enabled */
phungductung 0:e87aa4c49e95 1889 if((huart->Instance->CR1 & USART_CR1_TE) == USART_CR1_TE)
phungductung 0:e87aa4c49e95 1890 {
phungductung 0:e87aa4c49e95 1891 /* Wait until TEACK flag is set */
phungductung 0:e87aa4c49e95 1892 if(UART_WaitOnFlagUntilTimeout(huart, USART_ISR_TEACK, RESET, HAL_UART_TIMEOUT_VALUE) != HAL_OK)
phungductung 0:e87aa4c49e95 1893 {
phungductung 0:e87aa4c49e95 1894 /* Timeout Occurred */
phungductung 0:e87aa4c49e95 1895 return HAL_TIMEOUT;
phungductung 0:e87aa4c49e95 1896 }
phungductung 0:e87aa4c49e95 1897 }
phungductung 0:e87aa4c49e95 1898 /* Check if the Receiver is enabled */
phungductung 0:e87aa4c49e95 1899 if((huart->Instance->CR1 & USART_CR1_RE) == USART_CR1_RE)
phungductung 0:e87aa4c49e95 1900 {
phungductung 0:e87aa4c49e95 1901 /* Wait until REACK flag is set */
phungductung 0:e87aa4c49e95 1902 if(UART_WaitOnFlagUntilTimeout(huart, USART_ISR_REACK, RESET, HAL_UART_TIMEOUT_VALUE) != HAL_OK)
phungductung 0:e87aa4c49e95 1903 {
phungductung 0:e87aa4c49e95 1904 /* Timeout Occurred */
phungductung 0:e87aa4c49e95 1905 return HAL_TIMEOUT;
phungductung 0:e87aa4c49e95 1906 }
phungductung 0:e87aa4c49e95 1907 }
phungductung 0:e87aa4c49e95 1908
phungductung 0:e87aa4c49e95 1909 /* Initialize the UART State */
phungductung 0:e87aa4c49e95 1910 huart->State= HAL_UART_STATE_READY;
phungductung 0:e87aa4c49e95 1911
phungductung 0:e87aa4c49e95 1912 /* Process Unlocked */
phungductung 0:e87aa4c49e95 1913 __HAL_UNLOCK(huart);
phungductung 0:e87aa4c49e95 1914
phungductung 0:e87aa4c49e95 1915 return HAL_OK;
phungductung 0:e87aa4c49e95 1916 }
phungductung 0:e87aa4c49e95 1917
phungductung 0:e87aa4c49e95 1918 /**
phungductung 0:e87aa4c49e95 1919 * @brief Enables the UART transmitter and disables the UART receiver.
phungductung 0:e87aa4c49e95 1920 * @param huart: UART handle
phungductung 0:e87aa4c49e95 1921 * @retval HAL status
phungductung 0:e87aa4c49e95 1922 * @retval None
phungductung 0:e87aa4c49e95 1923 */
phungductung 0:e87aa4c49e95 1924 HAL_StatusTypeDef HAL_HalfDuplex_EnableTransmitter(UART_HandleTypeDef *huart)
phungductung 0:e87aa4c49e95 1925 {
phungductung 0:e87aa4c49e95 1926 /* Process Locked */
phungductung 0:e87aa4c49e95 1927 __HAL_LOCK(huart);
phungductung 0:e87aa4c49e95 1928 huart->State = HAL_UART_STATE_BUSY;
phungductung 0:e87aa4c49e95 1929
phungductung 0:e87aa4c49e95 1930 /* Clear TE and RE bits */
phungductung 0:e87aa4c49e95 1931 CLEAR_BIT(huart->Instance->CR1, (USART_CR1_TE | USART_CR1_RE));
phungductung 0:e87aa4c49e95 1932 /* Enable the USART's transmit interface by setting the TE bit in the USART CR1 register */
phungductung 0:e87aa4c49e95 1933 SET_BIT(huart->Instance->CR1, USART_CR1_TE);
phungductung 0:e87aa4c49e95 1934
phungductung 0:e87aa4c49e95 1935 huart->State= HAL_UART_STATE_READY;
phungductung 0:e87aa4c49e95 1936 /* Process Unlocked */
phungductung 0:e87aa4c49e95 1937 __HAL_UNLOCK(huart);
phungductung 0:e87aa4c49e95 1938
phungductung 0:e87aa4c49e95 1939 return HAL_OK;
phungductung 0:e87aa4c49e95 1940 }
phungductung 0:e87aa4c49e95 1941
phungductung 0:e87aa4c49e95 1942 /**
phungductung 0:e87aa4c49e95 1943 * @brief Enables the UART receiver and disables the UART transmitter.
phungductung 0:e87aa4c49e95 1944 * @param huart: UART handle
phungductung 0:e87aa4c49e95 1945 * @retval HAL status
phungductung 0:e87aa4c49e95 1946 */
phungductung 0:e87aa4c49e95 1947 HAL_StatusTypeDef HAL_HalfDuplex_EnableReceiver(UART_HandleTypeDef *huart)
phungductung 0:e87aa4c49e95 1948 {
phungductung 0:e87aa4c49e95 1949 /* Process Locked */
phungductung 0:e87aa4c49e95 1950 __HAL_LOCK(huart);
phungductung 0:e87aa4c49e95 1951 huart->State = HAL_UART_STATE_BUSY;
phungductung 0:e87aa4c49e95 1952
phungductung 0:e87aa4c49e95 1953 /* Clear TE and RE bits */
phungductung 0:e87aa4c49e95 1954 CLEAR_BIT(huart->Instance->CR1, (USART_CR1_TE | USART_CR1_RE));
phungductung 0:e87aa4c49e95 1955 /* Enable the USART's receive interface by setting the RE bit in the USART CR1 register */
phungductung 0:e87aa4c49e95 1956 SET_BIT(huart->Instance->CR1, USART_CR1_RE);
phungductung 0:e87aa4c49e95 1957
phungductung 0:e87aa4c49e95 1958 huart->State = HAL_UART_STATE_READY;
phungductung 0:e87aa4c49e95 1959 /* Process Unlocked */
phungductung 0:e87aa4c49e95 1960 __HAL_UNLOCK(huart);
phungductung 0:e87aa4c49e95 1961
phungductung 0:e87aa4c49e95 1962 return HAL_OK;
phungductung 0:e87aa4c49e95 1963 }
phungductung 0:e87aa4c49e95 1964
phungductung 0:e87aa4c49e95 1965
phungductung 0:e87aa4c49e95 1966 /**
phungductung 0:e87aa4c49e95 1967 * @brief Transmits break characters.
phungductung 0:e87aa4c49e95 1968 * @param huart: UART handle
phungductung 0:e87aa4c49e95 1969 * @retval HAL status
phungductung 0:e87aa4c49e95 1970 */
phungductung 0:e87aa4c49e95 1971 HAL_StatusTypeDef HAL_LIN_SendBreak(UART_HandleTypeDef *huart)
phungductung 0:e87aa4c49e95 1972 {
phungductung 0:e87aa4c49e95 1973 /* Check the parameters */
phungductung 0:e87aa4c49e95 1974 assert_param(IS_UART_INSTANCE(huart->Instance));
phungductung 0:e87aa4c49e95 1975
phungductung 0:e87aa4c49e95 1976 /* Process Locked */
phungductung 0:e87aa4c49e95 1977 __HAL_LOCK(huart);
phungductung 0:e87aa4c49e95 1978
phungductung 0:e87aa4c49e95 1979 huart->State = HAL_UART_STATE_BUSY;
phungductung 0:e87aa4c49e95 1980
phungductung 0:e87aa4c49e95 1981 /* Send break characters */
phungductung 0:e87aa4c49e95 1982 huart->Instance->RQR |= UART_SENDBREAK_REQUEST;
phungductung 0:e87aa4c49e95 1983
phungductung 0:e87aa4c49e95 1984 huart->State = HAL_UART_STATE_READY;
phungductung 0:e87aa4c49e95 1985
phungductung 0:e87aa4c49e95 1986 /* Process Unlocked */
phungductung 0:e87aa4c49e95 1987 __HAL_UNLOCK(huart);
phungductung 0:e87aa4c49e95 1988
phungductung 0:e87aa4c49e95 1989 return HAL_OK;
phungductung 0:e87aa4c49e95 1990 }
phungductung 0:e87aa4c49e95 1991
phungductung 0:e87aa4c49e95 1992
phungductung 0:e87aa4c49e95 1993 /**
phungductung 0:e87aa4c49e95 1994 * @}
phungductung 0:e87aa4c49e95 1995 */
phungductung 0:e87aa4c49e95 1996
phungductung 0:e87aa4c49e95 1997 /**
phungductung 0:e87aa4c49e95 1998 * @}
phungductung 0:e87aa4c49e95 1999 */
phungductung 0:e87aa4c49e95 2000
phungductung 0:e87aa4c49e95 2001 #endif /* HAL_UART_MODULE_ENABLED */
phungductung 0:e87aa4c49e95 2002 /**
phungductung 0:e87aa4c49e95 2003 * @}
phungductung 0:e87aa4c49e95 2004 */
phungductung 0:e87aa4c49e95 2005
phungductung 0:e87aa4c49e95 2006 /**
phungductung 0:e87aa4c49e95 2007 * @}
phungductung 0:e87aa4c49e95 2008 */
phungductung 0:e87aa4c49e95 2009
phungductung 0:e87aa4c49e95 2010 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/