fix LPC812 PWM

Dependents:   IR_LED_Send

Fork of mbed-dev by mbed official

Committer:
nameless129
Date:
Mon May 16 16:50:30 2016 +0000
Revision:
129:2e517c56bcfb
Parent:
19:112740acecfa
PWM Fix:Duty 0%??H???????????????

Who changed what in which revision?

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