mbed library sources

Dependents:   Encrypted my_mbed lklk CyaSSL_DTLS_Cellular ... more

Superseded

This library was superseded by mbed-dev - https://os.mbed.com/users/mbed_official/code/mbed-dev/.

Development branch of the mbed library sources. This library is kept in synch with the latest changes from the mbed SDK and it is not guaranteed to work.

If you are looking for a stable and tested release, please import one of the official mbed library releases:

Import librarymbed

The official Mbed 2 C/C++ SDK provides the software platform and libraries to build your applications.

Committer:
mbed_official
Date:
Sat Feb 08 19:45:06 2014 +0000
Revision:
87:085cde657901
Child:
106:ced8cbb51063
Synchronized with git revision 9272cdeb45ec7e6077641536509413da8fd2ebc2

Full URL: https://github.com/mbedmicro/mbed/commit/9272cdeb45ec7e6077641536509413da8fd2ebc2/

Add NUCLEO_F401RE, improvements

Who changed what in which revision?

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