fix LPC812 PWM

Dependents:   IR_LED_Send

Fork of mbed-dev by mbed official

Committer:
bogdanm
Date:
Thu Oct 01 15:25:22 2015 +0300
Revision:
0:9b334a45a8ff
Child:
113:b3775bf36a83
Initial commit on mbed-dev

Replaces mbed-src (now inactive)

Who changed what in which revision?

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