ON Semiconductor / mbed-os

Dependents:   mbed-TFT-example-NCS36510 mbed-Accelerometer-example-NCS36510 mbed-Accelerometer-example-NCS36510

Committer:
group-onsemi
Date:
Wed Jan 25 20:34:15 2017 +0000
Revision:
0:098463de4c5d
Initial commit

Who changed what in which revision?

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