mbed library sources for GR-PEACH rev.B.

Fork of mbed-src by mbed official

Committer:
RyoheiHagimoto
Date:
Wed Apr 15 01:34:29 2015 +0000
Revision:
514:cf59050bad8e
Parent:
385:be64abf45658
mbed library sources for GR-PEACH rev.B.

Who changed what in which revision?

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