Mouse code for the MacroRat

Dependencies:   ITG3200 QEI

Committer:
sahilmgandhi
Date:
Sat Jun 03 00:22:44 2017 +0000
Revision:
46:b156ef445742
Parent:
18:6a4db94011d3
Final code for internal battlebot competition.

Who changed what in which revision?

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