mbed library sources. Supersedes mbed-src.

Dependents:   Nucleo_Hello_Encoder BLE_iBeaconScan AM1805_DEMO DISCO-F429ZI_ExportTemplate1 ... more

Committer:
AnnaBridge
Date:
Wed Feb 20 22:31:08 2019 +0000
Revision:
189:f392fc9709a3
Parent:
186:707f6e361f3e
mbed library release version 165

Who changed what in which revision?

UserRevisionLine numberNew contents of line
<> 144:ef7eb2e8f9f7 1 /**
<> 144:ef7eb2e8f9f7 2 ******************************************************************************
<> 144:ef7eb2e8f9f7 3 * @file stm32l0xx_hal_irda.c
<> 144:ef7eb2e8f9f7 4 * @author MCD Application Team
<> 144:ef7eb2e8f9f7 5 * @brief IRDA HAL module driver.
Anna Bridge 186:707f6e361f3e 6 * This file provides firmware functions to manage the following
Anna Bridge 186:707f6e361f3e 7 * functionalities of the IrDA (Infrared Data Association) Peripheral
<> 144:ef7eb2e8f9f7 8 * (IRDA)
<> 144:ef7eb2e8f9f7 9 * + Initialization and de-initialization functions
<> 144:ef7eb2e8f9f7 10 * + IO operation functions
Anna Bridge 186:707f6e361f3e 11 * + Peripheral State and Errors functions
<> 144:ef7eb2e8f9f7 12 * + Peripheral Control functions
<> 144:ef7eb2e8f9f7 13 *
Anna Bridge 186:707f6e361f3e 14 @verbatim
Anna Bridge 186:707f6e361f3e 15 ==============================================================================
<> 144:ef7eb2e8f9f7 16 ##### How to use this driver #####
Anna Bridge 186:707f6e361f3e 17 ==============================================================================
Anna Bridge 186:707f6e361f3e 18 [..]
<> 144:ef7eb2e8f9f7 19 The IRDA HAL driver can be used as follows:
<> 144:ef7eb2e8f9f7 20
Anna Bridge 186:707f6e361f3e 21 (#) Declare a IRDA_HandleTypeDef handle structure (eg. IRDA_HandleTypeDef hirda).
Anna Bridge 186:707f6e361f3e 22 (#) Initialize the IRDA low level resources by implementing the HAL_IRDA_MspInit() API
Anna Bridge 186:707f6e361f3e 23 in setting the associated USART or UART in IRDA mode:
Anna Bridge 186:707f6e361f3e 24 (++) Enable the USARTx/UARTx interface clock.
Anna Bridge 186:707f6e361f3e 25 (++) USARTx/UARTx pins configuration:
Anna Bridge 186:707f6e361f3e 26 (+++) Enable the clock for the USARTx/UARTx GPIOs.
Anna Bridge 186:707f6e361f3e 27 (+++) Configure these USARTx/UARTx pins (TX as alternate function pull-up, RX as alternate function Input).
Anna Bridge 186:707f6e361f3e 28 (++) NVIC configuration if you need to use interrupt process (HAL_IRDA_Transmit_IT()
Anna Bridge 186:707f6e361f3e 29 and HAL_IRDA_Receive_IT() APIs):
Anna Bridge 186:707f6e361f3e 30 (+++) Configure the USARTx/UARTx interrupt priority.
Anna Bridge 186:707f6e361f3e 31 (+++) Enable the NVIC USARTx/UARTx IRQ handle.
Anna Bridge 186:707f6e361f3e 32 (+++) The specific IRDA interrupts (Transmission complete interrupt,
Anna Bridge 186:707f6e361f3e 33 RXNE interrupt and Error Interrupts) will be managed using the macros
Anna Bridge 186:707f6e361f3e 34 __HAL_IRDA_ENABLE_IT() and __HAL_IRDA_DISABLE_IT() inside the transmit and receive process.
Anna Bridge 186:707f6e361f3e 35
Anna Bridge 186:707f6e361f3e 36 (++) DMA Configuration if you need to use DMA process (HAL_IRDA_Transmit_DMA()
<> 144:ef7eb2e8f9f7 37 and HAL_IRDA_Receive_DMA() APIs):
Anna Bridge 186:707f6e361f3e 38 (+++) Declare a DMA handle structure for the Tx/Rx channel.
Anna Bridge 186:707f6e361f3e 39 (+++) Enable the DMAx interface clock.
Anna Bridge 186:707f6e361f3e 40 (+++) Configure the declared DMA handle structure with the required Tx/Rx parameters.
Anna Bridge 186:707f6e361f3e 41 (+++) Configure the DMA Tx/Rx channel.
Anna Bridge 186:707f6e361f3e 42 (+++) Associate the initialized DMA handle to the IRDA DMA Tx/Rx handle.
Anna Bridge 186:707f6e361f3e 43 (+++) Configure the priority and enable the NVIC for the transfer complete interrupt on the DMA Tx/Rx channel.
<> 144:ef7eb2e8f9f7 44
Anna Bridge 186:707f6e361f3e 45 (#) Program the Baud Rate, Word Length and Parity and Mode(Receiver/Transmitter),
Anna Bridge 186:707f6e361f3e 46 the normal or low power mode and the clock prescaler in the hirda handle Init structure.
<> 144:ef7eb2e8f9f7 47
<> 144:ef7eb2e8f9f7 48 (#) Initialize the IRDA registers by calling the HAL_IRDA_Init() API:
<> 144:ef7eb2e8f9f7 49 (++) This API configures also the low level Hardware GPIO, CLOCK, CORTEX...etc)
Anna Bridge 186:707f6e361f3e 50 by calling the customized HAL_IRDA_MspInit() API.
<> 144:ef7eb2e8f9f7 51
Anna Bridge 186:707f6e361f3e 52 -@@- The specific IRDA interrupts (Transmission complete interrupt,
Anna Bridge 186:707f6e361f3e 53 RXNE interrupt and Error Interrupts) will be managed using the macros
Anna Bridge 186:707f6e361f3e 54 __HAL_IRDA_ENABLE_IT() and __HAL_IRDA_DISABLE_IT() inside the transmit and receive process.
Anna Bridge 186:707f6e361f3e 55
<> 144:ef7eb2e8f9f7 56 (#) Three operation modes are available within this driver :
Anna Bridge 186:707f6e361f3e 57
Anna Bridge 186:707f6e361f3e 58 *** Polling mode IO operation ***
Anna Bridge 186:707f6e361f3e 59 =================================
Anna Bridge 186:707f6e361f3e 60 [..]
Anna Bridge 186:707f6e361f3e 61 (+) Send an amount of data in blocking mode using HAL_IRDA_Transmit()
Anna Bridge 186:707f6e361f3e 62 (+) Receive an amount of data in blocking mode using HAL_IRDA_Receive()
Anna Bridge 186:707f6e361f3e 63
Anna Bridge 186:707f6e361f3e 64 *** Interrupt mode IO operation ***
Anna Bridge 186:707f6e361f3e 65 ===================================
Anna Bridge 186:707f6e361f3e 66 [..]
Anna Bridge 186:707f6e361f3e 67 (+) Send an amount of data in non-blocking mode using HAL_IRDA_Transmit_IT()
Anna Bridge 186:707f6e361f3e 68 (+) At transmission end of transfer HAL_IRDA_TxCpltCallback() is executed and user can
Anna Bridge 186:707f6e361f3e 69 add his own code by customization of function pointer HAL_IRDA_TxCpltCallback()
Anna Bridge 186:707f6e361f3e 70 (+) Receive an amount of data in non-blocking mode using HAL_IRDA_Receive_IT()
Anna Bridge 186:707f6e361f3e 71 (+) At reception end of transfer HAL_IRDA_RxCpltCallback() is executed and user can
Anna Bridge 186:707f6e361f3e 72 add his own code by customization of function pointer HAL_IRDA_RxCpltCallback()
Anna Bridge 186:707f6e361f3e 73 (+) In case of transfer Error, HAL_IRDA_ErrorCallback() function is executed and user can
Anna Bridge 186:707f6e361f3e 74 add his own code by customization of function pointer HAL_IRDA_ErrorCallback()
<> 144:ef7eb2e8f9f7 75
Anna Bridge 186:707f6e361f3e 76 *** DMA mode IO operation ***
Anna Bridge 186:707f6e361f3e 77 ==============================
Anna Bridge 186:707f6e361f3e 78 [..]
Anna Bridge 186:707f6e361f3e 79 (+) Send an amount of data in non-blocking mode (DMA) using HAL_IRDA_Transmit_DMA()
Anna Bridge 186:707f6e361f3e 80 (+) At transmission half of transfer HAL_IRDA_TxHalfCpltCallback() is executed and user can
Anna Bridge 186:707f6e361f3e 81 add his own code by customization of function pointer HAL_IRDA_TxHalfCpltCallback()
Anna Bridge 186:707f6e361f3e 82 (+) At transmission end of transfer HAL_IRDA_TxCpltCallback() is executed and user can
Anna Bridge 186:707f6e361f3e 83 add his own code by customization of function pointer HAL_IRDA_TxCpltCallback()
Anna Bridge 186:707f6e361f3e 84 (+) Receive an amount of data in non-blocking mode (DMA) using HAL_IRDA_Receive_DMA()
Anna Bridge 186:707f6e361f3e 85 (+) At reception half of transfer HAL_IRDA_RxHalfCpltCallback() is executed and user can
Anna Bridge 186:707f6e361f3e 86 add his own code by customization of function pointer HAL_IRDA_RxHalfCpltCallback()
Anna Bridge 186:707f6e361f3e 87 (+) At reception end of transfer HAL_IRDA_RxCpltCallback() is executed and user can
Anna Bridge 186:707f6e361f3e 88 add his own code by customization of function pointer HAL_IRDA_RxCpltCallback()
Anna Bridge 186:707f6e361f3e 89 (+) In case of transfer Error, HAL_IRDA_ErrorCallback() function is executed and user can
Anna Bridge 186:707f6e361f3e 90 add his own code by customization of function pointer HAL_IRDA_ErrorCallback()
<> 144:ef7eb2e8f9f7 91
Anna Bridge 186:707f6e361f3e 92 *** IRDA HAL driver macros list ***
Anna Bridge 186:707f6e361f3e 93 ====================================
Anna Bridge 186:707f6e361f3e 94 [..]
Anna Bridge 186:707f6e361f3e 95 Below the list of most used macros in IRDA HAL driver.
Anna Bridge 186:707f6e361f3e 96
Anna Bridge 186:707f6e361f3e 97 (+) __HAL_IRDA_ENABLE: Enable the IRDA peripheral
Anna Bridge 186:707f6e361f3e 98 (+) __HAL_IRDA_DISABLE: Disable the IRDA peripheral
Anna Bridge 186:707f6e361f3e 99 (+) __HAL_IRDA_GET_FLAG : Check whether the specified IRDA flag is set or not
Anna Bridge 186:707f6e361f3e 100 (+) __HAL_IRDA_CLEAR_FLAG : Clear the specified IRDA pending flag
Anna Bridge 186:707f6e361f3e 101 (+) __HAL_IRDA_ENABLE_IT: Enable the specified IRDA interrupt
Anna Bridge 186:707f6e361f3e 102 (+) __HAL_IRDA_DISABLE_IT: Disable the specified IRDA interrupt
Anna Bridge 186:707f6e361f3e 103 (+) __HAL_IRDA_GET_IT_SOURCE: Check whether or not the specified IRDA interrupt is enabled
Anna Bridge 186:707f6e361f3e 104
Anna Bridge 186:707f6e361f3e 105 [..]
Anna Bridge 186:707f6e361f3e 106 (@) You can refer to the IRDA HAL driver header file for more useful macros
<> 144:ef7eb2e8f9f7 107
<> 144:ef7eb2e8f9f7 108 @endverbatim
<> 144:ef7eb2e8f9f7 109 ******************************************************************************
<> 144:ef7eb2e8f9f7 110 * @attention
<> 144:ef7eb2e8f9f7 111 *
<> 144:ef7eb2e8f9f7 112 * <h2><center>&copy; COPYRIGHT(c) 2016 STMicroelectronics</center></h2>
<> 144:ef7eb2e8f9f7 113 *
<> 144:ef7eb2e8f9f7 114 * Redistribution and use in source and binary forms, with or without modification,
<> 144:ef7eb2e8f9f7 115 * are permitted provided that the following conditions are met:
<> 144:ef7eb2e8f9f7 116 * 1. Redistributions of source code must retain the above copyright notice,
<> 144:ef7eb2e8f9f7 117 * this list of conditions and the following disclaimer.
<> 144:ef7eb2e8f9f7 118 * 2. Redistributions in binary form must reproduce the above copyright notice,
<> 144:ef7eb2e8f9f7 119 * this list of conditions and the following disclaimer in the documentation
<> 144:ef7eb2e8f9f7 120 * and/or other materials provided with the distribution.
<> 144:ef7eb2e8f9f7 121 * 3. Neither the name of STMicroelectronics nor the names of its contributors
<> 144:ef7eb2e8f9f7 122 * may be used to endorse or promote products derived from this software
<> 144:ef7eb2e8f9f7 123 * without specific prior written permission.
<> 144:ef7eb2e8f9f7 124 *
<> 144:ef7eb2e8f9f7 125 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
<> 144:ef7eb2e8f9f7 126 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
<> 144:ef7eb2e8f9f7 127 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
<> 144:ef7eb2e8f9f7 128 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
<> 144:ef7eb2e8f9f7 129 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
<> 144:ef7eb2e8f9f7 130 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
<> 144:ef7eb2e8f9f7 131 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
<> 144:ef7eb2e8f9f7 132 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
<> 144:ef7eb2e8f9f7 133 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
<> 144:ef7eb2e8f9f7 134 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
<> 144:ef7eb2e8f9f7 135 *
Anna Bridge 186:707f6e361f3e 136 ******************************************************************************
Anna Bridge 186:707f6e361f3e 137 */
<> 144:ef7eb2e8f9f7 138
<> 144:ef7eb2e8f9f7 139 /* Includes ------------------------------------------------------------------*/
<> 144:ef7eb2e8f9f7 140 #include "stm32l0xx_hal.h"
<> 144:ef7eb2e8f9f7 141
<> 144:ef7eb2e8f9f7 142 /** @addtogroup STM32L0xx_HAL_Driver
<> 144:ef7eb2e8f9f7 143 * @{
<> 144:ef7eb2e8f9f7 144 */
<> 144:ef7eb2e8f9f7 145
Anna Bridge 186:707f6e361f3e 146 /** @defgroup IRDA IRDA
Anna Bridge 186:707f6e361f3e 147 * @brief HAL IRDA module driver
<> 144:ef7eb2e8f9f7 148 * @{
<> 144:ef7eb2e8f9f7 149 */
<> 144:ef7eb2e8f9f7 150
Anna Bridge 186:707f6e361f3e 151 #ifdef HAL_IRDA_MODULE_ENABLED
Anna Bridge 186:707f6e361f3e 152
<> 144:ef7eb2e8f9f7 153 /* Private typedef -----------------------------------------------------------*/
<> 144:ef7eb2e8f9f7 154 /* Private define ------------------------------------------------------------*/
Anna Bridge 186:707f6e361f3e 155 /** @defgroup IRDA_Private_Constants IRDA Private Constants
Anna Bridge 186:707f6e361f3e 156 * @{
Anna Bridge 186:707f6e361f3e 157 */
Anna Bridge 186:707f6e361f3e 158 #define IRDA_TEACK_REACK_TIMEOUT 1000U /*!< IRDA TX or RX enable acknowledge time-out value */
<> 144:ef7eb2e8f9f7 159 #define IRDA_CR1_FIELDS ((uint32_t)(USART_CR1_M | USART_CR1_PCE \
Anna Bridge 186:707f6e361f3e 160 | USART_CR1_PS | USART_CR1_TE | USART_CR1_RE)) /*!< UART or USART CR1 fields of parameters set by IRDA_SetConfig API */
Anna Bridge 186:707f6e361f3e 161 /**
Anna Bridge 186:707f6e361f3e 162 * @}
Anna Bridge 186:707f6e361f3e 163 */
Anna Bridge 186:707f6e361f3e 164
Anna Bridge 186:707f6e361f3e 165 /* Private macros ------------------------------------------------------------*/
<> 144:ef7eb2e8f9f7 166 /* Private variables ---------------------------------------------------------*/
<> 144:ef7eb2e8f9f7 167 /* Private function prototypes -----------------------------------------------*/
Anna Bridge 186:707f6e361f3e 168 /** @addtogroup IRDA_Private_Functions
Anna Bridge 186:707f6e361f3e 169 * @{
Anna Bridge 186:707f6e361f3e 170 */
Anna Bridge 186:707f6e361f3e 171 static HAL_StatusTypeDef IRDA_SetConfig(IRDA_HandleTypeDef *hirda);
Anna Bridge 186:707f6e361f3e 172 static HAL_StatusTypeDef IRDA_CheckIdleState(IRDA_HandleTypeDef *hirda);
Anna Bridge 186:707f6e361f3e 173 static HAL_StatusTypeDef IRDA_WaitOnFlagUntilTimeout(IRDA_HandleTypeDef *hirda, uint32_t Flag, FlagStatus Status, uint32_t Tickstart, uint32_t Timeout);
Anna Bridge 186:707f6e361f3e 174 static void IRDA_EndTxTransfer(IRDA_HandleTypeDef *hirda);
Anna Bridge 186:707f6e361f3e 175 static void IRDA_EndRxTransfer(IRDA_HandleTypeDef *hirda);
<> 144:ef7eb2e8f9f7 176 static void IRDA_DMATransmitCplt(DMA_HandleTypeDef *hdma);
<> 144:ef7eb2e8f9f7 177 static void IRDA_DMATransmitHalfCplt(DMA_HandleTypeDef *hdma);
<> 144:ef7eb2e8f9f7 178 static void IRDA_DMAReceiveCplt(DMA_HandleTypeDef *hdma);
<> 144:ef7eb2e8f9f7 179 static void IRDA_DMAReceiveHalfCplt(DMA_HandleTypeDef *hdma);
Anna Bridge 186:707f6e361f3e 180 static void IRDA_DMAError(DMA_HandleTypeDef *hdma);
Anna Bridge 186:707f6e361f3e 181 static void IRDA_DMAAbortOnError(DMA_HandleTypeDef *hdma);
Anna Bridge 186:707f6e361f3e 182 static void IRDA_DMATxAbortCallback(DMA_HandleTypeDef *hdma);
Anna Bridge 186:707f6e361f3e 183 static void IRDA_DMARxAbortCallback(DMA_HandleTypeDef *hdma);
Anna Bridge 186:707f6e361f3e 184 static void IRDA_DMATxOnlyAbortCallback(DMA_HandleTypeDef *hdma);
Anna Bridge 186:707f6e361f3e 185 static void IRDA_DMARxOnlyAbortCallback(DMA_HandleTypeDef *hdma);
<> 144:ef7eb2e8f9f7 186 static HAL_StatusTypeDef IRDA_Transmit_IT(IRDA_HandleTypeDef *hirda);
<> 144:ef7eb2e8f9f7 187 static HAL_StatusTypeDef IRDA_EndTransmit_IT(IRDA_HandleTypeDef *hirda);
<> 144:ef7eb2e8f9f7 188 static HAL_StatusTypeDef IRDA_Receive_IT(IRDA_HandleTypeDef *hirda);
<> 144:ef7eb2e8f9f7 189 /**
<> 144:ef7eb2e8f9f7 190 * @}
<> 144:ef7eb2e8f9f7 191 */
Anna Bridge 186:707f6e361f3e 192
Anna Bridge 186:707f6e361f3e 193 /* Exported functions --------------------------------------------------------*/
Anna Bridge 186:707f6e361f3e 194
Anna Bridge 186:707f6e361f3e 195 /** @defgroup IRDA_Exported_Functions IRDA Exported Functions
<> 144:ef7eb2e8f9f7 196 * @{
<> 144:ef7eb2e8f9f7 197 */
<> 144:ef7eb2e8f9f7 198
Anna Bridge 186:707f6e361f3e 199 /** @defgroup IRDA_Exported_Functions_Group1 Initialization and de-initialization functions
Anna Bridge 186:707f6e361f3e 200 * @brief Initialization and Configuration functions
<> 144:ef7eb2e8f9f7 201 *
Anna Bridge 186:707f6e361f3e 202 @verbatim
Anna Bridge 186:707f6e361f3e 203 ==============================================================================
Anna Bridge 186:707f6e361f3e 204 ##### Initialization and Configuration functions #####
Anna Bridge 186:707f6e361f3e 205 ==============================================================================
Anna Bridge 186:707f6e361f3e 206 [..]
Anna Bridge 186:707f6e361f3e 207 This subsection provides a set of functions allowing to initialize the USARTx
Anna Bridge 186:707f6e361f3e 208 in asynchronous IRDA mode.
Anna Bridge 186:707f6e361f3e 209 (+) For the asynchronous mode only these parameters can be configured:
Anna Bridge 186:707f6e361f3e 210 (++) Baud Rate
Anna Bridge 186:707f6e361f3e 211 (++) Word Length
Anna Bridge 186:707f6e361f3e 212 (++) Parity: If the parity is enabled, then the MSB bit of the data written
Anna Bridge 186:707f6e361f3e 213 in the data register is transmitted but is changed by the parity bit.
Anna Bridge 186:707f6e361f3e 214 (++) Power mode
Anna Bridge 186:707f6e361f3e 215 (++) Prescaler setting
Anna Bridge 186:707f6e361f3e 216 (++) Receiver/transmitter modes
<> 151:5eaa88a5bcc7 217
Anna Bridge 186:707f6e361f3e 218 [..]
Anna Bridge 186:707f6e361f3e 219 The HAL_IRDA_Init() API follows the USART asynchronous configuration procedures
Anna Bridge 186:707f6e361f3e 220 (details for the procedures are available in reference manual).
<> 151:5eaa88a5bcc7 221
<> 151:5eaa88a5bcc7 222 @endverbatim
<> 151:5eaa88a5bcc7 223
Anna Bridge 186:707f6e361f3e 224 Depending on the frame length defined by the M1 and M0 bits (7-bit,
Anna Bridge 186:707f6e361f3e 225 8-bit or 9-bit), the possible IRDA frame formats are listed in the
Anna Bridge 186:707f6e361f3e 226 following table.
Anna Bridge 186:707f6e361f3e 227
Anna Bridge 186:707f6e361f3e 228 Table 1. IRDA frame format.
Anna Bridge 186:707f6e361f3e 229 +-----------------------------------------------------------------------+
Anna Bridge 186:707f6e361f3e 230 | M1 bit | M0 bit | PCE bit | IRDA frame |
Anna Bridge 186:707f6e361f3e 231 |---------|---------|-----------|---------------------------------------|
Anna Bridge 186:707f6e361f3e 232 | 0 | 0 | 0 | | SB | 8 bit data | STB | |
Anna Bridge 186:707f6e361f3e 233 |---------|---------|-----------|---------------------------------------|
Anna Bridge 186:707f6e361f3e 234 | 0 | 0 | 1 | | SB | 7 bit data | PB | STB | |
Anna Bridge 186:707f6e361f3e 235 |---------|---------|-----------|---------------------------------------|
Anna Bridge 186:707f6e361f3e 236 | 0 | 1 | 0 | | SB | 9 bit data | STB | |
Anna Bridge 186:707f6e361f3e 237 |---------|---------|-----------|---------------------------------------|
Anna Bridge 186:707f6e361f3e 238 | 0 | 1 | 1 | | SB | 8 bit data | PB | STB | |
Anna Bridge 186:707f6e361f3e 239 |---------|---------|-----------|---------------------------------------|
Anna Bridge 186:707f6e361f3e 240 | 1 | 0 | 0 | | SB | 7 bit data | STB | |
Anna Bridge 186:707f6e361f3e 241 |---------|---------|-----------|---------------------------------------|
Anna Bridge 186:707f6e361f3e 242 | 1 | 0 | 1 | | SB | 6 bit data | PB | STB | |
Anna Bridge 186:707f6e361f3e 243 +-----------------------------------------------------------------------+
<> 144:ef7eb2e8f9f7 244
<> 144:ef7eb2e8f9f7 245 * @{
<> 144:ef7eb2e8f9f7 246 */
<> 144:ef7eb2e8f9f7 247
<> 144:ef7eb2e8f9f7 248 /**
Anna Bridge 186:707f6e361f3e 249 * @brief Initialize the IRDA mode according to the specified
Anna Bridge 186:707f6e361f3e 250 * parameters in the IRDA_InitTypeDef and initialize the associated handle.
Anna Bridge 186:707f6e361f3e 251 * @param hirda: Pointer to a IRDA_HandleTypeDef structure that contains
Anna Bridge 186:707f6e361f3e 252 * the configuration information for the specified IRDA module.
<> 144:ef7eb2e8f9f7 253 * @retval HAL status
<> 144:ef7eb2e8f9f7 254 */
<> 144:ef7eb2e8f9f7 255 HAL_StatusTypeDef HAL_IRDA_Init(IRDA_HandleTypeDef *hirda)
<> 144:ef7eb2e8f9f7 256 {
<> 144:ef7eb2e8f9f7 257 /* Check the IRDA handle allocation */
<> 144:ef7eb2e8f9f7 258 if(hirda == NULL)
<> 144:ef7eb2e8f9f7 259 {
<> 144:ef7eb2e8f9f7 260 return HAL_ERROR;
<> 144:ef7eb2e8f9f7 261 }
<> 144:ef7eb2e8f9f7 262
<> 144:ef7eb2e8f9f7 263 /* Check the USART/UART associated to the IRDA handle */
<> 144:ef7eb2e8f9f7 264 assert_param(IS_IRDA_INSTANCE(hirda->Instance));
<> 144:ef7eb2e8f9f7 265
Anna Bridge 186:707f6e361f3e 266 if(hirda->gState == HAL_IRDA_STATE_RESET)
<> 144:ef7eb2e8f9f7 267 {
<> 144:ef7eb2e8f9f7 268 /* Allocate lock resource and initialize it */
<> 144:ef7eb2e8f9f7 269 hirda->Lock = HAL_UNLOCKED;
<> 144:ef7eb2e8f9f7 270
Anna Bridge 186:707f6e361f3e 271 /* Init the low level hardware : GPIO, CLOCK */
<> 144:ef7eb2e8f9f7 272 HAL_IRDA_MspInit(hirda);
<> 144:ef7eb2e8f9f7 273 }
<> 144:ef7eb2e8f9f7 274
Anna Bridge 186:707f6e361f3e 275 hirda->gState = HAL_IRDA_STATE_BUSY;
<> 144:ef7eb2e8f9f7 276
<> 144:ef7eb2e8f9f7 277 /* Disable the Peripheral to update the configuration registers */
<> 144:ef7eb2e8f9f7 278 __HAL_IRDA_DISABLE(hirda);
<> 144:ef7eb2e8f9f7 279
<> 144:ef7eb2e8f9f7 280 /* Set the IRDA Communication parameters */
Anna Bridge 186:707f6e361f3e 281 if (IRDA_SetConfig(hirda) == HAL_ERROR)
Anna Bridge 186:707f6e361f3e 282 {
Anna Bridge 186:707f6e361f3e 283 return HAL_ERROR;
Anna Bridge 186:707f6e361f3e 284 }
<> 144:ef7eb2e8f9f7 285
Anna Bridge 186:707f6e361f3e 286 /* In IRDA mode, the following bits must be kept cleared:
<> 144:ef7eb2e8f9f7 287 - LINEN, STOP and CLKEN bits in the USART_CR2 register,
<> 144:ef7eb2e8f9f7 288 - SCEN and HDSEL bits in the USART_CR3 register.*/
Anna Bridge 186:707f6e361f3e 289 CLEAR_BIT(hirda->Instance->CR2, (USART_CR2_LINEN | USART_CR2_CLKEN | USART_CR2_STOP));
Anna Bridge 186:707f6e361f3e 290 CLEAR_BIT(hirda->Instance->CR3, (USART_CR3_SCEN | USART_CR3_HDSEL));
<> 144:ef7eb2e8f9f7 291
<> 144:ef7eb2e8f9f7 292 /* set the UART/USART in IRDA mode */
Anna Bridge 186:707f6e361f3e 293 hirda->Instance->CR3 |= USART_CR3_IREN;
<> 144:ef7eb2e8f9f7 294
<> 144:ef7eb2e8f9f7 295 /* Enable the Peripheral */
<> 144:ef7eb2e8f9f7 296 __HAL_IRDA_ENABLE(hirda);
<> 144:ef7eb2e8f9f7 297
Anna Bridge 186:707f6e361f3e 298 /* TEACK and/or REACK to check before moving hirda->gState and hirda->RxState to Ready */
<> 144:ef7eb2e8f9f7 299 return (IRDA_CheckIdleState(hirda));
<> 144:ef7eb2e8f9f7 300 }
<> 144:ef7eb2e8f9f7 301
<> 144:ef7eb2e8f9f7 302 /**
Anna Bridge 186:707f6e361f3e 303 * @brief DeInitialize the IRDA peripheral.
Anna Bridge 186:707f6e361f3e 304 * @param hirda: Pointer to a IRDA_HandleTypeDef structure that contains
Anna Bridge 186:707f6e361f3e 305 * the configuration information for the specified IRDA module.
<> 144:ef7eb2e8f9f7 306 * @retval HAL status
<> 144:ef7eb2e8f9f7 307 */
<> 144:ef7eb2e8f9f7 308 HAL_StatusTypeDef HAL_IRDA_DeInit(IRDA_HandleTypeDef *hirda)
<> 144:ef7eb2e8f9f7 309 {
<> 144:ef7eb2e8f9f7 310 /* Check the IRDA handle allocation */
<> 144:ef7eb2e8f9f7 311 if(hirda == NULL)
<> 144:ef7eb2e8f9f7 312 {
<> 144:ef7eb2e8f9f7 313 return HAL_ERROR;
<> 144:ef7eb2e8f9f7 314 }
<> 144:ef7eb2e8f9f7 315
<> 144:ef7eb2e8f9f7 316 /* Check the USART/UART associated to the IRDA handle */
<> 144:ef7eb2e8f9f7 317 assert_param(IS_IRDA_INSTANCE(hirda->Instance));
<> 144:ef7eb2e8f9f7 318
Anna Bridge 186:707f6e361f3e 319 hirda->gState = HAL_IRDA_STATE_BUSY;
<> 144:ef7eb2e8f9f7 320
<> 144:ef7eb2e8f9f7 321 /* DeInit the low level hardware */
<> 144:ef7eb2e8f9f7 322 HAL_IRDA_MspDeInit(hirda);
<> 144:ef7eb2e8f9f7 323 /* Disable the Peripheral */
<> 144:ef7eb2e8f9f7 324 __HAL_IRDA_DISABLE(hirda);
<> 144:ef7eb2e8f9f7 325
<> 144:ef7eb2e8f9f7 326 hirda->ErrorCode = HAL_IRDA_ERROR_NONE;
Anna Bridge 186:707f6e361f3e 327 hirda->gState = HAL_IRDA_STATE_RESET;
Anna Bridge 186:707f6e361f3e 328 hirda->RxState = HAL_IRDA_STATE_RESET;
<> 144:ef7eb2e8f9f7 329
Anna Bridge 186:707f6e361f3e 330 /* Process Unlock */
<> 144:ef7eb2e8f9f7 331 __HAL_UNLOCK(hirda);
<> 144:ef7eb2e8f9f7 332
<> 144:ef7eb2e8f9f7 333 return HAL_OK;
<> 144:ef7eb2e8f9f7 334 }
<> 144:ef7eb2e8f9f7 335
<> 144:ef7eb2e8f9f7 336 /**
Anna Bridge 186:707f6e361f3e 337 * @brief Initialize the IRDA MSP.
Anna Bridge 186:707f6e361f3e 338 * @param hirda: Pointer to a IRDA_HandleTypeDef structure that contains
Anna Bridge 186:707f6e361f3e 339 * the configuration information for the specified IRDA module.
<> 144:ef7eb2e8f9f7 340 * @retval None
<> 144:ef7eb2e8f9f7 341 */
Anna Bridge 186:707f6e361f3e 342 __weak void HAL_IRDA_MspInit(IRDA_HandleTypeDef *hirda)
<> 144:ef7eb2e8f9f7 343 {
<> 144:ef7eb2e8f9f7 344 /* Prevent unused argument(s) compilation warning */
<> 144:ef7eb2e8f9f7 345 UNUSED(hirda);
<> 144:ef7eb2e8f9f7 346
Anna Bridge 186:707f6e361f3e 347 /* NOTE: This function should not be modified, when the callback is needed,
Anna Bridge 186:707f6e361f3e 348 the HAL_IRDA_MspInit can be implemented in the user file
Anna Bridge 186:707f6e361f3e 349 */
<> 144:ef7eb2e8f9f7 350 }
<> 144:ef7eb2e8f9f7 351
<> 144:ef7eb2e8f9f7 352 /**
Anna Bridge 186:707f6e361f3e 353 * @brief DeInitialize the IRDA MSP.
Anna Bridge 186:707f6e361f3e 354 * @param hirda: Pointer to a IRDA_HandleTypeDef structure that contains
Anna Bridge 186:707f6e361f3e 355 * the configuration information for the specified IRDA module.
<> 144:ef7eb2e8f9f7 356 * @retval None
<> 144:ef7eb2e8f9f7 357 */
Anna Bridge 186:707f6e361f3e 358 __weak void HAL_IRDA_MspDeInit(IRDA_HandleTypeDef *hirda)
<> 144:ef7eb2e8f9f7 359 {
<> 144:ef7eb2e8f9f7 360 /* Prevent unused argument(s) compilation warning */
<> 144:ef7eb2e8f9f7 361 UNUSED(hirda);
<> 144:ef7eb2e8f9f7 362
Anna Bridge 186:707f6e361f3e 363 /* NOTE: This function should not be modified, when the callback is needed,
Anna Bridge 186:707f6e361f3e 364 the HAL_IRDA_MspDeInit can be implemented in the user file
Anna Bridge 186:707f6e361f3e 365 */
<> 144:ef7eb2e8f9f7 366 }
<> 144:ef7eb2e8f9f7 367
<> 144:ef7eb2e8f9f7 368 /**
<> 144:ef7eb2e8f9f7 369 * @}
<> 144:ef7eb2e8f9f7 370 */
<> 144:ef7eb2e8f9f7 371
Anna Bridge 186:707f6e361f3e 372 /** @defgroup IRDA_Exported_Functions_Group2 IO operation functions
Anna Bridge 186:707f6e361f3e 373 * @brief IRDA Transmit and Receive functions
<> 144:ef7eb2e8f9f7 374 *
Anna Bridge 186:707f6e361f3e 375 @verbatim
Anna Bridge 186:707f6e361f3e 376 ===============================================================================
<> 144:ef7eb2e8f9f7 377 ##### IO operation functions #####
Anna Bridge 186:707f6e361f3e 378 ===============================================================================
Anna Bridge 186:707f6e361f3e 379 [..]
Anna Bridge 186:707f6e361f3e 380 This subsection provides a set of functions allowing to manage the IRDA data transfers.
Anna Bridge 186:707f6e361f3e 381
Anna Bridge 186:707f6e361f3e 382 [..]
Anna Bridge 186:707f6e361f3e 383 IrDA is a half duplex communication protocol. If the Transmitter is busy, any data
Anna Bridge 186:707f6e361f3e 384 on the IrDA receive line will be ignored by the IrDA decoder and if the Receiver
Anna Bridge 186:707f6e361f3e 385 is busy, data on the TX from the USART to IrDA will not be encoded by IrDA.
Anna Bridge 186:707f6e361f3e 386 While receiving data, transmission should be avoided as the data to be transmitted
Anna Bridge 186:707f6e361f3e 387 could be corrupted.
<> 144:ef7eb2e8f9f7 388
Anna Bridge 186:707f6e361f3e 389 (#) There are two mode of transfer:
Anna Bridge 186:707f6e361f3e 390 (++) Blocking mode: the communication is performed in polling mode.
Anna Bridge 186:707f6e361f3e 391 The HAL status of all data processing is returned by the same function
Anna Bridge 186:707f6e361f3e 392 after finishing transfer.
Anna Bridge 186:707f6e361f3e 393 (++) Non-Blocking mode: the communication is performed using Interrupts
Anna Bridge 186:707f6e361f3e 394 or DMA, these API's return the HAL status.
Anna Bridge 186:707f6e361f3e 395 The end of the data processing will be indicated through the
Anna Bridge 186:707f6e361f3e 396 dedicated IRDA IRQ when using Interrupt mode or the DMA IRQ when
Anna Bridge 186:707f6e361f3e 397 using DMA mode.
Anna Bridge 186:707f6e361f3e 398 The HAL_IRDA_TxCpltCallback(), HAL_IRDA_RxCpltCallback() user callbacks
Anna Bridge 186:707f6e361f3e 399 will be executed respectively at the end of the Transmit or Receive process
Anna Bridge 186:707f6e361f3e 400 The HAL_IRDA_ErrorCallback() user callback will be executed when a communication error is detected
<> 144:ef7eb2e8f9f7 401
Anna Bridge 186:707f6e361f3e 402 (#) Blocking mode APIs are :
<> 144:ef7eb2e8f9f7 403 (++) HAL_IRDA_Transmit()
Anna Bridge 186:707f6e361f3e 404 (++) HAL_IRDA_Receive()
Anna Bridge 186:707f6e361f3e 405
Anna Bridge 186:707f6e361f3e 406 (#) Non Blocking mode APIs with Interrupt are :
<> 144:ef7eb2e8f9f7 407 (++) HAL_IRDA_Transmit_IT()
<> 144:ef7eb2e8f9f7 408 (++) HAL_IRDA_Receive_IT()
<> 144:ef7eb2e8f9f7 409 (++) HAL_IRDA_IRQHandler()
<> 144:ef7eb2e8f9f7 410
Anna Bridge 186:707f6e361f3e 411 (#) Non Blocking mode functions with DMA are :
<> 144:ef7eb2e8f9f7 412 (++) HAL_IRDA_Transmit_DMA()
<> 144:ef7eb2e8f9f7 413 (++) HAL_IRDA_Receive_DMA()
Anna Bridge 186:707f6e361f3e 414 (++) HAL_IRDA_DMAPause()
Anna Bridge 186:707f6e361f3e 415 (++) HAL_IRDA_DMAResume()
Anna Bridge 186:707f6e361f3e 416 (++) HAL_IRDA_DMAStop()
<> 144:ef7eb2e8f9f7 417
Anna Bridge 186:707f6e361f3e 418 (#) A set of Transfer Complete Callbacks are provided in Non Blocking mode:
Anna Bridge 186:707f6e361f3e 419 (++) HAL_IRDA_TxHalfCpltCallback()
<> 144:ef7eb2e8f9f7 420 (++) HAL_IRDA_TxCpltCallback()
Anna Bridge 186:707f6e361f3e 421 (++) HAL_IRDA_RxHalfCpltCallback()
<> 144:ef7eb2e8f9f7 422 (++) HAL_IRDA_RxCpltCallback()
<> 144:ef7eb2e8f9f7 423 (++) HAL_IRDA_ErrorCallback()
Anna Bridge 186:707f6e361f3e 424
Anna Bridge 186:707f6e361f3e 425 (#) Non-Blocking mode transfers could be aborted using Abort API's :
Anna Bridge 186:707f6e361f3e 426 (+) HAL_IRDA_Abort()
Anna Bridge 186:707f6e361f3e 427 (+) HAL_IRDA_AbortTransmit()
Anna Bridge 186:707f6e361f3e 428 (+) HAL_IRDA_AbortReceive()
Anna Bridge 186:707f6e361f3e 429 (+) HAL_IRDA_Abort_IT()
Anna Bridge 186:707f6e361f3e 430 (+) HAL_IRDA_AbortTransmit_IT()
Anna Bridge 186:707f6e361f3e 431 (+) HAL_IRDA_AbortReceive_IT()
Anna Bridge 186:707f6e361f3e 432
Anna Bridge 186:707f6e361f3e 433 (#) For Abort services based on interrupts (HAL_IRDA_Abortxxx_IT), a set of Abort Complete Callbacks are provided:
Anna Bridge 186:707f6e361f3e 434 (+) HAL_IRDA_AbortCpltCallback()
Anna Bridge 186:707f6e361f3e 435 (+) HAL_IRDA_AbortTransmitCpltCallback()
Anna Bridge 186:707f6e361f3e 436 (+) HAL_IRDA_AbortReceiveCpltCallback()
Anna Bridge 186:707f6e361f3e 437
Anna Bridge 186:707f6e361f3e 438 (#) In Non-Blocking mode transfers, possible errors are split into 2 categories.
Anna Bridge 186:707f6e361f3e 439 Errors are handled as follows :
Anna Bridge 186:707f6e361f3e 440 (+) Error is considered as Recoverable and non blocking : Transfer could go till end, but error severity is
Anna Bridge 186:707f6e361f3e 441 to be evaluated by user : this concerns Frame Error, Parity Error or Noise Error in Interrupt mode reception .
Anna Bridge 186:707f6e361f3e 442 Received character is then retrieved and stored in Rx buffer, Error code is set to allow user to identify error type,
Anna Bridge 186:707f6e361f3e 443 and HAL_IRDA_ErrorCallback() user callback is executed. Transfer is kept ongoing on IRDA side.
Anna Bridge 186:707f6e361f3e 444 If user wants to abort it, Abort services should be called by user.
Anna Bridge 186:707f6e361f3e 445 (+) Error is considered as Blocking : Transfer could not be completed properly and is aborted.
Anna Bridge 186:707f6e361f3e 446 This concerns Overrun Error In Interrupt mode reception and all errors in DMA mode.
Anna Bridge 186:707f6e361f3e 447 Error code is set to allow user to identify error type, and HAL_IRDA_ErrorCallback() user callback is executed.
Anna Bridge 186:707f6e361f3e 448
<> 144:ef7eb2e8f9f7 449 @endverbatim
<> 144:ef7eb2e8f9f7 450 * @{
<> 144:ef7eb2e8f9f7 451 */
<> 144:ef7eb2e8f9f7 452
<> 144:ef7eb2e8f9f7 453 /**
Anna Bridge 186:707f6e361f3e 454 * @brief Send an amount of data in blocking mode.
Anna Bridge 186:707f6e361f3e 455 * @param hirda Pointer to a IRDA_HandleTypeDef structure that contains
Anna Bridge 186:707f6e361f3e 456 * the configuration information for the specified IRDA module.
Anna Bridge 186:707f6e361f3e 457 * @param pData Pointer to data buffer.
Anna Bridge 186:707f6e361f3e 458 * @param Size Amount of data to be sent.
Anna Bridge 186:707f6e361f3e 459 * @param Timeout Specify timeout value.
Anna Bridge 186:707f6e361f3e 460 * @note When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01),
Anna Bridge 186:707f6e361f3e 461 * address of user data buffer containing data to be sent, should be aligned on a half word frontier (16 bits)
Anna Bridge 186:707f6e361f3e 462 * (as sent data will be handled using u16 pointer cast). Depending on compilation chain,
Anna Bridge 186:707f6e361f3e 463 * use of specific alignment compilation directives or pragmas might be required to ensure proper alignment for pData.
<> 144:ef7eb2e8f9f7 464 * @retval HAL status
<> 144:ef7eb2e8f9f7 465 */
<> 144:ef7eb2e8f9f7 466 HAL_StatusTypeDef HAL_IRDA_Transmit(IRDA_HandleTypeDef *hirda, uint8_t *pData, uint16_t Size, uint32_t Timeout)
<> 144:ef7eb2e8f9f7 467 {
Anna Bridge 186:707f6e361f3e 468 uint16_t* tmp;
Anna Bridge 186:707f6e361f3e 469 uint32_t tickstart = 0;
Anna Bridge 186:707f6e361f3e 470
Anna Bridge 186:707f6e361f3e 471 /* Check that a Tx process is not already ongoing */
Anna Bridge 186:707f6e361f3e 472 if(hirda->gState == HAL_IRDA_STATE_READY)
<> 144:ef7eb2e8f9f7 473 {
Anna Bridge 186:707f6e361f3e 474 if((pData == NULL) || (Size == 0U))
<> 144:ef7eb2e8f9f7 475 {
Anna Bridge 186:707f6e361f3e 476 return HAL_ERROR;
<> 144:ef7eb2e8f9f7 477 }
Anna Bridge 186:707f6e361f3e 478
Anna Bridge 186:707f6e361f3e 479 /* In case of 9bits/No Parity transfer, pData buffer provided as input paramter
Anna Bridge 186:707f6e361f3e 480 should be aligned on a u16 frontier, as data to be filled into TDR will be
Anna Bridge 186:707f6e361f3e 481 handled through a u16 cast. */
Anna Bridge 186:707f6e361f3e 482 if ((hirda->Init.WordLength == UART_WORDLENGTH_9B) && (hirda->Init.Parity == UART_PARITY_NONE))
Anna Bridge 186:707f6e361f3e 483 {
Anna Bridge 186:707f6e361f3e 484 if((((uint32_t)pData)&1) != 0)
Anna Bridge 186:707f6e361f3e 485 {
Anna Bridge 186:707f6e361f3e 486 return HAL_ERROR;
Anna Bridge 186:707f6e361f3e 487 }
Anna Bridge 186:707f6e361f3e 488 }
Anna Bridge 186:707f6e361f3e 489
<> 144:ef7eb2e8f9f7 490 /* Process Locked */
<> 144:ef7eb2e8f9f7 491 __HAL_LOCK(hirda);
Anna Bridge 186:707f6e361f3e 492
<> 144:ef7eb2e8f9f7 493 hirda->ErrorCode = HAL_IRDA_ERROR_NONE;
Anna Bridge 186:707f6e361f3e 494 hirda->gState = HAL_IRDA_STATE_BUSY_TX;
<> 144:ef7eb2e8f9f7 495
Anna Bridge 186:707f6e361f3e 496 /* Init tickstart for timeout managment*/
Anna Bridge 186:707f6e361f3e 497 tickstart = HAL_GetTick();
Anna Bridge 186:707f6e361f3e 498
<> 144:ef7eb2e8f9f7 499 hirda->TxXferSize = Size;
<> 144:ef7eb2e8f9f7 500 hirda->TxXferCount = Size;
<> 151:5eaa88a5bcc7 501 while(hirda->TxXferCount > 0U)
<> 144:ef7eb2e8f9f7 502 {
<> 144:ef7eb2e8f9f7 503 hirda->TxXferCount--;
<> 144:ef7eb2e8f9f7 504
Anna Bridge 186:707f6e361f3e 505 if(IRDA_WaitOnFlagUntilTimeout(hirda, IRDA_FLAG_TXE, RESET, tickstart, Timeout) != HAL_OK)
Anna Bridge 186:707f6e361f3e 506 {
Anna Bridge 186:707f6e361f3e 507 return HAL_TIMEOUT;
Anna Bridge 186:707f6e361f3e 508 }
<> 144:ef7eb2e8f9f7 509 if ((hirda->Init.WordLength == IRDA_WORDLENGTH_9B) && (hirda->Init.Parity == IRDA_PARITY_NONE))
Anna Bridge 186:707f6e361f3e 510 {
Anna Bridge 186:707f6e361f3e 511 tmp = (uint16_t*) pData;
Anna Bridge 186:707f6e361f3e 512 hirda->Instance->TDR = (*tmp & (uint16_t)0x01FFU);
Anna Bridge 186:707f6e361f3e 513 pData += 2;
Anna Bridge 186:707f6e361f3e 514 }
Anna Bridge 186:707f6e361f3e 515 else
Anna Bridge 186:707f6e361f3e 516 {
Anna Bridge 186:707f6e361f3e 517 hirda->Instance->TDR = (*pData++ & (uint8_t)0xFFU);
Anna Bridge 186:707f6e361f3e 518 }
Anna Bridge 186:707f6e361f3e 519 }
<> 144:ef7eb2e8f9f7 520
Anna Bridge 186:707f6e361f3e 521 if(IRDA_WaitOnFlagUntilTimeout(hirda, IRDA_FLAG_TC, RESET, tickstart, Timeout) != HAL_OK)
<> 144:ef7eb2e8f9f7 522 {
Anna Bridge 186:707f6e361f3e 523 return HAL_TIMEOUT;
<> 144:ef7eb2e8f9f7 524 }
Anna Bridge 186:707f6e361f3e 525
Anna Bridge 186:707f6e361f3e 526 /* At end of Tx process, restore hirda->gState to Ready */
Anna Bridge 186:707f6e361f3e 527 hirda->gState = HAL_IRDA_STATE_READY;
Anna Bridge 186:707f6e361f3e 528
<> 144:ef7eb2e8f9f7 529 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 530 __HAL_UNLOCK(hirda);
Anna Bridge 186:707f6e361f3e 531
<> 144:ef7eb2e8f9f7 532 return HAL_OK;
<> 144:ef7eb2e8f9f7 533 }
<> 144:ef7eb2e8f9f7 534 else
<> 144:ef7eb2e8f9f7 535 {
Anna Bridge 186:707f6e361f3e 536 return HAL_BUSY;
<> 144:ef7eb2e8f9f7 537 }
<> 144:ef7eb2e8f9f7 538 }
<> 144:ef7eb2e8f9f7 539
<> 144:ef7eb2e8f9f7 540 /**
Anna Bridge 186:707f6e361f3e 541 * @brief Receive an amount of data in blocking mode.
Anna Bridge 186:707f6e361f3e 542 * @param hirda Pointer to a IRDA_HandleTypeDef structure that contains
Anna Bridge 186:707f6e361f3e 543 * the configuration information for the specified IRDA module.
Anna Bridge 186:707f6e361f3e 544 * @param pData Pointer to data buffer.
Anna Bridge 186:707f6e361f3e 545 * @param Size Amount of data to be received.
Anna Bridge 186:707f6e361f3e 546 * @param Timeout Specify timeout value.
Anna Bridge 186:707f6e361f3e 547 * @note When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01),
Anna Bridge 186:707f6e361f3e 548 * address of user data buffer containing data to be sent, should be aligned on a half word frontier (16 bits)
Anna Bridge 186:707f6e361f3e 549 * (as sent data will be handled using u16 pointer cast). Depending on compilation chain,
Anna Bridge 186:707f6e361f3e 550 * use of specific alignment compilation directives or pragmas might be required to ensure proper alignment for pData.
<> 144:ef7eb2e8f9f7 551 * @retval HAL status
<> 144:ef7eb2e8f9f7 552 */
<> 144:ef7eb2e8f9f7 553 HAL_StatusTypeDef HAL_IRDA_Receive(IRDA_HandleTypeDef *hirda, uint8_t *pData, uint16_t Size, uint32_t Timeout)
Anna Bridge 186:707f6e361f3e 554 {
<> 144:ef7eb2e8f9f7 555 uint16_t* tmp;
<> 144:ef7eb2e8f9f7 556 uint16_t uhMask;
Anna Bridge 186:707f6e361f3e 557 uint32_t tickstart = 0;
Anna Bridge 186:707f6e361f3e 558
Anna Bridge 186:707f6e361f3e 559 /* Check that a Rx process is not already ongoing */
Anna Bridge 186:707f6e361f3e 560 if(hirda->RxState == HAL_IRDA_STATE_READY)
Anna Bridge 186:707f6e361f3e 561 {
Anna Bridge 186:707f6e361f3e 562 if((pData == NULL) || (Size == 0U))
<> 144:ef7eb2e8f9f7 563 {
Anna Bridge 186:707f6e361f3e 564 return HAL_ERROR;
<> 144:ef7eb2e8f9f7 565 }
Anna Bridge 186:707f6e361f3e 566
Anna Bridge 186:707f6e361f3e 567 /* In case of 9bits/No Parity transfer, pData buffer provided as input paramter
Anna Bridge 186:707f6e361f3e 568 should be aligned on a u16 frontier, as data to be received from RDR will be
Anna Bridge 186:707f6e361f3e 569 handled through a u16 cast. */
Anna Bridge 186:707f6e361f3e 570 if ((hirda->Init.WordLength == UART_WORDLENGTH_9B) && (hirda->Init.Parity == UART_PARITY_NONE))
Anna Bridge 186:707f6e361f3e 571 {
Anna Bridge 186:707f6e361f3e 572 if((((uint32_t)pData)&1) != 0)
Anna Bridge 186:707f6e361f3e 573 {
Anna Bridge 186:707f6e361f3e 574 return HAL_ERROR;
Anna Bridge 186:707f6e361f3e 575 }
Anna Bridge 186:707f6e361f3e 576 }
Anna Bridge 186:707f6e361f3e 577
<> 144:ef7eb2e8f9f7 578 /* Process Locked */
<> 144:ef7eb2e8f9f7 579 __HAL_LOCK(hirda);
Anna Bridge 186:707f6e361f3e 580
<> 144:ef7eb2e8f9f7 581 hirda->ErrorCode = HAL_IRDA_ERROR_NONE;
Anna Bridge 186:707f6e361f3e 582 hirda->RxState = HAL_IRDA_STATE_BUSY_RX;
<> 144:ef7eb2e8f9f7 583
Anna Bridge 186:707f6e361f3e 584 /* Init tickstart for timeout managment*/
Anna Bridge 186:707f6e361f3e 585 tickstart = HAL_GetTick();
Anna Bridge 186:707f6e361f3e 586
Anna Bridge 186:707f6e361f3e 587 hirda->RxXferSize = Size;
<> 144:ef7eb2e8f9f7 588 hirda->RxXferCount = Size;
<> 144:ef7eb2e8f9f7 589
Anna Bridge 186:707f6e361f3e 590 /* Computation of the mask to apply to RDR register
<> 144:ef7eb2e8f9f7 591 of the UART associated to the IRDA */
<> 144:ef7eb2e8f9f7 592 IRDA_MASK_COMPUTATION(hirda);
<> 144:ef7eb2e8f9f7 593 uhMask = hirda->Mask;
<> 144:ef7eb2e8f9f7 594
<> 144:ef7eb2e8f9f7 595 /* Check data remaining to be received */
<> 151:5eaa88a5bcc7 596 while(hirda->RxXferCount > 0U)
<> 144:ef7eb2e8f9f7 597 {
<> 144:ef7eb2e8f9f7 598 hirda->RxXferCount--;
<> 144:ef7eb2e8f9f7 599
Anna Bridge 186:707f6e361f3e 600 if(IRDA_WaitOnFlagUntilTimeout(hirda, IRDA_FLAG_RXNE, RESET, tickstart, Timeout) != HAL_OK)
Anna Bridge 186:707f6e361f3e 601 {
<> 144:ef7eb2e8f9f7 602 return HAL_TIMEOUT;
Anna Bridge 186:707f6e361f3e 603 }
<> 144:ef7eb2e8f9f7 604 if ((hirda->Init.WordLength == IRDA_WORDLENGTH_9B) && (hirda->Init.Parity == IRDA_PARITY_NONE))
<> 144:ef7eb2e8f9f7 605 {
<> 144:ef7eb2e8f9f7 606 tmp = (uint16_t*) pData ;
<> 144:ef7eb2e8f9f7 607 *tmp = (uint16_t)(hirda->Instance->RDR & uhMask);
<> 151:5eaa88a5bcc7 608 pData +=2U;
<> 144:ef7eb2e8f9f7 609 }
<> 144:ef7eb2e8f9f7 610 else
<> 144:ef7eb2e8f9f7 611 {
Anna Bridge 186:707f6e361f3e 612 *pData++ = (uint8_t)(hirda->Instance->RDR & (uint8_t)uhMask);
Anna Bridge 186:707f6e361f3e 613 }
Anna Bridge 186:707f6e361f3e 614 }
<> 144:ef7eb2e8f9f7 615
Anna Bridge 186:707f6e361f3e 616 /* At end of Rx process, restore hirda->RxState to Ready */
Anna Bridge 186:707f6e361f3e 617 hirda->RxState = HAL_IRDA_STATE_READY;
Anna Bridge 186:707f6e361f3e 618
<> 144:ef7eb2e8f9f7 619 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 620 __HAL_UNLOCK(hirda);
Anna Bridge 186:707f6e361f3e 621
<> 144:ef7eb2e8f9f7 622 return HAL_OK;
<> 144:ef7eb2e8f9f7 623 }
<> 144:ef7eb2e8f9f7 624 else
<> 144:ef7eb2e8f9f7 625 {
Anna Bridge 186:707f6e361f3e 626 return HAL_BUSY;
<> 144:ef7eb2e8f9f7 627 }
<> 144:ef7eb2e8f9f7 628 }
<> 144:ef7eb2e8f9f7 629
<> 144:ef7eb2e8f9f7 630 /**
Anna Bridge 186:707f6e361f3e 631 * @brief Send an amount of data in interrupt mode.
Anna Bridge 186:707f6e361f3e 632 * @param hirda Pointer to a IRDA_HandleTypeDef structure that contains
Anna Bridge 186:707f6e361f3e 633 * the configuration information for the specified IRDA module.
Anna Bridge 186:707f6e361f3e 634 * @param pData Pointer to data buffer.
Anna Bridge 186:707f6e361f3e 635 * @param Size Amount of data to be sent.
Anna Bridge 186:707f6e361f3e 636 * @note When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01),
Anna Bridge 186:707f6e361f3e 637 * address of user data buffer containing data to be sent, should be aligned on a half word frontier (16 bits)
Anna Bridge 186:707f6e361f3e 638 * (as sent data will be handled using u16 pointer cast). Depending on compilation chain,
Anna Bridge 186:707f6e361f3e 639 * use of specific alignment compilation directives or pragmas might be required to ensure proper alignment for pData.
<> 144:ef7eb2e8f9f7 640 * @retval HAL status
<> 144:ef7eb2e8f9f7 641 */
<> 144:ef7eb2e8f9f7 642 HAL_StatusTypeDef HAL_IRDA_Transmit_IT(IRDA_HandleTypeDef *hirda, uint8_t *pData, uint16_t Size)
<> 144:ef7eb2e8f9f7 643 {
Anna Bridge 186:707f6e361f3e 644 /* Check that a Tx process is not already ongoing */
Anna Bridge 186:707f6e361f3e 645 if(hirda->gState == HAL_IRDA_STATE_READY)
<> 144:ef7eb2e8f9f7 646 {
Anna Bridge 186:707f6e361f3e 647 if((pData == NULL) || (Size == 0U))
<> 144:ef7eb2e8f9f7 648 {
<> 144:ef7eb2e8f9f7 649 return HAL_ERROR;
<> 144:ef7eb2e8f9f7 650 }
Anna Bridge 186:707f6e361f3e 651
Anna Bridge 186:707f6e361f3e 652 /* In case of 9bits/No Parity transfer, pData buffer provided as input paramter
Anna Bridge 186:707f6e361f3e 653 should be aligned on a u16 frontier, as data to be filled into TDR will be
Anna Bridge 186:707f6e361f3e 654 handled through a u16 cast. */
Anna Bridge 186:707f6e361f3e 655 if ((hirda->Init.WordLength == UART_WORDLENGTH_9B) && (hirda->Init.Parity == UART_PARITY_NONE))
Anna Bridge 186:707f6e361f3e 656 {
Anna Bridge 186:707f6e361f3e 657 if((((uint32_t)pData)&1) != 0)
Anna Bridge 186:707f6e361f3e 658 {
Anna Bridge 186:707f6e361f3e 659 return HAL_ERROR;
Anna Bridge 186:707f6e361f3e 660 }
Anna Bridge 186:707f6e361f3e 661 }
Anna Bridge 186:707f6e361f3e 662
<> 144:ef7eb2e8f9f7 663 /* Process Locked */
<> 144:ef7eb2e8f9f7 664 __HAL_LOCK(hirda);
Anna Bridge 186:707f6e361f3e 665
<> 144:ef7eb2e8f9f7 666 hirda->pTxBuffPtr = pData;
<> 144:ef7eb2e8f9f7 667 hirda->TxXferSize = Size;
<> 144:ef7eb2e8f9f7 668 hirda->TxXferCount = Size;
<> 144:ef7eb2e8f9f7 669
<> 144:ef7eb2e8f9f7 670 hirda->ErrorCode = HAL_IRDA_ERROR_NONE;
Anna Bridge 186:707f6e361f3e 671 hirda->gState = HAL_IRDA_STATE_BUSY_TX;
Anna Bridge 186:707f6e361f3e 672
<> 144:ef7eb2e8f9f7 673 /* Process Unlocked */
Anna Bridge 186:707f6e361f3e 674 __HAL_UNLOCK(hirda);
Anna Bridge 186:707f6e361f3e 675
<> 144:ef7eb2e8f9f7 676 /* Enable the IRDA Transmit Data Register Empty Interrupt */
Anna Bridge 186:707f6e361f3e 677 SET_BIT(hirda->Instance->CR1, USART_CR1_TXEIE);
Anna Bridge 186:707f6e361f3e 678
<> 144:ef7eb2e8f9f7 679 return HAL_OK;
<> 144:ef7eb2e8f9f7 680 }
<> 144:ef7eb2e8f9f7 681 else
<> 144:ef7eb2e8f9f7 682 {
Anna Bridge 186:707f6e361f3e 683 return HAL_BUSY;
<> 144:ef7eb2e8f9f7 684 }
<> 144:ef7eb2e8f9f7 685 }
<> 144:ef7eb2e8f9f7 686
<> 144:ef7eb2e8f9f7 687 /**
Anna Bridge 186:707f6e361f3e 688 * @brief Receive an amount of data in interrupt mode.
Anna Bridge 186:707f6e361f3e 689 * @param hirda Pointer to a IRDA_HandleTypeDef structure that contains
Anna Bridge 186:707f6e361f3e 690 * the configuration information for the specified IRDA module.
Anna Bridge 186:707f6e361f3e 691 * @param pData Pointer to data buffer.
Anna Bridge 186:707f6e361f3e 692 * @param Size Amount of data to be received.
Anna Bridge 186:707f6e361f3e 693 * @note When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01),
Anna Bridge 186:707f6e361f3e 694 * address of user data buffer containing data to be sent, should be aligned on a half word frontier (16 bits)
Anna Bridge 186:707f6e361f3e 695 * (as sent data will be handled using u16 pointer cast). Depending on compilation chain,
Anna Bridge 186:707f6e361f3e 696 * use of specific alignment compilation directives or pragmas might be required to ensure proper alignment for pData.
<> 144:ef7eb2e8f9f7 697 * @retval HAL status
<> 144:ef7eb2e8f9f7 698 */
<> 144:ef7eb2e8f9f7 699 HAL_StatusTypeDef HAL_IRDA_Receive_IT(IRDA_HandleTypeDef *hirda, uint8_t *pData, uint16_t Size)
Anna Bridge 186:707f6e361f3e 700 {
Anna Bridge 186:707f6e361f3e 701 /* Check that a Rx process is not already ongoing */
Anna Bridge 186:707f6e361f3e 702 if(hirda->RxState == HAL_IRDA_STATE_READY)
<> 144:ef7eb2e8f9f7 703 {
Anna Bridge 186:707f6e361f3e 704 if((pData == NULL) || (Size == 0U))
<> 144:ef7eb2e8f9f7 705 {
<> 144:ef7eb2e8f9f7 706 return HAL_ERROR;
<> 144:ef7eb2e8f9f7 707 }
Anna Bridge 186:707f6e361f3e 708
<> 144:ef7eb2e8f9f7 709 /* Process Locked */
Anna Bridge 186:707f6e361f3e 710 __HAL_LOCK(hirda);
Anna Bridge 186:707f6e361f3e 711
Anna Bridge 186:707f6e361f3e 712 /* In case of 9bits/No Parity transfer, pData buffer provided as input paramter
Anna Bridge 186:707f6e361f3e 713 should be aligned on a u16 frontier, as data to be filled into TDR will be
Anna Bridge 186:707f6e361f3e 714 handled through a u16 cast. */
Anna Bridge 186:707f6e361f3e 715 if ((hirda->Init.WordLength == UART_WORDLENGTH_9B) && (hirda->Init.Parity == UART_PARITY_NONE))
Anna Bridge 186:707f6e361f3e 716 {
Anna Bridge 186:707f6e361f3e 717 if((((uint32_t)pData)&1) != 0)
Anna Bridge 186:707f6e361f3e 718 {
Anna Bridge 186:707f6e361f3e 719 return HAL_ERROR;
Anna Bridge 186:707f6e361f3e 720 }
Anna Bridge 186:707f6e361f3e 721 }
Anna Bridge 186:707f6e361f3e 722
<> 144:ef7eb2e8f9f7 723 hirda->pRxBuffPtr = pData;
<> 144:ef7eb2e8f9f7 724 hirda->RxXferSize = Size;
<> 144:ef7eb2e8f9f7 725 hirda->RxXferCount = Size;
Anna Bridge 186:707f6e361f3e 726
Anna Bridge 186:707f6e361f3e 727 /* Computation of the mask to apply to the RDR register
<> 144:ef7eb2e8f9f7 728 of the UART associated to the IRDA */
<> 144:ef7eb2e8f9f7 729 IRDA_MASK_COMPUTATION(hirda);
Anna Bridge 186:707f6e361f3e 730
Anna Bridge 186:707f6e361f3e 731 hirda->ErrorCode = HAL_IRDA_ERROR_NONE;
Anna Bridge 186:707f6e361f3e 732 hirda->RxState = HAL_IRDA_STATE_BUSY_RX;
Anna Bridge 186:707f6e361f3e 733
<> 144:ef7eb2e8f9f7 734 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 735 __HAL_UNLOCK(hirda);
Anna Bridge 186:707f6e361f3e 736
Anna Bridge 186:707f6e361f3e 737 /* Enable the IRDA Parity Error and Data Register not empty Interrupts */
Anna Bridge 186:707f6e361f3e 738 SET_BIT(hirda->Instance->CR1, USART_CR1_PEIE| USART_CR1_RXNEIE);
Anna Bridge 186:707f6e361f3e 739
Anna Bridge 186:707f6e361f3e 740 /* Enable the IRDA Error Interrupt: (Frame error, noise error, overrun error) */
Anna Bridge 186:707f6e361f3e 741 SET_BIT(hirda->Instance->CR3, USART_CR3_EIE);
Anna Bridge 186:707f6e361f3e 742
<> 144:ef7eb2e8f9f7 743 return HAL_OK;
<> 144:ef7eb2e8f9f7 744 }
<> 144:ef7eb2e8f9f7 745 else
<> 144:ef7eb2e8f9f7 746 {
Anna Bridge 186:707f6e361f3e 747 return HAL_BUSY;
<> 144:ef7eb2e8f9f7 748 }
<> 144:ef7eb2e8f9f7 749 }
<> 144:ef7eb2e8f9f7 750
<> 144:ef7eb2e8f9f7 751 /**
Anna Bridge 186:707f6e361f3e 752 * @brief Send an amount of data in DMA mode.
Anna Bridge 186:707f6e361f3e 753 * @param hirda Pointer to a IRDA_HandleTypeDef structure that contains
Anna Bridge 186:707f6e361f3e 754 * the configuration information for the specified IRDA module.
Anna Bridge 186:707f6e361f3e 755 * @param pData pointer to data buffer.
Anna Bridge 186:707f6e361f3e 756 * @param Size amount of data to be sent.
Anna Bridge 186:707f6e361f3e 757 * @note When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01),
Anna Bridge 186:707f6e361f3e 758 * address of user data buffer containing data to be sent, should be aligned on a half word frontier (16 bits)
Anna Bridge 186:707f6e361f3e 759 * (as sent data will be handled using u16 pointer cast). Depending on compilation chain,
Anna Bridge 186:707f6e361f3e 760 * use of specific alignment compilation directives or pragmas might be required to ensure proper alignment for pData.
<> 144:ef7eb2e8f9f7 761 * @retval HAL status
<> 144:ef7eb2e8f9f7 762 */
<> 144:ef7eb2e8f9f7 763 HAL_StatusTypeDef HAL_IRDA_Transmit_DMA(IRDA_HandleTypeDef *hirda, uint8_t *pData, uint16_t Size)
<> 144:ef7eb2e8f9f7 764 {
Anna Bridge 186:707f6e361f3e 765 /* Check that a Tx process is not already ongoing */
Anna Bridge 186:707f6e361f3e 766 if(hirda->gState == HAL_IRDA_STATE_READY)
<> 144:ef7eb2e8f9f7 767 {
Anna Bridge 186:707f6e361f3e 768 if((pData == NULL) || (Size == 0U))
<> 144:ef7eb2e8f9f7 769 {
<> 144:ef7eb2e8f9f7 770 return HAL_ERROR;
<> 144:ef7eb2e8f9f7 771 }
Anna Bridge 186:707f6e361f3e 772
Anna Bridge 186:707f6e361f3e 773 /* In case of 9bits/No Parity transfer, pData buffer provided as input paramter
Anna Bridge 186:707f6e361f3e 774 should be aligned on a u16 frontier, as data to be filled into TDR will be
Anna Bridge 186:707f6e361f3e 775 handled through a u16 cast. */
Anna Bridge 186:707f6e361f3e 776 if ((hirda->Init.WordLength == UART_WORDLENGTH_9B) && (hirda->Init.Parity == UART_PARITY_NONE))
Anna Bridge 186:707f6e361f3e 777 {
Anna Bridge 186:707f6e361f3e 778 if((((uint32_t)pData)&1) != 0)
Anna Bridge 186:707f6e361f3e 779 {
Anna Bridge 186:707f6e361f3e 780 return HAL_ERROR;
Anna Bridge 186:707f6e361f3e 781 }
Anna Bridge 186:707f6e361f3e 782 }
Anna Bridge 186:707f6e361f3e 783
<> 144:ef7eb2e8f9f7 784 /* Process Locked */
<> 144:ef7eb2e8f9f7 785 __HAL_LOCK(hirda);
Anna Bridge 186:707f6e361f3e 786
<> 144:ef7eb2e8f9f7 787 hirda->pTxBuffPtr = pData;
<> 144:ef7eb2e8f9f7 788 hirda->TxXferSize = Size;
Anna Bridge 186:707f6e361f3e 789 hirda->TxXferCount = Size;
Anna Bridge 186:707f6e361f3e 790
<> 144:ef7eb2e8f9f7 791 hirda->ErrorCode = HAL_IRDA_ERROR_NONE;
Anna Bridge 186:707f6e361f3e 792 hirda->gState = HAL_IRDA_STATE_BUSY_TX;
Anna Bridge 186:707f6e361f3e 793
<> 144:ef7eb2e8f9f7 794 /* Set the IRDA DMA transfer complete callback */
<> 144:ef7eb2e8f9f7 795 hirda->hdmatx->XferCpltCallback = IRDA_DMATransmitCplt;
Anna Bridge 186:707f6e361f3e 796
<> 144:ef7eb2e8f9f7 797 /* Set the IRDA DMA half transfer complete callback */
<> 144:ef7eb2e8f9f7 798 hirda->hdmatx->XferHalfCpltCallback = IRDA_DMATransmitHalfCplt;
<> 144:ef7eb2e8f9f7 799
<> 144:ef7eb2e8f9f7 800 /* Set the DMA error callback */
<> 144:ef7eb2e8f9f7 801 hirda->hdmatx->XferErrorCallback = IRDA_DMAError;
<> 144:ef7eb2e8f9f7 802
Anna Bridge 186:707f6e361f3e 803 /* Set the DMA abort callback */
Anna Bridge 186:707f6e361f3e 804 hirda->hdmatx->XferAbortCallback = NULL;
Anna Bridge 186:707f6e361f3e 805
<> 144:ef7eb2e8f9f7 806 /* Enable the IRDA transmit DMA channel */
Anna Bridge 186:707f6e361f3e 807 HAL_DMA_Start_IT(hirda->hdmatx, (uint32_t)hirda->pTxBuffPtr, (uint32_t)&hirda->Instance->TDR, Size);
Anna Bridge 186:707f6e361f3e 808
Anna Bridge 186:707f6e361f3e 809 /* Clear the TC flag in the ICR register */
Anna Bridge 186:707f6e361f3e 810 __HAL_IRDA_CLEAR_FLAG(hirda, IRDA_CLEAR_TCF);
Anna Bridge 186:707f6e361f3e 811
Anna Bridge 186:707f6e361f3e 812 /* Process Unlocked */
Anna Bridge 186:707f6e361f3e 813 __HAL_UNLOCK(hirda);
<> 144:ef7eb2e8f9f7 814
<> 144:ef7eb2e8f9f7 815 /* Enable the DMA transfer for transmit request by setting the DMAT bit
Anna Bridge 186:707f6e361f3e 816 in the USART CR3 register */
Anna Bridge 186:707f6e361f3e 817 SET_BIT(hirda->Instance->CR3, USART_CR3_DMAT);
Anna Bridge 186:707f6e361f3e 818
<> 144:ef7eb2e8f9f7 819 return HAL_OK;
<> 144:ef7eb2e8f9f7 820 }
<> 144:ef7eb2e8f9f7 821 else
<> 144:ef7eb2e8f9f7 822 {
Anna Bridge 186:707f6e361f3e 823 return HAL_BUSY;
<> 144:ef7eb2e8f9f7 824 }
<> 144:ef7eb2e8f9f7 825 }
<> 144:ef7eb2e8f9f7 826
<> 144:ef7eb2e8f9f7 827 /**
Anna Bridge 186:707f6e361f3e 828 * @brief Receive an amount of data in DMA mode.
Anna Bridge 186:707f6e361f3e 829 * @param hirda Pointer to a IRDA_HandleTypeDef structure that contains
Anna Bridge 186:707f6e361f3e 830 * the configuration information for the specified IRDA module.
Anna Bridge 186:707f6e361f3e 831 * @param pData Pointer to data buffer.
Anna Bridge 186:707f6e361f3e 832 * @param Size Amount of data to be received.
Anna Bridge 186:707f6e361f3e 833 * @note When the IRDA parity is enabled (PCE = 1), the received data contains
Anna Bridge 186:707f6e361f3e 834 * the parity bit (MSB position).
Anna Bridge 186:707f6e361f3e 835 * @note When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01),
Anna Bridge 186:707f6e361f3e 836 * address of user data buffer containing data to be sent, should be aligned on a half word frontier (16 bits)
Anna Bridge 186:707f6e361f3e 837 * (as sent data will be handled using u16 pointer cast). Depending on compilation chain,
Anna Bridge 186:707f6e361f3e 838 * use of specific alignment compilation directives or pragmas might be required to ensure proper alignment for pData.
<> 144:ef7eb2e8f9f7 839 * @retval HAL status
<> 144:ef7eb2e8f9f7 840 */
<> 144:ef7eb2e8f9f7 841 HAL_StatusTypeDef HAL_IRDA_Receive_DMA(IRDA_HandleTypeDef *hirda, uint8_t *pData, uint16_t Size)
<> 144:ef7eb2e8f9f7 842 {
Anna Bridge 186:707f6e361f3e 843 /* Check that a Rx process is not already ongoing */
Anna Bridge 186:707f6e361f3e 844 if(hirda->RxState == HAL_IRDA_STATE_READY)
<> 144:ef7eb2e8f9f7 845 {
Anna Bridge 186:707f6e361f3e 846 if((pData == NULL) || (Size == 0U))
<> 144:ef7eb2e8f9f7 847 {
<> 144:ef7eb2e8f9f7 848 return HAL_ERROR;
<> 144:ef7eb2e8f9f7 849 }
Anna Bridge 186:707f6e361f3e 850
Anna Bridge 186:707f6e361f3e 851 /* In case of 9bits/No Parity transfer, pData buffer provided as input paramter
Anna Bridge 186:707f6e361f3e 852 should be aligned on a u16 frontier, as data to be filled into TDR will be
Anna Bridge 186:707f6e361f3e 853 handled through a u16 cast. */
Anna Bridge 186:707f6e361f3e 854 if ((hirda->Init.WordLength == UART_WORDLENGTH_9B) && (hirda->Init.Parity == UART_PARITY_NONE))
Anna Bridge 186:707f6e361f3e 855 {
Anna Bridge 186:707f6e361f3e 856 if((((uint32_t)pData)&1) != 0)
Anna Bridge 186:707f6e361f3e 857 {
Anna Bridge 186:707f6e361f3e 858 return HAL_ERROR;
Anna Bridge 186:707f6e361f3e 859 }
Anna Bridge 186:707f6e361f3e 860 }
Anna Bridge 186:707f6e361f3e 861
<> 144:ef7eb2e8f9f7 862 /* Process Locked */
<> 144:ef7eb2e8f9f7 863 __HAL_LOCK(hirda);
Anna Bridge 186:707f6e361f3e 864
<> 144:ef7eb2e8f9f7 865 hirda->pRxBuffPtr = pData;
<> 144:ef7eb2e8f9f7 866 hirda->RxXferSize = Size;
<> 144:ef7eb2e8f9f7 867
<> 144:ef7eb2e8f9f7 868 hirda->ErrorCode = HAL_IRDA_ERROR_NONE;
Anna Bridge 186:707f6e361f3e 869 hirda->RxState = HAL_IRDA_STATE_BUSY_RX;
Anna Bridge 186:707f6e361f3e 870
<> 144:ef7eb2e8f9f7 871 /* Set the IRDA DMA transfer complete callback */
<> 144:ef7eb2e8f9f7 872 hirda->hdmarx->XferCpltCallback = IRDA_DMAReceiveCplt;
Anna Bridge 186:707f6e361f3e 873
<> 144:ef7eb2e8f9f7 874 /* Set the IRDA DMA half transfer complete callback */
<> 144:ef7eb2e8f9f7 875 hirda->hdmarx->XferHalfCpltCallback = IRDA_DMAReceiveHalfCplt;
Anna Bridge 186:707f6e361f3e 876
<> 144:ef7eb2e8f9f7 877 /* Set the DMA error callback */
<> 144:ef7eb2e8f9f7 878 hirda->hdmarx->XferErrorCallback = IRDA_DMAError;
<> 144:ef7eb2e8f9f7 879
Anna Bridge 186:707f6e361f3e 880 /* Set the DMA abort callback */
Anna Bridge 186:707f6e361f3e 881 hirda->hdmarx->XferAbortCallback = NULL;
Anna Bridge 186:707f6e361f3e 882
<> 144:ef7eb2e8f9f7 883 /* Enable the DMA channel */
Anna Bridge 186:707f6e361f3e 884 HAL_DMA_Start_IT(hirda->hdmarx, (uint32_t)&hirda->Instance->RDR, (uint32_t)hirda->pRxBuffPtr, Size);
Anna Bridge 186:707f6e361f3e 885
Anna Bridge 186:707f6e361f3e 886 /* Process Unlocked */
Anna Bridge 186:707f6e361f3e 887 __HAL_UNLOCK(hirda);
<> 144:ef7eb2e8f9f7 888
Anna Bridge 186:707f6e361f3e 889 /* Enable the UART Parity Error Interrupt */
Anna Bridge 186:707f6e361f3e 890 SET_BIT(hirda->Instance->CR1, USART_CR1_PEIE);
Anna Bridge 186:707f6e361f3e 891
Anna Bridge 186:707f6e361f3e 892 /* Enable the UART Error Interrupt: (Frame error, noise error, overrun error) */
Anna Bridge 186:707f6e361f3e 893 SET_BIT(hirda->Instance->CR3, USART_CR3_EIE);
Anna Bridge 186:707f6e361f3e 894
Anna Bridge 186:707f6e361f3e 895 /* Enable the DMA transfer for the receiver request by setting the DMAR bit
Anna Bridge 186:707f6e361f3e 896 in the USART CR3 register */
Anna Bridge 186:707f6e361f3e 897 SET_BIT(hirda->Instance->CR3, USART_CR3_DMAR);
Anna Bridge 186:707f6e361f3e 898
<> 144:ef7eb2e8f9f7 899 return HAL_OK;
<> 144:ef7eb2e8f9f7 900 }
<> 144:ef7eb2e8f9f7 901 else
<> 144:ef7eb2e8f9f7 902 {
Anna Bridge 186:707f6e361f3e 903 return HAL_BUSY;
<> 144:ef7eb2e8f9f7 904 }
<> 144:ef7eb2e8f9f7 905 }
<> 144:ef7eb2e8f9f7 906
Anna Bridge 186:707f6e361f3e 907
<> 144:ef7eb2e8f9f7 908 /**
Anna Bridge 186:707f6e361f3e 909 * @brief Pause the DMA Transfer.
Anna Bridge 186:707f6e361f3e 910 * @param hirda Pointer to a IRDA_HandleTypeDef structure that contains
Anna Bridge 186:707f6e361f3e 911 * the configuration information for the specified IRDA module.
<> 144:ef7eb2e8f9f7 912 * @retval HAL status
<> 144:ef7eb2e8f9f7 913 */
<> 144:ef7eb2e8f9f7 914 HAL_StatusTypeDef HAL_IRDA_DMAPause(IRDA_HandleTypeDef *hirda)
<> 144:ef7eb2e8f9f7 915 {
<> 144:ef7eb2e8f9f7 916 /* Process Locked */
<> 144:ef7eb2e8f9f7 917 __HAL_LOCK(hirda);
Anna Bridge 186:707f6e361f3e 918
Anna Bridge 186:707f6e361f3e 919 if ((hirda->gState == HAL_IRDA_STATE_BUSY_TX) &&
Anna Bridge 186:707f6e361f3e 920 (HAL_IS_BIT_SET(hirda->Instance->CR3, USART_CR3_DMAT)))
<> 144:ef7eb2e8f9f7 921 {
Anna Bridge 186:707f6e361f3e 922 /* Disable the IRDA DMA Tx request */
Anna Bridge 186:707f6e361f3e 923 CLEAR_BIT(hirda->Instance->CR3, USART_CR3_DMAT);
<> 144:ef7eb2e8f9f7 924 }
Anna Bridge 186:707f6e361f3e 925 if ((hirda->RxState == HAL_IRDA_STATE_BUSY_RX) &&
Anna Bridge 186:707f6e361f3e 926 (HAL_IS_BIT_SET(hirda->Instance->CR3, USART_CR3_DMAR)))
<> 144:ef7eb2e8f9f7 927 {
Anna Bridge 186:707f6e361f3e 928 /* Disable PE and ERR (Frame error, noise error, overrun error) interrupts */
Anna Bridge 186:707f6e361f3e 929 CLEAR_BIT(hirda->Instance->CR1, USART_CR1_PEIE);
Anna Bridge 186:707f6e361f3e 930 CLEAR_BIT(hirda->Instance->CR3, USART_CR3_EIE);
Anna Bridge 186:707f6e361f3e 931
Anna Bridge 186:707f6e361f3e 932 /* Disable the IRDA DMA Rx request */
Anna Bridge 186:707f6e361f3e 933 CLEAR_BIT(hirda->Instance->CR3, USART_CR3_DMAR);
<> 144:ef7eb2e8f9f7 934 }
Anna Bridge 186:707f6e361f3e 935
<> 144:ef7eb2e8f9f7 936 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 937 __HAL_UNLOCK(hirda);
Anna Bridge 186:707f6e361f3e 938
Anna Bridge 186:707f6e361f3e 939 return HAL_OK;
<> 144:ef7eb2e8f9f7 940 }
<> 144:ef7eb2e8f9f7 941
<> 144:ef7eb2e8f9f7 942 /**
Anna Bridge 186:707f6e361f3e 943 * @brief Resume the DMA Transfer.
Anna Bridge 186:707f6e361f3e 944 * @param hirda Pointer to a IRDA_HandleTypeDef structure that contains
Anna Bridge 186:707f6e361f3e 945 * the configuration information for the specified UART module.
<> 144:ef7eb2e8f9f7 946 * @retval HAL status
<> 144:ef7eb2e8f9f7 947 */
<> 144:ef7eb2e8f9f7 948 HAL_StatusTypeDef HAL_IRDA_DMAResume(IRDA_HandleTypeDef *hirda)
<> 144:ef7eb2e8f9f7 949 {
<> 144:ef7eb2e8f9f7 950 /* Process Locked */
<> 144:ef7eb2e8f9f7 951 __HAL_LOCK(hirda);
<> 144:ef7eb2e8f9f7 952
Anna Bridge 186:707f6e361f3e 953 if(hirda->gState == HAL_IRDA_STATE_BUSY_TX)
Anna Bridge 186:707f6e361f3e 954 {
Anna Bridge 186:707f6e361f3e 955 /* Enable the IRDA DMA Tx request */
Anna Bridge 186:707f6e361f3e 956 SET_BIT(hirda->Instance->CR3, USART_CR3_DMAT);
<> 144:ef7eb2e8f9f7 957 }
Anna Bridge 186:707f6e361f3e 958 if(hirda->RxState == HAL_IRDA_STATE_BUSY_RX)
<> 144:ef7eb2e8f9f7 959 {
Anna Bridge 186:707f6e361f3e 960 /* Clear the Overrun flag before resuming the Rx transfer*/
Anna Bridge 186:707f6e361f3e 961 __HAL_IRDA_CLEAR_OREFLAG(hirda);
Anna Bridge 186:707f6e361f3e 962
Anna Bridge 186:707f6e361f3e 963 /* Reenable PE and ERR (Frame error, noise error, overrun error) interrupts */
Anna Bridge 186:707f6e361f3e 964 SET_BIT(hirda->Instance->CR1, USART_CR1_PEIE);
Anna Bridge 186:707f6e361f3e 965 SET_BIT(hirda->Instance->CR3, USART_CR3_EIE);
Anna Bridge 186:707f6e361f3e 966
Anna Bridge 186:707f6e361f3e 967 /* Enable the IRDA DMA Rx request */
Anna Bridge 186:707f6e361f3e 968 SET_BIT(hirda->Instance->CR3, USART_CR3_DMAR);
<> 144:ef7eb2e8f9f7 969 }
Anna Bridge 186:707f6e361f3e 970
<> 144:ef7eb2e8f9f7 971 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 972 __HAL_UNLOCK(hirda);
Anna Bridge 186:707f6e361f3e 973
<> 144:ef7eb2e8f9f7 974 return HAL_OK;
<> 144:ef7eb2e8f9f7 975 }
<> 144:ef7eb2e8f9f7 976
<> 144:ef7eb2e8f9f7 977 /**
Anna Bridge 186:707f6e361f3e 978 * @brief Stop the DMA Transfer.
Anna Bridge 186:707f6e361f3e 979 * @param hirda Pointer to a IRDA_HandleTypeDef structure that contains
Anna Bridge 186:707f6e361f3e 980 * the configuration information for the specified UART module.
<> 144:ef7eb2e8f9f7 981 * @retval HAL status
<> 144:ef7eb2e8f9f7 982 */
<> 144:ef7eb2e8f9f7 983 HAL_StatusTypeDef HAL_IRDA_DMAStop(IRDA_HandleTypeDef *hirda)
<> 144:ef7eb2e8f9f7 984 {
<> 144:ef7eb2e8f9f7 985 /* The Lock is not implemented on this API to allow the user application
Anna Bridge 186:707f6e361f3e 986 to call the HAL IRDA API under callbacks HAL_IRDA_TxCpltCallback() / HAL_IRDA_RxCpltCallback() /
Anna Bridge 186:707f6e361f3e 987 HAL_IRDA_TxHalfCpltCallback / HAL_IRDA_RxHalfCpltCallback:
Anna Bridge 186:707f6e361f3e 988 indeed, when HAL_DMA_Abort() API is called, the DMA TX/RX Transfer or Half Transfer complete
Anna Bridge 186:707f6e361f3e 989 interrupt is generated if the DMA transfer interruption occurs at the middle or at the end of
Anna Bridge 186:707f6e361f3e 990 the stream and the corresponding call back is executed. */
Anna Bridge 186:707f6e361f3e 991
Anna Bridge 186:707f6e361f3e 992 /* Stop IRDA DMA Tx request if ongoing */
Anna Bridge 186:707f6e361f3e 993 if ((hirda->gState == HAL_IRDA_STATE_BUSY_TX) &&
Anna Bridge 186:707f6e361f3e 994 (HAL_IS_BIT_SET(hirda->Instance->CR3, USART_CR3_DMAT)))
Anna Bridge 186:707f6e361f3e 995 {
Anna Bridge 186:707f6e361f3e 996 CLEAR_BIT(hirda->Instance->CR3, USART_CR3_DMAT);
Anna Bridge 186:707f6e361f3e 997
Anna Bridge 186:707f6e361f3e 998 /* Abort the IRDA DMA Tx channel */
Anna Bridge 186:707f6e361f3e 999 if(hirda->hdmatx != NULL)
Anna Bridge 186:707f6e361f3e 1000 {
Anna Bridge 186:707f6e361f3e 1001 HAL_DMA_Abort(hirda->hdmatx);
Anna Bridge 186:707f6e361f3e 1002 }
Anna Bridge 186:707f6e361f3e 1003
Anna Bridge 186:707f6e361f3e 1004 IRDA_EndTxTransfer(hirda);
Anna Bridge 186:707f6e361f3e 1005 }
Anna Bridge 186:707f6e361f3e 1006
Anna Bridge 186:707f6e361f3e 1007 /* Stop IRDA DMA Rx request if ongoing */
Anna Bridge 186:707f6e361f3e 1008 if ((hirda->RxState == HAL_IRDA_STATE_BUSY_RX) &&
Anna Bridge 186:707f6e361f3e 1009 (HAL_IS_BIT_SET(hirda->Instance->CR3, USART_CR3_DMAR)))
Anna Bridge 186:707f6e361f3e 1010 {
Anna Bridge 186:707f6e361f3e 1011 CLEAR_BIT(hirda->Instance->CR3, USART_CR3_DMAR);
Anna Bridge 186:707f6e361f3e 1012
Anna Bridge 186:707f6e361f3e 1013 /* Abort the IRDA DMA Rx channel */
Anna Bridge 186:707f6e361f3e 1014 if(hirda->hdmarx != NULL)
Anna Bridge 186:707f6e361f3e 1015 {
Anna Bridge 186:707f6e361f3e 1016 HAL_DMA_Abort(hirda->hdmarx);
Anna Bridge 186:707f6e361f3e 1017 }
Anna Bridge 186:707f6e361f3e 1018
Anna Bridge 186:707f6e361f3e 1019 IRDA_EndRxTransfer(hirda);
Anna Bridge 186:707f6e361f3e 1020 }
Anna Bridge 186:707f6e361f3e 1021
Anna Bridge 186:707f6e361f3e 1022 return HAL_OK;
Anna Bridge 186:707f6e361f3e 1023 }
Anna Bridge 186:707f6e361f3e 1024
Anna Bridge 186:707f6e361f3e 1025 /**
Anna Bridge 186:707f6e361f3e 1026 * @brief Abort ongoing transfers (blocking mode).
Anna Bridge 186:707f6e361f3e 1027 * @param hirda Pointer to a IRDA_HandleTypeDef structure that contains
Anna Bridge 186:707f6e361f3e 1028 * the configuration information for the specified UART module.
Anna Bridge 186:707f6e361f3e 1029 * @note This procedure could be used for aborting any ongoing transfer started in Interrupt or DMA mode.
Anna Bridge 186:707f6e361f3e 1030 * This procedure performs following operations :
Anna Bridge 186:707f6e361f3e 1031 * - Disable IRDA Interrupts (Tx and Rx)
Anna Bridge 186:707f6e361f3e 1032 * - Disable the DMA transfer in the peripheral register (if enabled)
Anna Bridge 186:707f6e361f3e 1033 * - Abort DMA transfer by calling HAL_DMA_Abort (in case of transfer in DMA mode)
Anna Bridge 186:707f6e361f3e 1034 * - Set handle State to READY
Anna Bridge 186:707f6e361f3e 1035 * @note This procedure is executed in blocking mode : when exiting function, Abort is considered as completed.
Anna Bridge 186:707f6e361f3e 1036 * @retval HAL status
Anna Bridge 186:707f6e361f3e 1037 */
Anna Bridge 186:707f6e361f3e 1038 HAL_StatusTypeDef HAL_IRDA_Abort(IRDA_HandleTypeDef *hirda)
Anna Bridge 186:707f6e361f3e 1039 {
Anna Bridge 186:707f6e361f3e 1040 /* Disable TXEIE, TCIE, RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts */
Anna Bridge 186:707f6e361f3e 1041 CLEAR_BIT(hirda->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE | USART_CR1_TXEIE | USART_CR1_TCIE));
Anna Bridge 186:707f6e361f3e 1042 CLEAR_BIT(hirda->Instance->CR3, USART_CR3_EIE);
Anna Bridge 186:707f6e361f3e 1043
Anna Bridge 186:707f6e361f3e 1044 /* Disable the IRDA DMA Tx request if enabled */
Anna Bridge 186:707f6e361f3e 1045 if (HAL_IS_BIT_SET(hirda->Instance->CR3, USART_CR3_DMAT))
Anna Bridge 186:707f6e361f3e 1046 {
Anna Bridge 186:707f6e361f3e 1047 CLEAR_BIT(hirda->Instance->CR3, USART_CR3_DMAT);
Anna Bridge 186:707f6e361f3e 1048
Anna Bridge 186:707f6e361f3e 1049 /* Abort the IRDA DMA Tx channel : use blocking DMA Abort API (no callback) */
Anna Bridge 186:707f6e361f3e 1050 if(hirda->hdmatx != NULL)
Anna Bridge 186:707f6e361f3e 1051 {
Anna Bridge 186:707f6e361f3e 1052 /* Set the IRDA DMA Abort callback to Null.
Anna Bridge 186:707f6e361f3e 1053 No call back execution at end of DMA abort procedure */
Anna Bridge 186:707f6e361f3e 1054 hirda->hdmatx->XferAbortCallback = NULL;
Anna Bridge 186:707f6e361f3e 1055
Anna Bridge 186:707f6e361f3e 1056 HAL_DMA_Abort(hirda->hdmatx);
Anna Bridge 186:707f6e361f3e 1057 }
Anna Bridge 186:707f6e361f3e 1058 }
Anna Bridge 186:707f6e361f3e 1059
Anna Bridge 186:707f6e361f3e 1060 /* Disable the IRDA DMA Rx request if enabled */
Anna Bridge 186:707f6e361f3e 1061 if (HAL_IS_BIT_SET(hirda->Instance->CR3, USART_CR3_DMAR))
Anna Bridge 186:707f6e361f3e 1062 {
Anna Bridge 186:707f6e361f3e 1063 CLEAR_BIT(hirda->Instance->CR3, USART_CR3_DMAR);
Anna Bridge 186:707f6e361f3e 1064
Anna Bridge 186:707f6e361f3e 1065 /* Abort the IRDA DMA Rx channel : use blocking DMA Abort API (no callback) */
Anna Bridge 186:707f6e361f3e 1066 if(hirda->hdmarx != NULL)
Anna Bridge 186:707f6e361f3e 1067 {
Anna Bridge 186:707f6e361f3e 1068 /* Set the IRDA DMA Abort callback to Null.
Anna Bridge 186:707f6e361f3e 1069 No call back execution at end of DMA abort procedure */
Anna Bridge 186:707f6e361f3e 1070 hirda->hdmarx->XferAbortCallback = NULL;
Anna Bridge 186:707f6e361f3e 1071
Anna Bridge 186:707f6e361f3e 1072 HAL_DMA_Abort(hirda->hdmarx);
Anna Bridge 186:707f6e361f3e 1073 }
Anna Bridge 186:707f6e361f3e 1074 }
Anna Bridge 186:707f6e361f3e 1075
Anna Bridge 186:707f6e361f3e 1076 /* Reset Tx and Rx transfer counters */
Anna Bridge 186:707f6e361f3e 1077 hirda->TxXferCount = 0;
Anna Bridge 186:707f6e361f3e 1078 hirda->RxXferCount = 0;
Anna Bridge 186:707f6e361f3e 1079
Anna Bridge 186:707f6e361f3e 1080 /* Clear the Error flags in the ICR register */
Anna Bridge 186:707f6e361f3e 1081 __HAL_IRDA_CLEAR_FLAG(hirda, IRDA_CLEAR_OREF | IRDA_CLEAR_NEF | IRDA_CLEAR_PEF | IRDA_CLEAR_FEF);
<> 144:ef7eb2e8f9f7 1082
Anna Bridge 186:707f6e361f3e 1083 /* Restore hirda->gState and hirda->RxState to Ready */
Anna Bridge 186:707f6e361f3e 1084 hirda->gState = HAL_IRDA_STATE_READY;
Anna Bridge 186:707f6e361f3e 1085 hirda->RxState = HAL_IRDA_STATE_READY;
Anna Bridge 186:707f6e361f3e 1086
Anna Bridge 186:707f6e361f3e 1087 /* Reset Handle ErrorCode to No Error */
Anna Bridge 186:707f6e361f3e 1088 hirda->ErrorCode = HAL_IRDA_ERROR_NONE;
Anna Bridge 186:707f6e361f3e 1089
Anna Bridge 186:707f6e361f3e 1090 return HAL_OK;
Anna Bridge 186:707f6e361f3e 1091 }
Anna Bridge 186:707f6e361f3e 1092
Anna Bridge 186:707f6e361f3e 1093 /**
Anna Bridge 186:707f6e361f3e 1094 * @brief Abort ongoing Transmit transfer (blocking mode).
Anna Bridge 186:707f6e361f3e 1095 * @param hirda Pointer to a IRDA_HandleTypeDef structure that contains
Anna Bridge 186:707f6e361f3e 1096 * the configuration information for the specified UART module.
Anna Bridge 186:707f6e361f3e 1097 * @note This procedure could be used for aborting any ongoing Tx transfer started in Interrupt or DMA mode.
Anna Bridge 186:707f6e361f3e 1098 * This procedure performs following operations :
Anna Bridge 186:707f6e361f3e 1099 * - Disable IRDA Interrupts (Tx)
Anna Bridge 186:707f6e361f3e 1100 * - Disable the DMA transfer in the peripheral register (if enabled)
Anna Bridge 186:707f6e361f3e 1101 * - Abort DMA transfer by calling HAL_DMA_Abort (in case of transfer in DMA mode)
Anna Bridge 186:707f6e361f3e 1102 * - Set handle State to READY
Anna Bridge 186:707f6e361f3e 1103 * @note This procedure is executed in blocking mode : when exiting function, Abort is considered as completed.
Anna Bridge 186:707f6e361f3e 1104 * @retval HAL status
Anna Bridge 186:707f6e361f3e 1105 */
Anna Bridge 186:707f6e361f3e 1106 HAL_StatusTypeDef HAL_IRDA_AbortTransmit(IRDA_HandleTypeDef *hirda)
Anna Bridge 186:707f6e361f3e 1107 {
Anna Bridge 186:707f6e361f3e 1108 /* Disable TXEIE and TCIE interrupts */
Anna Bridge 186:707f6e361f3e 1109 CLEAR_BIT(hirda->Instance->CR1, (USART_CR1_TXEIE | USART_CR1_TCIE));
Anna Bridge 186:707f6e361f3e 1110
Anna Bridge 186:707f6e361f3e 1111 /* Disable the IRDA DMA Tx request if enabled */
Anna Bridge 186:707f6e361f3e 1112 if (HAL_IS_BIT_SET(hirda->Instance->CR3, USART_CR3_DMAT))
<> 144:ef7eb2e8f9f7 1113 {
Anna Bridge 186:707f6e361f3e 1114 CLEAR_BIT(hirda->Instance->CR3, USART_CR3_DMAT);
Anna Bridge 186:707f6e361f3e 1115
Anna Bridge 186:707f6e361f3e 1116 /* Abort the IRDA DMA Tx channel : use blocking DMA Abort API (no callback) */
Anna Bridge 186:707f6e361f3e 1117 if(hirda->hdmatx != NULL)
Anna Bridge 186:707f6e361f3e 1118 {
Anna Bridge 186:707f6e361f3e 1119 /* Set the IRDA DMA Abort callback to Null.
Anna Bridge 186:707f6e361f3e 1120 No call back execution at end of DMA abort procedure */
Anna Bridge 186:707f6e361f3e 1121 hirda->hdmatx->XferAbortCallback = NULL;
Anna Bridge 186:707f6e361f3e 1122
Anna Bridge 186:707f6e361f3e 1123 HAL_DMA_Abort(hirda->hdmatx);
Anna Bridge 186:707f6e361f3e 1124 }
<> 144:ef7eb2e8f9f7 1125 }
Anna Bridge 186:707f6e361f3e 1126
Anna Bridge 186:707f6e361f3e 1127 /* Reset Tx transfer counter */
Anna Bridge 186:707f6e361f3e 1128 hirda->TxXferCount = 0;
Anna Bridge 186:707f6e361f3e 1129
Anna Bridge 186:707f6e361f3e 1130 /* Restore hirda->gState to Ready */
Anna Bridge 186:707f6e361f3e 1131 hirda->gState = HAL_IRDA_STATE_READY;
Anna Bridge 186:707f6e361f3e 1132
Anna Bridge 186:707f6e361f3e 1133 return HAL_OK;
Anna Bridge 186:707f6e361f3e 1134 }
Anna Bridge 186:707f6e361f3e 1135
Anna Bridge 186:707f6e361f3e 1136 /**
Anna Bridge 186:707f6e361f3e 1137 * @brief Abort ongoing Receive transfer (blocking mode).
Anna Bridge 186:707f6e361f3e 1138 * @param hirda Pointer to a IRDA_HandleTypeDef structure that contains
Anna Bridge 186:707f6e361f3e 1139 * the configuration information for the specified UART module.
Anna Bridge 186:707f6e361f3e 1140 * @note This procedure could be used for aborting any ongoing Rx transfer started in Interrupt or DMA mode.
Anna Bridge 186:707f6e361f3e 1141 * This procedure performs following operations :
Anna Bridge 186:707f6e361f3e 1142 * - Disable IRDA Interrupts (Rx)
Anna Bridge 186:707f6e361f3e 1143 * - Disable the DMA transfer in the peripheral register (if enabled)
Anna Bridge 186:707f6e361f3e 1144 * - Abort DMA transfer by calling HAL_DMA_Abort (in case of transfer in DMA mode)
Anna Bridge 186:707f6e361f3e 1145 * - Set handle State to READY
Anna Bridge 186:707f6e361f3e 1146 * @note This procedure is executed in blocking mode : when exiting function, Abort is considered as completed.
Anna Bridge 186:707f6e361f3e 1147 * @retval HAL status
Anna Bridge 186:707f6e361f3e 1148 */
Anna Bridge 186:707f6e361f3e 1149 HAL_StatusTypeDef HAL_IRDA_AbortReceive(IRDA_HandleTypeDef *hirda)
Anna Bridge 186:707f6e361f3e 1150 {
Anna Bridge 186:707f6e361f3e 1151 /* Disable RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts */
Anna Bridge 186:707f6e361f3e 1152 CLEAR_BIT(hirda->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE));
Anna Bridge 186:707f6e361f3e 1153 CLEAR_BIT(hirda->Instance->CR3, USART_CR3_EIE);
Anna Bridge 186:707f6e361f3e 1154
Anna Bridge 186:707f6e361f3e 1155 /* Disable the IRDA DMA Rx request if enabled */
Anna Bridge 186:707f6e361f3e 1156 if (HAL_IS_BIT_SET(hirda->Instance->CR3, USART_CR3_DMAR))
<> 144:ef7eb2e8f9f7 1157 {
Anna Bridge 186:707f6e361f3e 1158 CLEAR_BIT(hirda->Instance->CR3, USART_CR3_DMAR);
Anna Bridge 186:707f6e361f3e 1159
Anna Bridge 186:707f6e361f3e 1160 /* Abort the IRDA DMA Rx channel : use blocking DMA Abort API (no callback) */
Anna Bridge 186:707f6e361f3e 1161 if(hirda->hdmarx != NULL)
Anna Bridge 186:707f6e361f3e 1162 {
Anna Bridge 186:707f6e361f3e 1163 /* Set the IRDA DMA Abort callback to Null.
Anna Bridge 186:707f6e361f3e 1164 No call back execution at end of DMA abort procedure */
Anna Bridge 186:707f6e361f3e 1165 hirda->hdmarx->XferAbortCallback = NULL;
Anna Bridge 186:707f6e361f3e 1166
Anna Bridge 186:707f6e361f3e 1167 HAL_DMA_Abort(hirda->hdmarx);
Anna Bridge 186:707f6e361f3e 1168 }
<> 144:ef7eb2e8f9f7 1169 }
Anna Bridge 186:707f6e361f3e 1170
Anna Bridge 186:707f6e361f3e 1171 /* Reset Rx transfer counter */
Anna Bridge 186:707f6e361f3e 1172 hirda->RxXferCount = 0;
Anna Bridge 186:707f6e361f3e 1173
Anna Bridge 186:707f6e361f3e 1174 /* Clear the Error flags in the ICR register */
Anna Bridge 186:707f6e361f3e 1175 __HAL_IRDA_CLEAR_FLAG(hirda, IRDA_CLEAR_OREF | IRDA_CLEAR_NEF | IRDA_CLEAR_PEF | IRDA_CLEAR_FEF);
Anna Bridge 186:707f6e361f3e 1176
Anna Bridge 186:707f6e361f3e 1177 /* Restore hirda->RxState to Ready */
Anna Bridge 186:707f6e361f3e 1178 hirda->RxState = HAL_IRDA_STATE_READY;
<> 144:ef7eb2e8f9f7 1179
<> 144:ef7eb2e8f9f7 1180 return HAL_OK;
<> 144:ef7eb2e8f9f7 1181 }
<> 144:ef7eb2e8f9f7 1182
<> 144:ef7eb2e8f9f7 1183 /**
Anna Bridge 186:707f6e361f3e 1184 * @brief Abort ongoing transfers (Interrupt mode).
Anna Bridge 186:707f6e361f3e 1185 * @param hirda Pointer to a IRDA_HandleTypeDef structure that contains
Anna Bridge 186:707f6e361f3e 1186 * the configuration information for the specified UART module.
Anna Bridge 186:707f6e361f3e 1187 * @note This procedure could be used for aborting any ongoing transfer started in Interrupt or DMA mode.
Anna Bridge 186:707f6e361f3e 1188 * This procedure performs following operations :
Anna Bridge 186:707f6e361f3e 1189 * - Disable IRDA Interrupts (Tx and Rx)
Anna Bridge 186:707f6e361f3e 1190 * - Disable the DMA transfer in the peripheral register (if enabled)
Anna Bridge 186:707f6e361f3e 1191 * - Abort DMA transfer by calling HAL_DMA_Abort_IT (in case of transfer in DMA mode)
Anna Bridge 186:707f6e361f3e 1192 * - Set handle State to READY
Anna Bridge 186:707f6e361f3e 1193 * - At abort completion, call user abort complete callback
Anna Bridge 186:707f6e361f3e 1194 * @note This procedure is executed in Interrupt mode, meaning that abort procedure could be
Anna Bridge 186:707f6e361f3e 1195 * considered as completed only when user abort complete callback is executed (not when exiting function).
Anna Bridge 186:707f6e361f3e 1196 * @retval HAL status
Anna Bridge 186:707f6e361f3e 1197 */
Anna Bridge 186:707f6e361f3e 1198 HAL_StatusTypeDef HAL_IRDA_Abort_IT(IRDA_HandleTypeDef *hirda)
Anna Bridge 186:707f6e361f3e 1199 {
Anna Bridge 186:707f6e361f3e 1200 uint32_t abortcplt = 1;
Anna Bridge 186:707f6e361f3e 1201
Anna Bridge 186:707f6e361f3e 1202 /* Disable TXEIE, TCIE, RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts */
Anna Bridge 186:707f6e361f3e 1203 CLEAR_BIT(hirda->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE | USART_CR1_TXEIE | USART_CR1_TCIE));
Anna Bridge 186:707f6e361f3e 1204 CLEAR_BIT(hirda->Instance->CR3, USART_CR3_EIE);
Anna Bridge 186:707f6e361f3e 1205
Anna Bridge 186:707f6e361f3e 1206 /* If DMA Tx and/or DMA Rx Handles are associated to IRDA Handle, DMA Abort complete callbacks should be initialised
Anna Bridge 186:707f6e361f3e 1207 before any call to DMA Abort functions */
Anna Bridge 186:707f6e361f3e 1208 /* DMA Tx Handle is valid */
Anna Bridge 186:707f6e361f3e 1209 if(hirda->hdmatx != NULL)
Anna Bridge 186:707f6e361f3e 1210 {
Anna Bridge 186:707f6e361f3e 1211 /* Set DMA Abort Complete callback if IRDA DMA Tx request if enabled.
Anna Bridge 186:707f6e361f3e 1212 Otherwise, set it to NULL */
Anna Bridge 186:707f6e361f3e 1213 if(HAL_IS_BIT_SET(hirda->Instance->CR3, USART_CR3_DMAT))
Anna Bridge 186:707f6e361f3e 1214 {
Anna Bridge 186:707f6e361f3e 1215 hirda->hdmatx->XferAbortCallback = IRDA_DMATxAbortCallback;
Anna Bridge 186:707f6e361f3e 1216 }
Anna Bridge 186:707f6e361f3e 1217 else
Anna Bridge 186:707f6e361f3e 1218 {
Anna Bridge 186:707f6e361f3e 1219 hirda->hdmatx->XferAbortCallback = NULL;
Anna Bridge 186:707f6e361f3e 1220 }
Anna Bridge 186:707f6e361f3e 1221 }
Anna Bridge 186:707f6e361f3e 1222 /* DMA Rx Handle is valid */
Anna Bridge 186:707f6e361f3e 1223 if(hirda->hdmarx != NULL)
Anna Bridge 186:707f6e361f3e 1224 {
Anna Bridge 186:707f6e361f3e 1225 /* Set DMA Abort Complete callback if IRDA DMA Rx request if enabled.
Anna Bridge 186:707f6e361f3e 1226 Otherwise, set it to NULL */
Anna Bridge 186:707f6e361f3e 1227 if(HAL_IS_BIT_SET(hirda->Instance->CR3, USART_CR3_DMAR))
Anna Bridge 186:707f6e361f3e 1228 {
Anna Bridge 186:707f6e361f3e 1229 hirda->hdmarx->XferAbortCallback = IRDA_DMARxAbortCallback;
Anna Bridge 186:707f6e361f3e 1230 }
Anna Bridge 186:707f6e361f3e 1231 else
Anna Bridge 186:707f6e361f3e 1232 {
Anna Bridge 186:707f6e361f3e 1233 hirda->hdmarx->XferAbortCallback = NULL;
Anna Bridge 186:707f6e361f3e 1234 }
Anna Bridge 186:707f6e361f3e 1235 }
Anna Bridge 186:707f6e361f3e 1236
Anna Bridge 186:707f6e361f3e 1237 /* Disable the IRDA DMA Tx request if enabled */
Anna Bridge 186:707f6e361f3e 1238 if(HAL_IS_BIT_SET(hirda->Instance->CR3, USART_CR3_DMAT))
Anna Bridge 186:707f6e361f3e 1239 {
Anna Bridge 186:707f6e361f3e 1240 /* Disable DMA Tx at UART level */
Anna Bridge 186:707f6e361f3e 1241 CLEAR_BIT(hirda->Instance->CR3, USART_CR3_DMAT);
Anna Bridge 186:707f6e361f3e 1242
Anna Bridge 186:707f6e361f3e 1243 /* Abort the IRDA DMA Tx channel : use non blocking DMA Abort API (callback) */
Anna Bridge 186:707f6e361f3e 1244 if(hirda->hdmatx != NULL)
Anna Bridge 186:707f6e361f3e 1245 {
Anna Bridge 186:707f6e361f3e 1246 /* IRDA Tx DMA Abort callback has already been initialised :
Anna Bridge 186:707f6e361f3e 1247 will lead to call HAL_IRDA_AbortCpltCallback() at end of DMA abort procedure */
Anna Bridge 186:707f6e361f3e 1248
Anna Bridge 186:707f6e361f3e 1249 /* Abort DMA TX */
Anna Bridge 186:707f6e361f3e 1250 if(HAL_DMA_Abort_IT(hirda->hdmatx) != HAL_OK)
Anna Bridge 186:707f6e361f3e 1251 {
Anna Bridge 186:707f6e361f3e 1252 hirda->hdmatx->XferAbortCallback = NULL;
Anna Bridge 186:707f6e361f3e 1253 }
Anna Bridge 186:707f6e361f3e 1254 else
Anna Bridge 186:707f6e361f3e 1255 {
Anna Bridge 186:707f6e361f3e 1256 abortcplt = 0;
Anna Bridge 186:707f6e361f3e 1257 }
Anna Bridge 186:707f6e361f3e 1258 }
Anna Bridge 186:707f6e361f3e 1259 }
Anna Bridge 186:707f6e361f3e 1260
Anna Bridge 186:707f6e361f3e 1261 /* Disable the IRDA DMA Rx request if enabled */
Anna Bridge 186:707f6e361f3e 1262 if (HAL_IS_BIT_SET(hirda->Instance->CR3, USART_CR3_DMAR))
Anna Bridge 186:707f6e361f3e 1263 {
Anna Bridge 186:707f6e361f3e 1264 CLEAR_BIT(hirda->Instance->CR3, USART_CR3_DMAR);
Anna Bridge 186:707f6e361f3e 1265
Anna Bridge 186:707f6e361f3e 1266 /* Abort the IRDA DMA Rx channel : use non blocking DMA Abort API (callback) */
Anna Bridge 186:707f6e361f3e 1267 if(hirda->hdmarx != NULL)
Anna Bridge 186:707f6e361f3e 1268 {
Anna Bridge 186:707f6e361f3e 1269 /* IRDA Rx DMA Abort callback has already been initialised :
Anna Bridge 186:707f6e361f3e 1270 will lead to call HAL_IRDA_AbortCpltCallback() at end of DMA abort procedure */
Anna Bridge 186:707f6e361f3e 1271
Anna Bridge 186:707f6e361f3e 1272 /* Abort DMA RX */
Anna Bridge 186:707f6e361f3e 1273 if(HAL_DMA_Abort_IT(hirda->hdmarx) != HAL_OK)
Anna Bridge 186:707f6e361f3e 1274 {
Anna Bridge 186:707f6e361f3e 1275 hirda->hdmarx->XferAbortCallback = NULL;
Anna Bridge 186:707f6e361f3e 1276 abortcplt = 1;
Anna Bridge 186:707f6e361f3e 1277 }
Anna Bridge 186:707f6e361f3e 1278 else
Anna Bridge 186:707f6e361f3e 1279 {
Anna Bridge 186:707f6e361f3e 1280 abortcplt = 0;
Anna Bridge 186:707f6e361f3e 1281 }
Anna Bridge 186:707f6e361f3e 1282 }
Anna Bridge 186:707f6e361f3e 1283 }
Anna Bridge 186:707f6e361f3e 1284
Anna Bridge 186:707f6e361f3e 1285 /* if no DMA abort complete callback execution is required => call user Abort Complete callback */
Anna Bridge 186:707f6e361f3e 1286 if (abortcplt == 1)
Anna Bridge 186:707f6e361f3e 1287 {
Anna Bridge 186:707f6e361f3e 1288 /* Reset Tx and Rx transfer counters */
Anna Bridge 186:707f6e361f3e 1289 hirda->TxXferCount = 0;
Anna Bridge 186:707f6e361f3e 1290 hirda->RxXferCount = 0;
Anna Bridge 186:707f6e361f3e 1291
Anna Bridge 186:707f6e361f3e 1292 /* Reset errorCode */
Anna Bridge 186:707f6e361f3e 1293 hirda->ErrorCode = HAL_IRDA_ERROR_NONE;
Anna Bridge 186:707f6e361f3e 1294
Anna Bridge 186:707f6e361f3e 1295 /* Clear the Error flags in the ICR register */
Anna Bridge 186:707f6e361f3e 1296 __HAL_IRDA_CLEAR_FLAG(hirda, IRDA_CLEAR_OREF | IRDA_CLEAR_NEF | IRDA_CLEAR_PEF | IRDA_CLEAR_FEF);
Anna Bridge 186:707f6e361f3e 1297
Anna Bridge 186:707f6e361f3e 1298 /* Restore hirda->gState and hirda->RxState to Ready */
Anna Bridge 186:707f6e361f3e 1299 hirda->gState = HAL_IRDA_STATE_READY;
Anna Bridge 186:707f6e361f3e 1300 hirda->RxState = HAL_IRDA_STATE_READY;
Anna Bridge 186:707f6e361f3e 1301
Anna Bridge 186:707f6e361f3e 1302 /* As no DMA to be aborted, call directly user Abort complete callback */
Anna Bridge 186:707f6e361f3e 1303 HAL_IRDA_AbortCpltCallback(hirda);
Anna Bridge 186:707f6e361f3e 1304 }
Anna Bridge 186:707f6e361f3e 1305
Anna Bridge 186:707f6e361f3e 1306 return HAL_OK;
Anna Bridge 186:707f6e361f3e 1307 }
Anna Bridge 186:707f6e361f3e 1308
Anna Bridge 186:707f6e361f3e 1309 /**
Anna Bridge 186:707f6e361f3e 1310 * @brief Abort ongoing Transmit transfer (Interrupt mode).
Anna Bridge 186:707f6e361f3e 1311 * @param hirda Pointer to a IRDA_HandleTypeDef structure that contains
Anna Bridge 186:707f6e361f3e 1312 * the configuration information for the specified UART module.
Anna Bridge 186:707f6e361f3e 1313 * @note This procedure could be used for aborting any ongoing Tx transfer started in Interrupt or DMA mode.
Anna Bridge 186:707f6e361f3e 1314 * This procedure performs following operations :
Anna Bridge 186:707f6e361f3e 1315 * - Disable IRDA Interrupts (Tx)
Anna Bridge 186:707f6e361f3e 1316 * - Disable the DMA transfer in the peripheral register (if enabled)
Anna Bridge 186:707f6e361f3e 1317 * - Abort DMA transfer by calling HAL_DMA_Abort_IT (in case of transfer in DMA mode)
Anna Bridge 186:707f6e361f3e 1318 * - Set handle State to READY
Anna Bridge 186:707f6e361f3e 1319 * - At abort completion, call user abort complete callback
Anna Bridge 186:707f6e361f3e 1320 * @note This procedure is executed in Interrupt mode, meaning that abort procedure could be
Anna Bridge 186:707f6e361f3e 1321 * considered as completed only when user abort complete callback is executed (not when exiting function).
Anna Bridge 186:707f6e361f3e 1322 * @retval HAL status
Anna Bridge 186:707f6e361f3e 1323 */
Anna Bridge 186:707f6e361f3e 1324 HAL_StatusTypeDef HAL_IRDA_AbortTransmit_IT(IRDA_HandleTypeDef *hirda)
Anna Bridge 186:707f6e361f3e 1325 {
Anna Bridge 186:707f6e361f3e 1326 /* Disable TXEIE and TCIE interrupts */
Anna Bridge 186:707f6e361f3e 1327 CLEAR_BIT(hirda->Instance->CR1, (USART_CR1_TXEIE | USART_CR1_TCIE));
Anna Bridge 186:707f6e361f3e 1328
Anna Bridge 186:707f6e361f3e 1329 /* Disable the IRDA DMA Tx request if enabled */
Anna Bridge 186:707f6e361f3e 1330 if (HAL_IS_BIT_SET(hirda->Instance->CR3, USART_CR3_DMAT))
Anna Bridge 186:707f6e361f3e 1331 {
Anna Bridge 186:707f6e361f3e 1332 CLEAR_BIT(hirda->Instance->CR3, USART_CR3_DMAT);
Anna Bridge 186:707f6e361f3e 1333
Anna Bridge 186:707f6e361f3e 1334 /* Abort the IRDA DMA Tx channel : use non blocking DMA Abort API (callback) */
Anna Bridge 186:707f6e361f3e 1335 if(hirda->hdmatx != NULL)
Anna Bridge 186:707f6e361f3e 1336 {
Anna Bridge 186:707f6e361f3e 1337 /* Set the IRDA DMA Abort callback :
Anna Bridge 186:707f6e361f3e 1338 will lead to call HAL_IRDA_AbortCpltCallback() at end of DMA abort procedure */
Anna Bridge 186:707f6e361f3e 1339 hirda->hdmatx->XferAbortCallback = IRDA_DMATxOnlyAbortCallback;
Anna Bridge 186:707f6e361f3e 1340
Anna Bridge 186:707f6e361f3e 1341 /* Abort DMA TX */
Anna Bridge 186:707f6e361f3e 1342 if(HAL_DMA_Abort_IT(hirda->hdmatx) != HAL_OK)
Anna Bridge 186:707f6e361f3e 1343 {
Anna Bridge 186:707f6e361f3e 1344 /* Call Directly hirda->hdmatx->XferAbortCallback function in case of error */
Anna Bridge 186:707f6e361f3e 1345 hirda->hdmatx->XferAbortCallback(hirda->hdmatx);
Anna Bridge 186:707f6e361f3e 1346 }
Anna Bridge 186:707f6e361f3e 1347 }
Anna Bridge 186:707f6e361f3e 1348 else
Anna Bridge 186:707f6e361f3e 1349 {
Anna Bridge 186:707f6e361f3e 1350 /* Reset Tx transfer counter */
Anna Bridge 186:707f6e361f3e 1351 hirda->TxXferCount = 0;
Anna Bridge 186:707f6e361f3e 1352
Anna Bridge 186:707f6e361f3e 1353 /* Restore hirda->gState to Ready */
Anna Bridge 186:707f6e361f3e 1354 hirda->gState = HAL_IRDA_STATE_READY;
Anna Bridge 186:707f6e361f3e 1355
Anna Bridge 186:707f6e361f3e 1356 /* As no DMA to be aborted, call directly user Abort complete callback */
Anna Bridge 186:707f6e361f3e 1357 HAL_IRDA_AbortTransmitCpltCallback(hirda);
Anna Bridge 186:707f6e361f3e 1358 }
Anna Bridge 186:707f6e361f3e 1359 }
Anna Bridge 186:707f6e361f3e 1360 else
Anna Bridge 186:707f6e361f3e 1361 {
Anna Bridge 186:707f6e361f3e 1362 /* Reset Tx transfer counter */
Anna Bridge 186:707f6e361f3e 1363 hirda->TxXferCount = 0;
Anna Bridge 186:707f6e361f3e 1364
Anna Bridge 186:707f6e361f3e 1365 /* Restore hirda->gState to Ready */
Anna Bridge 186:707f6e361f3e 1366 hirda->gState = HAL_IRDA_STATE_READY;
Anna Bridge 186:707f6e361f3e 1367
Anna Bridge 186:707f6e361f3e 1368 /* As no DMA to be aborted, call directly user Abort complete callback */
Anna Bridge 186:707f6e361f3e 1369 HAL_IRDA_AbortTransmitCpltCallback(hirda);
Anna Bridge 186:707f6e361f3e 1370 }
Anna Bridge 186:707f6e361f3e 1371
Anna Bridge 186:707f6e361f3e 1372 return HAL_OK;
Anna Bridge 186:707f6e361f3e 1373 }
Anna Bridge 186:707f6e361f3e 1374
Anna Bridge 186:707f6e361f3e 1375 /**
Anna Bridge 186:707f6e361f3e 1376 * @brief Abort ongoing Receive transfer (Interrupt mode).
Anna Bridge 186:707f6e361f3e 1377 * @param hirda Pointer to a IRDA_HandleTypeDef structure that contains
Anna Bridge 186:707f6e361f3e 1378 * the configuration information for the specified UART module.
Anna Bridge 186:707f6e361f3e 1379 * @note This procedure could be used for aborting any ongoing Rx transfer started in Interrupt or DMA mode.
Anna Bridge 186:707f6e361f3e 1380 * This procedure performs following operations :
Anna Bridge 186:707f6e361f3e 1381 * - Disable IRDA Interrupts (Rx)
Anna Bridge 186:707f6e361f3e 1382 * - Disable the DMA transfer in the peripheral register (if enabled)
Anna Bridge 186:707f6e361f3e 1383 * - Abort DMA transfer by calling HAL_DMA_Abort_IT (in case of transfer in DMA mode)
Anna Bridge 186:707f6e361f3e 1384 * - Set handle State to READY
Anna Bridge 186:707f6e361f3e 1385 * - At abort completion, call user abort complete callback
Anna Bridge 186:707f6e361f3e 1386 * @note This procedure is executed in Interrupt mode, meaning that abort procedure could be
Anna Bridge 186:707f6e361f3e 1387 * considered as completed only when user abort complete callback is executed (not when exiting function).
Anna Bridge 186:707f6e361f3e 1388 * @retval HAL status
Anna Bridge 186:707f6e361f3e 1389 */
Anna Bridge 186:707f6e361f3e 1390 HAL_StatusTypeDef HAL_IRDA_AbortReceive_IT(IRDA_HandleTypeDef *hirda)
Anna Bridge 186:707f6e361f3e 1391 {
Anna Bridge 186:707f6e361f3e 1392 /* Disable RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts */
Anna Bridge 186:707f6e361f3e 1393 CLEAR_BIT(hirda->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE));
Anna Bridge 186:707f6e361f3e 1394 CLEAR_BIT(hirda->Instance->CR3, USART_CR3_EIE);
Anna Bridge 186:707f6e361f3e 1395
Anna Bridge 186:707f6e361f3e 1396 /* Disable the IRDA DMA Rx request if enabled */
Anna Bridge 186:707f6e361f3e 1397 if (HAL_IS_BIT_SET(hirda->Instance->CR3, USART_CR3_DMAR))
Anna Bridge 186:707f6e361f3e 1398 {
Anna Bridge 186:707f6e361f3e 1399 CLEAR_BIT(hirda->Instance->CR3, USART_CR3_DMAR);
Anna Bridge 186:707f6e361f3e 1400
Anna Bridge 186:707f6e361f3e 1401 /* Abort the IRDA DMA Rx channel : use non blocking DMA Abort API (callback) */
Anna Bridge 186:707f6e361f3e 1402 if(hirda->hdmarx != NULL)
Anna Bridge 186:707f6e361f3e 1403 {
Anna Bridge 186:707f6e361f3e 1404 /* Set the IRDA DMA Abort callback :
Anna Bridge 186:707f6e361f3e 1405 will lead to call HAL_IRDA_AbortCpltCallback() at end of DMA abort procedure */
Anna Bridge 186:707f6e361f3e 1406 hirda->hdmarx->XferAbortCallback = IRDA_DMARxOnlyAbortCallback;
Anna Bridge 186:707f6e361f3e 1407
Anna Bridge 186:707f6e361f3e 1408 /* Abort DMA RX */
Anna Bridge 186:707f6e361f3e 1409 if(HAL_DMA_Abort_IT(hirda->hdmarx) != HAL_OK)
Anna Bridge 186:707f6e361f3e 1410 {
Anna Bridge 186:707f6e361f3e 1411 /* Call Directly hirda->hdmarx->XferAbortCallback function in case of error */
Anna Bridge 186:707f6e361f3e 1412 hirda->hdmarx->XferAbortCallback(hirda->hdmarx);
Anna Bridge 186:707f6e361f3e 1413 }
Anna Bridge 186:707f6e361f3e 1414 }
Anna Bridge 186:707f6e361f3e 1415 else
Anna Bridge 186:707f6e361f3e 1416 {
Anna Bridge 186:707f6e361f3e 1417 /* Reset Rx transfer counter */
Anna Bridge 186:707f6e361f3e 1418 hirda->RxXferCount = 0;
Anna Bridge 186:707f6e361f3e 1419
Anna Bridge 186:707f6e361f3e 1420 /* Clear the Error flags in the ICR register */
Anna Bridge 186:707f6e361f3e 1421 __HAL_IRDA_CLEAR_FLAG(hirda, IRDA_CLEAR_OREF | IRDA_CLEAR_NEF | IRDA_CLEAR_PEF | IRDA_CLEAR_FEF);
Anna Bridge 186:707f6e361f3e 1422
Anna Bridge 186:707f6e361f3e 1423 /* Restore hirda->RxState to Ready */
Anna Bridge 186:707f6e361f3e 1424 hirda->RxState = HAL_IRDA_STATE_READY;
Anna Bridge 186:707f6e361f3e 1425
Anna Bridge 186:707f6e361f3e 1426 /* As no DMA to be aborted, call directly user Abort complete callback */
Anna Bridge 186:707f6e361f3e 1427 HAL_IRDA_AbortReceiveCpltCallback(hirda);
Anna Bridge 186:707f6e361f3e 1428 }
Anna Bridge 186:707f6e361f3e 1429 }
Anna Bridge 186:707f6e361f3e 1430 else
Anna Bridge 186:707f6e361f3e 1431 {
Anna Bridge 186:707f6e361f3e 1432 /* Reset Rx transfer counter */
Anna Bridge 186:707f6e361f3e 1433 hirda->RxXferCount = 0;
Anna Bridge 186:707f6e361f3e 1434
Anna Bridge 186:707f6e361f3e 1435 /* Clear the Error flags in the ICR register */
Anna Bridge 186:707f6e361f3e 1436 __HAL_IRDA_CLEAR_FLAG(hirda, IRDA_CLEAR_OREF | IRDA_CLEAR_NEF | IRDA_CLEAR_PEF | IRDA_CLEAR_FEF);
Anna Bridge 186:707f6e361f3e 1437
Anna Bridge 186:707f6e361f3e 1438 /* Restore hirda->RxState to Ready */
Anna Bridge 186:707f6e361f3e 1439 hirda->RxState = HAL_IRDA_STATE_READY;
Anna Bridge 186:707f6e361f3e 1440
Anna Bridge 186:707f6e361f3e 1441 /* As no DMA to be aborted, call directly user Abort complete callback */
Anna Bridge 186:707f6e361f3e 1442 HAL_IRDA_AbortReceiveCpltCallback(hirda);
Anna Bridge 186:707f6e361f3e 1443 }
Anna Bridge 186:707f6e361f3e 1444
Anna Bridge 186:707f6e361f3e 1445 return HAL_OK;
Anna Bridge 186:707f6e361f3e 1446 }
Anna Bridge 186:707f6e361f3e 1447
Anna Bridge 186:707f6e361f3e 1448 /**
Anna Bridge 186:707f6e361f3e 1449 * @brief Handle IRDA interrupt request.
Anna Bridge 186:707f6e361f3e 1450 * @param hirda Pointer to a IRDA_HandleTypeDef structure that contains
Anna Bridge 186:707f6e361f3e 1451 * the configuration information for the specified IRDA module.
<> 144:ef7eb2e8f9f7 1452 * @retval None
<> 144:ef7eb2e8f9f7 1453 */
<> 144:ef7eb2e8f9f7 1454 void HAL_IRDA_IRQHandler(IRDA_HandleTypeDef *hirda)
<> 144:ef7eb2e8f9f7 1455 {
Anna Bridge 186:707f6e361f3e 1456 uint32_t isrflags = READ_REG(hirda->Instance->ISR);
Anna Bridge 186:707f6e361f3e 1457 uint32_t cr1its = READ_REG(hirda->Instance->CR1);
Anna Bridge 186:707f6e361f3e 1458 uint32_t cr3its;
Anna Bridge 186:707f6e361f3e 1459 uint32_t errorflags;
Anna Bridge 186:707f6e361f3e 1460
Anna Bridge 186:707f6e361f3e 1461 /* If no error occurs */
Anna Bridge 186:707f6e361f3e 1462 errorflags = (isrflags & (uint32_t)(USART_ISR_PE | USART_ISR_FE | USART_ISR_ORE | USART_ISR_NE));
Anna Bridge 186:707f6e361f3e 1463 if (errorflags == RESET)
Anna Bridge 186:707f6e361f3e 1464 {
Anna Bridge 186:707f6e361f3e 1465 /* IRDA in mode Receiver ---------------------------------------------------*/
Anna Bridge 186:707f6e361f3e 1466 if(((isrflags & USART_ISR_RXNE) != RESET) && ((cr1its & USART_CR1_RXNEIE) != RESET))
Anna Bridge 186:707f6e361f3e 1467 {
Anna Bridge 186:707f6e361f3e 1468 IRDA_Receive_IT(hirda);
Anna Bridge 186:707f6e361f3e 1469 return;
Anna Bridge 186:707f6e361f3e 1470 }
Anna Bridge 186:707f6e361f3e 1471 }
Anna Bridge 186:707f6e361f3e 1472
Anna Bridge 186:707f6e361f3e 1473 /* If some errors occur */
Anna Bridge 186:707f6e361f3e 1474 cr3its = READ_REG(hirda->Instance->CR3);
Anna Bridge 186:707f6e361f3e 1475 if( (errorflags != RESET)
Anna Bridge 186:707f6e361f3e 1476 && ( ((cr3its & USART_CR3_EIE) != RESET)
Anna Bridge 186:707f6e361f3e 1477 || ((cr1its & (USART_CR1_RXNEIE | USART_CR1_PEIE)) != RESET)) )
Anna Bridge 186:707f6e361f3e 1478 {
Anna Bridge 186:707f6e361f3e 1479 /* IRDA parity error interrupt occurred -------------------------------------*/
Anna Bridge 186:707f6e361f3e 1480 if(((isrflags & USART_ISR_PE) != RESET) && ((cr1its & USART_CR1_PEIE) != RESET))
Anna Bridge 186:707f6e361f3e 1481 {
Anna Bridge 186:707f6e361f3e 1482 __HAL_IRDA_CLEAR_IT(hirda, IRDA_CLEAR_PEF);
<> 144:ef7eb2e8f9f7 1483
Anna Bridge 186:707f6e361f3e 1484 hirda->ErrorCode |= HAL_IRDA_ERROR_PE;
Anna Bridge 186:707f6e361f3e 1485 }
Anna Bridge 186:707f6e361f3e 1486
Anna Bridge 186:707f6e361f3e 1487 /* IRDA frame error interrupt occurred --------------------------------------*/
Anna Bridge 186:707f6e361f3e 1488 if(((isrflags & USART_ISR_FE) != RESET) && ((cr3its & USART_CR3_EIE) != RESET))
Anna Bridge 186:707f6e361f3e 1489 {
Anna Bridge 186:707f6e361f3e 1490 __HAL_IRDA_CLEAR_IT(hirda, IRDA_CLEAR_FEF);
Anna Bridge 186:707f6e361f3e 1491
Anna Bridge 186:707f6e361f3e 1492 hirda->ErrorCode |= HAL_IRDA_ERROR_FE;
Anna Bridge 186:707f6e361f3e 1493 }
<> 144:ef7eb2e8f9f7 1494
Anna Bridge 186:707f6e361f3e 1495 /* IRDA noise error interrupt occurred --------------------------------------*/
Anna Bridge 186:707f6e361f3e 1496 if(((isrflags & USART_ISR_NE) != RESET) && ((cr3its & USART_CR3_EIE) != RESET))
Anna Bridge 186:707f6e361f3e 1497 {
Anna Bridge 186:707f6e361f3e 1498 __HAL_IRDA_CLEAR_IT(hirda, IRDA_CLEAR_NEF);
Anna Bridge 186:707f6e361f3e 1499
Anna Bridge 186:707f6e361f3e 1500 hirda->ErrorCode |= HAL_IRDA_ERROR_NE;
Anna Bridge 186:707f6e361f3e 1501 }
Anna Bridge 186:707f6e361f3e 1502
Anna Bridge 186:707f6e361f3e 1503 /* IRDA Over-Run interrupt occurred -----------------------------------------*/
Anna Bridge 186:707f6e361f3e 1504 if(((isrflags & USART_ISR_ORE) != RESET) &&
Anna Bridge 186:707f6e361f3e 1505 (((cr1its & USART_CR1_RXNEIE) != RESET) || ((cr3its & USART_CR3_EIE) != RESET)))
Anna Bridge 186:707f6e361f3e 1506 {
Anna Bridge 186:707f6e361f3e 1507 __HAL_IRDA_CLEAR_IT(hirda, IRDA_CLEAR_OREF);
Anna Bridge 186:707f6e361f3e 1508
Anna Bridge 186:707f6e361f3e 1509 hirda->ErrorCode |= HAL_IRDA_ERROR_ORE;
Anna Bridge 186:707f6e361f3e 1510 }
<> 144:ef7eb2e8f9f7 1511
Anna Bridge 186:707f6e361f3e 1512 /* Call IRDA Error Call back function if need be --------------------------*/
Anna Bridge 186:707f6e361f3e 1513 if(hirda->ErrorCode != HAL_IRDA_ERROR_NONE)
Anna Bridge 186:707f6e361f3e 1514 {
Anna Bridge 186:707f6e361f3e 1515 /* IRDA in mode Receiver ---------------------------------------------------*/
Anna Bridge 186:707f6e361f3e 1516 if(((isrflags & USART_ISR_RXNE) != RESET) && ((cr1its & USART_CR1_RXNEIE) != RESET))
Anna Bridge 186:707f6e361f3e 1517 {
Anna Bridge 186:707f6e361f3e 1518 IRDA_Receive_IT(hirda);
Anna Bridge 186:707f6e361f3e 1519 }
Anna Bridge 186:707f6e361f3e 1520
Anna Bridge 186:707f6e361f3e 1521 /* If Overrun error occurs, or if any error occurs in DMA mode reception,
Anna Bridge 186:707f6e361f3e 1522 consider error as blocking */
Anna Bridge 186:707f6e361f3e 1523 if (((hirda->ErrorCode & HAL_IRDA_ERROR_ORE) != RESET) ||
Anna Bridge 186:707f6e361f3e 1524 (HAL_IS_BIT_SET(hirda->Instance->CR3, USART_CR3_DMAR)))
Anna Bridge 186:707f6e361f3e 1525 {
Anna Bridge 186:707f6e361f3e 1526 /* Blocking error : transfer is aborted
Anna Bridge 186:707f6e361f3e 1527 Set the IRDA state ready to be able to start again the process,
Anna Bridge 186:707f6e361f3e 1528 Disable Rx Interrupts, and disable Rx DMA request, if ongoing */
Anna Bridge 186:707f6e361f3e 1529 IRDA_EndRxTransfer(hirda);
Anna Bridge 186:707f6e361f3e 1530
Anna Bridge 186:707f6e361f3e 1531 /* Disable the IRDA DMA Rx request if enabled */
Anna Bridge 186:707f6e361f3e 1532 if (HAL_IS_BIT_SET(hirda->Instance->CR3, USART_CR3_DMAR))
Anna Bridge 186:707f6e361f3e 1533 {
Anna Bridge 186:707f6e361f3e 1534 CLEAR_BIT(hirda->Instance->CR3, USART_CR3_DMAR);
Anna Bridge 186:707f6e361f3e 1535
Anna Bridge 186:707f6e361f3e 1536 /* Abort the IRDA DMA Rx channel */
Anna Bridge 186:707f6e361f3e 1537 if(hirda->hdmarx != NULL)
Anna Bridge 186:707f6e361f3e 1538 {
Anna Bridge 186:707f6e361f3e 1539 /* Set the IRDA DMA Abort callback :
Anna Bridge 186:707f6e361f3e 1540 will lead to call HAL_IRDA_ErrorCallback() at end of DMA abort procedure */
Anna Bridge 186:707f6e361f3e 1541 hirda->hdmarx->XferAbortCallback = IRDA_DMAAbortOnError;
<> 144:ef7eb2e8f9f7 1542
Anna Bridge 186:707f6e361f3e 1543 /* Abort DMA RX */
Anna Bridge 186:707f6e361f3e 1544 if(HAL_DMA_Abort_IT(hirda->hdmarx) != HAL_OK)
Anna Bridge 186:707f6e361f3e 1545 {
Anna Bridge 186:707f6e361f3e 1546 /* Call Directly hirda->hdmarx->XferAbortCallback function in case of error */
Anna Bridge 186:707f6e361f3e 1547 hirda->hdmarx->XferAbortCallback(hirda->hdmarx);
Anna Bridge 186:707f6e361f3e 1548 }
Anna Bridge 186:707f6e361f3e 1549 }
Anna Bridge 186:707f6e361f3e 1550 else
Anna Bridge 186:707f6e361f3e 1551 {
Anna Bridge 186:707f6e361f3e 1552 /* Call user error callback */
Anna Bridge 186:707f6e361f3e 1553 HAL_IRDA_ErrorCallback(hirda);
Anna Bridge 186:707f6e361f3e 1554 }
Anna Bridge 186:707f6e361f3e 1555 }
Anna Bridge 186:707f6e361f3e 1556 else
Anna Bridge 186:707f6e361f3e 1557 {
Anna Bridge 186:707f6e361f3e 1558 /* Call user error callback */
Anna Bridge 186:707f6e361f3e 1559 HAL_IRDA_ErrorCallback(hirda);
Anna Bridge 186:707f6e361f3e 1560 }
Anna Bridge 186:707f6e361f3e 1561 }
Anna Bridge 186:707f6e361f3e 1562 else
Anna Bridge 186:707f6e361f3e 1563 {
Anna Bridge 186:707f6e361f3e 1564 /* Non Blocking error : transfer could go on.
Anna Bridge 186:707f6e361f3e 1565 Error is notified to user through user error callback */
Anna Bridge 186:707f6e361f3e 1566 HAL_IRDA_ErrorCallback(hirda);
Anna Bridge 186:707f6e361f3e 1567 hirda->ErrorCode = HAL_IRDA_ERROR_NONE;
Anna Bridge 186:707f6e361f3e 1568 }
Anna Bridge 186:707f6e361f3e 1569 }
Anna Bridge 186:707f6e361f3e 1570 return;
<> 144:ef7eb2e8f9f7 1571
Anna Bridge 186:707f6e361f3e 1572 } /* End if some error occurs */
Anna Bridge 186:707f6e361f3e 1573
<> 144:ef7eb2e8f9f7 1574 /* IRDA in mode Transmitter ------------------------------------------------*/
Anna Bridge 186:707f6e361f3e 1575 if(((isrflags & USART_ISR_TXE) != RESET) && ((cr1its & USART_CR1_TXEIE) != RESET))
<> 144:ef7eb2e8f9f7 1576 {
<> 144:ef7eb2e8f9f7 1577 IRDA_Transmit_IT(hirda);
Anna Bridge 186:707f6e361f3e 1578 return;
Anna Bridge 186:707f6e361f3e 1579 }
<> 144:ef7eb2e8f9f7 1580
Anna Bridge 186:707f6e361f3e 1581 /* IRDA in mode Transmitter (transmission end) -----------------------------*/
Anna Bridge 186:707f6e361f3e 1582 if(((isrflags & USART_ISR_TC) != RESET) && ((cr1its & USART_CR1_TCIE) != RESET))
<> 144:ef7eb2e8f9f7 1583 {
<> 144:ef7eb2e8f9f7 1584 IRDA_EndTransmit_IT(hirda);
Anna Bridge 186:707f6e361f3e 1585 return;
Anna Bridge 186:707f6e361f3e 1586 }
<> 144:ef7eb2e8f9f7 1587
<> 144:ef7eb2e8f9f7 1588 }
<> 144:ef7eb2e8f9f7 1589
<> 144:ef7eb2e8f9f7 1590 /**
Anna Bridge 186:707f6e361f3e 1591 * @brief Tx Transfer completed callback.
Anna Bridge 186:707f6e361f3e 1592 * @param hirda Pointer to a IRDA_HandleTypeDef structure that contains
Anna Bridge 186:707f6e361f3e 1593 * the configuration information for the specified IRDA module.
<> 144:ef7eb2e8f9f7 1594 * @retval None
<> 144:ef7eb2e8f9f7 1595 */
Anna Bridge 186:707f6e361f3e 1596 __weak void HAL_IRDA_TxCpltCallback(IRDA_HandleTypeDef *hirda)
<> 144:ef7eb2e8f9f7 1597 {
<> 144:ef7eb2e8f9f7 1598 /* Prevent unused argument(s) compilation warning */
<> 144:ef7eb2e8f9f7 1599 UNUSED(hirda);
<> 144:ef7eb2e8f9f7 1600
<> 144:ef7eb2e8f9f7 1601 /* NOTE : This function should not be modified, when the callback is needed,
Anna Bridge 186:707f6e361f3e 1602 the HAL_IRDA_TxCpltCallback can be implemented in the user file.
Anna Bridge 186:707f6e361f3e 1603 */
<> 144:ef7eb2e8f9f7 1604 }
<> 144:ef7eb2e8f9f7 1605
<> 144:ef7eb2e8f9f7 1606 /**
Anna Bridge 186:707f6e361f3e 1607 * @brief Tx Half Transfer completed callback.
Anna Bridge 186:707f6e361f3e 1608 * @param hirda Pointer to a IRDA_HandleTypeDef structure that contains
Anna Bridge 186:707f6e361f3e 1609 * the configuration information for the specified USART module.
<> 144:ef7eb2e8f9f7 1610 * @retval None
<> 144:ef7eb2e8f9f7 1611 */
Anna Bridge 186:707f6e361f3e 1612 __weak void HAL_IRDA_TxHalfCpltCallback(IRDA_HandleTypeDef *hirda)
<> 144:ef7eb2e8f9f7 1613 {
<> 144:ef7eb2e8f9f7 1614 /* Prevent unused argument(s) compilation warning */
<> 144:ef7eb2e8f9f7 1615 UNUSED(hirda);
<> 144:ef7eb2e8f9f7 1616
<> 144:ef7eb2e8f9f7 1617 /* NOTE : This function should not be modified, when the callback is needed,
Anna Bridge 186:707f6e361f3e 1618 the HAL_IRDA_TxHalfCpltCallback can be implemented in the user file.
Anna Bridge 186:707f6e361f3e 1619 */
<> 144:ef7eb2e8f9f7 1620 }
<> 144:ef7eb2e8f9f7 1621
<> 144:ef7eb2e8f9f7 1622 /**
Anna Bridge 186:707f6e361f3e 1623 * @brief Rx Transfer completed callback.
Anna Bridge 186:707f6e361f3e 1624 * @param hirda Pointer to a IRDA_HandleTypeDef structure that contains
Anna Bridge 186:707f6e361f3e 1625 * the configuration information for the specified IRDA module.
Anna Bridge 186:707f6e361f3e 1626 * @retval None
Anna Bridge 186:707f6e361f3e 1627 */
Anna Bridge 186:707f6e361f3e 1628 __weak void HAL_IRDA_RxCpltCallback(IRDA_HandleTypeDef *hirda)
Anna Bridge 186:707f6e361f3e 1629 {
Anna Bridge 186:707f6e361f3e 1630 /* Prevent unused argument(s) compilation warning */
Anna Bridge 186:707f6e361f3e 1631 UNUSED(hirda);
Anna Bridge 186:707f6e361f3e 1632
Anna Bridge 186:707f6e361f3e 1633 /* NOTE : This function should not be modified, when the callback is needed,
Anna Bridge 186:707f6e361f3e 1634 the HAL_IRDA_RxCpltCallback can be implemented in the user file.
Anna Bridge 186:707f6e361f3e 1635 */
Anna Bridge 186:707f6e361f3e 1636 }
Anna Bridge 186:707f6e361f3e 1637
Anna Bridge 186:707f6e361f3e 1638 /**
Anna Bridge 186:707f6e361f3e 1639 * @brief Rx Half Transfer complete callback.
Anna Bridge 186:707f6e361f3e 1640 * @param hirda: Pointer to a IRDA_HandleTypeDef structure that contains
Anna Bridge 186:707f6e361f3e 1641 * the configuration information for the specified IRDA module.
<> 144:ef7eb2e8f9f7 1642 * @retval None
<> 144:ef7eb2e8f9f7 1643 */
<> 144:ef7eb2e8f9f7 1644 __weak void HAL_IRDA_RxHalfCpltCallback(IRDA_HandleTypeDef *hirda)
<> 144:ef7eb2e8f9f7 1645 {
<> 144:ef7eb2e8f9f7 1646 /* Prevent unused argument(s) compilation warning */
<> 144:ef7eb2e8f9f7 1647 UNUSED(hirda);
<> 144:ef7eb2e8f9f7 1648
<> 144:ef7eb2e8f9f7 1649 /* NOTE : This function should not be modified, when the callback is needed,
Anna Bridge 186:707f6e361f3e 1650 the HAL_IRDA_RxHalfCpltCallback can be implemented in the user file.
<> 144:ef7eb2e8f9f7 1651 */
<> 144:ef7eb2e8f9f7 1652 }
<> 144:ef7eb2e8f9f7 1653
<> 144:ef7eb2e8f9f7 1654 /**
Anna Bridge 186:707f6e361f3e 1655 * @brief IRDA error callback.
Anna Bridge 186:707f6e361f3e 1656 * @param hirda Pointer to a IRDA_HandleTypeDef structure that contains
Anna Bridge 186:707f6e361f3e 1657 * the configuration information for the specified IRDA module.
<> 144:ef7eb2e8f9f7 1658 * @retval None
<> 144:ef7eb2e8f9f7 1659 */
Anna Bridge 186:707f6e361f3e 1660 __weak void HAL_IRDA_ErrorCallback(IRDA_HandleTypeDef *hirda)
Anna Bridge 186:707f6e361f3e 1661 {
Anna Bridge 186:707f6e361f3e 1662 /* Prevent unused argument(s) compilation warning */
Anna Bridge 186:707f6e361f3e 1663 UNUSED(hirda);
Anna Bridge 186:707f6e361f3e 1664
Anna Bridge 186:707f6e361f3e 1665 /* NOTE : This function should not be modified, when the callback is needed,
Anna Bridge 186:707f6e361f3e 1666 the HAL_IRDA_ErrorCallback can be implemented in the user file.
Anna Bridge 186:707f6e361f3e 1667 */
Anna Bridge 186:707f6e361f3e 1668 }
Anna Bridge 186:707f6e361f3e 1669
Anna Bridge 186:707f6e361f3e 1670 /**
Anna Bridge 186:707f6e361f3e 1671 * @brief IRDA Abort Complete callback.
Anna Bridge 186:707f6e361f3e 1672 * @param hirda Pointer to a IRDA_HandleTypeDef structure that contains
Anna Bridge 186:707f6e361f3e 1673 * the configuration information for the specified IRDA module.
Anna Bridge 186:707f6e361f3e 1674 * @retval None
Anna Bridge 186:707f6e361f3e 1675 */
Anna Bridge 186:707f6e361f3e 1676 __weak void HAL_IRDA_AbortCpltCallback (IRDA_HandleTypeDef *hirda)
<> 144:ef7eb2e8f9f7 1677 {
<> 144:ef7eb2e8f9f7 1678 /* Prevent unused argument(s) compilation warning */
<> 144:ef7eb2e8f9f7 1679 UNUSED(hirda);
<> 144:ef7eb2e8f9f7 1680
<> 144:ef7eb2e8f9f7 1681 /* NOTE : This function should not be modified, when the callback is needed,
Anna Bridge 186:707f6e361f3e 1682 the HAL_IRDA_AbortCpltCallback can be implemented in the user file.
<> 144:ef7eb2e8f9f7 1683 */
<> 144:ef7eb2e8f9f7 1684 }
<> 144:ef7eb2e8f9f7 1685
<> 144:ef7eb2e8f9f7 1686 /**
Anna Bridge 186:707f6e361f3e 1687 * @brief IRDA Abort Complete callback.
Anna Bridge 186:707f6e361f3e 1688 * @param hirda Pointer to a IRDA_HandleTypeDef structure that contains
Anna Bridge 186:707f6e361f3e 1689 * the configuration information for the specified IRDA module.
<> 144:ef7eb2e8f9f7 1690 * @retval None
<> 144:ef7eb2e8f9f7 1691 */
Anna Bridge 186:707f6e361f3e 1692 __weak void HAL_IRDA_AbortTransmitCpltCallback (IRDA_HandleTypeDef *hirda)
<> 144:ef7eb2e8f9f7 1693 {
<> 144:ef7eb2e8f9f7 1694 /* Prevent unused argument(s) compilation warning */
<> 144:ef7eb2e8f9f7 1695 UNUSED(hirda);
<> 144:ef7eb2e8f9f7 1696
<> 144:ef7eb2e8f9f7 1697 /* NOTE : This function should not be modified, when the callback is needed,
Anna Bridge 186:707f6e361f3e 1698 the HAL_IRDA_AbortTransmitCpltCallback can be implemented in the user file.
Anna Bridge 186:707f6e361f3e 1699 */
Anna Bridge 186:707f6e361f3e 1700 }
Anna Bridge 186:707f6e361f3e 1701
Anna Bridge 186:707f6e361f3e 1702 /**
Anna Bridge 186:707f6e361f3e 1703 * @brief IRDA Abort Receive Complete callback.
Anna Bridge 186:707f6e361f3e 1704 * @param hirda Pointer to a IRDA_HandleTypeDef structure that contains
Anna Bridge 186:707f6e361f3e 1705 * the configuration information for the specified IRDA module.
Anna Bridge 186:707f6e361f3e 1706 * @retval None
Anna Bridge 186:707f6e361f3e 1707 */
Anna Bridge 186:707f6e361f3e 1708 __weak void HAL_IRDA_AbortReceiveCpltCallback (IRDA_HandleTypeDef *hirda)
Anna Bridge 186:707f6e361f3e 1709 {
Anna Bridge 186:707f6e361f3e 1710 /* Prevent unused argument(s) compilation warning */
Anna Bridge 186:707f6e361f3e 1711 UNUSED(hirda);
Anna Bridge 186:707f6e361f3e 1712
Anna Bridge 186:707f6e361f3e 1713 /* NOTE : This function should not be modified, when the callback is needed,
Anna Bridge 186:707f6e361f3e 1714 the HAL_IRDA_AbortReceiveCpltCallback can be implemented in the user file.
Anna Bridge 186:707f6e361f3e 1715 */
<> 144:ef7eb2e8f9f7 1716 }
<> 144:ef7eb2e8f9f7 1717
<> 144:ef7eb2e8f9f7 1718 /**
<> 144:ef7eb2e8f9f7 1719 * @}
<> 144:ef7eb2e8f9f7 1720 */
<> 144:ef7eb2e8f9f7 1721
Anna Bridge 186:707f6e361f3e 1722 /** @defgroup IRDA_Exported_Functions_Group4 Peripheral State and Error functions
Anna Bridge 186:707f6e361f3e 1723 * @brief IRDA State and Errors functions
<> 144:ef7eb2e8f9f7 1724 *
Anna Bridge 186:707f6e361f3e 1725 @verbatim
Anna Bridge 186:707f6e361f3e 1726 ==============================================================================
Anna Bridge 186:707f6e361f3e 1727 ##### Peripheral State and Error functions #####
Anna Bridge 186:707f6e361f3e 1728 ==============================================================================
Anna Bridge 186:707f6e361f3e 1729 [..]
Anna Bridge 186:707f6e361f3e 1730 This subsection provides a set of functions allowing to return the State of IrDA
Anna Bridge 186:707f6e361f3e 1731 communication process and also return Peripheral Errors occurred during communication process
Anna Bridge 186:707f6e361f3e 1732 (+) HAL_IRDA_GetState() API can be helpful to check in run-time the state
Anna Bridge 186:707f6e361f3e 1733 of the IRDA peripheral handle.
Anna Bridge 186:707f6e361f3e 1734 (+) HAL_IRDA_GetError() checks in run-time errors that could occur during
Anna Bridge 186:707f6e361f3e 1735 communication.
Anna Bridge 186:707f6e361f3e 1736
<> 144:ef7eb2e8f9f7 1737 @endverbatim
<> 144:ef7eb2e8f9f7 1738 * @{
<> 144:ef7eb2e8f9f7 1739 */
<> 144:ef7eb2e8f9f7 1740
<> 144:ef7eb2e8f9f7 1741 /**
Anna Bridge 186:707f6e361f3e 1742 * @brief Return the IRDA handle state.
Anna Bridge 186:707f6e361f3e 1743 * @param hirda Pointer to a IRDA_HandleTypeDef structure that contains
Anna Bridge 186:707f6e361f3e 1744 * the configuration information for the specified IRDA module.
<> 144:ef7eb2e8f9f7 1745 * @retval HAL state
<> 144:ef7eb2e8f9f7 1746 */
<> 144:ef7eb2e8f9f7 1747 HAL_IRDA_StateTypeDef HAL_IRDA_GetState(IRDA_HandleTypeDef *hirda)
<> 144:ef7eb2e8f9f7 1748 {
Anna Bridge 186:707f6e361f3e 1749 /* Return IRDA handle state */
Anna Bridge 186:707f6e361f3e 1750 uint32_t temp1= 0x00, temp2 = 0x00;
Anna Bridge 186:707f6e361f3e 1751 temp1 = hirda->gState;
Anna Bridge 186:707f6e361f3e 1752 temp2 = hirda->RxState;
Anna Bridge 186:707f6e361f3e 1753
Anna Bridge 186:707f6e361f3e 1754 return (HAL_IRDA_StateTypeDef)(temp1 | temp2);
<> 144:ef7eb2e8f9f7 1755 }
<> 144:ef7eb2e8f9f7 1756
<> 144:ef7eb2e8f9f7 1757 /**
Anna Bridge 186:707f6e361f3e 1758 * @brief Return the IRDA handle error code.
Anna Bridge 186:707f6e361f3e 1759 * @param hirda Pointer to a IRDA_HandleTypeDef structure that contains
Anna Bridge 186:707f6e361f3e 1760 * the configuration information for the specified IRDA module.
Anna Bridge 186:707f6e361f3e 1761 * @retval IRDA Error Code
Anna Bridge 186:707f6e361f3e 1762 */
<> 144:ef7eb2e8f9f7 1763 uint32_t HAL_IRDA_GetError(IRDA_HandleTypeDef *hirda)
<> 144:ef7eb2e8f9f7 1764 {
<> 144:ef7eb2e8f9f7 1765 return hirda->ErrorCode;
<> 144:ef7eb2e8f9f7 1766 }
<> 144:ef7eb2e8f9f7 1767
<> 144:ef7eb2e8f9f7 1768 /**
<> 144:ef7eb2e8f9f7 1769 * @}
<> 144:ef7eb2e8f9f7 1770 */
<> 144:ef7eb2e8f9f7 1771
<> 144:ef7eb2e8f9f7 1772 /**
<> 144:ef7eb2e8f9f7 1773 * @}
<> 144:ef7eb2e8f9f7 1774 */
<> 144:ef7eb2e8f9f7 1775
Anna Bridge 186:707f6e361f3e 1776 /** @defgroup IRDA_Private_Functions IRDA Private Functions
<> 144:ef7eb2e8f9f7 1777 * @{
<> 144:ef7eb2e8f9f7 1778 */
Anna Bridge 186:707f6e361f3e 1779
<> 144:ef7eb2e8f9f7 1780 /**
Anna Bridge 186:707f6e361f3e 1781 * @brief Configure the IRDA peripheral.
Anna Bridge 186:707f6e361f3e 1782 * @param hirda Pointer to a IRDA_HandleTypeDef structure that contains
Anna Bridge 186:707f6e361f3e 1783 * the configuration information for the specified IRDA module.
Anna Bridge 186:707f6e361f3e 1784 * @retval HAL status
<> 144:ef7eb2e8f9f7 1785 */
Anna Bridge 186:707f6e361f3e 1786 static HAL_StatusTypeDef IRDA_SetConfig(IRDA_HandleTypeDef *hirda)
<> 144:ef7eb2e8f9f7 1787 {
Anna Bridge 186:707f6e361f3e 1788 uint32_t tmpreg = 0x00000000U;
Anna Bridge 186:707f6e361f3e 1789 IRDA_ClockSourceTypeDef clocksource = IRDA_CLOCKSOURCE_UNDEFINED;
Anna Bridge 186:707f6e361f3e 1790 HAL_StatusTypeDef ret = HAL_OK;
Anna Bridge 186:707f6e361f3e 1791
Anna Bridge 186:707f6e361f3e 1792 /* Check the communication parameters */
Anna Bridge 186:707f6e361f3e 1793 assert_param(IS_IRDA_BAUDRATE(hirda->Init.BaudRate));
<> 144:ef7eb2e8f9f7 1794 assert_param(IS_IRDA_WORD_LENGTH(hirda->Init.WordLength));
<> 144:ef7eb2e8f9f7 1795 assert_param(IS_IRDA_PARITY(hirda->Init.Parity));
<> 144:ef7eb2e8f9f7 1796 assert_param(IS_IRDA_TX_RX_MODE(hirda->Init.Mode));
Anna Bridge 186:707f6e361f3e 1797 assert_param(IS_IRDA_PRESCALER(hirda->Init.Prescaler));
Anna Bridge 186:707f6e361f3e 1798 assert_param(IS_IRDA_POWERMODE(hirda->Init.PowerMode));
Anna Bridge 186:707f6e361f3e 1799
Anna Bridge 186:707f6e361f3e 1800 /*-------------------------- USART CR1 Configuration -----------------------*/
Anna Bridge 186:707f6e361f3e 1801 /* Configure the IRDA Word Length, Parity and transfer Mode:
Anna Bridge 186:707f6e361f3e 1802 Set the M bits according to hirda->Init.WordLength value
Anna Bridge 186:707f6e361f3e 1803 Set PCE and PS bits according to hirda->Init.Parity value
Anna Bridge 186:707f6e361f3e 1804 Set TE and RE bits according to hirda->Init.Mode value */
<> 144:ef7eb2e8f9f7 1805 tmpreg = (uint32_t)hirda->Init.WordLength | hirda->Init.Parity | hirda->Init.Mode ;
Anna Bridge 186:707f6e361f3e 1806
<> 144:ef7eb2e8f9f7 1807 MODIFY_REG(hirda->Instance->CR1, IRDA_CR1_FIELDS, tmpreg);
Anna Bridge 186:707f6e361f3e 1808
<> 144:ef7eb2e8f9f7 1809 /*-------------------------- USART CR3 Configuration -----------------------*/
<> 144:ef7eb2e8f9f7 1810 MODIFY_REG(hirda->Instance->CR3, USART_CR3_IRLP, hirda->Init.PowerMode);
Anna Bridge 186:707f6e361f3e 1811
Anna Bridge 186:707f6e361f3e 1812 /*-------------------------- USART GTPR Configuration ----------------------*/
Anna Bridge 186:707f6e361f3e 1813 MODIFY_REG(hirda->Instance->GTPR, USART_GTPR_PSC, hirda->Init.Prescaler);
Anna Bridge 186:707f6e361f3e 1814
Anna Bridge 186:707f6e361f3e 1815 /*-------------------------- USART BRR Configuration -----------------------*/
<> 144:ef7eb2e8f9f7 1816 IRDA_GETCLOCKSOURCE(hirda, clocksource);
<> 144:ef7eb2e8f9f7 1817 switch (clocksource)
<> 144:ef7eb2e8f9f7 1818 {
Anna Bridge 186:707f6e361f3e 1819 case IRDA_CLOCKSOURCE_PCLK1:
Anna Bridge 186:707f6e361f3e 1820 hirda->Instance->BRR = (uint16_t)((HAL_RCC_GetPCLK1Freq() + (hirda->Init.BaudRate/2U)) / hirda->Init.BaudRate);
Anna Bridge 186:707f6e361f3e 1821 break;
Anna Bridge 186:707f6e361f3e 1822 case IRDA_CLOCKSOURCE_PCLK2:
Anna Bridge 186:707f6e361f3e 1823 hirda->Instance->BRR = (uint16_t)((HAL_RCC_GetPCLK2Freq() + (hirda->Init.BaudRate/2U)) / hirda->Init.BaudRate);
Anna Bridge 186:707f6e361f3e 1824 break;
Anna Bridge 186:707f6e361f3e 1825 case IRDA_CLOCKSOURCE_HSI:
Anna Bridge 186:707f6e361f3e 1826 hirda->Instance->BRR = (uint16_t)((HSI_VALUE + (hirda->Init.BaudRate/2U)) / hirda->Init.BaudRate);
Anna Bridge 186:707f6e361f3e 1827 break;
Anna Bridge 186:707f6e361f3e 1828 case IRDA_CLOCKSOURCE_SYSCLK:
Anna Bridge 186:707f6e361f3e 1829 hirda->Instance->BRR = (uint16_t)((HAL_RCC_GetSysClockFreq() + (hirda->Init.BaudRate/2U)) / hirda->Init.BaudRate);
Anna Bridge 186:707f6e361f3e 1830 break;
Anna Bridge 186:707f6e361f3e 1831 case IRDA_CLOCKSOURCE_LSE:
Anna Bridge 186:707f6e361f3e 1832 hirda->Instance->BRR = (uint16_t)((LSE_VALUE + (hirda->Init.BaudRate/2U)) / hirda->Init.BaudRate);
Anna Bridge 186:707f6e361f3e 1833 break;
Anna Bridge 186:707f6e361f3e 1834 case IRDA_CLOCKSOURCE_UNDEFINED:
Anna Bridge 186:707f6e361f3e 1835 default:
Anna Bridge 186:707f6e361f3e 1836 ret = HAL_ERROR;
Anna Bridge 186:707f6e361f3e 1837 break;
Anna Bridge 186:707f6e361f3e 1838 }
Anna Bridge 186:707f6e361f3e 1839
Anna Bridge 186:707f6e361f3e 1840 return ret;
<> 144:ef7eb2e8f9f7 1841 }
<> 144:ef7eb2e8f9f7 1842
<> 144:ef7eb2e8f9f7 1843 /**
Anna Bridge 186:707f6e361f3e 1844 * @brief Check the IRDA Idle State.
Anna Bridge 186:707f6e361f3e 1845 * @param hirda Pointer to a IRDA_HandleTypeDef structure that contains
Anna Bridge 186:707f6e361f3e 1846 * the configuration information for the specified IRDA module.
<> 144:ef7eb2e8f9f7 1847 * @retval HAL status
<> 144:ef7eb2e8f9f7 1848 */
<> 144:ef7eb2e8f9f7 1849 static HAL_StatusTypeDef IRDA_CheckIdleState(IRDA_HandleTypeDef *hirda)
<> 144:ef7eb2e8f9f7 1850 {
Anna Bridge 186:707f6e361f3e 1851 uint32_t tickstart = 0;
Anna Bridge 186:707f6e361f3e 1852
<> 144:ef7eb2e8f9f7 1853 /* Initialize the IRDA ErrorCode */
<> 144:ef7eb2e8f9f7 1854 hirda->ErrorCode = HAL_IRDA_ERROR_NONE;
Anna Bridge 186:707f6e361f3e 1855
Anna Bridge 186:707f6e361f3e 1856 /* Init tickstart for timeout managment*/
Anna Bridge 186:707f6e361f3e 1857 tickstart = HAL_GetTick();
Anna Bridge 186:707f6e361f3e 1858
<> 144:ef7eb2e8f9f7 1859 /* Check if the Transmitter is enabled */
<> 144:ef7eb2e8f9f7 1860 if((hirda->Instance->CR1 & USART_CR1_TE) == USART_CR1_TE)
<> 144:ef7eb2e8f9f7 1861 {
<> 144:ef7eb2e8f9f7 1862 /* Wait until TEACK flag is set */
Anna Bridge 186:707f6e361f3e 1863 if(IRDA_WaitOnFlagUntilTimeout(hirda, USART_ISR_TEACK, RESET, tickstart, IRDA_TEACK_REACK_TIMEOUT) != HAL_OK)
Anna Bridge 186:707f6e361f3e 1864 {
Anna Bridge 186:707f6e361f3e 1865 /* Timeout occurred */
<> 144:ef7eb2e8f9f7 1866 return HAL_TIMEOUT;
Anna Bridge 186:707f6e361f3e 1867 }
<> 144:ef7eb2e8f9f7 1868 }
<> 144:ef7eb2e8f9f7 1869 /* Check if the Receiver is enabled */
<> 144:ef7eb2e8f9f7 1870 if((hirda->Instance->CR1 & USART_CR1_RE) == USART_CR1_RE)
<> 144:ef7eb2e8f9f7 1871 {
Anna Bridge 186:707f6e361f3e 1872 /* Wait until REACK flag is set */
Anna Bridge 186:707f6e361f3e 1873 if(IRDA_WaitOnFlagUntilTimeout(hirda, USART_ISR_REACK, RESET, tickstart, IRDA_TEACK_REACK_TIMEOUT) != HAL_OK)
Anna Bridge 186:707f6e361f3e 1874 {
Anna Bridge 186:707f6e361f3e 1875 /* Timeout occurred */
<> 144:ef7eb2e8f9f7 1876 return HAL_TIMEOUT;
Anna Bridge 186:707f6e361f3e 1877 }
<> 144:ef7eb2e8f9f7 1878 }
Anna Bridge 186:707f6e361f3e 1879
Anna Bridge 186:707f6e361f3e 1880 /* Initialize the IRDA state*/
Anna Bridge 186:707f6e361f3e 1881 hirda->gState = HAL_IRDA_STATE_READY;
Anna Bridge 186:707f6e361f3e 1882 hirda->RxState = HAL_IRDA_STATE_READY;
Anna Bridge 186:707f6e361f3e 1883
<> 144:ef7eb2e8f9f7 1884 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 1885 __HAL_UNLOCK(hirda);
Anna Bridge 186:707f6e361f3e 1886
<> 144:ef7eb2e8f9f7 1887 return HAL_OK;
<> 144:ef7eb2e8f9f7 1888 }
<> 144:ef7eb2e8f9f7 1889
<> 144:ef7eb2e8f9f7 1890 /**
<> 144:ef7eb2e8f9f7 1891 * @brief Handle IRDA Communication Timeout.
Anna Bridge 186:707f6e361f3e 1892 * @param hirda Pointer to a IRDA_HandleTypeDef structure that contains
Anna Bridge 186:707f6e361f3e 1893 * the configuration information for the specified IRDA module.
Anna Bridge 186:707f6e361f3e 1894 * @param Flag Specifies the IRDA flag to check.
Anna Bridge 186:707f6e361f3e 1895 * @param Status Flag status (SET or RESET)
Anna Bridge 186:707f6e361f3e 1896 * @param Tickstart Tick start value
Anna Bridge 186:707f6e361f3e 1897 * @param Timeout Timeout duration
<> 144:ef7eb2e8f9f7 1898 * @retval HAL status
<> 144:ef7eb2e8f9f7 1899 */
Anna Bridge 186:707f6e361f3e 1900 static HAL_StatusTypeDef IRDA_WaitOnFlagUntilTimeout(IRDA_HandleTypeDef *hirda, uint32_t Flag, FlagStatus Status, uint32_t Tickstart, uint32_t Timeout)
<> 144:ef7eb2e8f9f7 1901 {
<> 144:ef7eb2e8f9f7 1902 /* Wait until flag is set */
Anna Bridge 186:707f6e361f3e 1903 while((__HAL_IRDA_GET_FLAG(hirda, Flag) ? SET : RESET) == Status)
<> 144:ef7eb2e8f9f7 1904 {
Anna Bridge 186:707f6e361f3e 1905 /* Check for the Timeout */
Anna Bridge 186:707f6e361f3e 1906 if(Timeout != HAL_MAX_DELAY)
<> 144:ef7eb2e8f9f7 1907 {
Anna Bridge 186:707f6e361f3e 1908 if((Timeout == 0) || ((HAL_GetTick()-Tickstart) > Timeout))
<> 144:ef7eb2e8f9f7 1909 {
Anna Bridge 186:707f6e361f3e 1910 /* Disable TXE, RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts for the interrupt process */
Anna Bridge 186:707f6e361f3e 1911 CLEAR_BIT(hirda->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE | USART_CR1_TXEIE));
Anna Bridge 186:707f6e361f3e 1912 CLEAR_BIT(hirda->Instance->CR3, USART_CR3_EIE);
<> 144:ef7eb2e8f9f7 1913
Anna Bridge 186:707f6e361f3e 1914 hirda->gState = HAL_IRDA_STATE_READY;
Anna Bridge 186:707f6e361f3e 1915 hirda->RxState = HAL_IRDA_STATE_READY;
<> 144:ef7eb2e8f9f7 1916
Anna Bridge 186:707f6e361f3e 1917 /* Process Unlocked */
Anna Bridge 186:707f6e361f3e 1918 __HAL_UNLOCK(hirda);
Anna Bridge 186:707f6e361f3e 1919 return HAL_TIMEOUT;
<> 144:ef7eb2e8f9f7 1920 }
<> 144:ef7eb2e8f9f7 1921 }
<> 144:ef7eb2e8f9f7 1922 }
Anna Bridge 186:707f6e361f3e 1923 return HAL_OK;
Anna Bridge 186:707f6e361f3e 1924 }
Anna Bridge 186:707f6e361f3e 1925
Anna Bridge 186:707f6e361f3e 1926
Anna Bridge 186:707f6e361f3e 1927 /**
Anna Bridge 186:707f6e361f3e 1928 * @brief End ongoing Tx transfer on IRDA peripheral (following error detection or Transmit completion).
Anna Bridge 186:707f6e361f3e 1929 * @param hirda Pointer to a IRDA_HandleTypeDef structure that contains
Anna Bridge 186:707f6e361f3e 1930 * the configuration information for the specified IRDA module.
Anna Bridge 186:707f6e361f3e 1931 * @retval None
Anna Bridge 186:707f6e361f3e 1932 */
Anna Bridge 186:707f6e361f3e 1933 static void IRDA_EndTxTransfer(IRDA_HandleTypeDef *hirda)
Anna Bridge 186:707f6e361f3e 1934 {
Anna Bridge 186:707f6e361f3e 1935 /* Disable TXEIE and TCIE interrupts */
Anna Bridge 186:707f6e361f3e 1936 CLEAR_BIT(hirda->Instance->CR1, (USART_CR1_TXEIE | USART_CR1_TCIE));
Anna Bridge 186:707f6e361f3e 1937
Anna Bridge 186:707f6e361f3e 1938 /* At end of Tx process, restore hirda->gState to Ready */
Anna Bridge 186:707f6e361f3e 1939 hirda->gState = HAL_IRDA_STATE_READY;
Anna Bridge 186:707f6e361f3e 1940 }
Anna Bridge 186:707f6e361f3e 1941
Anna Bridge 186:707f6e361f3e 1942
Anna Bridge 186:707f6e361f3e 1943 /**
Anna Bridge 186:707f6e361f3e 1944 * @brief End ongoing Rx transfer on UART peripheral (following error detection or Reception completion).
Anna Bridge 186:707f6e361f3e 1945 * @param hirda Pointer to a IRDA_HandleTypeDef structure that contains
Anna Bridge 186:707f6e361f3e 1946 * the configuration information for the specified IRDA module.
Anna Bridge 186:707f6e361f3e 1947 * @retval None
Anna Bridge 186:707f6e361f3e 1948 */
Anna Bridge 186:707f6e361f3e 1949 static void IRDA_EndRxTransfer(IRDA_HandleTypeDef *hirda)
Anna Bridge 186:707f6e361f3e 1950 {
Anna Bridge 186:707f6e361f3e 1951 /* Disable RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts */
Anna Bridge 186:707f6e361f3e 1952 CLEAR_BIT(hirda->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE));
Anna Bridge 186:707f6e361f3e 1953 CLEAR_BIT(hirda->Instance->CR3, USART_CR3_EIE);
Anna Bridge 186:707f6e361f3e 1954
Anna Bridge 186:707f6e361f3e 1955 /* At end of Rx process, restore hirda->RxState to Ready */
Anna Bridge 186:707f6e361f3e 1956 hirda->RxState = HAL_IRDA_STATE_READY;
Anna Bridge 186:707f6e361f3e 1957 }
Anna Bridge 186:707f6e361f3e 1958
Anna Bridge 186:707f6e361f3e 1959
Anna Bridge 186:707f6e361f3e 1960 /**
Anna Bridge 186:707f6e361f3e 1961 * @brief DMA IRDA transmit process complete callback.
Anna Bridge 186:707f6e361f3e 1962 * @param hdma Pointer to a DMA_HandleTypeDef structure that contains
Anna Bridge 186:707f6e361f3e 1963 * the configuration information for the specified DMA module.
Anna Bridge 186:707f6e361f3e 1964 * @retval None
Anna Bridge 186:707f6e361f3e 1965 */
Anna Bridge 186:707f6e361f3e 1966 static void IRDA_DMATransmitCplt(DMA_HandleTypeDef *hdma)
Anna Bridge 186:707f6e361f3e 1967 {
Anna Bridge 186:707f6e361f3e 1968 IRDA_HandleTypeDef* hirda = (IRDA_HandleTypeDef*)(hdma->Parent);
Anna Bridge 186:707f6e361f3e 1969
Anna Bridge 186:707f6e361f3e 1970 /* DMA Normal mode */
Anna Bridge 186:707f6e361f3e 1971 if ( HAL_IS_BIT_CLR(hdma->Instance->CCR, DMA_CCR_CIRC) )
Anna Bridge 186:707f6e361f3e 1972 {
Anna Bridge 186:707f6e361f3e 1973 hirda->TxXferCount = 0U;
Anna Bridge 186:707f6e361f3e 1974
Anna Bridge 186:707f6e361f3e 1975 /* Disable the DMA transfer for transmit request by resetting the DMAT bit
Anna Bridge 186:707f6e361f3e 1976 in the IRDA CR3 register */
Anna Bridge 186:707f6e361f3e 1977 CLEAR_BIT(hirda->Instance->CR3, USART_CR3_DMAT);
Anna Bridge 186:707f6e361f3e 1978
Anna Bridge 186:707f6e361f3e 1979 /* Enable the IRDA Transmit Complete Interrupt */
Anna Bridge 186:707f6e361f3e 1980 SET_BIT(hirda->Instance->CR1, USART_CR1_TCIE);
Anna Bridge 186:707f6e361f3e 1981 }
Anna Bridge 186:707f6e361f3e 1982 /* DMA Circular mode */
<> 144:ef7eb2e8f9f7 1983 else
<> 144:ef7eb2e8f9f7 1984 {
Anna Bridge 186:707f6e361f3e 1985 HAL_IRDA_TxCpltCallback(hirda);
Anna Bridge 186:707f6e361f3e 1986 }
Anna Bridge 186:707f6e361f3e 1987
Anna Bridge 186:707f6e361f3e 1988 }
Anna Bridge 186:707f6e361f3e 1989
Anna Bridge 186:707f6e361f3e 1990 /**
Anna Bridge 186:707f6e361f3e 1991 * @brief DMA IRDA transmit process half complete callback.
Anna Bridge 186:707f6e361f3e 1992 * @param hdma Pointer to a DMA_HandleTypeDef structure that contains
Anna Bridge 186:707f6e361f3e 1993 * the configuration information for the specified DMA module.
Anna Bridge 186:707f6e361f3e 1994 * @retval None
Anna Bridge 186:707f6e361f3e 1995 */
Anna Bridge 186:707f6e361f3e 1996 static void IRDA_DMATransmitHalfCplt(DMA_HandleTypeDef *hdma)
Anna Bridge 186:707f6e361f3e 1997 {
Anna Bridge 186:707f6e361f3e 1998 IRDA_HandleTypeDef* hirda = (IRDA_HandleTypeDef*)(hdma->Parent);
Anna Bridge 186:707f6e361f3e 1999
Anna Bridge 186:707f6e361f3e 2000 HAL_IRDA_TxHalfCpltCallback(hirda);
Anna Bridge 186:707f6e361f3e 2001 }
Anna Bridge 186:707f6e361f3e 2002
Anna Bridge 186:707f6e361f3e 2003 /**
Anna Bridge 186:707f6e361f3e 2004 * @brief DMA IRDA receive process complete callback.
Anna Bridge 186:707f6e361f3e 2005 * @param hdma: Pointer to a DMA_HandleTypeDef structure that contains
Anna Bridge 186:707f6e361f3e 2006 * the configuration information for the specified DMA module.
Anna Bridge 186:707f6e361f3e 2007 * @retval None
Anna Bridge 186:707f6e361f3e 2008 */
Anna Bridge 186:707f6e361f3e 2009 static void IRDA_DMAReceiveCplt(DMA_HandleTypeDef *hdma)
Anna Bridge 186:707f6e361f3e 2010 {
Anna Bridge 186:707f6e361f3e 2011 IRDA_HandleTypeDef* hirda = (IRDA_HandleTypeDef*)(hdma->Parent);
<> 144:ef7eb2e8f9f7 2012
Anna Bridge 186:707f6e361f3e 2013 /* DMA Normal mode */
Anna Bridge 186:707f6e361f3e 2014 if ( HAL_IS_BIT_CLR(hdma->Instance->CCR, DMA_CCR_CIRC) )
Anna Bridge 186:707f6e361f3e 2015 {
Anna Bridge 186:707f6e361f3e 2016 hirda->RxXferCount = 0;
<> 144:ef7eb2e8f9f7 2017
Anna Bridge 186:707f6e361f3e 2018 /* Disable PE and ERR (Frame error, noise error, overrun error) interrupts */
Anna Bridge 186:707f6e361f3e 2019 CLEAR_BIT(hirda->Instance->CR1, USART_CR1_PEIE);
Anna Bridge 186:707f6e361f3e 2020 CLEAR_BIT(hirda->Instance->CR3, USART_CR3_EIE);
Anna Bridge 186:707f6e361f3e 2021
Anna Bridge 186:707f6e361f3e 2022 /* Disable the DMA transfer for the receiver request by resetting the DMAR bit
Anna Bridge 186:707f6e361f3e 2023 in the IRDA CR3 register */
Anna Bridge 186:707f6e361f3e 2024 CLEAR_BIT(hirda->Instance->CR3, USART_CR3_DMAR);
<> 144:ef7eb2e8f9f7 2025
Anna Bridge 186:707f6e361f3e 2026 /* At end of Rx process, restore hirda->RxState to Ready */
Anna Bridge 186:707f6e361f3e 2027 hirda->RxState = HAL_IRDA_STATE_READY;
<> 144:ef7eb2e8f9f7 2028 }
Anna Bridge 186:707f6e361f3e 2029
Anna Bridge 186:707f6e361f3e 2030 HAL_IRDA_RxCpltCallback(hirda);
Anna Bridge 186:707f6e361f3e 2031 }
Anna Bridge 186:707f6e361f3e 2032
Anna Bridge 186:707f6e361f3e 2033 /**
Anna Bridge 186:707f6e361f3e 2034 * @brief DMA IRDA receive process half complete callback.
Anna Bridge 186:707f6e361f3e 2035 * @param hdma: Pointer to a DMA_HandleTypeDef structure that contains
Anna Bridge 186:707f6e361f3e 2036 * the configuration information for the specified DMA module.
Anna Bridge 186:707f6e361f3e 2037 * @retval None
Anna Bridge 186:707f6e361f3e 2038 */
Anna Bridge 186:707f6e361f3e 2039 static void IRDA_DMAReceiveHalfCplt(DMA_HandleTypeDef *hdma)
Anna Bridge 186:707f6e361f3e 2040 {
Anna Bridge 186:707f6e361f3e 2041 IRDA_HandleTypeDef* hirda = (IRDA_HandleTypeDef*)(hdma->Parent);
Anna Bridge 186:707f6e361f3e 2042
Anna Bridge 186:707f6e361f3e 2043 HAL_IRDA_RxHalfCpltCallback(hirda);
<> 144:ef7eb2e8f9f7 2044 }
<> 144:ef7eb2e8f9f7 2045
<> 144:ef7eb2e8f9f7 2046 /**
Anna Bridge 186:707f6e361f3e 2047 * @brief DMA IRDA communication error callback.
Anna Bridge 186:707f6e361f3e 2048 * @param hdma Pointer to a DMA_HandleTypeDef structure that contains
Anna Bridge 186:707f6e361f3e 2049 * the configuration information for the specified DMA module.
Anna Bridge 186:707f6e361f3e 2050 * @retval None
Anna Bridge 186:707f6e361f3e 2051 */
Anna Bridge 186:707f6e361f3e 2052 static void IRDA_DMAError(DMA_HandleTypeDef *hdma)
Anna Bridge 186:707f6e361f3e 2053 {
Anna Bridge 186:707f6e361f3e 2054 IRDA_HandleTypeDef* hirda = (IRDA_HandleTypeDef*)(hdma->Parent);
Anna Bridge 186:707f6e361f3e 2055
Anna Bridge 186:707f6e361f3e 2056 /* Stop IRDA DMA Tx request if ongoing */
Anna Bridge 186:707f6e361f3e 2057 if ( (hirda->gState == HAL_IRDA_STATE_BUSY_TX)
Anna Bridge 186:707f6e361f3e 2058 &&(HAL_IS_BIT_SET(hirda->Instance->CR3, USART_CR3_DMAT)) )
Anna Bridge 186:707f6e361f3e 2059 {
Anna Bridge 186:707f6e361f3e 2060 hirda->TxXferCount = 0;
Anna Bridge 186:707f6e361f3e 2061 IRDA_EndTxTransfer(hirda);
Anna Bridge 186:707f6e361f3e 2062 }
Anna Bridge 186:707f6e361f3e 2063
Anna Bridge 186:707f6e361f3e 2064 /* Stop IRDA DMA Rx request if ongoing */
Anna Bridge 186:707f6e361f3e 2065 if ( (hirda->RxState == HAL_IRDA_STATE_BUSY_RX)
Anna Bridge 186:707f6e361f3e 2066 &&(HAL_IS_BIT_SET(hirda->Instance->CR3, USART_CR3_DMAR)) )
Anna Bridge 186:707f6e361f3e 2067 {
Anna Bridge 186:707f6e361f3e 2068 hirda->RxXferCount = 0;
Anna Bridge 186:707f6e361f3e 2069 IRDA_EndRxTransfer(hirda);
Anna Bridge 186:707f6e361f3e 2070 }
Anna Bridge 186:707f6e361f3e 2071
Anna Bridge 186:707f6e361f3e 2072 hirda->ErrorCode |= HAL_IRDA_ERROR_DMA;
Anna Bridge 186:707f6e361f3e 2073 HAL_IRDA_ErrorCallback(hirda);
Anna Bridge 186:707f6e361f3e 2074 }
Anna Bridge 186:707f6e361f3e 2075
Anna Bridge 186:707f6e361f3e 2076 /**
Anna Bridge 186:707f6e361f3e 2077 * @brief DMA IRDA communication abort callback, when initiated by HAL services on Error
Anna Bridge 186:707f6e361f3e 2078 * (To be called at end of DMA Abort procedure following error occurrence).
Anna Bridge 186:707f6e361f3e 2079 * @param hdma DMA handle.
Anna Bridge 186:707f6e361f3e 2080 * @retval None
Anna Bridge 186:707f6e361f3e 2081 */
Anna Bridge 186:707f6e361f3e 2082 static void IRDA_DMAAbortOnError(DMA_HandleTypeDef *hdma)
Anna Bridge 186:707f6e361f3e 2083 {
Anna Bridge 186:707f6e361f3e 2084 IRDA_HandleTypeDef* hirda = (IRDA_HandleTypeDef*)(hdma->Parent);
Anna Bridge 186:707f6e361f3e 2085 hirda->RxXferCount = 0;
Anna Bridge 186:707f6e361f3e 2086 hirda->TxXferCount = 0;
Anna Bridge 186:707f6e361f3e 2087
Anna Bridge 186:707f6e361f3e 2088 HAL_IRDA_ErrorCallback(hirda);
Anna Bridge 186:707f6e361f3e 2089 }
Anna Bridge 186:707f6e361f3e 2090
Anna Bridge 186:707f6e361f3e 2091 /**
Anna Bridge 186:707f6e361f3e 2092 * @brief DMA IRDA Tx communication abort callback, when initiated by user
Anna Bridge 186:707f6e361f3e 2093 * (To be called at end of DMA Tx Abort procedure following user abort request).
Anna Bridge 186:707f6e361f3e 2094 * @note When this callback is executed, User Abort complete call back is called only if no
Anna Bridge 186:707f6e361f3e 2095 * Abort still ongoing for Rx DMA Handle.
Anna Bridge 186:707f6e361f3e 2096 * @param hdma DMA handle.
Anna Bridge 186:707f6e361f3e 2097 * @retval None
Anna Bridge 186:707f6e361f3e 2098 */
Anna Bridge 186:707f6e361f3e 2099 static void IRDA_DMATxAbortCallback(DMA_HandleTypeDef *hdma)
Anna Bridge 186:707f6e361f3e 2100 {
Anna Bridge 186:707f6e361f3e 2101 IRDA_HandleTypeDef* hirda = (IRDA_HandleTypeDef* )(hdma->Parent);
Anna Bridge 186:707f6e361f3e 2102
Anna Bridge 186:707f6e361f3e 2103 hirda->hdmatx->XferAbortCallback = NULL;
Anna Bridge 186:707f6e361f3e 2104
Anna Bridge 186:707f6e361f3e 2105 /* Check if an Abort process is still ongoing */
Anna Bridge 186:707f6e361f3e 2106 if(hirda->hdmarx != NULL)
Anna Bridge 186:707f6e361f3e 2107 {
Anna Bridge 186:707f6e361f3e 2108 if(hirda->hdmarx->XferAbortCallback != NULL)
Anna Bridge 186:707f6e361f3e 2109 {
Anna Bridge 186:707f6e361f3e 2110 return;
Anna Bridge 186:707f6e361f3e 2111 }
Anna Bridge 186:707f6e361f3e 2112 }
Anna Bridge 186:707f6e361f3e 2113
Anna Bridge 186:707f6e361f3e 2114 /* No Abort process still ongoing : All DMA channels are aborted, call user Abort Complete callback */
Anna Bridge 186:707f6e361f3e 2115 hirda->TxXferCount = 0;
Anna Bridge 186:707f6e361f3e 2116 hirda->RxXferCount = 0;
Anna Bridge 186:707f6e361f3e 2117
Anna Bridge 186:707f6e361f3e 2118 /* Reset errorCode */
Anna Bridge 186:707f6e361f3e 2119 hirda->ErrorCode = HAL_IRDA_ERROR_NONE;
Anna Bridge 186:707f6e361f3e 2120
Anna Bridge 186:707f6e361f3e 2121 /* Clear the Error flags in the ICR register */
Anna Bridge 186:707f6e361f3e 2122 __HAL_IRDA_CLEAR_FLAG(hirda, IRDA_CLEAR_OREF | IRDA_CLEAR_NEF | IRDA_CLEAR_PEF | IRDA_CLEAR_FEF);
Anna Bridge 186:707f6e361f3e 2123
Anna Bridge 186:707f6e361f3e 2124 /* Restore hirda->gState and hirda->RxState to Ready */
Anna Bridge 186:707f6e361f3e 2125 hirda->gState = HAL_IRDA_STATE_READY;
Anna Bridge 186:707f6e361f3e 2126 hirda->RxState = HAL_IRDA_STATE_READY;
Anna Bridge 186:707f6e361f3e 2127
Anna Bridge 186:707f6e361f3e 2128 /* Call user Abort complete callback */
Anna Bridge 186:707f6e361f3e 2129 HAL_IRDA_AbortCpltCallback(hirda);
Anna Bridge 186:707f6e361f3e 2130 }
Anna Bridge 186:707f6e361f3e 2131
Anna Bridge 186:707f6e361f3e 2132
Anna Bridge 186:707f6e361f3e 2133 /**
Anna Bridge 186:707f6e361f3e 2134 * @brief DMA IRDA Rx communication abort callback, when initiated by user
Anna Bridge 186:707f6e361f3e 2135 * (To be called at end of DMA Rx Abort procedure following user abort request).
Anna Bridge 186:707f6e361f3e 2136 * @note When this callback is executed, User Abort complete call back is called only if no
Anna Bridge 186:707f6e361f3e 2137 * Abort still ongoing for Tx DMA Handle.
Anna Bridge 186:707f6e361f3e 2138 * @param hdma DMA handle.
Anna Bridge 186:707f6e361f3e 2139 * @retval None
Anna Bridge 186:707f6e361f3e 2140 */
Anna Bridge 186:707f6e361f3e 2141 static void IRDA_DMARxAbortCallback(DMA_HandleTypeDef *hdma)
Anna Bridge 186:707f6e361f3e 2142 {
Anna Bridge 186:707f6e361f3e 2143 IRDA_HandleTypeDef* hirda = (IRDA_HandleTypeDef* )(hdma->Parent);
Anna Bridge 186:707f6e361f3e 2144
Anna Bridge 186:707f6e361f3e 2145 hirda->hdmarx->XferAbortCallback = NULL;
Anna Bridge 186:707f6e361f3e 2146
Anna Bridge 186:707f6e361f3e 2147 /* Check if an Abort process is still ongoing */
Anna Bridge 186:707f6e361f3e 2148 if(hirda->hdmatx != NULL)
Anna Bridge 186:707f6e361f3e 2149 {
Anna Bridge 186:707f6e361f3e 2150 if(hirda->hdmatx->XferAbortCallback != NULL)
Anna Bridge 186:707f6e361f3e 2151 {
Anna Bridge 186:707f6e361f3e 2152 return;
Anna Bridge 186:707f6e361f3e 2153 }
Anna Bridge 186:707f6e361f3e 2154 }
Anna Bridge 186:707f6e361f3e 2155
Anna Bridge 186:707f6e361f3e 2156 /* No Abort process still ongoing : All DMA channels are aborted, call user Abort Complete callback */
Anna Bridge 186:707f6e361f3e 2157 hirda->TxXferCount = 0;
Anna Bridge 186:707f6e361f3e 2158 hirda->RxXferCount = 0;
Anna Bridge 186:707f6e361f3e 2159
Anna Bridge 186:707f6e361f3e 2160 /* Reset errorCode */
Anna Bridge 186:707f6e361f3e 2161 hirda->ErrorCode = HAL_IRDA_ERROR_NONE;
Anna Bridge 186:707f6e361f3e 2162
Anna Bridge 186:707f6e361f3e 2163 /* Clear the Error flags in the ICR register */
Anna Bridge 186:707f6e361f3e 2164 __HAL_IRDA_CLEAR_FLAG(hirda, IRDA_CLEAR_OREF | IRDA_CLEAR_NEF | IRDA_CLEAR_PEF | IRDA_CLEAR_FEF);
Anna Bridge 186:707f6e361f3e 2165
Anna Bridge 186:707f6e361f3e 2166 /* Restore hirda->gState and hirda->RxState to Ready */
Anna Bridge 186:707f6e361f3e 2167 hirda->gState = HAL_IRDA_STATE_READY;
Anna Bridge 186:707f6e361f3e 2168 hirda->RxState = HAL_IRDA_STATE_READY;
Anna Bridge 186:707f6e361f3e 2169
Anna Bridge 186:707f6e361f3e 2170 /* Call user Abort complete callback */
Anna Bridge 186:707f6e361f3e 2171 HAL_IRDA_AbortCpltCallback(hirda);
Anna Bridge 186:707f6e361f3e 2172 }
Anna Bridge 186:707f6e361f3e 2173
Anna Bridge 186:707f6e361f3e 2174
Anna Bridge 186:707f6e361f3e 2175 /**
Anna Bridge 186:707f6e361f3e 2176 * @brief DMA IRDA Tx communication abort callback, when initiated by user by a call to
Anna Bridge 186:707f6e361f3e 2177 * HAL_IRDA_AbortTransmit_IT API (Abort only Tx transfer)
Anna Bridge 186:707f6e361f3e 2178 * (This callback is executed at end of DMA Tx Abort procedure following user abort request,
Anna Bridge 186:707f6e361f3e 2179 * and leads to user Tx Abort Complete callback execution).
Anna Bridge 186:707f6e361f3e 2180 * @param hdma DMA handle.
Anna Bridge 186:707f6e361f3e 2181 * @retval None
Anna Bridge 186:707f6e361f3e 2182 */
Anna Bridge 186:707f6e361f3e 2183 static void IRDA_DMATxOnlyAbortCallback(DMA_HandleTypeDef *hdma)
Anna Bridge 186:707f6e361f3e 2184 {
Anna Bridge 186:707f6e361f3e 2185 IRDA_HandleTypeDef* hirda = (IRDA_HandleTypeDef*)(hdma->Parent);
Anna Bridge 186:707f6e361f3e 2186
Anna Bridge 186:707f6e361f3e 2187 hirda->TxXferCount = 0;
Anna Bridge 186:707f6e361f3e 2188
Anna Bridge 186:707f6e361f3e 2189 /* Restore hirda->gState to Ready */
Anna Bridge 186:707f6e361f3e 2190 hirda->gState = HAL_IRDA_STATE_READY;
Anna Bridge 186:707f6e361f3e 2191
Anna Bridge 186:707f6e361f3e 2192 /* Call user Abort complete callback */
Anna Bridge 186:707f6e361f3e 2193 HAL_IRDA_AbortTransmitCpltCallback(hirda);
Anna Bridge 186:707f6e361f3e 2194 }
Anna Bridge 186:707f6e361f3e 2195
Anna Bridge 186:707f6e361f3e 2196 /**
Anna Bridge 186:707f6e361f3e 2197 * @brief DMA IRDA Rx communication abort callback, when initiated by user by a call to
Anna Bridge 186:707f6e361f3e 2198 * HAL_IRDA_AbortReceive_IT API (Abort only Rx transfer)
Anna Bridge 186:707f6e361f3e 2199 * (This callback is executed at end of DMA Rx Abort procedure following user abort request,
Anna Bridge 186:707f6e361f3e 2200 * and leads to user Rx Abort Complete callback execution).
Anna Bridge 186:707f6e361f3e 2201 * @param hdma DMA handle.
Anna Bridge 186:707f6e361f3e 2202 * @retval None
Anna Bridge 186:707f6e361f3e 2203 */
Anna Bridge 186:707f6e361f3e 2204 static void IRDA_DMARxOnlyAbortCallback(DMA_HandleTypeDef *hdma)
Anna Bridge 186:707f6e361f3e 2205 {
Anna Bridge 186:707f6e361f3e 2206 IRDA_HandleTypeDef* hirda = ( IRDA_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
Anna Bridge 186:707f6e361f3e 2207
Anna Bridge 186:707f6e361f3e 2208 hirda->RxXferCount = 0;
Anna Bridge 186:707f6e361f3e 2209
Anna Bridge 186:707f6e361f3e 2210 /* Clear the Error flags in the ICR register */
Anna Bridge 186:707f6e361f3e 2211 __HAL_IRDA_CLEAR_FLAG(hirda, IRDA_CLEAR_OREF | IRDA_CLEAR_NEF | IRDA_CLEAR_PEF | IRDA_CLEAR_FEF);
Anna Bridge 186:707f6e361f3e 2212
Anna Bridge 186:707f6e361f3e 2213 /* Restore hirda->RxState to Ready */
Anna Bridge 186:707f6e361f3e 2214 hirda->RxState = HAL_IRDA_STATE_READY;
Anna Bridge 186:707f6e361f3e 2215
Anna Bridge 186:707f6e361f3e 2216 /* Call user Abort complete callback */
Anna Bridge 186:707f6e361f3e 2217 HAL_IRDA_AbortReceiveCpltCallback(hirda);
Anna Bridge 186:707f6e361f3e 2218 }
Anna Bridge 186:707f6e361f3e 2219
Anna Bridge 186:707f6e361f3e 2220 /**
Anna Bridge 186:707f6e361f3e 2221 * @brief Send an amount of data in interrupt mode.
Anna Bridge 186:707f6e361f3e 2222 * @note Function is called under interruption only, once
Anna Bridge 186:707f6e361f3e 2223 * interruptions have been enabled by HAL_IRDA_Transmit_IT().
Anna Bridge 186:707f6e361f3e 2224 * @param hirda Pointer to a IRDA_HandleTypeDef structure that contains
Anna Bridge 186:707f6e361f3e 2225 * the configuration information for the specified IRDA module.
<> 144:ef7eb2e8f9f7 2226 * @retval HAL status
<> 144:ef7eb2e8f9f7 2227 */
<> 144:ef7eb2e8f9f7 2228 static HAL_StatusTypeDef IRDA_Transmit_IT(IRDA_HandleTypeDef *hirda)
<> 144:ef7eb2e8f9f7 2229 {
<> 144:ef7eb2e8f9f7 2230 uint16_t* tmp;
Anna Bridge 186:707f6e361f3e 2231
Anna Bridge 186:707f6e361f3e 2232 /* Check that a Tx process is ongoing */
Anna Bridge 186:707f6e361f3e 2233 if(hirda->gState == HAL_IRDA_STATE_BUSY_TX)
<> 144:ef7eb2e8f9f7 2234 {
<> 151:5eaa88a5bcc7 2235 if(hirda->TxXferCount == 0U)
<> 144:ef7eb2e8f9f7 2236 {
<> 144:ef7eb2e8f9f7 2237 /* Disable the IRDA Transmit Data Register Empty Interrupt */
Anna Bridge 186:707f6e361f3e 2238 CLEAR_BIT(hirda->Instance->CR1, USART_CR1_TXEIE);
Anna Bridge 186:707f6e361f3e 2239
Anna Bridge 186:707f6e361f3e 2240 /* Enable the IRDA Transmit Complete Interrupt */
Anna Bridge 186:707f6e361f3e 2241 SET_BIT(hirda->Instance->CR1, USART_CR1_TCIE);
Anna Bridge 186:707f6e361f3e 2242
<> 144:ef7eb2e8f9f7 2243 return HAL_OK;
<> 144:ef7eb2e8f9f7 2244 }
<> 144:ef7eb2e8f9f7 2245 else
<> 144:ef7eb2e8f9f7 2246 {
<> 144:ef7eb2e8f9f7 2247 if ((hirda->Init.WordLength == IRDA_WORDLENGTH_9B) && (hirda->Init.Parity == IRDA_PARITY_NONE))
<> 144:ef7eb2e8f9f7 2248 {
<> 144:ef7eb2e8f9f7 2249 tmp = (uint16_t*) hirda->pTxBuffPtr;
<> 151:5eaa88a5bcc7 2250 hirda->Instance->TDR = (*tmp & (uint16_t)0x01FFU);
<> 151:5eaa88a5bcc7 2251 hirda->pTxBuffPtr += 2U;
<> 144:ef7eb2e8f9f7 2252 }
<> 144:ef7eb2e8f9f7 2253 else
<> 144:ef7eb2e8f9f7 2254 {
Anna Bridge 186:707f6e361f3e 2255 hirda->Instance->TDR = (uint8_t)(*hirda->pTxBuffPtr++ & (uint8_t)0xFFU);
<> 144:ef7eb2e8f9f7 2256 }
<> 144:ef7eb2e8f9f7 2257 hirda->TxXferCount--;
Anna Bridge 186:707f6e361f3e 2258
<> 144:ef7eb2e8f9f7 2259 return HAL_OK;
<> 144:ef7eb2e8f9f7 2260 }
<> 144:ef7eb2e8f9f7 2261 }
<> 144:ef7eb2e8f9f7 2262 else
<> 144:ef7eb2e8f9f7 2263 {
<> 144:ef7eb2e8f9f7 2264 return HAL_BUSY;
<> 144:ef7eb2e8f9f7 2265 }
<> 144:ef7eb2e8f9f7 2266 }
Anna Bridge 186:707f6e361f3e 2267
<> 144:ef7eb2e8f9f7 2268 /**
Anna Bridge 186:707f6e361f3e 2269 * @brief Wrap up transmission in non-blocking mode.
Anna Bridge 186:707f6e361f3e 2270 * @param hirda Pointer to a IRDA_HandleTypeDef structure that contains
Anna Bridge 186:707f6e361f3e 2271 * the configuration information for the specified IRDA module.
<> 144:ef7eb2e8f9f7 2272 * @retval HAL status
<> 144:ef7eb2e8f9f7 2273 */
<> 144:ef7eb2e8f9f7 2274 static HAL_StatusTypeDef IRDA_EndTransmit_IT(IRDA_HandleTypeDef *hirda)
<> 144:ef7eb2e8f9f7 2275 {
Anna Bridge 186:707f6e361f3e 2276 /* Disable the IRDA Transmit Complete Interrupt */
Anna Bridge 186:707f6e361f3e 2277 CLEAR_BIT(hirda->Instance->CR1, USART_CR1_TCIE);
Anna Bridge 186:707f6e361f3e 2278
Anna Bridge 186:707f6e361f3e 2279 /* Tx process is ended, restore hirda->gState to Ready */
Anna Bridge 186:707f6e361f3e 2280 hirda->gState = HAL_IRDA_STATE_READY;
Anna Bridge 186:707f6e361f3e 2281
<> 144:ef7eb2e8f9f7 2282 HAL_IRDA_TxCpltCallback(hirda);
Anna Bridge 186:707f6e361f3e 2283
<> 144:ef7eb2e8f9f7 2284 return HAL_OK;
<> 144:ef7eb2e8f9f7 2285 }
<> 144:ef7eb2e8f9f7 2286
<> 144:ef7eb2e8f9f7 2287 /**
Anna Bridge 186:707f6e361f3e 2288 * @brief Receive an amount of data in interrupt mode.
Anna Bridge 186:707f6e361f3e 2289 * @note Function is called under interruption only, once
<> 144:ef7eb2e8f9f7 2290 * interruptions have been enabled by HAL_IRDA_Receive_IT()
Anna Bridge 186:707f6e361f3e 2291 * @param hirda Pointer to a IRDA_HandleTypeDef structure that contains
Anna Bridge 186:707f6e361f3e 2292 * the configuration information for the specified IRDA module.
<> 144:ef7eb2e8f9f7 2293 * @retval HAL status
<> 144:ef7eb2e8f9f7 2294 */
<> 144:ef7eb2e8f9f7 2295 static HAL_StatusTypeDef IRDA_Receive_IT(IRDA_HandleTypeDef *hirda)
<> 144:ef7eb2e8f9f7 2296 {
<> 144:ef7eb2e8f9f7 2297 uint16_t* tmp;
Anna Bridge 186:707f6e361f3e 2298 uint16_t uhMask = hirda->Mask;
Anna Bridge 186:707f6e361f3e 2299 uint16_t uhdata;
Anna Bridge 186:707f6e361f3e 2300
Anna Bridge 186:707f6e361f3e 2301 /* Check that a Rx process is ongoing */
Anna Bridge 186:707f6e361f3e 2302 if (hirda->RxState == HAL_IRDA_STATE_BUSY_RX)
<> 144:ef7eb2e8f9f7 2303 {
Anna Bridge 186:707f6e361f3e 2304 uhdata = (uint16_t) READ_REG(hirda->Instance->RDR);
<> 144:ef7eb2e8f9f7 2305 if ((hirda->Init.WordLength == IRDA_WORDLENGTH_9B) && (hirda->Init.Parity == IRDA_PARITY_NONE))
<> 144:ef7eb2e8f9f7 2306 {
<> 144:ef7eb2e8f9f7 2307 tmp = (uint16_t*) hirda->pRxBuffPtr ;
Anna Bridge 186:707f6e361f3e 2308 *tmp = (uint16_t)(uhdata & uhMask);
Anna Bridge 186:707f6e361f3e 2309 hirda->pRxBuffPtr +=2U;
<> 144:ef7eb2e8f9f7 2310 }
<> 144:ef7eb2e8f9f7 2311 else
<> 144:ef7eb2e8f9f7 2312 {
Anna Bridge 186:707f6e361f3e 2313 *hirda->pRxBuffPtr++ = (uint8_t)(uhdata & (uint8_t)uhMask);
<> 144:ef7eb2e8f9f7 2314 }
Anna Bridge 186:707f6e361f3e 2315
<> 151:5eaa88a5bcc7 2316 if(--hirda->RxXferCount == 0U)
<> 144:ef7eb2e8f9f7 2317 {
Anna Bridge 186:707f6e361f3e 2318 /* Disable the IRDA Parity Error Interrupt and RXNE interrupt */
Anna Bridge 186:707f6e361f3e 2319 CLEAR_BIT(hirda->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE));
<> 151:5eaa88a5bcc7 2320
<> 151:5eaa88a5bcc7 2321 /* Disable the IRDA Error Interrupt: (Frame error, noise error, overrun error) */
Anna Bridge 186:707f6e361f3e 2322 CLEAR_BIT(hirda->Instance->CR3, USART_CR3_EIE);
<> 151:5eaa88a5bcc7 2323
Anna Bridge 186:707f6e361f3e 2324 /* Rx process is completed, restore hirda->RxState to Ready */
Anna Bridge 186:707f6e361f3e 2325 hirda->RxState = HAL_IRDA_STATE_READY;
Anna Bridge 186:707f6e361f3e 2326
<> 144:ef7eb2e8f9f7 2327 HAL_IRDA_RxCpltCallback(hirda);
Anna Bridge 186:707f6e361f3e 2328
<> 144:ef7eb2e8f9f7 2329 return HAL_OK;
<> 144:ef7eb2e8f9f7 2330 }
Anna Bridge 186:707f6e361f3e 2331
<> 144:ef7eb2e8f9f7 2332 return HAL_OK;
<> 144:ef7eb2e8f9f7 2333 }
<> 144:ef7eb2e8f9f7 2334 else
<> 144:ef7eb2e8f9f7 2335 {
Anna Bridge 186:707f6e361f3e 2336 /* Clear RXNE interrupt flag */
Anna Bridge 186:707f6e361f3e 2337 __HAL_IRDA_SEND_REQ(hirda, IRDA_RXDATA_FLUSH_REQUEST);
<> 144:ef7eb2e8f9f7 2338
Anna Bridge 186:707f6e361f3e 2339 return HAL_BUSY;
<> 144:ef7eb2e8f9f7 2340 }
<> 144:ef7eb2e8f9f7 2341 }
<> 144:ef7eb2e8f9f7 2342
<> 144:ef7eb2e8f9f7 2343 /**
<> 144:ef7eb2e8f9f7 2344 * @}
<> 144:ef7eb2e8f9f7 2345 */
<> 144:ef7eb2e8f9f7 2346
<> 144:ef7eb2e8f9f7 2347 #endif /* HAL_IRDA_MODULE_ENABLED */
<> 144:ef7eb2e8f9f7 2348 /**
<> 144:ef7eb2e8f9f7 2349 * @}
<> 144:ef7eb2e8f9f7 2350 */
<> 144:ef7eb2e8f9f7 2351
Anna Bridge 186:707f6e361f3e 2352 /**
Anna Bridge 186:707f6e361f3e 2353 * @}
Anna Bridge 186:707f6e361f3e 2354 */
Anna Bridge 186:707f6e361f3e 2355
<> 144:ef7eb2e8f9f7 2356 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
<> 144:ef7eb2e8f9f7 2357