fix LPC812 PWM

Dependents:   IR_LED_Send

Fork of mbed-dev by mbed official

Committer:
nameless129
Date:
Mon May 16 16:50:30 2016 +0000
Revision:
129:2e517c56bcfb
Parent:
124:6a4a5b7d7324
PWM Fix:Duty 0%??H???????????????

Who changed what in which revision?

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