Aravind Vadali / mbed-src-AV

Dependents:   micromouse4_encoder_testing PID_Test Lab1_Test WorkingPID ... more

Committer:
aravindsv
Date:
Mon Nov 02 02:26:59 2015 +0000
Revision:
0:ba7650f404af
Reduced HSE_STARTUP_TIMEOUT to 500 ms, fixed some compiler warnings

Who changed what in which revision?

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