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
mbed library release version 165

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AnnaBridge 189:f392fc9709a3 1 /**
AnnaBridge 189:f392fc9709a3 2 ******************************************************************************
AnnaBridge 189:f392fc9709a3 3 * @file stm32h7xx_hal_irda.c
AnnaBridge 189:f392fc9709a3 4 * @author MCD Application Team
AnnaBridge 189:f392fc9709a3 5 * @brief IRDA HAL module driver.
AnnaBridge 189:f392fc9709a3 6 * This file provides firmware functions to manage the following
AnnaBridge 189:f392fc9709a3 7 * functionalities of the IrDA (Infrared Data Association) Peripheral
AnnaBridge 189:f392fc9709a3 8 * (IRDA)
AnnaBridge 189:f392fc9709a3 9 * + Initialization and de-initialization functions
AnnaBridge 189:f392fc9709a3 10 * + IO operation functions
AnnaBridge 189:f392fc9709a3 11 * + Peripheral State and Errors functions
AnnaBridge 189:f392fc9709a3 12 * + Peripheral Control functions
AnnaBridge 189:f392fc9709a3 13 *
AnnaBridge 189:f392fc9709a3 14 @verbatim
AnnaBridge 189:f392fc9709a3 15 ==============================================================================
AnnaBridge 189:f392fc9709a3 16 ##### How to use this driver #####
AnnaBridge 189:f392fc9709a3 17 ==============================================================================
AnnaBridge 189:f392fc9709a3 18 [..]
AnnaBridge 189:f392fc9709a3 19 The IRDA HAL driver can be used as follows:
AnnaBridge 189:f392fc9709a3 20
AnnaBridge 189:f392fc9709a3 21 (#) Declare a IRDA_HandleTypeDef handle structure (eg. IRDA_HandleTypeDef hirda).
AnnaBridge 189:f392fc9709a3 22 (#) Initialize the IRDA low level resources by implementing the HAL_IRDA_MspInit() API
AnnaBridge 189:f392fc9709a3 23 in setting the associated USART or UART in IRDA mode:
AnnaBridge 189:f392fc9709a3 24 (++) Enable the USARTx/UARTx interface clock.
AnnaBridge 189:f392fc9709a3 25 (++) USARTx/UARTx pins configuration:
AnnaBridge 189:f392fc9709a3 26 (+++) Enable the clock for the USARTx/UARTx GPIOs.
AnnaBridge 189:f392fc9709a3 27 (+++) Configure these USARTx/UARTx pins (TX as alternate function pull-up, RX as alternate function Input).
AnnaBridge 189:f392fc9709a3 28 (++) NVIC configuration if you need to use interrupt process (HAL_IRDA_Transmit_IT()
AnnaBridge 189:f392fc9709a3 29 and HAL_IRDA_Receive_IT() APIs):
AnnaBridge 189:f392fc9709a3 30 (+++) Configure the USARTx/UARTx interrupt priority.
AnnaBridge 189:f392fc9709a3 31 (+++) Enable the NVIC USARTx/UARTx IRQ handle.
AnnaBridge 189:f392fc9709a3 32 (+++) The specific IRDA interrupts (Transmission complete interrupt,
AnnaBridge 189:f392fc9709a3 33 RXNE interrupt and Error Interrupts) will be managed using the macros
AnnaBridge 189:f392fc9709a3 34 __HAL_IRDA_ENABLE_IT() and __HAL_IRDA_DISABLE_IT() inside the transmit and receive process.
AnnaBridge 189:f392fc9709a3 35
AnnaBridge 189:f392fc9709a3 36 (++) DMA Configuration if you need to use DMA process (HAL_IRDA_Transmit_DMA()
AnnaBridge 189:f392fc9709a3 37 and HAL_IRDA_Receive_DMA() APIs):
AnnaBridge 189:f392fc9709a3 38 (+++) Declare a DMA handle structure for the Tx/Rx channel.
AnnaBridge 189:f392fc9709a3 39 (+++) Enable the DMAx interface clock.
AnnaBridge 189:f392fc9709a3 40 (+++) Configure the declared DMA handle structure with the required Tx/Rx parameters.
AnnaBridge 189:f392fc9709a3 41 (+++) Configure the DMA Tx/Rx channel.
AnnaBridge 189:f392fc9709a3 42 (+++) Associate the initialized DMA handle to the IRDA DMA Tx/Rx handle.
AnnaBridge 189:f392fc9709a3 43 (+++) Configure the priority and enable the NVIC for the transfer complete interrupt on the DMA Tx/Rx channel.
AnnaBridge 189:f392fc9709a3 44
AnnaBridge 189:f392fc9709a3 45 (#) Program the Baud Rate, Word Length and Parity and Mode(Receiver/Transmitter),
AnnaBridge 189:f392fc9709a3 46 the normal or low power mode and the clock prescaler in the hirda handle Init structure.
AnnaBridge 189:f392fc9709a3 47
AnnaBridge 189:f392fc9709a3 48 (#) Initialize the IRDA registers by calling the HAL_IRDA_Init() API:
AnnaBridge 189:f392fc9709a3 49 (++) This API configures also the low level Hardware GPIO, CLOCK, CORTEX...etc)
AnnaBridge 189:f392fc9709a3 50 by calling the customized HAL_IRDA_MspInit() API.
AnnaBridge 189:f392fc9709a3 51
AnnaBridge 189:f392fc9709a3 52 -@@- The specific IRDA interrupts (Transmission complete interrupt,
AnnaBridge 189:f392fc9709a3 53 RXNE interrupt and Error Interrupts) will be managed using the macros
AnnaBridge 189:f392fc9709a3 54 __HAL_IRDA_ENABLE_IT() and __HAL_IRDA_DISABLE_IT() inside the transmit and receive process.
AnnaBridge 189:f392fc9709a3 55
AnnaBridge 189:f392fc9709a3 56 (#) Three operation modes are available within this driver :
AnnaBridge 189:f392fc9709a3 57
AnnaBridge 189:f392fc9709a3 58 *** Polling mode IO operation ***
AnnaBridge 189:f392fc9709a3 59 =================================
AnnaBridge 189:f392fc9709a3 60 [..]
AnnaBridge 189:f392fc9709a3 61 (+) Send an amount of data in blocking mode using HAL_IRDA_Transmit()
AnnaBridge 189:f392fc9709a3 62 (+) Receive an amount of data in blocking mode using HAL_IRDA_Receive()
AnnaBridge 189:f392fc9709a3 63
AnnaBridge 189:f392fc9709a3 64 *** Interrupt mode IO operation ***
AnnaBridge 189:f392fc9709a3 65 ===================================
AnnaBridge 189:f392fc9709a3 66 [..]
AnnaBridge 189:f392fc9709a3 67 (+) Send an amount of data in non-blocking mode using HAL_IRDA_Transmit_IT()
AnnaBridge 189:f392fc9709a3 68 (+) At transmission end of transfer HAL_IRDA_TxCpltCallback() is executed and user can
AnnaBridge 189:f392fc9709a3 69 add his own code by customization of function pointer HAL_IRDA_TxCpltCallback()
AnnaBridge 189:f392fc9709a3 70 (+) Receive an amount of data in non-blocking mode using HAL_IRDA_Receive_IT()
AnnaBridge 189:f392fc9709a3 71 (+) At reception end of transfer HAL_IRDA_RxCpltCallback() is executed and user can
AnnaBridge 189:f392fc9709a3 72 add his own code by customization of function pointer HAL_IRDA_RxCpltCallback()
AnnaBridge 189:f392fc9709a3 73 (+) In case of transfer Error, HAL_IRDA_ErrorCallback() function is executed and user can
AnnaBridge 189:f392fc9709a3 74 add his own code by customization of function pointer HAL_IRDA_ErrorCallback()
AnnaBridge 189:f392fc9709a3 75
AnnaBridge 189:f392fc9709a3 76 *** DMA mode IO operation ***
AnnaBridge 189:f392fc9709a3 77 ==============================
AnnaBridge 189:f392fc9709a3 78 [..]
AnnaBridge 189:f392fc9709a3 79 (+) Send an amount of data in non-blocking mode (DMA) using HAL_IRDA_Transmit_DMA()
AnnaBridge 189:f392fc9709a3 80 (+) At transmission half of transfer HAL_IRDA_TxHalfCpltCallback() is executed and user can
AnnaBridge 189:f392fc9709a3 81 add his own code by customization of function pointer HAL_IRDA_TxHalfCpltCallback()
AnnaBridge 189:f392fc9709a3 82 (+) At transmission end of transfer HAL_IRDA_TxCpltCallback() is executed and user can
AnnaBridge 189:f392fc9709a3 83 add his own code by customization of function pointer HAL_IRDA_TxCpltCallback()
AnnaBridge 189:f392fc9709a3 84 (+) Receive an amount of data in non-blocking mode (DMA) using HAL_IRDA_Receive_DMA()
AnnaBridge 189:f392fc9709a3 85 (+) At reception half of transfer HAL_IRDA_RxHalfCpltCallback() is executed and user can
AnnaBridge 189:f392fc9709a3 86 add his own code by customization of function pointer HAL_IRDA_RxHalfCpltCallback()
AnnaBridge 189:f392fc9709a3 87 (+) At reception end of transfer HAL_IRDA_RxCpltCallback() is executed and user can
AnnaBridge 189:f392fc9709a3 88 add his own code by customization of function pointer HAL_IRDA_RxCpltCallback()
AnnaBridge 189:f392fc9709a3 89 (+) In case of transfer Error, HAL_IRDA_ErrorCallback() function is executed and user can
AnnaBridge 189:f392fc9709a3 90 add his own code by customization of function pointer HAL_IRDA_ErrorCallback()
AnnaBridge 189:f392fc9709a3 91
AnnaBridge 189:f392fc9709a3 92 *** IRDA HAL driver macros list ***
AnnaBridge 189:f392fc9709a3 93 ====================================
AnnaBridge 189:f392fc9709a3 94 [..]
AnnaBridge 189:f392fc9709a3 95 Below the list of most used macros in IRDA HAL driver.
AnnaBridge 189:f392fc9709a3 96
AnnaBridge 189:f392fc9709a3 97 (+) __HAL_IRDA_ENABLE: Enable the IRDA peripheral
AnnaBridge 189:f392fc9709a3 98 (+) __HAL_IRDA_DISABLE: Disable the IRDA peripheral
AnnaBridge 189:f392fc9709a3 99 (+) __HAL_IRDA_GET_FLAG : Check whether the specified IRDA flag is set or not
AnnaBridge 189:f392fc9709a3 100 (+) __HAL_IRDA_CLEAR_FLAG : Clear the specified IRDA pending flag
AnnaBridge 189:f392fc9709a3 101 (+) __HAL_IRDA_ENABLE_IT: Enable the specified IRDA interrupt
AnnaBridge 189:f392fc9709a3 102 (+) __HAL_IRDA_DISABLE_IT: Disable the specified IRDA interrupt
AnnaBridge 189:f392fc9709a3 103 (+) __HAL_IRDA_GET_IT_SOURCE: Check whether or not the specified IRDA interrupt is enabled
AnnaBridge 189:f392fc9709a3 104
AnnaBridge 189:f392fc9709a3 105 [..]
AnnaBridge 189:f392fc9709a3 106 (@) You can refer to the IRDA HAL driver header file for more useful macros
AnnaBridge 189:f392fc9709a3 107
AnnaBridge 189:f392fc9709a3 108 ##### Callback registration #####
AnnaBridge 189:f392fc9709a3 109 ==================================
AnnaBridge 189:f392fc9709a3 110
AnnaBridge 189:f392fc9709a3 111 [..]
AnnaBridge 189:f392fc9709a3 112 The compilation define USE_HAL_IRDA_REGISTER_CALLBACKS when set to 1
AnnaBridge 189:f392fc9709a3 113 allows the user to configure dynamically the driver callbacks.
AnnaBridge 189:f392fc9709a3 114
AnnaBridge 189:f392fc9709a3 115 [..]
AnnaBridge 189:f392fc9709a3 116 Use Function @ref HAL_IRDA_RegisterCallback() to register a user callback.
AnnaBridge 189:f392fc9709a3 117 Function @ref HAL_IRDA_RegisterCallback() allows to register following callbacks:
AnnaBridge 189:f392fc9709a3 118 (+) TxHalfCpltCallback : Tx Half Complete Callback.
AnnaBridge 189:f392fc9709a3 119 (+) TxCpltCallback : Tx Complete Callback.
AnnaBridge 189:f392fc9709a3 120 (+) RxHalfCpltCallback : Rx Half Complete Callback.
AnnaBridge 189:f392fc9709a3 121 (+) RxCpltCallback : Rx Complete Callback.
AnnaBridge 189:f392fc9709a3 122 (+) ErrorCallback : Error Callback.
AnnaBridge 189:f392fc9709a3 123 (+) AbortCpltCallback : Abort Complete Callback.
AnnaBridge 189:f392fc9709a3 124 (+) AbortTransmitCpltCallback : Abort Transmit Complete Callback.
AnnaBridge 189:f392fc9709a3 125 (+) AbortReceiveCpltCallback : Abort Receive Complete Callback.
AnnaBridge 189:f392fc9709a3 126 (+) MspInitCallback : IRDA MspInit.
AnnaBridge 189:f392fc9709a3 127 (+) MspDeInitCallback : IRDA MspDeInit.
AnnaBridge 189:f392fc9709a3 128 This function takes as parameters the HAL peripheral handle, the Callback ID
AnnaBridge 189:f392fc9709a3 129 and a pointer to the user callback function.
AnnaBridge 189:f392fc9709a3 130
AnnaBridge 189:f392fc9709a3 131 [..]
AnnaBridge 189:f392fc9709a3 132 Use function @ref HAL_IRDA_UnRegisterCallback() to reset a callback to the default
AnnaBridge 189:f392fc9709a3 133 weak (surcharged) function.
AnnaBridge 189:f392fc9709a3 134 @ref HAL_IRDA_UnRegisterCallback() takes as parameters the HAL peripheral handle,
AnnaBridge 189:f392fc9709a3 135 and the Callback ID.
AnnaBridge 189:f392fc9709a3 136 This function allows to reset following callbacks:
AnnaBridge 189:f392fc9709a3 137 (+) TxHalfCpltCallback : Tx Half Complete Callback.
AnnaBridge 189:f392fc9709a3 138 (+) TxCpltCallback : Tx Complete Callback.
AnnaBridge 189:f392fc9709a3 139 (+) RxHalfCpltCallback : Rx Half Complete Callback.
AnnaBridge 189:f392fc9709a3 140 (+) RxCpltCallback : Rx Complete Callback.
AnnaBridge 189:f392fc9709a3 141 (+) ErrorCallback : Error Callback.
AnnaBridge 189:f392fc9709a3 142 (+) AbortCpltCallback : Abort Complete Callback.
AnnaBridge 189:f392fc9709a3 143 (+) AbortTransmitCpltCallback : Abort Transmit Complete Callback.
AnnaBridge 189:f392fc9709a3 144 (+) AbortReceiveCpltCallback : Abort Receive Complete Callback.
AnnaBridge 189:f392fc9709a3 145 (+) MspInitCallback : IRDA MspInit.
AnnaBridge 189:f392fc9709a3 146 (+) MspDeInitCallback : IRDA MspDeInit.
AnnaBridge 189:f392fc9709a3 147
AnnaBridge 189:f392fc9709a3 148 [..]
AnnaBridge 189:f392fc9709a3 149 By default, after the @ref HAL_IRDA_Init() and when the state is HAL_IRDA_STATE_RESET
AnnaBridge 189:f392fc9709a3 150 all callbacks are set to the corresponding weak (surcharged) functions:
AnnaBridge 189:f392fc9709a3 151 examples @ref HAL_IRDA_TxCpltCallback(), @ref HAL_IRDA_RxHalfCpltCallback().
AnnaBridge 189:f392fc9709a3 152 Exception done for MspInit and MspDeInit functions that are respectively
AnnaBridge 189:f392fc9709a3 153 reset to the legacy weak (surcharged) functions in the @ref HAL_IRDA_Init()
AnnaBridge 189:f392fc9709a3 154 and @ref HAL_IRDA_DeInit() only when these callbacks are null (not registered beforehand).
AnnaBridge 189:f392fc9709a3 155 If not, MspInit or MspDeInit are not null, the @ref HAL_IRDA_Init() and @ref HAL_IRDA_DeInit()
AnnaBridge 189:f392fc9709a3 156 keep and use the user MspInit/MspDeInit callbacks (registered beforehand).
AnnaBridge 189:f392fc9709a3 157
AnnaBridge 189:f392fc9709a3 158 [..]
AnnaBridge 189:f392fc9709a3 159 Callbacks can be registered/unregistered in HAL_IRDA_STATE_READY state only.
AnnaBridge 189:f392fc9709a3 160 Exception done MspInit/MspDeInit that can be registered/unregistered
AnnaBridge 189:f392fc9709a3 161 in HAL_IRDA_STATE_READY or HAL_IRDA_STATE_RESET state, thus registered (user)
AnnaBridge 189:f392fc9709a3 162 MspInit/DeInit callbacks can be used during the Init/DeInit.
AnnaBridge 189:f392fc9709a3 163 In that case first register the MspInit/MspDeInit user callbacks
AnnaBridge 189:f392fc9709a3 164 using @ref HAL_IRDA_RegisterCallback() before calling @ref HAL_IRDA_DeInit()
AnnaBridge 189:f392fc9709a3 165 or @ref HAL_IRDA_Init() function.
AnnaBridge 189:f392fc9709a3 166
AnnaBridge 189:f392fc9709a3 167 [..]
AnnaBridge 189:f392fc9709a3 168 When The compilation define USE_HAL_IRDA_REGISTER_CALLBACKS is set to 0 or
AnnaBridge 189:f392fc9709a3 169 not defined, the callback registration feature is not available
AnnaBridge 189:f392fc9709a3 170 and weak (surcharged) callbacks are used.
AnnaBridge 189:f392fc9709a3 171
AnnaBridge 189:f392fc9709a3 172 @endverbatim
AnnaBridge 189:f392fc9709a3 173 ******************************************************************************
AnnaBridge 189:f392fc9709a3 174 * @attention
AnnaBridge 189:f392fc9709a3 175 *
AnnaBridge 189:f392fc9709a3 176 * <h2><center>&copy; Copyright (c) 2017 STMicroelectronics.
AnnaBridge 189:f392fc9709a3 177 * All rights reserved.</center></h2>
AnnaBridge 189:f392fc9709a3 178 *
AnnaBridge 189:f392fc9709a3 179 * This software component is licensed by ST under BSD 3-Clause license,
AnnaBridge 189:f392fc9709a3 180 * the "License"; You may not use this file except in compliance with the
AnnaBridge 189:f392fc9709a3 181 * License. You may obtain a copy of the License at:
AnnaBridge 189:f392fc9709a3 182 * opensource.org/licenses/BSD-3-Clause
AnnaBridge 189:f392fc9709a3 183 *
AnnaBridge 189:f392fc9709a3 184 ******************************************************************************
AnnaBridge 189:f392fc9709a3 185 */
AnnaBridge 189:f392fc9709a3 186
AnnaBridge 189:f392fc9709a3 187 /* Includes ------------------------------------------------------------------*/
AnnaBridge 189:f392fc9709a3 188 #include "stm32h7xx_hal.h"
AnnaBridge 189:f392fc9709a3 189
AnnaBridge 189:f392fc9709a3 190 /** @addtogroup STM32H7xx_HAL_Driver
AnnaBridge 189:f392fc9709a3 191 * @{
AnnaBridge 189:f392fc9709a3 192 */
AnnaBridge 189:f392fc9709a3 193
AnnaBridge 189:f392fc9709a3 194 /** @defgroup IRDA IRDA
AnnaBridge 189:f392fc9709a3 195 * @brief HAL IRDA module driver
AnnaBridge 189:f392fc9709a3 196 * @{
AnnaBridge 189:f392fc9709a3 197 */
AnnaBridge 189:f392fc9709a3 198
AnnaBridge 189:f392fc9709a3 199 #ifdef HAL_IRDA_MODULE_ENABLED
AnnaBridge 189:f392fc9709a3 200
AnnaBridge 189:f392fc9709a3 201 /* Private typedef -----------------------------------------------------------*/
AnnaBridge 189:f392fc9709a3 202 /* Private define ------------------------------------------------------------*/
AnnaBridge 189:f392fc9709a3 203 /** @defgroup IRDA_Private_Constants IRDA Private Constants
AnnaBridge 189:f392fc9709a3 204 * @{
AnnaBridge 189:f392fc9709a3 205 */
AnnaBridge 189:f392fc9709a3 206 #define IRDA_TEACK_REACK_TIMEOUT 1000U /*!< IRDA TX or RX enable acknowledge time-out value */
AnnaBridge 189:f392fc9709a3 207
AnnaBridge 189:f392fc9709a3 208 #define IRDA_CR1_FIELDS ((uint32_t)(USART_CR1_M | USART_CR1_PCE \
AnnaBridge 189:f392fc9709a3 209 | USART_CR1_PS | USART_CR1_TE | USART_CR1_RE)) /*!< UART or USART CR1 fields of parameters set by IRDA_SetConfig API */
AnnaBridge 189:f392fc9709a3 210
AnnaBridge 189:f392fc9709a3 211 #define USART_BRR_MIN 0x10U /*!< USART BRR minimum authorized value */
AnnaBridge 189:f392fc9709a3 212
AnnaBridge 189:f392fc9709a3 213 #define USART_BRR_MAX 0x0000FFFFU /*!< USART BRR maximum authorized value */
AnnaBridge 189:f392fc9709a3 214 /**
AnnaBridge 189:f392fc9709a3 215 * @}
AnnaBridge 189:f392fc9709a3 216 */
AnnaBridge 189:f392fc9709a3 217
AnnaBridge 189:f392fc9709a3 218 /* Private macros ------------------------------------------------------------*/
AnnaBridge 189:f392fc9709a3 219 /** @defgroup IRDA_Private_Macros IRDA Private Macros
AnnaBridge 189:f392fc9709a3 220 * @{
AnnaBridge 189:f392fc9709a3 221 */
AnnaBridge 189:f392fc9709a3 222 /** @brief BRR division operation to set BRR register in 16-bit oversampling mode.
AnnaBridge 189:f392fc9709a3 223 * @param __PCLK__ IRDA clock source.
AnnaBridge 189:f392fc9709a3 224 * @param __BAUD__ Baud rate set by the user.
AnnaBridge 189:f392fc9709a3 225 * @param __PRESCALER__ IRDA clock prescaler value.
AnnaBridge 189:f392fc9709a3 226 * @retval Division result
AnnaBridge 189:f392fc9709a3 227 */
AnnaBridge 189:f392fc9709a3 228 #define IRDA_DIV_SAMPLING16(__PCLK__, __BAUD__, __PRESCALER__) ((((__PCLK__)/IRDAPrescTable[(__PRESCALER__)]) + ((__BAUD__)/2U)) / (__BAUD__))
AnnaBridge 189:f392fc9709a3 229 /**
AnnaBridge 189:f392fc9709a3 230 * @}
AnnaBridge 189:f392fc9709a3 231 */
AnnaBridge 189:f392fc9709a3 232
AnnaBridge 189:f392fc9709a3 233 /* Private variables ---------------------------------------------------------*/
AnnaBridge 189:f392fc9709a3 234 /* Private function prototypes -----------------------------------------------*/
AnnaBridge 189:f392fc9709a3 235 /** @addtogroup IRDA_Private_Functions
AnnaBridge 189:f392fc9709a3 236 * @{
AnnaBridge 189:f392fc9709a3 237 */
AnnaBridge 189:f392fc9709a3 238 #if (USE_HAL_IRDA_REGISTER_CALLBACKS == 1)
AnnaBridge 189:f392fc9709a3 239 void IRDA_InitCallbacksToDefault(IRDA_HandleTypeDef *hirda);
AnnaBridge 189:f392fc9709a3 240 #endif /* USE_HAL_IRDA_REGISTER_CALLBACKS */
AnnaBridge 189:f392fc9709a3 241 static HAL_StatusTypeDef IRDA_SetConfig(IRDA_HandleTypeDef *hirda);
AnnaBridge 189:f392fc9709a3 242 static HAL_StatusTypeDef IRDA_CheckIdleState(IRDA_HandleTypeDef *hirda);
AnnaBridge 189:f392fc9709a3 243 static HAL_StatusTypeDef IRDA_WaitOnFlagUntilTimeout(IRDA_HandleTypeDef *hirda, uint32_t Flag, FlagStatus Status, uint32_t Tickstart, uint32_t Timeout);
AnnaBridge 189:f392fc9709a3 244 static void IRDA_EndTxTransfer(IRDA_HandleTypeDef *hirda);
AnnaBridge 189:f392fc9709a3 245 static void IRDA_EndRxTransfer(IRDA_HandleTypeDef *hirda);
AnnaBridge 189:f392fc9709a3 246 static void IRDA_DMATransmitCplt(DMA_HandleTypeDef *hdma);
AnnaBridge 189:f392fc9709a3 247 static void IRDA_DMATransmitHalfCplt(DMA_HandleTypeDef *hdma);
AnnaBridge 189:f392fc9709a3 248 static void IRDA_DMAReceiveCplt(DMA_HandleTypeDef *hdma);
AnnaBridge 189:f392fc9709a3 249 static void IRDA_DMAReceiveHalfCplt(DMA_HandleTypeDef *hdma);
AnnaBridge 189:f392fc9709a3 250 static void IRDA_DMAError(DMA_HandleTypeDef *hdma);
AnnaBridge 189:f392fc9709a3 251 static void IRDA_DMAAbortOnError(DMA_HandleTypeDef *hdma);
AnnaBridge 189:f392fc9709a3 252 static void IRDA_DMATxAbortCallback(DMA_HandleTypeDef *hdma);
AnnaBridge 189:f392fc9709a3 253 static void IRDA_DMARxAbortCallback(DMA_HandleTypeDef *hdma);
AnnaBridge 189:f392fc9709a3 254 static void IRDA_DMATxOnlyAbortCallback(DMA_HandleTypeDef *hdma);
AnnaBridge 189:f392fc9709a3 255 static void IRDA_DMARxOnlyAbortCallback(DMA_HandleTypeDef *hdma);
AnnaBridge 189:f392fc9709a3 256 static void IRDA_Transmit_IT(IRDA_HandleTypeDef *hirda);
AnnaBridge 189:f392fc9709a3 257 static void IRDA_EndTransmit_IT(IRDA_HandleTypeDef *hirda);
AnnaBridge 189:f392fc9709a3 258 static void IRDA_Receive_IT(IRDA_HandleTypeDef *hirda);
AnnaBridge 189:f392fc9709a3 259 /**
AnnaBridge 189:f392fc9709a3 260 * @}
AnnaBridge 189:f392fc9709a3 261 */
AnnaBridge 189:f392fc9709a3 262
AnnaBridge 189:f392fc9709a3 263 /* Exported functions --------------------------------------------------------*/
AnnaBridge 189:f392fc9709a3 264
AnnaBridge 189:f392fc9709a3 265 /** @defgroup IRDA_Exported_Functions IRDA Exported Functions
AnnaBridge 189:f392fc9709a3 266 * @{
AnnaBridge 189:f392fc9709a3 267 */
AnnaBridge 189:f392fc9709a3 268
AnnaBridge 189:f392fc9709a3 269 /** @defgroup IRDA_Exported_Functions_Group1 Initialization and de-initialization functions
AnnaBridge 189:f392fc9709a3 270 * @brief Initialization and Configuration functions
AnnaBridge 189:f392fc9709a3 271 *
AnnaBridge 189:f392fc9709a3 272 @verbatim
AnnaBridge 189:f392fc9709a3 273 ==============================================================================
AnnaBridge 189:f392fc9709a3 274 ##### Initialization and Configuration functions #####
AnnaBridge 189:f392fc9709a3 275 ==============================================================================
AnnaBridge 189:f392fc9709a3 276 [..]
AnnaBridge 189:f392fc9709a3 277 This subsection provides a set of functions allowing to initialize the USARTx
AnnaBridge 189:f392fc9709a3 278 in asynchronous IRDA mode.
AnnaBridge 189:f392fc9709a3 279 (+) For the asynchronous mode only these parameters can be configured:
AnnaBridge 189:f392fc9709a3 280 (++) Baud Rate
AnnaBridge 189:f392fc9709a3 281 (++) Word Length
AnnaBridge 189:f392fc9709a3 282 (++) Parity: If the parity is enabled, then the MSB bit of the data written
AnnaBridge 189:f392fc9709a3 283 in the data register is transmitted but is changed by the parity bit.
AnnaBridge 189:f392fc9709a3 284 (++) Power mode
AnnaBridge 189:f392fc9709a3 285 (++) Prescaler setting
AnnaBridge 189:f392fc9709a3 286 (++) Receiver/transmitter modes
AnnaBridge 189:f392fc9709a3 287
AnnaBridge 189:f392fc9709a3 288 [..]
AnnaBridge 189:f392fc9709a3 289 The HAL_IRDA_Init() API follows the USART asynchronous configuration procedures
AnnaBridge 189:f392fc9709a3 290 (details for the procedures are available in reference manual).
AnnaBridge 189:f392fc9709a3 291
AnnaBridge 189:f392fc9709a3 292 @endverbatim
AnnaBridge 189:f392fc9709a3 293
AnnaBridge 189:f392fc9709a3 294 Depending on the frame length defined by the M1 and M0 bits (7-bit,
AnnaBridge 189:f392fc9709a3 295 8-bit or 9-bit), the possible IRDA frame formats are listed in the
AnnaBridge 189:f392fc9709a3 296 following table.
AnnaBridge 189:f392fc9709a3 297
AnnaBridge 189:f392fc9709a3 298 Table 1. IRDA frame format.
AnnaBridge 189:f392fc9709a3 299 +-----------------------------------------------------------------------+
AnnaBridge 189:f392fc9709a3 300 | M1 bit | M0 bit | PCE bit | IRDA frame |
AnnaBridge 189:f392fc9709a3 301 |---------|---------|-----------|---------------------------------------|
AnnaBridge 189:f392fc9709a3 302 | 0 | 0 | 0 | | SB | 8 bit data | STB | |
AnnaBridge 189:f392fc9709a3 303 |---------|---------|-----------|---------------------------------------|
AnnaBridge 189:f392fc9709a3 304 | 0 | 0 | 1 | | SB | 7 bit data | PB | STB | |
AnnaBridge 189:f392fc9709a3 305 |---------|---------|-----------|---------------------------------------|
AnnaBridge 189:f392fc9709a3 306 | 0 | 1 | 0 | | SB | 9 bit data | STB | |
AnnaBridge 189:f392fc9709a3 307 |---------|---------|-----------|---------------------------------------|
AnnaBridge 189:f392fc9709a3 308 | 0 | 1 | 1 | | SB | 8 bit data | PB | STB | |
AnnaBridge 189:f392fc9709a3 309 |---------|---------|-----------|---------------------------------------|
AnnaBridge 189:f392fc9709a3 310 | 1 | 0 | 0 | | SB | 7 bit data | STB | |
AnnaBridge 189:f392fc9709a3 311 |---------|---------|-----------|---------------------------------------|
AnnaBridge 189:f392fc9709a3 312 | 1 | 0 | 1 | | SB | 6 bit data | PB | STB | |
AnnaBridge 189:f392fc9709a3 313 +-----------------------------------------------------------------------+
AnnaBridge 189:f392fc9709a3 314
AnnaBridge 189:f392fc9709a3 315 * @{
AnnaBridge 189:f392fc9709a3 316 */
AnnaBridge 189:f392fc9709a3 317
AnnaBridge 189:f392fc9709a3 318 /**
AnnaBridge 189:f392fc9709a3 319 * @brief Initialize the IRDA mode according to the specified
AnnaBridge 189:f392fc9709a3 320 * parameters in the IRDA_InitTypeDef and initialize the associated handle.
AnnaBridge 189:f392fc9709a3 321 * @param hirda Pointer to a IRDA_HandleTypeDef structure that contains
AnnaBridge 189:f392fc9709a3 322 * the configuration information for the specified IRDA module.
AnnaBridge 189:f392fc9709a3 323 * @retval HAL status
AnnaBridge 189:f392fc9709a3 324 */
AnnaBridge 189:f392fc9709a3 325 HAL_StatusTypeDef HAL_IRDA_Init(IRDA_HandleTypeDef *hirda)
AnnaBridge 189:f392fc9709a3 326 {
AnnaBridge 189:f392fc9709a3 327 /* Check the IRDA handle allocation */
AnnaBridge 189:f392fc9709a3 328 if (hirda == NULL)
AnnaBridge 189:f392fc9709a3 329 {
AnnaBridge 189:f392fc9709a3 330 return HAL_ERROR;
AnnaBridge 189:f392fc9709a3 331 }
AnnaBridge 189:f392fc9709a3 332
AnnaBridge 189:f392fc9709a3 333 /* Check the USART/UART associated to the IRDA handle */
AnnaBridge 189:f392fc9709a3 334 assert_param(IS_IRDA_INSTANCE(hirda->Instance));
AnnaBridge 189:f392fc9709a3 335
AnnaBridge 189:f392fc9709a3 336 if (hirda->gState == HAL_IRDA_STATE_RESET)
AnnaBridge 189:f392fc9709a3 337 {
AnnaBridge 189:f392fc9709a3 338 /* Allocate lock resource and initialize it */
AnnaBridge 189:f392fc9709a3 339 hirda->Lock = HAL_UNLOCKED;
AnnaBridge 189:f392fc9709a3 340
AnnaBridge 189:f392fc9709a3 341 #if USE_HAL_IRDA_REGISTER_CALLBACKS == 1
AnnaBridge 189:f392fc9709a3 342 IRDA_InitCallbacksToDefault(hirda);
AnnaBridge 189:f392fc9709a3 343
AnnaBridge 189:f392fc9709a3 344 if (hirda->MspInitCallback == NULL)
AnnaBridge 189:f392fc9709a3 345 {
AnnaBridge 189:f392fc9709a3 346 hirda->MspInitCallback = HAL_IRDA_MspInit;
AnnaBridge 189:f392fc9709a3 347 }
AnnaBridge 189:f392fc9709a3 348
AnnaBridge 189:f392fc9709a3 349 /* Init the low level hardware */
AnnaBridge 189:f392fc9709a3 350 hirda->MspInitCallback(hirda);
AnnaBridge 189:f392fc9709a3 351 #else
AnnaBridge 189:f392fc9709a3 352 /* Init the low level hardware : GPIO, CLOCK */
AnnaBridge 189:f392fc9709a3 353 HAL_IRDA_MspInit(hirda);
AnnaBridge 189:f392fc9709a3 354 #endif /* USE_HAL_IRDA_REGISTER_CALLBACKS */
AnnaBridge 189:f392fc9709a3 355 }
AnnaBridge 189:f392fc9709a3 356
AnnaBridge 189:f392fc9709a3 357 hirda->gState = HAL_IRDA_STATE_BUSY;
AnnaBridge 189:f392fc9709a3 358
AnnaBridge 189:f392fc9709a3 359 /* Disable the Peripheral to update the configuration registers */
AnnaBridge 189:f392fc9709a3 360 __HAL_IRDA_DISABLE(hirda);
AnnaBridge 189:f392fc9709a3 361
AnnaBridge 189:f392fc9709a3 362 /* Set the IRDA Communication parameters */
AnnaBridge 189:f392fc9709a3 363 if (IRDA_SetConfig(hirda) == HAL_ERROR)
AnnaBridge 189:f392fc9709a3 364 {
AnnaBridge 189:f392fc9709a3 365 return HAL_ERROR;
AnnaBridge 189:f392fc9709a3 366 }
AnnaBridge 189:f392fc9709a3 367
AnnaBridge 189:f392fc9709a3 368 /* In IRDA mode, the following bits must be kept cleared:
AnnaBridge 189:f392fc9709a3 369 - LINEN, STOP and CLKEN bits in the USART_CR2 register,
AnnaBridge 189:f392fc9709a3 370 - SCEN and HDSEL bits in the USART_CR3 register.*/
AnnaBridge 189:f392fc9709a3 371 CLEAR_BIT(hirda->Instance->CR2, (USART_CR2_LINEN | USART_CR2_CLKEN | USART_CR2_STOP));
AnnaBridge 189:f392fc9709a3 372 CLEAR_BIT(hirda->Instance->CR3, (USART_CR3_SCEN | USART_CR3_HDSEL));
AnnaBridge 189:f392fc9709a3 373
AnnaBridge 189:f392fc9709a3 374 /* set the UART/USART in IRDA mode */
AnnaBridge 189:f392fc9709a3 375 hirda->Instance->CR3 |= USART_CR3_IREN;
AnnaBridge 189:f392fc9709a3 376
AnnaBridge 189:f392fc9709a3 377 /* Enable the Peripheral */
AnnaBridge 189:f392fc9709a3 378 __HAL_IRDA_ENABLE(hirda);
AnnaBridge 189:f392fc9709a3 379
AnnaBridge 189:f392fc9709a3 380 /* TEACK and/or REACK to check before moving hirda->gState and hirda->RxState to Ready */
AnnaBridge 189:f392fc9709a3 381 return (IRDA_CheckIdleState(hirda));
AnnaBridge 189:f392fc9709a3 382 }
AnnaBridge 189:f392fc9709a3 383
AnnaBridge 189:f392fc9709a3 384 /**
AnnaBridge 189:f392fc9709a3 385 * @brief DeInitialize the IRDA peripheral.
AnnaBridge 189:f392fc9709a3 386 * @param hirda Pointer to a IRDA_HandleTypeDef structure that contains
AnnaBridge 189:f392fc9709a3 387 * the configuration information for the specified IRDA module.
AnnaBridge 189:f392fc9709a3 388 * @retval HAL status
AnnaBridge 189:f392fc9709a3 389 */
AnnaBridge 189:f392fc9709a3 390 HAL_StatusTypeDef HAL_IRDA_DeInit(IRDA_HandleTypeDef *hirda)
AnnaBridge 189:f392fc9709a3 391 {
AnnaBridge 189:f392fc9709a3 392 /* Check the IRDA handle allocation */
AnnaBridge 189:f392fc9709a3 393 if (hirda == NULL)
AnnaBridge 189:f392fc9709a3 394 {
AnnaBridge 189:f392fc9709a3 395 return HAL_ERROR;
AnnaBridge 189:f392fc9709a3 396 }
AnnaBridge 189:f392fc9709a3 397
AnnaBridge 189:f392fc9709a3 398 /* Check the USART/UART associated to the IRDA handle */
AnnaBridge 189:f392fc9709a3 399 assert_param(IS_IRDA_INSTANCE(hirda->Instance));
AnnaBridge 189:f392fc9709a3 400
AnnaBridge 189:f392fc9709a3 401 hirda->gState = HAL_IRDA_STATE_BUSY;
AnnaBridge 189:f392fc9709a3 402
AnnaBridge 189:f392fc9709a3 403 /* DeInit the low level hardware */
AnnaBridge 189:f392fc9709a3 404 #if USE_HAL_IRDA_REGISTER_CALLBACKS == 1
AnnaBridge 189:f392fc9709a3 405 if (hirda->MspDeInitCallback == NULL)
AnnaBridge 189:f392fc9709a3 406 {
AnnaBridge 189:f392fc9709a3 407 hirda->MspDeInitCallback = HAL_IRDA_MspDeInit;
AnnaBridge 189:f392fc9709a3 408 }
AnnaBridge 189:f392fc9709a3 409 /* DeInit the low level hardware */
AnnaBridge 189:f392fc9709a3 410 hirda->MspDeInitCallback(hirda);
AnnaBridge 189:f392fc9709a3 411 #else
AnnaBridge 189:f392fc9709a3 412 HAL_IRDA_MspDeInit(hirda);
AnnaBridge 189:f392fc9709a3 413 #endif /* USE_HAL_IRDA_REGISTER_CALLBACKS */
AnnaBridge 189:f392fc9709a3 414 /* Disable the Peripheral */
AnnaBridge 189:f392fc9709a3 415 __HAL_IRDA_DISABLE(hirda);
AnnaBridge 189:f392fc9709a3 416
AnnaBridge 189:f392fc9709a3 417 hirda->ErrorCode = HAL_IRDA_ERROR_NONE;
AnnaBridge 189:f392fc9709a3 418 hirda->gState = HAL_IRDA_STATE_RESET;
AnnaBridge 189:f392fc9709a3 419 hirda->RxState = HAL_IRDA_STATE_RESET;
AnnaBridge 189:f392fc9709a3 420
AnnaBridge 189:f392fc9709a3 421 /* Process Unlock */
AnnaBridge 189:f392fc9709a3 422 __HAL_UNLOCK(hirda);
AnnaBridge 189:f392fc9709a3 423
AnnaBridge 189:f392fc9709a3 424 return HAL_OK;
AnnaBridge 189:f392fc9709a3 425 }
AnnaBridge 189:f392fc9709a3 426
AnnaBridge 189:f392fc9709a3 427 /**
AnnaBridge 189:f392fc9709a3 428 * @brief Initialize the IRDA MSP.
AnnaBridge 189:f392fc9709a3 429 * @param hirda Pointer to a IRDA_HandleTypeDef structure that contains
AnnaBridge 189:f392fc9709a3 430 * the configuration information for the specified IRDA module.
AnnaBridge 189:f392fc9709a3 431 * @retval None
AnnaBridge 189:f392fc9709a3 432 */
AnnaBridge 189:f392fc9709a3 433 __weak void HAL_IRDA_MspInit(IRDA_HandleTypeDef *hirda)
AnnaBridge 189:f392fc9709a3 434 {
AnnaBridge 189:f392fc9709a3 435 /* Prevent unused argument(s) compilation warning */
AnnaBridge 189:f392fc9709a3 436 UNUSED(hirda);
AnnaBridge 189:f392fc9709a3 437
AnnaBridge 189:f392fc9709a3 438 /* NOTE: This function should not be modified, when the callback is needed,
AnnaBridge 189:f392fc9709a3 439 the HAL_IRDA_MspInit can be implemented in the user file
AnnaBridge 189:f392fc9709a3 440 */
AnnaBridge 189:f392fc9709a3 441 }
AnnaBridge 189:f392fc9709a3 442
AnnaBridge 189:f392fc9709a3 443 /**
AnnaBridge 189:f392fc9709a3 444 * @brief DeInitialize the IRDA MSP.
AnnaBridge 189:f392fc9709a3 445 * @param hirda Pointer to a IRDA_HandleTypeDef structure that contains
AnnaBridge 189:f392fc9709a3 446 * the configuration information for the specified IRDA module.
AnnaBridge 189:f392fc9709a3 447 * @retval None
AnnaBridge 189:f392fc9709a3 448 */
AnnaBridge 189:f392fc9709a3 449 __weak void HAL_IRDA_MspDeInit(IRDA_HandleTypeDef *hirda)
AnnaBridge 189:f392fc9709a3 450 {
AnnaBridge 189:f392fc9709a3 451 /* Prevent unused argument(s) compilation warning */
AnnaBridge 189:f392fc9709a3 452 UNUSED(hirda);
AnnaBridge 189:f392fc9709a3 453
AnnaBridge 189:f392fc9709a3 454 /* NOTE: This function should not be modified, when the callback is needed,
AnnaBridge 189:f392fc9709a3 455 the HAL_IRDA_MspDeInit can be implemented in the user file
AnnaBridge 189:f392fc9709a3 456 */
AnnaBridge 189:f392fc9709a3 457 }
AnnaBridge 189:f392fc9709a3 458
AnnaBridge 189:f392fc9709a3 459 #if (USE_HAL_IRDA_REGISTER_CALLBACKS == 1)
AnnaBridge 189:f392fc9709a3 460 /**
AnnaBridge 189:f392fc9709a3 461 * @brief Register a User IRDA Callback
AnnaBridge 189:f392fc9709a3 462 * To be used instead of the weak predefined callback
AnnaBridge 189:f392fc9709a3 463 * @param hirda irda handle
AnnaBridge 189:f392fc9709a3 464 * @param CallbackID ID of the callback to be registered
AnnaBridge 189:f392fc9709a3 465 * This parameter can be one of the following values:
AnnaBridge 189:f392fc9709a3 466 * @arg @ref HAL_IRDA_TX_HALFCOMPLETE_CB_ID Tx Half Complete Callback ID
AnnaBridge 189:f392fc9709a3 467 * @arg @ref HAL_IRDA_TX_COMPLETE_CB_ID Tx Complete Callback ID
AnnaBridge 189:f392fc9709a3 468 * @arg @ref HAL_IRDA_RX_HALFCOMPLETE_CB_ID Rx Half Complete Callback ID
AnnaBridge 189:f392fc9709a3 469 * @arg @ref HAL_IRDA_RX_COMPLETE_CB_ID Rx Complete Callback ID
AnnaBridge 189:f392fc9709a3 470 * @arg @ref HAL_IRDA_ERROR_CB_ID Error Callback ID
AnnaBridge 189:f392fc9709a3 471 * @arg @ref HAL_IRDA_ABORT_COMPLETE_CB_ID Abort Complete Callback ID
AnnaBridge 189:f392fc9709a3 472 * @arg @ref HAL_IRDA_ABORT_TRANSMIT_COMPLETE_CB_ID Abort Transmit Complete Callback ID
AnnaBridge 189:f392fc9709a3 473 * @arg @ref HAL_IRDA_ABORT_RECEIVE_COMPLETE_CB_ID Abort Receive Complete Callback ID
AnnaBridge 189:f392fc9709a3 474 * @arg @ref HAL_IRDA_MSPINIT_CB_ID MspInit Callback ID
AnnaBridge 189:f392fc9709a3 475 * @arg @ref HAL_IRDA_MSPDEINIT_CB_ID MspDeInit Callback ID
AnnaBridge 189:f392fc9709a3 476 * @param pCallback pointer to the Callback function
AnnaBridge 189:f392fc9709a3 477 * @retval HAL status
AnnaBridge 189:f392fc9709a3 478 */
AnnaBridge 189:f392fc9709a3 479 HAL_StatusTypeDef HAL_IRDA_RegisterCallback(IRDA_HandleTypeDef *hirda, HAL_IRDA_CallbackIDTypeDef CallbackID, pIRDA_CallbackTypeDef pCallback)
AnnaBridge 189:f392fc9709a3 480 {
AnnaBridge 189:f392fc9709a3 481 HAL_StatusTypeDef status = HAL_OK;
AnnaBridge 189:f392fc9709a3 482
AnnaBridge 189:f392fc9709a3 483 if (pCallback == NULL)
AnnaBridge 189:f392fc9709a3 484 {
AnnaBridge 189:f392fc9709a3 485 /* Update the error code */
AnnaBridge 189:f392fc9709a3 486 hirda->ErrorCode |= HAL_IRDA_ERROR_INVALID_CALLBACK;
AnnaBridge 189:f392fc9709a3 487
AnnaBridge 189:f392fc9709a3 488 return HAL_ERROR;
AnnaBridge 189:f392fc9709a3 489 }
AnnaBridge 189:f392fc9709a3 490 /* Process locked */
AnnaBridge 189:f392fc9709a3 491 __HAL_LOCK(hirda);
AnnaBridge 189:f392fc9709a3 492
AnnaBridge 189:f392fc9709a3 493 if (hirda->gState == HAL_IRDA_STATE_READY)
AnnaBridge 189:f392fc9709a3 494 {
AnnaBridge 189:f392fc9709a3 495 switch (CallbackID)
AnnaBridge 189:f392fc9709a3 496 {
AnnaBridge 189:f392fc9709a3 497 case HAL_IRDA_TX_HALFCOMPLETE_CB_ID :
AnnaBridge 189:f392fc9709a3 498 hirda->TxHalfCpltCallback = pCallback;
AnnaBridge 189:f392fc9709a3 499 break;
AnnaBridge 189:f392fc9709a3 500
AnnaBridge 189:f392fc9709a3 501 case HAL_IRDA_TX_COMPLETE_CB_ID :
AnnaBridge 189:f392fc9709a3 502 hirda->TxCpltCallback = pCallback;
AnnaBridge 189:f392fc9709a3 503 break;
AnnaBridge 189:f392fc9709a3 504
AnnaBridge 189:f392fc9709a3 505 case HAL_IRDA_RX_HALFCOMPLETE_CB_ID :
AnnaBridge 189:f392fc9709a3 506 hirda->RxHalfCpltCallback = pCallback;
AnnaBridge 189:f392fc9709a3 507 break;
AnnaBridge 189:f392fc9709a3 508
AnnaBridge 189:f392fc9709a3 509 case HAL_IRDA_RX_COMPLETE_CB_ID :
AnnaBridge 189:f392fc9709a3 510 hirda->RxCpltCallback = pCallback;
AnnaBridge 189:f392fc9709a3 511 break;
AnnaBridge 189:f392fc9709a3 512
AnnaBridge 189:f392fc9709a3 513 case HAL_IRDA_ERROR_CB_ID :
AnnaBridge 189:f392fc9709a3 514 hirda->ErrorCallback = pCallback;
AnnaBridge 189:f392fc9709a3 515 break;
AnnaBridge 189:f392fc9709a3 516
AnnaBridge 189:f392fc9709a3 517 case HAL_IRDA_ABORT_COMPLETE_CB_ID :
AnnaBridge 189:f392fc9709a3 518 hirda->AbortCpltCallback = pCallback;
AnnaBridge 189:f392fc9709a3 519 break;
AnnaBridge 189:f392fc9709a3 520
AnnaBridge 189:f392fc9709a3 521 case HAL_IRDA_ABORT_TRANSMIT_COMPLETE_CB_ID :
AnnaBridge 189:f392fc9709a3 522 hirda->AbortTransmitCpltCallback = pCallback;
AnnaBridge 189:f392fc9709a3 523 break;
AnnaBridge 189:f392fc9709a3 524
AnnaBridge 189:f392fc9709a3 525 case HAL_IRDA_ABORT_RECEIVE_COMPLETE_CB_ID :
AnnaBridge 189:f392fc9709a3 526 hirda->AbortReceiveCpltCallback = pCallback;
AnnaBridge 189:f392fc9709a3 527 break;
AnnaBridge 189:f392fc9709a3 528
AnnaBridge 189:f392fc9709a3 529 case HAL_IRDA_MSPINIT_CB_ID :
AnnaBridge 189:f392fc9709a3 530 hirda->MspInitCallback = pCallback;
AnnaBridge 189:f392fc9709a3 531 break;
AnnaBridge 189:f392fc9709a3 532
AnnaBridge 189:f392fc9709a3 533 case HAL_IRDA_MSPDEINIT_CB_ID :
AnnaBridge 189:f392fc9709a3 534 hirda->MspDeInitCallback = pCallback;
AnnaBridge 189:f392fc9709a3 535 break;
AnnaBridge 189:f392fc9709a3 536
AnnaBridge 189:f392fc9709a3 537 default :
AnnaBridge 189:f392fc9709a3 538 /* Update the error code */
AnnaBridge 189:f392fc9709a3 539 hirda->ErrorCode |= HAL_IRDA_ERROR_INVALID_CALLBACK;
AnnaBridge 189:f392fc9709a3 540
AnnaBridge 189:f392fc9709a3 541 /* Return error status */
AnnaBridge 189:f392fc9709a3 542 status = HAL_ERROR;
AnnaBridge 189:f392fc9709a3 543 break;
AnnaBridge 189:f392fc9709a3 544 }
AnnaBridge 189:f392fc9709a3 545 }
AnnaBridge 189:f392fc9709a3 546 else if (hirda->gState == HAL_IRDA_STATE_RESET)
AnnaBridge 189:f392fc9709a3 547 {
AnnaBridge 189:f392fc9709a3 548 switch (CallbackID)
AnnaBridge 189:f392fc9709a3 549 {
AnnaBridge 189:f392fc9709a3 550 case HAL_IRDA_MSPINIT_CB_ID :
AnnaBridge 189:f392fc9709a3 551 hirda->MspInitCallback = pCallback;
AnnaBridge 189:f392fc9709a3 552 break;
AnnaBridge 189:f392fc9709a3 553
AnnaBridge 189:f392fc9709a3 554 case HAL_IRDA_MSPDEINIT_CB_ID :
AnnaBridge 189:f392fc9709a3 555 hirda->MspDeInitCallback = pCallback;
AnnaBridge 189:f392fc9709a3 556 break;
AnnaBridge 189:f392fc9709a3 557
AnnaBridge 189:f392fc9709a3 558 default :
AnnaBridge 189:f392fc9709a3 559 /* Update the error code */
AnnaBridge 189:f392fc9709a3 560 hirda->ErrorCode |= HAL_IRDA_ERROR_INVALID_CALLBACK;
AnnaBridge 189:f392fc9709a3 561
AnnaBridge 189:f392fc9709a3 562 /* Return error status */
AnnaBridge 189:f392fc9709a3 563 status = HAL_ERROR;
AnnaBridge 189:f392fc9709a3 564 break;
AnnaBridge 189:f392fc9709a3 565 }
AnnaBridge 189:f392fc9709a3 566 }
AnnaBridge 189:f392fc9709a3 567 else
AnnaBridge 189:f392fc9709a3 568 {
AnnaBridge 189:f392fc9709a3 569 /* Update the error code */
AnnaBridge 189:f392fc9709a3 570 hirda->ErrorCode |= HAL_IRDA_ERROR_INVALID_CALLBACK;
AnnaBridge 189:f392fc9709a3 571
AnnaBridge 189:f392fc9709a3 572 /* Return error status */
AnnaBridge 189:f392fc9709a3 573 status = HAL_ERROR;
AnnaBridge 189:f392fc9709a3 574 }
AnnaBridge 189:f392fc9709a3 575
AnnaBridge 189:f392fc9709a3 576 /* Release Lock */
AnnaBridge 189:f392fc9709a3 577 __HAL_UNLOCK(hirda);
AnnaBridge 189:f392fc9709a3 578
AnnaBridge 189:f392fc9709a3 579 return status;
AnnaBridge 189:f392fc9709a3 580 }
AnnaBridge 189:f392fc9709a3 581
AnnaBridge 189:f392fc9709a3 582 /**
AnnaBridge 189:f392fc9709a3 583 * @brief Unregister an IRDA callback
AnnaBridge 189:f392fc9709a3 584 * IRDA callback is redirected to the weak predefined callback
AnnaBridge 189:f392fc9709a3 585 * @param hirda irda handle
AnnaBridge 189:f392fc9709a3 586 * @param CallbackID ID of the callback to be unregistered
AnnaBridge 189:f392fc9709a3 587 * This parameter can be one of the following values:
AnnaBridge 189:f392fc9709a3 588 * @arg @ref HAL_IRDA_TX_HALFCOMPLETE_CB_ID Tx Half Complete Callback ID
AnnaBridge 189:f392fc9709a3 589 * @arg @ref HAL_IRDA_TX_COMPLETE_CB_ID Tx Complete Callback ID
AnnaBridge 189:f392fc9709a3 590 * @arg @ref HAL_IRDA_RX_HALFCOMPLETE_CB_ID Rx Half Complete Callback ID
AnnaBridge 189:f392fc9709a3 591 * @arg @ref HAL_IRDA_RX_COMPLETE_CB_ID Rx Complete Callback ID
AnnaBridge 189:f392fc9709a3 592 * @arg @ref HAL_IRDA_ERROR_CB_ID Error Callback ID
AnnaBridge 189:f392fc9709a3 593 * @arg @ref HAL_IRDA_ABORT_COMPLETE_CB_ID Abort Complete Callback ID
AnnaBridge 189:f392fc9709a3 594 * @arg @ref HAL_IRDA_ABORT_TRANSMIT_COMPLETE_CB_ID Abort Transmit Complete Callback ID
AnnaBridge 189:f392fc9709a3 595 * @arg @ref HAL_IRDA_ABORT_RECEIVE_COMPLETE_CB_ID Abort Receive Complete Callback ID
AnnaBridge 189:f392fc9709a3 596 * @arg @ref HAL_IRDA_MSPINIT_CB_ID MspInit Callback ID
AnnaBridge 189:f392fc9709a3 597 * @arg @ref HAL_IRDA_MSPDEINIT_CB_ID MspDeInit Callback ID
AnnaBridge 189:f392fc9709a3 598 * @retval HAL status
AnnaBridge 189:f392fc9709a3 599 */
AnnaBridge 189:f392fc9709a3 600 HAL_StatusTypeDef HAL_IRDA_UnRegisterCallback(IRDA_HandleTypeDef *hirda, HAL_IRDA_CallbackIDTypeDef CallbackID)
AnnaBridge 189:f392fc9709a3 601 {
AnnaBridge 189:f392fc9709a3 602 HAL_StatusTypeDef status = HAL_OK;
AnnaBridge 189:f392fc9709a3 603
AnnaBridge 189:f392fc9709a3 604 /* Process locked */
AnnaBridge 189:f392fc9709a3 605 __HAL_LOCK(hirda);
AnnaBridge 189:f392fc9709a3 606
AnnaBridge 189:f392fc9709a3 607 if (HAL_IRDA_STATE_READY == hirda->gState)
AnnaBridge 189:f392fc9709a3 608 {
AnnaBridge 189:f392fc9709a3 609 switch (CallbackID)
AnnaBridge 189:f392fc9709a3 610 {
AnnaBridge 189:f392fc9709a3 611 case HAL_IRDA_TX_HALFCOMPLETE_CB_ID :
AnnaBridge 189:f392fc9709a3 612 hirda->TxHalfCpltCallback = HAL_IRDA_TxHalfCpltCallback; /* Legacy weak TxHalfCpltCallback */
AnnaBridge 189:f392fc9709a3 613 break;
AnnaBridge 189:f392fc9709a3 614
AnnaBridge 189:f392fc9709a3 615 case HAL_IRDA_TX_COMPLETE_CB_ID :
AnnaBridge 189:f392fc9709a3 616 hirda->TxCpltCallback = HAL_IRDA_TxCpltCallback; /* Legacy weak TxCpltCallback */
AnnaBridge 189:f392fc9709a3 617 break;
AnnaBridge 189:f392fc9709a3 618
AnnaBridge 189:f392fc9709a3 619 case HAL_IRDA_RX_HALFCOMPLETE_CB_ID :
AnnaBridge 189:f392fc9709a3 620 hirda->RxHalfCpltCallback = HAL_IRDA_RxHalfCpltCallback; /* Legacy weak RxHalfCpltCallback */
AnnaBridge 189:f392fc9709a3 621 break;
AnnaBridge 189:f392fc9709a3 622
AnnaBridge 189:f392fc9709a3 623 case HAL_IRDA_RX_COMPLETE_CB_ID :
AnnaBridge 189:f392fc9709a3 624 hirda->RxCpltCallback = HAL_IRDA_RxCpltCallback; /* Legacy weak RxCpltCallback */
AnnaBridge 189:f392fc9709a3 625 break;
AnnaBridge 189:f392fc9709a3 626
AnnaBridge 189:f392fc9709a3 627 case HAL_IRDA_ERROR_CB_ID :
AnnaBridge 189:f392fc9709a3 628 hirda->ErrorCallback = HAL_IRDA_ErrorCallback; /* Legacy weak ErrorCallback */
AnnaBridge 189:f392fc9709a3 629 break;
AnnaBridge 189:f392fc9709a3 630
AnnaBridge 189:f392fc9709a3 631 case HAL_IRDA_ABORT_COMPLETE_CB_ID :
AnnaBridge 189:f392fc9709a3 632 hirda->AbortCpltCallback = HAL_IRDA_AbortCpltCallback; /* Legacy weak AbortCpltCallback */
AnnaBridge 189:f392fc9709a3 633 break;
AnnaBridge 189:f392fc9709a3 634
AnnaBridge 189:f392fc9709a3 635 case HAL_IRDA_ABORT_TRANSMIT_COMPLETE_CB_ID :
AnnaBridge 189:f392fc9709a3 636 hirda->AbortTransmitCpltCallback = HAL_IRDA_AbortTransmitCpltCallback; /* Legacy weak AbortTransmitCpltCallback */
AnnaBridge 189:f392fc9709a3 637 break;
AnnaBridge 189:f392fc9709a3 638
AnnaBridge 189:f392fc9709a3 639 case HAL_IRDA_ABORT_RECEIVE_COMPLETE_CB_ID :
AnnaBridge 189:f392fc9709a3 640 hirda->AbortReceiveCpltCallback = HAL_IRDA_AbortReceiveCpltCallback; /* Legacy weak AbortReceiveCpltCallback */
AnnaBridge 189:f392fc9709a3 641 break;
AnnaBridge 189:f392fc9709a3 642
AnnaBridge 189:f392fc9709a3 643 case HAL_IRDA_MSPINIT_CB_ID :
AnnaBridge 189:f392fc9709a3 644 hirda->MspInitCallback = HAL_IRDA_MspInit; /* Legacy weak MspInitCallback */
AnnaBridge 189:f392fc9709a3 645 break;
AnnaBridge 189:f392fc9709a3 646
AnnaBridge 189:f392fc9709a3 647 case HAL_IRDA_MSPDEINIT_CB_ID :
AnnaBridge 189:f392fc9709a3 648 hirda->MspDeInitCallback = HAL_IRDA_MspDeInit; /* Legacy weak MspDeInitCallback */
AnnaBridge 189:f392fc9709a3 649 break;
AnnaBridge 189:f392fc9709a3 650
AnnaBridge 189:f392fc9709a3 651 default :
AnnaBridge 189:f392fc9709a3 652 /* Update the error code */
AnnaBridge 189:f392fc9709a3 653 hirda->ErrorCode |= HAL_IRDA_ERROR_INVALID_CALLBACK;
AnnaBridge 189:f392fc9709a3 654
AnnaBridge 189:f392fc9709a3 655 /* Return error status */
AnnaBridge 189:f392fc9709a3 656 status = HAL_ERROR;
AnnaBridge 189:f392fc9709a3 657 break;
AnnaBridge 189:f392fc9709a3 658 }
AnnaBridge 189:f392fc9709a3 659 }
AnnaBridge 189:f392fc9709a3 660 else if (HAL_IRDA_STATE_RESET == hirda->gState)
AnnaBridge 189:f392fc9709a3 661 {
AnnaBridge 189:f392fc9709a3 662 switch (CallbackID)
AnnaBridge 189:f392fc9709a3 663 {
AnnaBridge 189:f392fc9709a3 664 case HAL_IRDA_MSPINIT_CB_ID :
AnnaBridge 189:f392fc9709a3 665 hirda->MspInitCallback = HAL_IRDA_MspInit;
AnnaBridge 189:f392fc9709a3 666 break;
AnnaBridge 189:f392fc9709a3 667
AnnaBridge 189:f392fc9709a3 668 case HAL_IRDA_MSPDEINIT_CB_ID :
AnnaBridge 189:f392fc9709a3 669 hirda->MspDeInitCallback = HAL_IRDA_MspDeInit;
AnnaBridge 189:f392fc9709a3 670 break;
AnnaBridge 189:f392fc9709a3 671
AnnaBridge 189:f392fc9709a3 672 default :
AnnaBridge 189:f392fc9709a3 673 /* Update the error code */
AnnaBridge 189:f392fc9709a3 674 hirda->ErrorCode |= HAL_IRDA_ERROR_INVALID_CALLBACK;
AnnaBridge 189:f392fc9709a3 675
AnnaBridge 189:f392fc9709a3 676 /* Return error status */
AnnaBridge 189:f392fc9709a3 677 status = HAL_ERROR;
AnnaBridge 189:f392fc9709a3 678 break;
AnnaBridge 189:f392fc9709a3 679 }
AnnaBridge 189:f392fc9709a3 680 }
AnnaBridge 189:f392fc9709a3 681 else
AnnaBridge 189:f392fc9709a3 682 {
AnnaBridge 189:f392fc9709a3 683 /* Update the error code */
AnnaBridge 189:f392fc9709a3 684 hirda->ErrorCode |= HAL_IRDA_ERROR_INVALID_CALLBACK;
AnnaBridge 189:f392fc9709a3 685
AnnaBridge 189:f392fc9709a3 686 /* Return error status */
AnnaBridge 189:f392fc9709a3 687 status = HAL_ERROR;
AnnaBridge 189:f392fc9709a3 688 }
AnnaBridge 189:f392fc9709a3 689
AnnaBridge 189:f392fc9709a3 690 /* Release Lock */
AnnaBridge 189:f392fc9709a3 691 __HAL_UNLOCK(hirda);
AnnaBridge 189:f392fc9709a3 692
AnnaBridge 189:f392fc9709a3 693 return status;
AnnaBridge 189:f392fc9709a3 694 }
AnnaBridge 189:f392fc9709a3 695 #endif /* USE_HAL_IRDA_REGISTER_CALLBACKS */
AnnaBridge 189:f392fc9709a3 696
AnnaBridge 189:f392fc9709a3 697 /**
AnnaBridge 189:f392fc9709a3 698 * @}
AnnaBridge 189:f392fc9709a3 699 */
AnnaBridge 189:f392fc9709a3 700
AnnaBridge 189:f392fc9709a3 701 /** @defgroup IRDA_Exported_Functions_Group2 IO operation functions
AnnaBridge 189:f392fc9709a3 702 * @brief IRDA Transmit and Receive functions
AnnaBridge 189:f392fc9709a3 703 *
AnnaBridge 189:f392fc9709a3 704 @verbatim
AnnaBridge 189:f392fc9709a3 705 ===============================================================================
AnnaBridge 189:f392fc9709a3 706 ##### IO operation functions #####
AnnaBridge 189:f392fc9709a3 707 ===============================================================================
AnnaBridge 189:f392fc9709a3 708 [..]
AnnaBridge 189:f392fc9709a3 709 This subsection provides a set of functions allowing to manage the IRDA data transfers.
AnnaBridge 189:f392fc9709a3 710
AnnaBridge 189:f392fc9709a3 711 [..]
AnnaBridge 189:f392fc9709a3 712 IrDA is a half duplex communication protocol. If the Transmitter is busy, any data
AnnaBridge 189:f392fc9709a3 713 on the IrDA receive line will be ignored by the IrDA decoder and if the Receiver
AnnaBridge 189:f392fc9709a3 714 is busy, data on the TX from the USART to IrDA will not be encoded by IrDA.
AnnaBridge 189:f392fc9709a3 715 While receiving data, transmission should be avoided as the data to be transmitted
AnnaBridge 189:f392fc9709a3 716 could be corrupted.
AnnaBridge 189:f392fc9709a3 717
AnnaBridge 189:f392fc9709a3 718 (#) There are two modes of transfer:
AnnaBridge 189:f392fc9709a3 719 (++) Blocking mode: the communication is performed in polling mode.
AnnaBridge 189:f392fc9709a3 720 The HAL status of all data processing is returned by the same function
AnnaBridge 189:f392fc9709a3 721 after finishing transfer.
AnnaBridge 189:f392fc9709a3 722 (++) Non-Blocking mode: the communication is performed using Interrupts
AnnaBridge 189:f392fc9709a3 723 or DMA, these API's return the HAL status.
AnnaBridge 189:f392fc9709a3 724 The end of the data processing will be indicated through the
AnnaBridge 189:f392fc9709a3 725 dedicated IRDA IRQ when using Interrupt mode or the DMA IRQ when
AnnaBridge 189:f392fc9709a3 726 using DMA mode.
AnnaBridge 189:f392fc9709a3 727 The HAL_IRDA_TxCpltCallback(), HAL_IRDA_RxCpltCallback() user callbacks
AnnaBridge 189:f392fc9709a3 728 will be executed respectively at the end of the Transmit or Receive process
AnnaBridge 189:f392fc9709a3 729 The HAL_IRDA_ErrorCallback() user callback will be executed when a communication error is detected
AnnaBridge 189:f392fc9709a3 730
AnnaBridge 189:f392fc9709a3 731 (#) Blocking mode APIs are :
AnnaBridge 189:f392fc9709a3 732 (++) HAL_IRDA_Transmit()
AnnaBridge 189:f392fc9709a3 733 (++) HAL_IRDA_Receive()
AnnaBridge 189:f392fc9709a3 734
AnnaBridge 189:f392fc9709a3 735 (#) Non Blocking mode APIs with Interrupt are :
AnnaBridge 189:f392fc9709a3 736 (++) HAL_IRDA_Transmit_IT()
AnnaBridge 189:f392fc9709a3 737 (++) HAL_IRDA_Receive_IT()
AnnaBridge 189:f392fc9709a3 738 (++) HAL_IRDA_IRQHandler()
AnnaBridge 189:f392fc9709a3 739
AnnaBridge 189:f392fc9709a3 740 (#) Non Blocking mode functions with DMA are :
AnnaBridge 189:f392fc9709a3 741 (++) HAL_IRDA_Transmit_DMA()
AnnaBridge 189:f392fc9709a3 742 (++) HAL_IRDA_Receive_DMA()
AnnaBridge 189:f392fc9709a3 743 (++) HAL_IRDA_DMAPause()
AnnaBridge 189:f392fc9709a3 744 (++) HAL_IRDA_DMAResume()
AnnaBridge 189:f392fc9709a3 745 (++) HAL_IRDA_DMAStop()
AnnaBridge 189:f392fc9709a3 746
AnnaBridge 189:f392fc9709a3 747 (#) A set of Transfer Complete Callbacks are provided in Non Blocking mode:
AnnaBridge 189:f392fc9709a3 748 (++) HAL_IRDA_TxHalfCpltCallback()
AnnaBridge 189:f392fc9709a3 749 (++) HAL_IRDA_TxCpltCallback()
AnnaBridge 189:f392fc9709a3 750 (++) HAL_IRDA_RxHalfCpltCallback()
AnnaBridge 189:f392fc9709a3 751 (++) HAL_IRDA_RxCpltCallback()
AnnaBridge 189:f392fc9709a3 752 (++) HAL_IRDA_ErrorCallback()
AnnaBridge 189:f392fc9709a3 753
AnnaBridge 189:f392fc9709a3 754 (#) Non-Blocking mode transfers could be aborted using Abort API's :
AnnaBridge 189:f392fc9709a3 755 (+) HAL_IRDA_Abort()
AnnaBridge 189:f392fc9709a3 756 (+) HAL_IRDA_AbortTransmit()
AnnaBridge 189:f392fc9709a3 757 (+) HAL_IRDA_AbortReceive()
AnnaBridge 189:f392fc9709a3 758 (+) HAL_IRDA_Abort_IT()
AnnaBridge 189:f392fc9709a3 759 (+) HAL_IRDA_AbortTransmit_IT()
AnnaBridge 189:f392fc9709a3 760 (+) HAL_IRDA_AbortReceive_IT()
AnnaBridge 189:f392fc9709a3 761
AnnaBridge 189:f392fc9709a3 762 (#) For Abort services based on interrupts (HAL_IRDA_Abortxxx_IT), a set of Abort Complete Callbacks are provided:
AnnaBridge 189:f392fc9709a3 763 (+) HAL_IRDA_AbortCpltCallback()
AnnaBridge 189:f392fc9709a3 764 (+) HAL_IRDA_AbortTransmitCpltCallback()
AnnaBridge 189:f392fc9709a3 765 (+) HAL_IRDA_AbortReceiveCpltCallback()
AnnaBridge 189:f392fc9709a3 766
AnnaBridge 189:f392fc9709a3 767 (#) In Non-Blocking mode transfers, possible errors are split into 2 categories.
AnnaBridge 189:f392fc9709a3 768 Errors are handled as follows :
AnnaBridge 189:f392fc9709a3 769 (+) Error is considered as Recoverable and non blocking : Transfer could go till end, but error severity is
AnnaBridge 189:f392fc9709a3 770 to be evaluated by user : this concerns Frame Error, Parity Error or Noise Error in Interrupt mode reception .
AnnaBridge 189:f392fc9709a3 771 Received character is then retrieved and stored in Rx buffer, Error code is set to allow user to identify error type,
AnnaBridge 189:f392fc9709a3 772 and HAL_IRDA_ErrorCallback() user callback is executed. Transfer is kept ongoing on IRDA side.
AnnaBridge 189:f392fc9709a3 773 If user wants to abort it, Abort services should be called by user.
AnnaBridge 189:f392fc9709a3 774 (+) Error is considered as Blocking : Transfer could not be completed properly and is aborted.
AnnaBridge 189:f392fc9709a3 775 This concerns Overrun Error In Interrupt mode reception and all errors in DMA mode.
AnnaBridge 189:f392fc9709a3 776 Error code is set to allow user to identify error type, and HAL_IRDA_ErrorCallback() user callback is executed.
AnnaBridge 189:f392fc9709a3 777
AnnaBridge 189:f392fc9709a3 778 @endverbatim
AnnaBridge 189:f392fc9709a3 779 * @{
AnnaBridge 189:f392fc9709a3 780 */
AnnaBridge 189:f392fc9709a3 781
AnnaBridge 189:f392fc9709a3 782 /**
AnnaBridge 189:f392fc9709a3 783 * @brief Send an amount of data in blocking mode.
AnnaBridge 189:f392fc9709a3 784 * @param hirda Pointer to a IRDA_HandleTypeDef structure that contains
AnnaBridge 189:f392fc9709a3 785 * the configuration information for the specified IRDA module.
AnnaBridge 189:f392fc9709a3 786 * @param pData Pointer to data buffer.
AnnaBridge 189:f392fc9709a3 787 * @param Size Amount of data to be sent.
AnnaBridge 189:f392fc9709a3 788 * @param Timeout Specify timeout value.
AnnaBridge 189:f392fc9709a3 789 * @retval HAL status
AnnaBridge 189:f392fc9709a3 790 */
AnnaBridge 189:f392fc9709a3 791 HAL_StatusTypeDef HAL_IRDA_Transmit(IRDA_HandleTypeDef *hirda, uint8_t *pData, uint16_t Size, uint32_t Timeout)
AnnaBridge 189:f392fc9709a3 792 {
AnnaBridge 189:f392fc9709a3 793 uint8_t *pdata8bits;
AnnaBridge 189:f392fc9709a3 794 uint16_t *pdata16bits;
AnnaBridge 189:f392fc9709a3 795 uint32_t tickstart;
AnnaBridge 189:f392fc9709a3 796
AnnaBridge 189:f392fc9709a3 797 /* Check that a Tx process is not already ongoing */
AnnaBridge 189:f392fc9709a3 798 if (hirda->gState == HAL_IRDA_STATE_READY)
AnnaBridge 189:f392fc9709a3 799 {
AnnaBridge 189:f392fc9709a3 800 if ((pData == NULL) || (Size == 0U))
AnnaBridge 189:f392fc9709a3 801 {
AnnaBridge 189:f392fc9709a3 802 return HAL_ERROR;
AnnaBridge 189:f392fc9709a3 803 }
AnnaBridge 189:f392fc9709a3 804
AnnaBridge 189:f392fc9709a3 805 /* Process Locked */
AnnaBridge 189:f392fc9709a3 806 __HAL_LOCK(hirda);
AnnaBridge 189:f392fc9709a3 807
AnnaBridge 189:f392fc9709a3 808 hirda->ErrorCode = HAL_IRDA_ERROR_NONE;
AnnaBridge 189:f392fc9709a3 809 hirda->gState = HAL_IRDA_STATE_BUSY_TX;
AnnaBridge 189:f392fc9709a3 810
AnnaBridge 189:f392fc9709a3 811 /* Init tickstart for timeout managment*/
AnnaBridge 189:f392fc9709a3 812 tickstart = HAL_GetTick();
AnnaBridge 189:f392fc9709a3 813
AnnaBridge 189:f392fc9709a3 814 hirda->TxXferSize = Size;
AnnaBridge 189:f392fc9709a3 815 hirda->TxXferCount = Size;
AnnaBridge 189:f392fc9709a3 816
AnnaBridge 189:f392fc9709a3 817 /* In case of 9bits/No Parity transfer, pData needs to be handled as a uint16_t pointer */
AnnaBridge 189:f392fc9709a3 818 if ((hirda->Init.WordLength == IRDA_WORDLENGTH_9B) && (hirda->Init.Parity == IRDA_PARITY_NONE))
AnnaBridge 189:f392fc9709a3 819 {
AnnaBridge 189:f392fc9709a3 820 pdata8bits = NULL;
AnnaBridge 189:f392fc9709a3 821 pdata16bits = (uint16_t *) pData; /* Derogation R.11.3 */
AnnaBridge 189:f392fc9709a3 822 }
AnnaBridge 189:f392fc9709a3 823 else
AnnaBridge 189:f392fc9709a3 824 {
AnnaBridge 189:f392fc9709a3 825 pdata8bits = pData;
AnnaBridge 189:f392fc9709a3 826 pdata16bits = NULL;
AnnaBridge 189:f392fc9709a3 827 }
AnnaBridge 189:f392fc9709a3 828
AnnaBridge 189:f392fc9709a3 829 while (hirda->TxXferCount > 0U)
AnnaBridge 189:f392fc9709a3 830 {
AnnaBridge 189:f392fc9709a3 831 hirda->TxXferCount--;
AnnaBridge 189:f392fc9709a3 832
AnnaBridge 189:f392fc9709a3 833 if (IRDA_WaitOnFlagUntilTimeout(hirda, IRDA_FLAG_TXE, RESET, tickstart, Timeout) != HAL_OK)
AnnaBridge 189:f392fc9709a3 834 {
AnnaBridge 189:f392fc9709a3 835 return HAL_TIMEOUT;
AnnaBridge 189:f392fc9709a3 836 }
AnnaBridge 189:f392fc9709a3 837 if (pdata8bits == NULL)
AnnaBridge 189:f392fc9709a3 838 {
AnnaBridge 189:f392fc9709a3 839 hirda->Instance->TDR = (uint16_t)(*pdata16bits & 0x01FFU);
AnnaBridge 189:f392fc9709a3 840 pdata16bits++;
AnnaBridge 189:f392fc9709a3 841 }
AnnaBridge 189:f392fc9709a3 842 else
AnnaBridge 189:f392fc9709a3 843 {
AnnaBridge 189:f392fc9709a3 844 hirda->Instance->TDR = (uint8_t)(*pdata8bits & 0xFFU);
AnnaBridge 189:f392fc9709a3 845 pdata8bits++;
AnnaBridge 189:f392fc9709a3 846 }
AnnaBridge 189:f392fc9709a3 847 }
AnnaBridge 189:f392fc9709a3 848
AnnaBridge 189:f392fc9709a3 849 if (IRDA_WaitOnFlagUntilTimeout(hirda, IRDA_FLAG_TC, RESET, tickstart, Timeout) != HAL_OK)
AnnaBridge 189:f392fc9709a3 850 {
AnnaBridge 189:f392fc9709a3 851 return HAL_TIMEOUT;
AnnaBridge 189:f392fc9709a3 852 }
AnnaBridge 189:f392fc9709a3 853
AnnaBridge 189:f392fc9709a3 854 /* At end of Tx process, restore hirda->gState to Ready */
AnnaBridge 189:f392fc9709a3 855 hirda->gState = HAL_IRDA_STATE_READY;
AnnaBridge 189:f392fc9709a3 856
AnnaBridge 189:f392fc9709a3 857 /* Process Unlocked */
AnnaBridge 189:f392fc9709a3 858 __HAL_UNLOCK(hirda);
AnnaBridge 189:f392fc9709a3 859
AnnaBridge 189:f392fc9709a3 860 return HAL_OK;
AnnaBridge 189:f392fc9709a3 861 }
AnnaBridge 189:f392fc9709a3 862 else
AnnaBridge 189:f392fc9709a3 863 {
AnnaBridge 189:f392fc9709a3 864 return HAL_BUSY;
AnnaBridge 189:f392fc9709a3 865 }
AnnaBridge 189:f392fc9709a3 866 }
AnnaBridge 189:f392fc9709a3 867
AnnaBridge 189:f392fc9709a3 868 /**
AnnaBridge 189:f392fc9709a3 869 * @brief Receive an amount of data in blocking mode.
AnnaBridge 189:f392fc9709a3 870 * @param hirda Pointer to a IRDA_HandleTypeDef structure that contains
AnnaBridge 189:f392fc9709a3 871 * the configuration information for the specified IRDA module.
AnnaBridge 189:f392fc9709a3 872 * @param pData Pointer to data buffer.
AnnaBridge 189:f392fc9709a3 873 * @param Size Amount of data to be received.
AnnaBridge 189:f392fc9709a3 874 * @param Timeout Specify timeout value.
AnnaBridge 189:f392fc9709a3 875 * @retval HAL status
AnnaBridge 189:f392fc9709a3 876 */
AnnaBridge 189:f392fc9709a3 877 HAL_StatusTypeDef HAL_IRDA_Receive(IRDA_HandleTypeDef *hirda, uint8_t *pData, uint16_t Size, uint32_t Timeout)
AnnaBridge 189:f392fc9709a3 878 {
AnnaBridge 189:f392fc9709a3 879 uint8_t *pdata8bits;
AnnaBridge 189:f392fc9709a3 880 uint16_t *pdata16bits;
AnnaBridge 189:f392fc9709a3 881 uint16_t uhMask;
AnnaBridge 189:f392fc9709a3 882 uint32_t tickstart;
AnnaBridge 189:f392fc9709a3 883
AnnaBridge 189:f392fc9709a3 884 /* Check that a Rx process is not already ongoing */
AnnaBridge 189:f392fc9709a3 885 if (hirda->RxState == HAL_IRDA_STATE_READY)
AnnaBridge 189:f392fc9709a3 886 {
AnnaBridge 189:f392fc9709a3 887 if ((pData == NULL) || (Size == 0U))
AnnaBridge 189:f392fc9709a3 888 {
AnnaBridge 189:f392fc9709a3 889 return HAL_ERROR;
AnnaBridge 189:f392fc9709a3 890 }
AnnaBridge 189:f392fc9709a3 891
AnnaBridge 189:f392fc9709a3 892 /* Process Locked */
AnnaBridge 189:f392fc9709a3 893 __HAL_LOCK(hirda);
AnnaBridge 189:f392fc9709a3 894
AnnaBridge 189:f392fc9709a3 895 hirda->ErrorCode = HAL_IRDA_ERROR_NONE;
AnnaBridge 189:f392fc9709a3 896 hirda->RxState = HAL_IRDA_STATE_BUSY_RX;
AnnaBridge 189:f392fc9709a3 897
AnnaBridge 189:f392fc9709a3 898 /* Init tickstart for timeout managment*/
AnnaBridge 189:f392fc9709a3 899 tickstart = HAL_GetTick();
AnnaBridge 189:f392fc9709a3 900
AnnaBridge 189:f392fc9709a3 901 hirda->RxXferSize = Size;
AnnaBridge 189:f392fc9709a3 902 hirda->RxXferCount = Size;
AnnaBridge 189:f392fc9709a3 903
AnnaBridge 189:f392fc9709a3 904 /* Computation of the mask to apply to RDR register
AnnaBridge 189:f392fc9709a3 905 of the UART associated to the IRDA */
AnnaBridge 189:f392fc9709a3 906 IRDA_MASK_COMPUTATION(hirda);
AnnaBridge 189:f392fc9709a3 907 uhMask = hirda->Mask;
AnnaBridge 189:f392fc9709a3 908
AnnaBridge 189:f392fc9709a3 909 /* In case of 9bits/No Parity transfer, pRxData needs to be handled as a uint16_t pointer */
AnnaBridge 189:f392fc9709a3 910 if ((hirda->Init.WordLength == IRDA_WORDLENGTH_9B) && (hirda->Init.Parity == IRDA_PARITY_NONE))
AnnaBridge 189:f392fc9709a3 911 {
AnnaBridge 189:f392fc9709a3 912 pdata8bits = NULL;
AnnaBridge 189:f392fc9709a3 913 pdata16bits = (uint16_t *) pData; /* Derogation R.11.3 */
AnnaBridge 189:f392fc9709a3 914 }
AnnaBridge 189:f392fc9709a3 915 else
AnnaBridge 189:f392fc9709a3 916 {
AnnaBridge 189:f392fc9709a3 917 pdata8bits = pData;
AnnaBridge 189:f392fc9709a3 918 pdata16bits = NULL;
AnnaBridge 189:f392fc9709a3 919 }
AnnaBridge 189:f392fc9709a3 920
AnnaBridge 189:f392fc9709a3 921 /* Check data remaining to be received */
AnnaBridge 189:f392fc9709a3 922 while (hirda->RxXferCount > 0U)
AnnaBridge 189:f392fc9709a3 923 {
AnnaBridge 189:f392fc9709a3 924 hirda->RxXferCount--;
AnnaBridge 189:f392fc9709a3 925
AnnaBridge 189:f392fc9709a3 926 if (IRDA_WaitOnFlagUntilTimeout(hirda, IRDA_FLAG_RXNE, RESET, tickstart, Timeout) != HAL_OK)
AnnaBridge 189:f392fc9709a3 927 {
AnnaBridge 189:f392fc9709a3 928 return HAL_TIMEOUT;
AnnaBridge 189:f392fc9709a3 929 }
AnnaBridge 189:f392fc9709a3 930 if (pdata8bits == NULL)
AnnaBridge 189:f392fc9709a3 931 {
AnnaBridge 189:f392fc9709a3 932 *pdata16bits = (uint16_t)(hirda->Instance->RDR & uhMask);
AnnaBridge 189:f392fc9709a3 933 pdata16bits++;
AnnaBridge 189:f392fc9709a3 934 }
AnnaBridge 189:f392fc9709a3 935 else
AnnaBridge 189:f392fc9709a3 936 {
AnnaBridge 189:f392fc9709a3 937 *pdata8bits = (uint8_t)(hirda->Instance->RDR & (uint8_t)uhMask);
AnnaBridge 189:f392fc9709a3 938 pdata8bits++;
AnnaBridge 189:f392fc9709a3 939 }
AnnaBridge 189:f392fc9709a3 940 }
AnnaBridge 189:f392fc9709a3 941
AnnaBridge 189:f392fc9709a3 942 /* At end of Rx process, restore hirda->RxState to Ready */
AnnaBridge 189:f392fc9709a3 943 hirda->RxState = HAL_IRDA_STATE_READY;
AnnaBridge 189:f392fc9709a3 944
AnnaBridge 189:f392fc9709a3 945 /* Process Unlocked */
AnnaBridge 189:f392fc9709a3 946 __HAL_UNLOCK(hirda);
AnnaBridge 189:f392fc9709a3 947
AnnaBridge 189:f392fc9709a3 948 return HAL_OK;
AnnaBridge 189:f392fc9709a3 949 }
AnnaBridge 189:f392fc9709a3 950 else
AnnaBridge 189:f392fc9709a3 951 {
AnnaBridge 189:f392fc9709a3 952 return HAL_BUSY;
AnnaBridge 189:f392fc9709a3 953 }
AnnaBridge 189:f392fc9709a3 954 }
AnnaBridge 189:f392fc9709a3 955
AnnaBridge 189:f392fc9709a3 956 /**
AnnaBridge 189:f392fc9709a3 957 * @brief Send an amount of data in interrupt mode.
AnnaBridge 189:f392fc9709a3 958 * @param hirda Pointer to a IRDA_HandleTypeDef structure that contains
AnnaBridge 189:f392fc9709a3 959 * the configuration information for the specified IRDA module.
AnnaBridge 189:f392fc9709a3 960 * @param pData Pointer to data buffer.
AnnaBridge 189:f392fc9709a3 961 * @param Size Amount of data to be sent.
AnnaBridge 189:f392fc9709a3 962 * @retval HAL status
AnnaBridge 189:f392fc9709a3 963 */
AnnaBridge 189:f392fc9709a3 964 HAL_StatusTypeDef HAL_IRDA_Transmit_IT(IRDA_HandleTypeDef *hirda, uint8_t *pData, uint16_t Size)
AnnaBridge 189:f392fc9709a3 965 {
AnnaBridge 189:f392fc9709a3 966 /* Check that a Tx process is not already ongoing */
AnnaBridge 189:f392fc9709a3 967 if (hirda->gState == HAL_IRDA_STATE_READY)
AnnaBridge 189:f392fc9709a3 968 {
AnnaBridge 189:f392fc9709a3 969 if ((pData == NULL) || (Size == 0U))
AnnaBridge 189:f392fc9709a3 970 {
AnnaBridge 189:f392fc9709a3 971 return HAL_ERROR;
AnnaBridge 189:f392fc9709a3 972 }
AnnaBridge 189:f392fc9709a3 973
AnnaBridge 189:f392fc9709a3 974 /* Process Locked */
AnnaBridge 189:f392fc9709a3 975 __HAL_LOCK(hirda);
AnnaBridge 189:f392fc9709a3 976
AnnaBridge 189:f392fc9709a3 977 hirda->pTxBuffPtr = pData;
AnnaBridge 189:f392fc9709a3 978 hirda->TxXferSize = Size;
AnnaBridge 189:f392fc9709a3 979 hirda->TxXferCount = Size;
AnnaBridge 189:f392fc9709a3 980
AnnaBridge 189:f392fc9709a3 981 hirda->ErrorCode = HAL_IRDA_ERROR_NONE;
AnnaBridge 189:f392fc9709a3 982 hirda->gState = HAL_IRDA_STATE_BUSY_TX;
AnnaBridge 189:f392fc9709a3 983
AnnaBridge 189:f392fc9709a3 984 /* Process Unlocked */
AnnaBridge 189:f392fc9709a3 985 __HAL_UNLOCK(hirda);
AnnaBridge 189:f392fc9709a3 986
AnnaBridge 189:f392fc9709a3 987 /* Enable the IRDA Transmit Data Register Empty Interrupt */
AnnaBridge 189:f392fc9709a3 988 SET_BIT(hirda->Instance->CR1, USART_CR1_TXEIE_TXFNFIE);
AnnaBridge 189:f392fc9709a3 989
AnnaBridge 189:f392fc9709a3 990 return HAL_OK;
AnnaBridge 189:f392fc9709a3 991 }
AnnaBridge 189:f392fc9709a3 992 else
AnnaBridge 189:f392fc9709a3 993 {
AnnaBridge 189:f392fc9709a3 994 return HAL_BUSY;
AnnaBridge 189:f392fc9709a3 995 }
AnnaBridge 189:f392fc9709a3 996 }
AnnaBridge 189:f392fc9709a3 997
AnnaBridge 189:f392fc9709a3 998 /**
AnnaBridge 189:f392fc9709a3 999 * @brief Receive an amount of data in interrupt mode.
AnnaBridge 189:f392fc9709a3 1000 * @param hirda Pointer to a IRDA_HandleTypeDef structure that contains
AnnaBridge 189:f392fc9709a3 1001 * the configuration information for the specified IRDA module.
AnnaBridge 189:f392fc9709a3 1002 * @param pData Pointer to data buffer.
AnnaBridge 189:f392fc9709a3 1003 * @param Size Amount of data to be received.
AnnaBridge 189:f392fc9709a3 1004 * @retval HAL status
AnnaBridge 189:f392fc9709a3 1005 */
AnnaBridge 189:f392fc9709a3 1006 HAL_StatusTypeDef HAL_IRDA_Receive_IT(IRDA_HandleTypeDef *hirda, uint8_t *pData, uint16_t Size)
AnnaBridge 189:f392fc9709a3 1007 {
AnnaBridge 189:f392fc9709a3 1008 /* Check that a Rx process is not already ongoing */
AnnaBridge 189:f392fc9709a3 1009 if (hirda->RxState == HAL_IRDA_STATE_READY)
AnnaBridge 189:f392fc9709a3 1010 {
AnnaBridge 189:f392fc9709a3 1011 if ((pData == NULL) || (Size == 0U))
AnnaBridge 189:f392fc9709a3 1012 {
AnnaBridge 189:f392fc9709a3 1013 return HAL_ERROR;
AnnaBridge 189:f392fc9709a3 1014 }
AnnaBridge 189:f392fc9709a3 1015
AnnaBridge 189:f392fc9709a3 1016 /* Process Locked */
AnnaBridge 189:f392fc9709a3 1017 __HAL_LOCK(hirda);
AnnaBridge 189:f392fc9709a3 1018
AnnaBridge 189:f392fc9709a3 1019 hirda->pRxBuffPtr = pData;
AnnaBridge 189:f392fc9709a3 1020 hirda->RxXferSize = Size;
AnnaBridge 189:f392fc9709a3 1021 hirda->RxXferCount = Size;
AnnaBridge 189:f392fc9709a3 1022
AnnaBridge 189:f392fc9709a3 1023 /* Computation of the mask to apply to the RDR register
AnnaBridge 189:f392fc9709a3 1024 of the UART associated to the IRDA */
AnnaBridge 189:f392fc9709a3 1025 IRDA_MASK_COMPUTATION(hirda);
AnnaBridge 189:f392fc9709a3 1026
AnnaBridge 189:f392fc9709a3 1027 hirda->ErrorCode = HAL_IRDA_ERROR_NONE;
AnnaBridge 189:f392fc9709a3 1028 hirda->RxState = HAL_IRDA_STATE_BUSY_RX;
AnnaBridge 189:f392fc9709a3 1029
AnnaBridge 189:f392fc9709a3 1030 /* Process Unlocked */
AnnaBridge 189:f392fc9709a3 1031 __HAL_UNLOCK(hirda);
AnnaBridge 189:f392fc9709a3 1032
AnnaBridge 189:f392fc9709a3 1033 /* Enable the IRDA Parity Error and Data Register not empty Interrupts */
AnnaBridge 189:f392fc9709a3 1034 SET_BIT(hirda->Instance->CR1, USART_CR1_PEIE | USART_CR1_RXNEIE_RXFNEIE);
AnnaBridge 189:f392fc9709a3 1035
AnnaBridge 189:f392fc9709a3 1036 /* Enable the IRDA Error Interrupt: (Frame error, noise error, overrun error) */
AnnaBridge 189:f392fc9709a3 1037 SET_BIT(hirda->Instance->CR3, USART_CR3_EIE);
AnnaBridge 189:f392fc9709a3 1038
AnnaBridge 189:f392fc9709a3 1039 return HAL_OK;
AnnaBridge 189:f392fc9709a3 1040 }
AnnaBridge 189:f392fc9709a3 1041 else
AnnaBridge 189:f392fc9709a3 1042 {
AnnaBridge 189:f392fc9709a3 1043 return HAL_BUSY;
AnnaBridge 189:f392fc9709a3 1044 }
AnnaBridge 189:f392fc9709a3 1045 }
AnnaBridge 189:f392fc9709a3 1046
AnnaBridge 189:f392fc9709a3 1047 /**
AnnaBridge 189:f392fc9709a3 1048 * @brief Send an amount of data in DMA mode.
AnnaBridge 189:f392fc9709a3 1049 * @param hirda Pointer to a IRDA_HandleTypeDef structure that contains
AnnaBridge 189:f392fc9709a3 1050 * the configuration information for the specified IRDA module.
AnnaBridge 189:f392fc9709a3 1051 * @param pData pointer to data buffer.
AnnaBridge 189:f392fc9709a3 1052 * @param Size amount of data to be sent.
AnnaBridge 189:f392fc9709a3 1053 * @retval HAL status
AnnaBridge 189:f392fc9709a3 1054 */
AnnaBridge 189:f392fc9709a3 1055 HAL_StatusTypeDef HAL_IRDA_Transmit_DMA(IRDA_HandleTypeDef *hirda, uint8_t *pData, uint16_t Size)
AnnaBridge 189:f392fc9709a3 1056 {
AnnaBridge 189:f392fc9709a3 1057 /* Check that a Tx process is not already ongoing */
AnnaBridge 189:f392fc9709a3 1058 if (hirda->gState == HAL_IRDA_STATE_READY)
AnnaBridge 189:f392fc9709a3 1059 {
AnnaBridge 189:f392fc9709a3 1060 if ((pData == NULL) || (Size == 0U))
AnnaBridge 189:f392fc9709a3 1061 {
AnnaBridge 189:f392fc9709a3 1062 return HAL_ERROR;
AnnaBridge 189:f392fc9709a3 1063 }
AnnaBridge 189:f392fc9709a3 1064
AnnaBridge 189:f392fc9709a3 1065 /* Process Locked */
AnnaBridge 189:f392fc9709a3 1066 __HAL_LOCK(hirda);
AnnaBridge 189:f392fc9709a3 1067
AnnaBridge 189:f392fc9709a3 1068 hirda->pTxBuffPtr = pData;
AnnaBridge 189:f392fc9709a3 1069 hirda->TxXferSize = Size;
AnnaBridge 189:f392fc9709a3 1070 hirda->TxXferCount = Size;
AnnaBridge 189:f392fc9709a3 1071
AnnaBridge 189:f392fc9709a3 1072 hirda->ErrorCode = HAL_IRDA_ERROR_NONE;
AnnaBridge 189:f392fc9709a3 1073 hirda->gState = HAL_IRDA_STATE_BUSY_TX;
AnnaBridge 189:f392fc9709a3 1074
AnnaBridge 189:f392fc9709a3 1075 /* Set the IRDA DMA transfer complete callback */
AnnaBridge 189:f392fc9709a3 1076 hirda->hdmatx->XferCpltCallback = IRDA_DMATransmitCplt;
AnnaBridge 189:f392fc9709a3 1077
AnnaBridge 189:f392fc9709a3 1078 /* Set the IRDA DMA half transfer complete callback */
AnnaBridge 189:f392fc9709a3 1079 hirda->hdmatx->XferHalfCpltCallback = IRDA_DMATransmitHalfCplt;
AnnaBridge 189:f392fc9709a3 1080
AnnaBridge 189:f392fc9709a3 1081 /* Set the DMA error callback */
AnnaBridge 189:f392fc9709a3 1082 hirda->hdmatx->XferErrorCallback = IRDA_DMAError;
AnnaBridge 189:f392fc9709a3 1083
AnnaBridge 189:f392fc9709a3 1084 /* Set the DMA abort callback */
AnnaBridge 189:f392fc9709a3 1085 hirda->hdmatx->XferAbortCallback = NULL;
AnnaBridge 189:f392fc9709a3 1086
AnnaBridge 189:f392fc9709a3 1087 /* Enable the IRDA transmit DMA channel */
AnnaBridge 189:f392fc9709a3 1088 if (HAL_DMA_Start_IT(hirda->hdmatx, (uint32_t)hirda->pTxBuffPtr, (uint32_t)&hirda->Instance->TDR, Size) == HAL_OK)
AnnaBridge 189:f392fc9709a3 1089 {
AnnaBridge 189:f392fc9709a3 1090 /* Clear the TC flag in the ICR register */
AnnaBridge 189:f392fc9709a3 1091 __HAL_IRDA_CLEAR_FLAG(hirda, IRDA_CLEAR_TCF);
AnnaBridge 189:f392fc9709a3 1092
AnnaBridge 189:f392fc9709a3 1093 /* Process Unlocked */
AnnaBridge 189:f392fc9709a3 1094 __HAL_UNLOCK(hirda);
AnnaBridge 189:f392fc9709a3 1095
AnnaBridge 189:f392fc9709a3 1096 /* Enable the DMA transfer for transmit request by setting the DMAT bit
AnnaBridge 189:f392fc9709a3 1097 in the USART CR3 register */
AnnaBridge 189:f392fc9709a3 1098 SET_BIT(hirda->Instance->CR3, USART_CR3_DMAT);
AnnaBridge 189:f392fc9709a3 1099
AnnaBridge 189:f392fc9709a3 1100 return HAL_OK;
AnnaBridge 189:f392fc9709a3 1101 }
AnnaBridge 189:f392fc9709a3 1102 else
AnnaBridge 189:f392fc9709a3 1103 {
AnnaBridge 189:f392fc9709a3 1104 /* Set error code to DMA */
AnnaBridge 189:f392fc9709a3 1105 hirda->ErrorCode = HAL_IRDA_ERROR_DMA;
AnnaBridge 189:f392fc9709a3 1106
AnnaBridge 189:f392fc9709a3 1107 /* Process Unlocked */
AnnaBridge 189:f392fc9709a3 1108 __HAL_UNLOCK(hirda);
AnnaBridge 189:f392fc9709a3 1109
AnnaBridge 189:f392fc9709a3 1110 /* Restore hirda->gState to ready */
AnnaBridge 189:f392fc9709a3 1111 hirda->gState = HAL_IRDA_STATE_READY;
AnnaBridge 189:f392fc9709a3 1112
AnnaBridge 189:f392fc9709a3 1113 return HAL_ERROR;
AnnaBridge 189:f392fc9709a3 1114 }
AnnaBridge 189:f392fc9709a3 1115 }
AnnaBridge 189:f392fc9709a3 1116 else
AnnaBridge 189:f392fc9709a3 1117 {
AnnaBridge 189:f392fc9709a3 1118 return HAL_BUSY;
AnnaBridge 189:f392fc9709a3 1119 }
AnnaBridge 189:f392fc9709a3 1120 }
AnnaBridge 189:f392fc9709a3 1121
AnnaBridge 189:f392fc9709a3 1122 /**
AnnaBridge 189:f392fc9709a3 1123 * @brief Receive an amount of data in DMA mode.
AnnaBridge 189:f392fc9709a3 1124 * @note When the IRDA parity is enabled (PCE = 1), the received data contains
AnnaBridge 189:f392fc9709a3 1125 * the parity bit (MSB position).
AnnaBridge 189:f392fc9709a3 1126 * @param hirda Pointer to a IRDA_HandleTypeDef structure that contains
AnnaBridge 189:f392fc9709a3 1127 * the configuration information for the specified IRDA module.
AnnaBridge 189:f392fc9709a3 1128 * @param pData Pointer to data buffer.
AnnaBridge 189:f392fc9709a3 1129 * @param Size Amount of data to be received.
AnnaBridge 189:f392fc9709a3 1130 * @retval HAL status
AnnaBridge 189:f392fc9709a3 1131 */
AnnaBridge 189:f392fc9709a3 1132 HAL_StatusTypeDef HAL_IRDA_Receive_DMA(IRDA_HandleTypeDef *hirda, uint8_t *pData, uint16_t Size)
AnnaBridge 189:f392fc9709a3 1133 {
AnnaBridge 189:f392fc9709a3 1134 /* Check that a Rx process is not already ongoing */
AnnaBridge 189:f392fc9709a3 1135 if (hirda->RxState == HAL_IRDA_STATE_READY)
AnnaBridge 189:f392fc9709a3 1136 {
AnnaBridge 189:f392fc9709a3 1137 if ((pData == NULL) || (Size == 0U))
AnnaBridge 189:f392fc9709a3 1138 {
AnnaBridge 189:f392fc9709a3 1139 return HAL_ERROR;
AnnaBridge 189:f392fc9709a3 1140 }
AnnaBridge 189:f392fc9709a3 1141
AnnaBridge 189:f392fc9709a3 1142 /* Process Locked */
AnnaBridge 189:f392fc9709a3 1143 __HAL_LOCK(hirda);
AnnaBridge 189:f392fc9709a3 1144
AnnaBridge 189:f392fc9709a3 1145 hirda->pRxBuffPtr = pData;
AnnaBridge 189:f392fc9709a3 1146 hirda->RxXferSize = Size;
AnnaBridge 189:f392fc9709a3 1147
AnnaBridge 189:f392fc9709a3 1148 hirda->ErrorCode = HAL_IRDA_ERROR_NONE;
AnnaBridge 189:f392fc9709a3 1149 hirda->RxState = HAL_IRDA_STATE_BUSY_RX;
AnnaBridge 189:f392fc9709a3 1150
AnnaBridge 189:f392fc9709a3 1151 /* Set the IRDA DMA transfer complete callback */
AnnaBridge 189:f392fc9709a3 1152 hirda->hdmarx->XferCpltCallback = IRDA_DMAReceiveCplt;
AnnaBridge 189:f392fc9709a3 1153
AnnaBridge 189:f392fc9709a3 1154 /* Set the IRDA DMA half transfer complete callback */
AnnaBridge 189:f392fc9709a3 1155 hirda->hdmarx->XferHalfCpltCallback = IRDA_DMAReceiveHalfCplt;
AnnaBridge 189:f392fc9709a3 1156
AnnaBridge 189:f392fc9709a3 1157 /* Set the DMA error callback */
AnnaBridge 189:f392fc9709a3 1158 hirda->hdmarx->XferErrorCallback = IRDA_DMAError;
AnnaBridge 189:f392fc9709a3 1159
AnnaBridge 189:f392fc9709a3 1160 /* Set the DMA abort callback */
AnnaBridge 189:f392fc9709a3 1161 hirda->hdmarx->XferAbortCallback = NULL;
AnnaBridge 189:f392fc9709a3 1162
AnnaBridge 189:f392fc9709a3 1163 /* Enable the DMA channel */
AnnaBridge 189:f392fc9709a3 1164 if (HAL_DMA_Start_IT(hirda->hdmarx, (uint32_t)&hirda->Instance->RDR, (uint32_t)hirda->pRxBuffPtr, Size) == HAL_OK)
AnnaBridge 189:f392fc9709a3 1165 {
AnnaBridge 189:f392fc9709a3 1166 /* Process Unlocked */
AnnaBridge 189:f392fc9709a3 1167 __HAL_UNLOCK(hirda);
AnnaBridge 189:f392fc9709a3 1168
AnnaBridge 189:f392fc9709a3 1169 /* Enable the UART Parity Error Interrupt */
AnnaBridge 189:f392fc9709a3 1170 SET_BIT(hirda->Instance->CR1, USART_CR1_PEIE);
AnnaBridge 189:f392fc9709a3 1171
AnnaBridge 189:f392fc9709a3 1172 /* Enable the UART Error Interrupt: (Frame error, noise error, overrun error) */
AnnaBridge 189:f392fc9709a3 1173 SET_BIT(hirda->Instance->CR3, USART_CR3_EIE);
AnnaBridge 189:f392fc9709a3 1174
AnnaBridge 189:f392fc9709a3 1175 /* Enable the DMA transfer for the receiver request by setting the DMAR bit
AnnaBridge 189:f392fc9709a3 1176 in the USART CR3 register */
AnnaBridge 189:f392fc9709a3 1177 SET_BIT(hirda->Instance->CR3, USART_CR3_DMAR);
AnnaBridge 189:f392fc9709a3 1178
AnnaBridge 189:f392fc9709a3 1179 return HAL_OK;
AnnaBridge 189:f392fc9709a3 1180 }
AnnaBridge 189:f392fc9709a3 1181 else
AnnaBridge 189:f392fc9709a3 1182 {
AnnaBridge 189:f392fc9709a3 1183 /* Set error code to DMA */
AnnaBridge 189:f392fc9709a3 1184 hirda->ErrorCode = HAL_IRDA_ERROR_DMA;
AnnaBridge 189:f392fc9709a3 1185
AnnaBridge 189:f392fc9709a3 1186 /* Process Unlocked */
AnnaBridge 189:f392fc9709a3 1187 __HAL_UNLOCK(hirda);
AnnaBridge 189:f392fc9709a3 1188
AnnaBridge 189:f392fc9709a3 1189 /* Restore hirda->RxState to ready */
AnnaBridge 189:f392fc9709a3 1190 hirda->RxState = HAL_IRDA_STATE_READY;
AnnaBridge 189:f392fc9709a3 1191
AnnaBridge 189:f392fc9709a3 1192 return HAL_ERROR;
AnnaBridge 189:f392fc9709a3 1193 }
AnnaBridge 189:f392fc9709a3 1194 }
AnnaBridge 189:f392fc9709a3 1195 else
AnnaBridge 189:f392fc9709a3 1196 {
AnnaBridge 189:f392fc9709a3 1197 return HAL_BUSY;
AnnaBridge 189:f392fc9709a3 1198 }
AnnaBridge 189:f392fc9709a3 1199 }
AnnaBridge 189:f392fc9709a3 1200
AnnaBridge 189:f392fc9709a3 1201
AnnaBridge 189:f392fc9709a3 1202 /**
AnnaBridge 189:f392fc9709a3 1203 * @brief Pause the DMA Transfer.
AnnaBridge 189:f392fc9709a3 1204 * @param hirda Pointer to a IRDA_HandleTypeDef structure that contains
AnnaBridge 189:f392fc9709a3 1205 * the configuration information for the specified IRDA module.
AnnaBridge 189:f392fc9709a3 1206 * @retval HAL status
AnnaBridge 189:f392fc9709a3 1207 */
AnnaBridge 189:f392fc9709a3 1208 HAL_StatusTypeDef HAL_IRDA_DMAPause(IRDA_HandleTypeDef *hirda)
AnnaBridge 189:f392fc9709a3 1209 {
AnnaBridge 189:f392fc9709a3 1210 /* Process Locked */
AnnaBridge 189:f392fc9709a3 1211 __HAL_LOCK(hirda);
AnnaBridge 189:f392fc9709a3 1212
AnnaBridge 189:f392fc9709a3 1213 if (hirda->gState == HAL_IRDA_STATE_BUSY_TX)
AnnaBridge 189:f392fc9709a3 1214 {
AnnaBridge 189:f392fc9709a3 1215 if (HAL_IS_BIT_SET(hirda->Instance->CR3, USART_CR3_DMAT))
AnnaBridge 189:f392fc9709a3 1216 {
AnnaBridge 189:f392fc9709a3 1217 /* Disable the IRDA DMA Tx request */
AnnaBridge 189:f392fc9709a3 1218 CLEAR_BIT(hirda->Instance->CR3, USART_CR3_DMAT);
AnnaBridge 189:f392fc9709a3 1219 }
AnnaBridge 189:f392fc9709a3 1220 }
AnnaBridge 189:f392fc9709a3 1221 if (hirda->RxState == HAL_IRDA_STATE_BUSY_RX)
AnnaBridge 189:f392fc9709a3 1222 {
AnnaBridge 189:f392fc9709a3 1223 if (HAL_IS_BIT_SET(hirda->Instance->CR3, USART_CR3_DMAR))
AnnaBridge 189:f392fc9709a3 1224 {
AnnaBridge 189:f392fc9709a3 1225 /* Disable PE and ERR (Frame error, noise error, overrun error) interrupts */
AnnaBridge 189:f392fc9709a3 1226 CLEAR_BIT(hirda->Instance->CR1, USART_CR1_PEIE);
AnnaBridge 189:f392fc9709a3 1227 CLEAR_BIT(hirda->Instance->CR3, USART_CR3_EIE);
AnnaBridge 189:f392fc9709a3 1228
AnnaBridge 189:f392fc9709a3 1229 /* Disable the IRDA DMA Rx request */
AnnaBridge 189:f392fc9709a3 1230 CLEAR_BIT(hirda->Instance->CR3, USART_CR3_DMAR);
AnnaBridge 189:f392fc9709a3 1231 }
AnnaBridge 189:f392fc9709a3 1232 }
AnnaBridge 189:f392fc9709a3 1233
AnnaBridge 189:f392fc9709a3 1234 /* Process Unlocked */
AnnaBridge 189:f392fc9709a3 1235 __HAL_UNLOCK(hirda);
AnnaBridge 189:f392fc9709a3 1236
AnnaBridge 189:f392fc9709a3 1237 return HAL_OK;
AnnaBridge 189:f392fc9709a3 1238 }
AnnaBridge 189:f392fc9709a3 1239
AnnaBridge 189:f392fc9709a3 1240 /**
AnnaBridge 189:f392fc9709a3 1241 * @brief Resume the DMA Transfer.
AnnaBridge 189:f392fc9709a3 1242 * @param hirda Pointer to a IRDA_HandleTypeDef structure that contains
AnnaBridge 189:f392fc9709a3 1243 * the configuration information for the specified UART module.
AnnaBridge 189:f392fc9709a3 1244 * @retval HAL status
AnnaBridge 189:f392fc9709a3 1245 */
AnnaBridge 189:f392fc9709a3 1246 HAL_StatusTypeDef HAL_IRDA_DMAResume(IRDA_HandleTypeDef *hirda)
AnnaBridge 189:f392fc9709a3 1247 {
AnnaBridge 189:f392fc9709a3 1248 /* Process Locked */
AnnaBridge 189:f392fc9709a3 1249 __HAL_LOCK(hirda);
AnnaBridge 189:f392fc9709a3 1250
AnnaBridge 189:f392fc9709a3 1251 if (hirda->gState == HAL_IRDA_STATE_BUSY_TX)
AnnaBridge 189:f392fc9709a3 1252 {
AnnaBridge 189:f392fc9709a3 1253 /* Enable the IRDA DMA Tx request */
AnnaBridge 189:f392fc9709a3 1254 SET_BIT(hirda->Instance->CR3, USART_CR3_DMAT);
AnnaBridge 189:f392fc9709a3 1255 }
AnnaBridge 189:f392fc9709a3 1256 if (hirda->RxState == HAL_IRDA_STATE_BUSY_RX)
AnnaBridge 189:f392fc9709a3 1257 {
AnnaBridge 189:f392fc9709a3 1258 /* Clear the Overrun flag before resuming the Rx transfer*/
AnnaBridge 189:f392fc9709a3 1259 __HAL_IRDA_CLEAR_OREFLAG(hirda);
AnnaBridge 189:f392fc9709a3 1260
AnnaBridge 189:f392fc9709a3 1261 /* Reenable PE and ERR (Frame error, noise error, overrun error) interrupts */
AnnaBridge 189:f392fc9709a3 1262 SET_BIT(hirda->Instance->CR1, USART_CR1_PEIE);
AnnaBridge 189:f392fc9709a3 1263 SET_BIT(hirda->Instance->CR3, USART_CR3_EIE);
AnnaBridge 189:f392fc9709a3 1264
AnnaBridge 189:f392fc9709a3 1265 /* Enable the IRDA DMA Rx request */
AnnaBridge 189:f392fc9709a3 1266 SET_BIT(hirda->Instance->CR3, USART_CR3_DMAR);
AnnaBridge 189:f392fc9709a3 1267 }
AnnaBridge 189:f392fc9709a3 1268
AnnaBridge 189:f392fc9709a3 1269 /* Process Unlocked */
AnnaBridge 189:f392fc9709a3 1270 __HAL_UNLOCK(hirda);
AnnaBridge 189:f392fc9709a3 1271
AnnaBridge 189:f392fc9709a3 1272 return HAL_OK;
AnnaBridge 189:f392fc9709a3 1273 }
AnnaBridge 189:f392fc9709a3 1274
AnnaBridge 189:f392fc9709a3 1275 /**
AnnaBridge 189:f392fc9709a3 1276 * @brief Stop the DMA Transfer.
AnnaBridge 189:f392fc9709a3 1277 * @param hirda Pointer to a IRDA_HandleTypeDef structure that contains
AnnaBridge 189:f392fc9709a3 1278 * the configuration information for the specified UART module.
AnnaBridge 189:f392fc9709a3 1279 * @retval HAL status
AnnaBridge 189:f392fc9709a3 1280 */
AnnaBridge 189:f392fc9709a3 1281 HAL_StatusTypeDef HAL_IRDA_DMAStop(IRDA_HandleTypeDef *hirda)
AnnaBridge 189:f392fc9709a3 1282 {
AnnaBridge 189:f392fc9709a3 1283 /* The Lock is not implemented on this API to allow the user application
AnnaBridge 189:f392fc9709a3 1284 to call the HAL IRDA API under callbacks HAL_IRDA_TxCpltCallback() / HAL_IRDA_RxCpltCallback() /
AnnaBridge 189:f392fc9709a3 1285 HAL_IRDA_TxHalfCpltCallback / HAL_IRDA_RxHalfCpltCallback:
AnnaBridge 189:f392fc9709a3 1286 indeed, when HAL_DMA_Abort() API is called, the DMA TX/RX Transfer or Half Transfer complete
AnnaBridge 189:f392fc9709a3 1287 interrupt is generated if the DMA transfer interruption occurs at the middle or at the end of
AnnaBridge 189:f392fc9709a3 1288 the stream and the corresponding call back is executed. */
AnnaBridge 189:f392fc9709a3 1289
AnnaBridge 189:f392fc9709a3 1290 /* Stop IRDA DMA Tx request if ongoing */
AnnaBridge 189:f392fc9709a3 1291 if (hirda->gState == HAL_IRDA_STATE_BUSY_TX)
AnnaBridge 189:f392fc9709a3 1292 {
AnnaBridge 189:f392fc9709a3 1293 if (HAL_IS_BIT_SET(hirda->Instance->CR3, USART_CR3_DMAT))
AnnaBridge 189:f392fc9709a3 1294 {
AnnaBridge 189:f392fc9709a3 1295 CLEAR_BIT(hirda->Instance->CR3, USART_CR3_DMAT);
AnnaBridge 189:f392fc9709a3 1296
AnnaBridge 189:f392fc9709a3 1297 /* Abort the IRDA DMA Tx channel */
AnnaBridge 189:f392fc9709a3 1298 if (hirda->hdmatx != NULL)
AnnaBridge 189:f392fc9709a3 1299 {
AnnaBridge 189:f392fc9709a3 1300 if (HAL_DMA_Abort(hirda->hdmatx) != HAL_OK)
AnnaBridge 189:f392fc9709a3 1301 {
AnnaBridge 189:f392fc9709a3 1302 if (HAL_DMA_GetError(hirda->hdmatx) == HAL_DMA_ERROR_TIMEOUT)
AnnaBridge 189:f392fc9709a3 1303 {
AnnaBridge 189:f392fc9709a3 1304 /* Set error code to DMA */
AnnaBridge 189:f392fc9709a3 1305 hirda->ErrorCode = HAL_IRDA_ERROR_DMA;
AnnaBridge 189:f392fc9709a3 1306
AnnaBridge 189:f392fc9709a3 1307 return HAL_TIMEOUT;
AnnaBridge 189:f392fc9709a3 1308 }
AnnaBridge 189:f392fc9709a3 1309 }
AnnaBridge 189:f392fc9709a3 1310 }
AnnaBridge 189:f392fc9709a3 1311
AnnaBridge 189:f392fc9709a3 1312 IRDA_EndTxTransfer(hirda);
AnnaBridge 189:f392fc9709a3 1313 }
AnnaBridge 189:f392fc9709a3 1314 }
AnnaBridge 189:f392fc9709a3 1315
AnnaBridge 189:f392fc9709a3 1316 /* Stop IRDA DMA Rx request if ongoing */
AnnaBridge 189:f392fc9709a3 1317 if (hirda->RxState == HAL_IRDA_STATE_BUSY_RX)
AnnaBridge 189:f392fc9709a3 1318 {
AnnaBridge 189:f392fc9709a3 1319 if (HAL_IS_BIT_SET(hirda->Instance->CR3, USART_CR3_DMAR))
AnnaBridge 189:f392fc9709a3 1320 {
AnnaBridge 189:f392fc9709a3 1321 CLEAR_BIT(hirda->Instance->CR3, USART_CR3_DMAR);
AnnaBridge 189:f392fc9709a3 1322
AnnaBridge 189:f392fc9709a3 1323 /* Abort the IRDA DMA Rx channel */
AnnaBridge 189:f392fc9709a3 1324 if (hirda->hdmarx != NULL)
AnnaBridge 189:f392fc9709a3 1325 {
AnnaBridge 189:f392fc9709a3 1326 if (HAL_DMA_Abort(hirda->hdmarx) != HAL_OK)
AnnaBridge 189:f392fc9709a3 1327 {
AnnaBridge 189:f392fc9709a3 1328 if (HAL_DMA_GetError(hirda->hdmarx) == HAL_DMA_ERROR_TIMEOUT)
AnnaBridge 189:f392fc9709a3 1329 {
AnnaBridge 189:f392fc9709a3 1330 /* Set error code to DMA */
AnnaBridge 189:f392fc9709a3 1331 hirda->ErrorCode = HAL_IRDA_ERROR_DMA;
AnnaBridge 189:f392fc9709a3 1332
AnnaBridge 189:f392fc9709a3 1333 return HAL_TIMEOUT;
AnnaBridge 189:f392fc9709a3 1334 }
AnnaBridge 189:f392fc9709a3 1335 }
AnnaBridge 189:f392fc9709a3 1336 }
AnnaBridge 189:f392fc9709a3 1337
AnnaBridge 189:f392fc9709a3 1338 IRDA_EndRxTransfer(hirda);
AnnaBridge 189:f392fc9709a3 1339 }
AnnaBridge 189:f392fc9709a3 1340 }
AnnaBridge 189:f392fc9709a3 1341
AnnaBridge 189:f392fc9709a3 1342 return HAL_OK;
AnnaBridge 189:f392fc9709a3 1343 }
AnnaBridge 189:f392fc9709a3 1344
AnnaBridge 189:f392fc9709a3 1345 /**
AnnaBridge 189:f392fc9709a3 1346 * @brief Abort ongoing transfers (blocking mode).
AnnaBridge 189:f392fc9709a3 1347 * @param hirda Pointer to a IRDA_HandleTypeDef structure that contains
AnnaBridge 189:f392fc9709a3 1348 * the configuration information for the specified UART module.
AnnaBridge 189:f392fc9709a3 1349 * @note This procedure could be used for aborting any ongoing transfer started in Interrupt or DMA mode.
AnnaBridge 189:f392fc9709a3 1350 * This procedure performs following operations :
AnnaBridge 189:f392fc9709a3 1351 * - Disable IRDA Interrupts (Tx and Rx)
AnnaBridge 189:f392fc9709a3 1352 * - Disable the DMA transfer in the peripheral register (if enabled)
AnnaBridge 189:f392fc9709a3 1353 * - Abort DMA transfer by calling HAL_DMA_Abort (in case of transfer in DMA mode)
AnnaBridge 189:f392fc9709a3 1354 * - Set handle State to READY
AnnaBridge 189:f392fc9709a3 1355 * @note This procedure is executed in blocking mode : when exiting function, Abort is considered as completed.
AnnaBridge 189:f392fc9709a3 1356 * @retval HAL status
AnnaBridge 189:f392fc9709a3 1357 */
AnnaBridge 189:f392fc9709a3 1358 HAL_StatusTypeDef HAL_IRDA_Abort(IRDA_HandleTypeDef *hirda)
AnnaBridge 189:f392fc9709a3 1359 {
AnnaBridge 189:f392fc9709a3 1360 /* Disable TXEIE, TCIE, RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts */
AnnaBridge 189:f392fc9709a3 1361 CLEAR_BIT(hirda->Instance->CR1, (USART_CR1_RXNEIE_RXFNEIE | USART_CR1_PEIE | USART_CR1_TXEIE_TXFNFIE | USART_CR1_TCIE));
AnnaBridge 189:f392fc9709a3 1362 CLEAR_BIT(hirda->Instance->CR3, USART_CR3_EIE);
AnnaBridge 189:f392fc9709a3 1363
AnnaBridge 189:f392fc9709a3 1364 /* Disable the IRDA DMA Tx request if enabled */
AnnaBridge 189:f392fc9709a3 1365 if (HAL_IS_BIT_SET(hirda->Instance->CR3, USART_CR3_DMAT))
AnnaBridge 189:f392fc9709a3 1366 {
AnnaBridge 189:f392fc9709a3 1367 CLEAR_BIT(hirda->Instance->CR3, USART_CR3_DMAT);
AnnaBridge 189:f392fc9709a3 1368
AnnaBridge 189:f392fc9709a3 1369 /* Abort the IRDA DMA Tx channel : use blocking DMA Abort API (no callback) */
AnnaBridge 189:f392fc9709a3 1370 if (hirda->hdmatx != NULL)
AnnaBridge 189:f392fc9709a3 1371 {
AnnaBridge 189:f392fc9709a3 1372 /* Set the IRDA DMA Abort callback to Null.
AnnaBridge 189:f392fc9709a3 1373 No call back execution at end of DMA abort procedure */
AnnaBridge 189:f392fc9709a3 1374 hirda->hdmatx->XferAbortCallback = NULL;
AnnaBridge 189:f392fc9709a3 1375
AnnaBridge 189:f392fc9709a3 1376 if (HAL_DMA_Abort(hirda->hdmatx) != HAL_OK)
AnnaBridge 189:f392fc9709a3 1377 {
AnnaBridge 189:f392fc9709a3 1378 if (HAL_DMA_GetError(hirda->hdmatx) == HAL_DMA_ERROR_TIMEOUT)
AnnaBridge 189:f392fc9709a3 1379 {
AnnaBridge 189:f392fc9709a3 1380 /* Set error code to DMA */
AnnaBridge 189:f392fc9709a3 1381 hirda->ErrorCode = HAL_IRDA_ERROR_DMA;
AnnaBridge 189:f392fc9709a3 1382
AnnaBridge 189:f392fc9709a3 1383 return HAL_TIMEOUT;
AnnaBridge 189:f392fc9709a3 1384 }
AnnaBridge 189:f392fc9709a3 1385 }
AnnaBridge 189:f392fc9709a3 1386 }
AnnaBridge 189:f392fc9709a3 1387 }
AnnaBridge 189:f392fc9709a3 1388
AnnaBridge 189:f392fc9709a3 1389 /* Disable the IRDA DMA Rx request if enabled */
AnnaBridge 189:f392fc9709a3 1390 if (HAL_IS_BIT_SET(hirda->Instance->CR3, USART_CR3_DMAR))
AnnaBridge 189:f392fc9709a3 1391 {
AnnaBridge 189:f392fc9709a3 1392 CLEAR_BIT(hirda->Instance->CR3, USART_CR3_DMAR);
AnnaBridge 189:f392fc9709a3 1393
AnnaBridge 189:f392fc9709a3 1394 /* Abort the IRDA DMA Rx channel : use blocking DMA Abort API (no callback) */
AnnaBridge 189:f392fc9709a3 1395 if (hirda->hdmarx != NULL)
AnnaBridge 189:f392fc9709a3 1396 {
AnnaBridge 189:f392fc9709a3 1397 /* Set the IRDA DMA Abort callback to Null.
AnnaBridge 189:f392fc9709a3 1398 No call back execution at end of DMA abort procedure */
AnnaBridge 189:f392fc9709a3 1399 hirda->hdmarx->XferAbortCallback = NULL;
AnnaBridge 189:f392fc9709a3 1400
AnnaBridge 189:f392fc9709a3 1401 if (HAL_DMA_Abort(hirda->hdmarx) != HAL_OK)
AnnaBridge 189:f392fc9709a3 1402 {
AnnaBridge 189:f392fc9709a3 1403 if (HAL_DMA_GetError(hirda->hdmarx) == HAL_DMA_ERROR_TIMEOUT)
AnnaBridge 189:f392fc9709a3 1404 {
AnnaBridge 189:f392fc9709a3 1405 /* Set error code to DMA */
AnnaBridge 189:f392fc9709a3 1406 hirda->ErrorCode = HAL_IRDA_ERROR_DMA;
AnnaBridge 189:f392fc9709a3 1407
AnnaBridge 189:f392fc9709a3 1408 return HAL_TIMEOUT;
AnnaBridge 189:f392fc9709a3 1409 }
AnnaBridge 189:f392fc9709a3 1410 }
AnnaBridge 189:f392fc9709a3 1411 }
AnnaBridge 189:f392fc9709a3 1412 }
AnnaBridge 189:f392fc9709a3 1413
AnnaBridge 189:f392fc9709a3 1414 /* Reset Tx and Rx transfer counters */
AnnaBridge 189:f392fc9709a3 1415 hirda->TxXferCount = 0U;
AnnaBridge 189:f392fc9709a3 1416 hirda->RxXferCount = 0U;
AnnaBridge 189:f392fc9709a3 1417
AnnaBridge 189:f392fc9709a3 1418 /* Clear the Error flags in the ICR register */
AnnaBridge 189:f392fc9709a3 1419 __HAL_IRDA_CLEAR_FLAG(hirda, IRDA_CLEAR_OREF | IRDA_CLEAR_NEF | IRDA_CLEAR_PEF | IRDA_CLEAR_FEF);
AnnaBridge 189:f392fc9709a3 1420
AnnaBridge 189:f392fc9709a3 1421 /* Restore hirda->gState and hirda->RxState to Ready */
AnnaBridge 189:f392fc9709a3 1422 hirda->gState = HAL_IRDA_STATE_READY;
AnnaBridge 189:f392fc9709a3 1423 hirda->RxState = HAL_IRDA_STATE_READY;
AnnaBridge 189:f392fc9709a3 1424
AnnaBridge 189:f392fc9709a3 1425 /* Reset Handle ErrorCode to No Error */
AnnaBridge 189:f392fc9709a3 1426 hirda->ErrorCode = HAL_IRDA_ERROR_NONE;
AnnaBridge 189:f392fc9709a3 1427
AnnaBridge 189:f392fc9709a3 1428 return HAL_OK;
AnnaBridge 189:f392fc9709a3 1429 }
AnnaBridge 189:f392fc9709a3 1430
AnnaBridge 189:f392fc9709a3 1431 /**
AnnaBridge 189:f392fc9709a3 1432 * @brief Abort ongoing Transmit transfer (blocking mode).
AnnaBridge 189:f392fc9709a3 1433 * @param hirda Pointer to a IRDA_HandleTypeDef structure that contains
AnnaBridge 189:f392fc9709a3 1434 * the configuration information for the specified UART module.
AnnaBridge 189:f392fc9709a3 1435 * @note This procedure could be used for aborting any ongoing Tx transfer started in Interrupt or DMA mode.
AnnaBridge 189:f392fc9709a3 1436 * This procedure performs following operations :
AnnaBridge 189:f392fc9709a3 1437 * - Disable IRDA Interrupts (Tx)
AnnaBridge 189:f392fc9709a3 1438 * - Disable the DMA transfer in the peripheral register (if enabled)
AnnaBridge 189:f392fc9709a3 1439 * - Abort DMA transfer by calling HAL_DMA_Abort (in case of transfer in DMA mode)
AnnaBridge 189:f392fc9709a3 1440 * - Set handle State to READY
AnnaBridge 189:f392fc9709a3 1441 * @note This procedure is executed in blocking mode : when exiting function, Abort is considered as completed.
AnnaBridge 189:f392fc9709a3 1442 * @retval HAL status
AnnaBridge 189:f392fc9709a3 1443 */
AnnaBridge 189:f392fc9709a3 1444 HAL_StatusTypeDef HAL_IRDA_AbortTransmit(IRDA_HandleTypeDef *hirda)
AnnaBridge 189:f392fc9709a3 1445 {
AnnaBridge 189:f392fc9709a3 1446 /* Disable TXEIE and TCIE interrupts */
AnnaBridge 189:f392fc9709a3 1447 CLEAR_BIT(hirda->Instance->CR1, (USART_CR1_TXEIE_TXFNFIE | USART_CR1_TCIE));
AnnaBridge 189:f392fc9709a3 1448
AnnaBridge 189:f392fc9709a3 1449 /* Disable the IRDA DMA Tx request if enabled */
AnnaBridge 189:f392fc9709a3 1450 if (HAL_IS_BIT_SET(hirda->Instance->CR3, USART_CR3_DMAT))
AnnaBridge 189:f392fc9709a3 1451 {
AnnaBridge 189:f392fc9709a3 1452 CLEAR_BIT(hirda->Instance->CR3, USART_CR3_DMAT);
AnnaBridge 189:f392fc9709a3 1453
AnnaBridge 189:f392fc9709a3 1454 /* Abort the IRDA DMA Tx channel : use blocking DMA Abort API (no callback) */
AnnaBridge 189:f392fc9709a3 1455 if (hirda->hdmatx != NULL)
AnnaBridge 189:f392fc9709a3 1456 {
AnnaBridge 189:f392fc9709a3 1457 /* Set the IRDA DMA Abort callback to Null.
AnnaBridge 189:f392fc9709a3 1458 No call back execution at end of DMA abort procedure */
AnnaBridge 189:f392fc9709a3 1459 hirda->hdmatx->XferAbortCallback = NULL;
AnnaBridge 189:f392fc9709a3 1460
AnnaBridge 189:f392fc9709a3 1461 if (HAL_DMA_Abort(hirda->hdmatx) != HAL_OK)
AnnaBridge 189:f392fc9709a3 1462 {
AnnaBridge 189:f392fc9709a3 1463 if (HAL_DMA_GetError(hirda->hdmatx) == HAL_DMA_ERROR_TIMEOUT)
AnnaBridge 189:f392fc9709a3 1464 {
AnnaBridge 189:f392fc9709a3 1465 /* Set error code to DMA */
AnnaBridge 189:f392fc9709a3 1466 hirda->ErrorCode = HAL_IRDA_ERROR_DMA;
AnnaBridge 189:f392fc9709a3 1467
AnnaBridge 189:f392fc9709a3 1468 return HAL_TIMEOUT;
AnnaBridge 189:f392fc9709a3 1469 }
AnnaBridge 189:f392fc9709a3 1470 }
AnnaBridge 189:f392fc9709a3 1471 }
AnnaBridge 189:f392fc9709a3 1472 }
AnnaBridge 189:f392fc9709a3 1473
AnnaBridge 189:f392fc9709a3 1474 /* Reset Tx transfer counter */
AnnaBridge 189:f392fc9709a3 1475 hirda->TxXferCount = 0U;
AnnaBridge 189:f392fc9709a3 1476
AnnaBridge 189:f392fc9709a3 1477 /* Restore hirda->gState to Ready */
AnnaBridge 189:f392fc9709a3 1478 hirda->gState = HAL_IRDA_STATE_READY;
AnnaBridge 189:f392fc9709a3 1479
AnnaBridge 189:f392fc9709a3 1480 return HAL_OK;
AnnaBridge 189:f392fc9709a3 1481 }
AnnaBridge 189:f392fc9709a3 1482
AnnaBridge 189:f392fc9709a3 1483 /**
AnnaBridge 189:f392fc9709a3 1484 * @brief Abort ongoing Receive transfer (blocking mode).
AnnaBridge 189:f392fc9709a3 1485 * @param hirda Pointer to a IRDA_HandleTypeDef structure that contains
AnnaBridge 189:f392fc9709a3 1486 * the configuration information for the specified UART module.
AnnaBridge 189:f392fc9709a3 1487 * @note This procedure could be used for aborting any ongoing Rx transfer started in Interrupt or DMA mode.
AnnaBridge 189:f392fc9709a3 1488 * This procedure performs following operations :
AnnaBridge 189:f392fc9709a3 1489 * - Disable IRDA Interrupts (Rx)
AnnaBridge 189:f392fc9709a3 1490 * - Disable the DMA transfer in the peripheral register (if enabled)
AnnaBridge 189:f392fc9709a3 1491 * - Abort DMA transfer by calling HAL_DMA_Abort (in case of transfer in DMA mode)
AnnaBridge 189:f392fc9709a3 1492 * - Set handle State to READY
AnnaBridge 189:f392fc9709a3 1493 * @note This procedure is executed in blocking mode : when exiting function, Abort is considered as completed.
AnnaBridge 189:f392fc9709a3 1494 * @retval HAL status
AnnaBridge 189:f392fc9709a3 1495 */
AnnaBridge 189:f392fc9709a3 1496 HAL_StatusTypeDef HAL_IRDA_AbortReceive(IRDA_HandleTypeDef *hirda)
AnnaBridge 189:f392fc9709a3 1497 {
AnnaBridge 189:f392fc9709a3 1498 /* Disable RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts */
AnnaBridge 189:f392fc9709a3 1499 CLEAR_BIT(hirda->Instance->CR1, (USART_CR1_RXNEIE_RXFNEIE | USART_CR1_PEIE));
AnnaBridge 189:f392fc9709a3 1500 CLEAR_BIT(hirda->Instance->CR3, USART_CR3_EIE);
AnnaBridge 189:f392fc9709a3 1501
AnnaBridge 189:f392fc9709a3 1502 /* Disable the IRDA DMA Rx request if enabled */
AnnaBridge 189:f392fc9709a3 1503 if (HAL_IS_BIT_SET(hirda->Instance->CR3, USART_CR3_DMAR))
AnnaBridge 189:f392fc9709a3 1504 {
AnnaBridge 189:f392fc9709a3 1505 CLEAR_BIT(hirda->Instance->CR3, USART_CR3_DMAR);
AnnaBridge 189:f392fc9709a3 1506
AnnaBridge 189:f392fc9709a3 1507 /* Abort the IRDA DMA Rx channel : use blocking DMA Abort API (no callback) */
AnnaBridge 189:f392fc9709a3 1508 if (hirda->hdmarx != NULL)
AnnaBridge 189:f392fc9709a3 1509 {
AnnaBridge 189:f392fc9709a3 1510 /* Set the IRDA DMA Abort callback to Null.
AnnaBridge 189:f392fc9709a3 1511 No call back execution at end of DMA abort procedure */
AnnaBridge 189:f392fc9709a3 1512 hirda->hdmarx->XferAbortCallback = NULL;
AnnaBridge 189:f392fc9709a3 1513
AnnaBridge 189:f392fc9709a3 1514 if (HAL_DMA_Abort(hirda->hdmarx) != HAL_OK)
AnnaBridge 189:f392fc9709a3 1515 {
AnnaBridge 189:f392fc9709a3 1516 if (HAL_DMA_GetError(hirda->hdmarx) == HAL_DMA_ERROR_TIMEOUT)
AnnaBridge 189:f392fc9709a3 1517 {
AnnaBridge 189:f392fc9709a3 1518 /* Set error code to DMA */
AnnaBridge 189:f392fc9709a3 1519 hirda->ErrorCode = HAL_IRDA_ERROR_DMA;
AnnaBridge 189:f392fc9709a3 1520
AnnaBridge 189:f392fc9709a3 1521 return HAL_TIMEOUT;
AnnaBridge 189:f392fc9709a3 1522 }
AnnaBridge 189:f392fc9709a3 1523 }
AnnaBridge 189:f392fc9709a3 1524 }
AnnaBridge 189:f392fc9709a3 1525 }
AnnaBridge 189:f392fc9709a3 1526
AnnaBridge 189:f392fc9709a3 1527 /* Reset Rx transfer counter */
AnnaBridge 189:f392fc9709a3 1528 hirda->RxXferCount = 0U;
AnnaBridge 189:f392fc9709a3 1529
AnnaBridge 189:f392fc9709a3 1530 /* Clear the Error flags in the ICR register */
AnnaBridge 189:f392fc9709a3 1531 __HAL_IRDA_CLEAR_FLAG(hirda, IRDA_CLEAR_OREF | IRDA_CLEAR_NEF | IRDA_CLEAR_PEF | IRDA_CLEAR_FEF);
AnnaBridge 189:f392fc9709a3 1532
AnnaBridge 189:f392fc9709a3 1533 /* Restore hirda->RxState to Ready */
AnnaBridge 189:f392fc9709a3 1534 hirda->RxState = HAL_IRDA_STATE_READY;
AnnaBridge 189:f392fc9709a3 1535
AnnaBridge 189:f392fc9709a3 1536 return HAL_OK;
AnnaBridge 189:f392fc9709a3 1537 }
AnnaBridge 189:f392fc9709a3 1538
AnnaBridge 189:f392fc9709a3 1539 /**
AnnaBridge 189:f392fc9709a3 1540 * @brief Abort ongoing transfers (Interrupt mode).
AnnaBridge 189:f392fc9709a3 1541 * @param hirda Pointer to a IRDA_HandleTypeDef structure that contains
AnnaBridge 189:f392fc9709a3 1542 * the configuration information for the specified UART module.
AnnaBridge 189:f392fc9709a3 1543 * @note This procedure could be used for aborting any ongoing transfer started in Interrupt or DMA mode.
AnnaBridge 189:f392fc9709a3 1544 * This procedure performs following operations :
AnnaBridge 189:f392fc9709a3 1545 * - Disable IRDA Interrupts (Tx and Rx)
AnnaBridge 189:f392fc9709a3 1546 * - Disable the DMA transfer in the peripheral register (if enabled)
AnnaBridge 189:f392fc9709a3 1547 * - Abort DMA transfer by calling HAL_DMA_Abort_IT (in case of transfer in DMA mode)
AnnaBridge 189:f392fc9709a3 1548 * - Set handle State to READY
AnnaBridge 189:f392fc9709a3 1549 * - At abort completion, call user abort complete callback
AnnaBridge 189:f392fc9709a3 1550 * @note This procedure is executed in Interrupt mode, meaning that abort procedure could be
AnnaBridge 189:f392fc9709a3 1551 * considered as completed only when user abort complete callback is executed (not when exiting function).
AnnaBridge 189:f392fc9709a3 1552 * @retval HAL status
AnnaBridge 189:f392fc9709a3 1553 */
AnnaBridge 189:f392fc9709a3 1554 HAL_StatusTypeDef HAL_IRDA_Abort_IT(IRDA_HandleTypeDef *hirda)
AnnaBridge 189:f392fc9709a3 1555 {
AnnaBridge 189:f392fc9709a3 1556 uint32_t abortcplt = 1U;
AnnaBridge 189:f392fc9709a3 1557
AnnaBridge 189:f392fc9709a3 1558 /* Disable TXEIE, TCIE, RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts */
AnnaBridge 189:f392fc9709a3 1559 CLEAR_BIT(hirda->Instance->CR1, (USART_CR1_RXNEIE_RXFNEIE | USART_CR1_PEIE | USART_CR1_TXEIE_TXFNFIE | USART_CR1_TCIE));
AnnaBridge 189:f392fc9709a3 1560 CLEAR_BIT(hirda->Instance->CR3, USART_CR3_EIE);
AnnaBridge 189:f392fc9709a3 1561
AnnaBridge 189:f392fc9709a3 1562 /* If DMA Tx and/or DMA Rx Handles are associated to IRDA Handle, DMA Abort complete callbacks should be initialised
AnnaBridge 189:f392fc9709a3 1563 before any call to DMA Abort functions */
AnnaBridge 189:f392fc9709a3 1564 /* DMA Tx Handle is valid */
AnnaBridge 189:f392fc9709a3 1565 if (hirda->hdmatx != NULL)
AnnaBridge 189:f392fc9709a3 1566 {
AnnaBridge 189:f392fc9709a3 1567 /* Set DMA Abort Complete callback if IRDA DMA Tx request if enabled.
AnnaBridge 189:f392fc9709a3 1568 Otherwise, set it to NULL */
AnnaBridge 189:f392fc9709a3 1569 if (HAL_IS_BIT_SET(hirda->Instance->CR3, USART_CR3_DMAT))
AnnaBridge 189:f392fc9709a3 1570 {
AnnaBridge 189:f392fc9709a3 1571 hirda->hdmatx->XferAbortCallback = IRDA_DMATxAbortCallback;
AnnaBridge 189:f392fc9709a3 1572 }
AnnaBridge 189:f392fc9709a3 1573 else
AnnaBridge 189:f392fc9709a3 1574 {
AnnaBridge 189:f392fc9709a3 1575 hirda->hdmatx->XferAbortCallback = NULL;
AnnaBridge 189:f392fc9709a3 1576 }
AnnaBridge 189:f392fc9709a3 1577 }
AnnaBridge 189:f392fc9709a3 1578 /* DMA Rx Handle is valid */
AnnaBridge 189:f392fc9709a3 1579 if (hirda->hdmarx != NULL)
AnnaBridge 189:f392fc9709a3 1580 {
AnnaBridge 189:f392fc9709a3 1581 /* Set DMA Abort Complete callback if IRDA DMA Rx request if enabled.
AnnaBridge 189:f392fc9709a3 1582 Otherwise, set it to NULL */
AnnaBridge 189:f392fc9709a3 1583 if (HAL_IS_BIT_SET(hirda->Instance->CR3, USART_CR3_DMAR))
AnnaBridge 189:f392fc9709a3 1584 {
AnnaBridge 189:f392fc9709a3 1585 hirda->hdmarx->XferAbortCallback = IRDA_DMARxAbortCallback;
AnnaBridge 189:f392fc9709a3 1586 }
AnnaBridge 189:f392fc9709a3 1587 else
AnnaBridge 189:f392fc9709a3 1588 {
AnnaBridge 189:f392fc9709a3 1589 hirda->hdmarx->XferAbortCallback = NULL;
AnnaBridge 189:f392fc9709a3 1590 }
AnnaBridge 189:f392fc9709a3 1591 }
AnnaBridge 189:f392fc9709a3 1592
AnnaBridge 189:f392fc9709a3 1593 /* Disable the IRDA DMA Tx request if enabled */
AnnaBridge 189:f392fc9709a3 1594 if (HAL_IS_BIT_SET(hirda->Instance->CR3, USART_CR3_DMAT))
AnnaBridge 189:f392fc9709a3 1595 {
AnnaBridge 189:f392fc9709a3 1596 /* Disable DMA Tx at UART level */
AnnaBridge 189:f392fc9709a3 1597 CLEAR_BIT(hirda->Instance->CR3, USART_CR3_DMAT);
AnnaBridge 189:f392fc9709a3 1598
AnnaBridge 189:f392fc9709a3 1599 /* Abort the IRDA DMA Tx channel : use non blocking DMA Abort API (callback) */
AnnaBridge 189:f392fc9709a3 1600 if (hirda->hdmatx != NULL)
AnnaBridge 189:f392fc9709a3 1601 {
AnnaBridge 189:f392fc9709a3 1602 /* IRDA Tx DMA Abort callback has already been initialised :
AnnaBridge 189:f392fc9709a3 1603 will lead to call HAL_IRDA_AbortCpltCallback() at end of DMA abort procedure */
AnnaBridge 189:f392fc9709a3 1604
AnnaBridge 189:f392fc9709a3 1605 /* Abort DMA TX */
AnnaBridge 189:f392fc9709a3 1606 if (HAL_DMA_Abort_IT(hirda->hdmatx) != HAL_OK)
AnnaBridge 189:f392fc9709a3 1607 {
AnnaBridge 189:f392fc9709a3 1608 hirda->hdmatx->XferAbortCallback = NULL;
AnnaBridge 189:f392fc9709a3 1609 }
AnnaBridge 189:f392fc9709a3 1610 else
AnnaBridge 189:f392fc9709a3 1611 {
AnnaBridge 189:f392fc9709a3 1612 abortcplt = 0U;
AnnaBridge 189:f392fc9709a3 1613 }
AnnaBridge 189:f392fc9709a3 1614 }
AnnaBridge 189:f392fc9709a3 1615 }
AnnaBridge 189:f392fc9709a3 1616
AnnaBridge 189:f392fc9709a3 1617 /* Disable the IRDA DMA Rx request if enabled */
AnnaBridge 189:f392fc9709a3 1618 if (HAL_IS_BIT_SET(hirda->Instance->CR3, USART_CR3_DMAR))
AnnaBridge 189:f392fc9709a3 1619 {
AnnaBridge 189:f392fc9709a3 1620 CLEAR_BIT(hirda->Instance->CR3, USART_CR3_DMAR);
AnnaBridge 189:f392fc9709a3 1621
AnnaBridge 189:f392fc9709a3 1622 /* Abort the IRDA DMA Rx channel : use non blocking DMA Abort API (callback) */
AnnaBridge 189:f392fc9709a3 1623 if (hirda->hdmarx != NULL)
AnnaBridge 189:f392fc9709a3 1624 {
AnnaBridge 189:f392fc9709a3 1625 /* IRDA Rx DMA Abort callback has already been initialised :
AnnaBridge 189:f392fc9709a3 1626 will lead to call HAL_IRDA_AbortCpltCallback() at end of DMA abort procedure */
AnnaBridge 189:f392fc9709a3 1627
AnnaBridge 189:f392fc9709a3 1628 /* Abort DMA RX */
AnnaBridge 189:f392fc9709a3 1629 if (HAL_DMA_Abort_IT(hirda->hdmarx) != HAL_OK)
AnnaBridge 189:f392fc9709a3 1630 {
AnnaBridge 189:f392fc9709a3 1631 hirda->hdmarx->XferAbortCallback = NULL;
AnnaBridge 189:f392fc9709a3 1632 abortcplt = 1U;
AnnaBridge 189:f392fc9709a3 1633 }
AnnaBridge 189:f392fc9709a3 1634 else
AnnaBridge 189:f392fc9709a3 1635 {
AnnaBridge 189:f392fc9709a3 1636 abortcplt = 0U;
AnnaBridge 189:f392fc9709a3 1637 }
AnnaBridge 189:f392fc9709a3 1638 }
AnnaBridge 189:f392fc9709a3 1639 }
AnnaBridge 189:f392fc9709a3 1640
AnnaBridge 189:f392fc9709a3 1641 /* if no DMA abort complete callback execution is required => call user Abort Complete callback */
AnnaBridge 189:f392fc9709a3 1642 if (abortcplt == 1U)
AnnaBridge 189:f392fc9709a3 1643 {
AnnaBridge 189:f392fc9709a3 1644 /* Reset Tx and Rx transfer counters */
AnnaBridge 189:f392fc9709a3 1645 hirda->TxXferCount = 0U;
AnnaBridge 189:f392fc9709a3 1646 hirda->RxXferCount = 0U;
AnnaBridge 189:f392fc9709a3 1647
AnnaBridge 189:f392fc9709a3 1648 /* Reset errorCode */
AnnaBridge 189:f392fc9709a3 1649 hirda->ErrorCode = HAL_IRDA_ERROR_NONE;
AnnaBridge 189:f392fc9709a3 1650
AnnaBridge 189:f392fc9709a3 1651 /* Clear the Error flags in the ICR register */
AnnaBridge 189:f392fc9709a3 1652 __HAL_IRDA_CLEAR_FLAG(hirda, IRDA_CLEAR_OREF | IRDA_CLEAR_NEF | IRDA_CLEAR_PEF | IRDA_CLEAR_FEF);
AnnaBridge 189:f392fc9709a3 1653
AnnaBridge 189:f392fc9709a3 1654 /* Restore hirda->gState and hirda->RxState to Ready */
AnnaBridge 189:f392fc9709a3 1655 hirda->gState = HAL_IRDA_STATE_READY;
AnnaBridge 189:f392fc9709a3 1656 hirda->RxState = HAL_IRDA_STATE_READY;
AnnaBridge 189:f392fc9709a3 1657
AnnaBridge 189:f392fc9709a3 1658 /* As no DMA to be aborted, call directly user Abort complete callback */
AnnaBridge 189:f392fc9709a3 1659 #if (USE_HAL_IRDA_REGISTER_CALLBACKS == 1)
AnnaBridge 189:f392fc9709a3 1660 /* Call registered Abort complete callback */
AnnaBridge 189:f392fc9709a3 1661 hirda->AbortCpltCallback(hirda);
AnnaBridge 189:f392fc9709a3 1662 #else
AnnaBridge 189:f392fc9709a3 1663 /* Call legacy weak Abort complete callback */
AnnaBridge 189:f392fc9709a3 1664 HAL_IRDA_AbortCpltCallback(hirda);
AnnaBridge 189:f392fc9709a3 1665 #endif /* USE_HAL_IRDA_REGISTER_CALLBACK */
AnnaBridge 189:f392fc9709a3 1666 }
AnnaBridge 189:f392fc9709a3 1667
AnnaBridge 189:f392fc9709a3 1668 return HAL_OK;
AnnaBridge 189:f392fc9709a3 1669 }
AnnaBridge 189:f392fc9709a3 1670
AnnaBridge 189:f392fc9709a3 1671 /**
AnnaBridge 189:f392fc9709a3 1672 * @brief Abort ongoing Transmit transfer (Interrupt mode).
AnnaBridge 189:f392fc9709a3 1673 * @param hirda Pointer to a IRDA_HandleTypeDef structure that contains
AnnaBridge 189:f392fc9709a3 1674 * the configuration information for the specified UART module.
AnnaBridge 189:f392fc9709a3 1675 * @note This procedure could be used for aborting any ongoing Tx transfer started in Interrupt or DMA mode.
AnnaBridge 189:f392fc9709a3 1676 * This procedure performs following operations :
AnnaBridge 189:f392fc9709a3 1677 * - Disable IRDA Interrupts (Tx)
AnnaBridge 189:f392fc9709a3 1678 * - Disable the DMA transfer in the peripheral register (if enabled)
AnnaBridge 189:f392fc9709a3 1679 * - Abort DMA transfer by calling HAL_DMA_Abort_IT (in case of transfer in DMA mode)
AnnaBridge 189:f392fc9709a3 1680 * - Set handle State to READY
AnnaBridge 189:f392fc9709a3 1681 * - At abort completion, call user abort complete callback
AnnaBridge 189:f392fc9709a3 1682 * @note This procedure is executed in Interrupt mode, meaning that abort procedure could be
AnnaBridge 189:f392fc9709a3 1683 * considered as completed only when user abort complete callback is executed (not when exiting function).
AnnaBridge 189:f392fc9709a3 1684 * @retval HAL status
AnnaBridge 189:f392fc9709a3 1685 */
AnnaBridge 189:f392fc9709a3 1686 HAL_StatusTypeDef HAL_IRDA_AbortTransmit_IT(IRDA_HandleTypeDef *hirda)
AnnaBridge 189:f392fc9709a3 1687 {
AnnaBridge 189:f392fc9709a3 1688 /* Disable TXEIE and TCIE interrupts */
AnnaBridge 189:f392fc9709a3 1689 CLEAR_BIT(hirda->Instance->CR1, (USART_CR1_TXEIE_TXFNFIE | USART_CR1_TCIE));
AnnaBridge 189:f392fc9709a3 1690
AnnaBridge 189:f392fc9709a3 1691 /* Disable the IRDA DMA Tx request if enabled */
AnnaBridge 189:f392fc9709a3 1692 if (HAL_IS_BIT_SET(hirda->Instance->CR3, USART_CR3_DMAT))
AnnaBridge 189:f392fc9709a3 1693 {
AnnaBridge 189:f392fc9709a3 1694 CLEAR_BIT(hirda->Instance->CR3, USART_CR3_DMAT);
AnnaBridge 189:f392fc9709a3 1695
AnnaBridge 189:f392fc9709a3 1696 /* Abort the IRDA DMA Tx channel : use non blocking DMA Abort API (callback) */
AnnaBridge 189:f392fc9709a3 1697 if (hirda->hdmatx != NULL)
AnnaBridge 189:f392fc9709a3 1698 {
AnnaBridge 189:f392fc9709a3 1699 /* Set the IRDA DMA Abort callback :
AnnaBridge 189:f392fc9709a3 1700 will lead to call HAL_IRDA_AbortCpltCallback() at end of DMA abort procedure */
AnnaBridge 189:f392fc9709a3 1701 hirda->hdmatx->XferAbortCallback = IRDA_DMATxOnlyAbortCallback;
AnnaBridge 189:f392fc9709a3 1702
AnnaBridge 189:f392fc9709a3 1703 /* Abort DMA TX */
AnnaBridge 189:f392fc9709a3 1704 if (HAL_DMA_Abort_IT(hirda->hdmatx) != HAL_OK)
AnnaBridge 189:f392fc9709a3 1705 {
AnnaBridge 189:f392fc9709a3 1706 /* Call Directly hirda->hdmatx->XferAbortCallback function in case of error */
AnnaBridge 189:f392fc9709a3 1707 hirda->hdmatx->XferAbortCallback(hirda->hdmatx);
AnnaBridge 189:f392fc9709a3 1708 }
AnnaBridge 189:f392fc9709a3 1709 }
AnnaBridge 189:f392fc9709a3 1710 else
AnnaBridge 189:f392fc9709a3 1711 {
AnnaBridge 189:f392fc9709a3 1712 /* Reset Tx transfer counter */
AnnaBridge 189:f392fc9709a3 1713 hirda->TxXferCount = 0U;
AnnaBridge 189:f392fc9709a3 1714
AnnaBridge 189:f392fc9709a3 1715 /* Restore hirda->gState to Ready */
AnnaBridge 189:f392fc9709a3 1716 hirda->gState = HAL_IRDA_STATE_READY;
AnnaBridge 189:f392fc9709a3 1717
AnnaBridge 189:f392fc9709a3 1718 /* As no DMA to be aborted, call directly user Abort complete callback */
AnnaBridge 189:f392fc9709a3 1719 #if (USE_HAL_IRDA_REGISTER_CALLBACKS == 1)
AnnaBridge 189:f392fc9709a3 1720 /* Call registered Abort Transmit Complete Callback */
AnnaBridge 189:f392fc9709a3 1721 hirda->AbortTransmitCpltCallback(hirda);
AnnaBridge 189:f392fc9709a3 1722 #else
AnnaBridge 189:f392fc9709a3 1723 /* Call legacy weak Abort Transmit Complete Callback */
AnnaBridge 189:f392fc9709a3 1724 HAL_IRDA_AbortTransmitCpltCallback(hirda);
AnnaBridge 189:f392fc9709a3 1725 #endif /* USE_HAL_IRDA_REGISTER_CALLBACK */
AnnaBridge 189:f392fc9709a3 1726 }
AnnaBridge 189:f392fc9709a3 1727 }
AnnaBridge 189:f392fc9709a3 1728 else
AnnaBridge 189:f392fc9709a3 1729 {
AnnaBridge 189:f392fc9709a3 1730 /* Reset Tx transfer counter */
AnnaBridge 189:f392fc9709a3 1731 hirda->TxXferCount = 0U;
AnnaBridge 189:f392fc9709a3 1732
AnnaBridge 189:f392fc9709a3 1733 /* Restore hirda->gState to Ready */
AnnaBridge 189:f392fc9709a3 1734 hirda->gState = HAL_IRDA_STATE_READY;
AnnaBridge 189:f392fc9709a3 1735
AnnaBridge 189:f392fc9709a3 1736 /* As no DMA to be aborted, call directly user Abort complete callback */
AnnaBridge 189:f392fc9709a3 1737 #if (USE_HAL_IRDA_REGISTER_CALLBACKS == 1)
AnnaBridge 189:f392fc9709a3 1738 /* Call registered Abort Transmit Complete Callback */
AnnaBridge 189:f392fc9709a3 1739 hirda->AbortTransmitCpltCallback(hirda);
AnnaBridge 189:f392fc9709a3 1740 #else
AnnaBridge 189:f392fc9709a3 1741 /* Call legacy weak Abort Transmit Complete Callback */
AnnaBridge 189:f392fc9709a3 1742 HAL_IRDA_AbortTransmitCpltCallback(hirda);
AnnaBridge 189:f392fc9709a3 1743 #endif /* USE_HAL_IRDA_REGISTER_CALLBACK */
AnnaBridge 189:f392fc9709a3 1744 }
AnnaBridge 189:f392fc9709a3 1745
AnnaBridge 189:f392fc9709a3 1746 return HAL_OK;
AnnaBridge 189:f392fc9709a3 1747 }
AnnaBridge 189:f392fc9709a3 1748
AnnaBridge 189:f392fc9709a3 1749 /**
AnnaBridge 189:f392fc9709a3 1750 * @brief Abort ongoing Receive transfer (Interrupt mode).
AnnaBridge 189:f392fc9709a3 1751 * @param hirda Pointer to a IRDA_HandleTypeDef structure that contains
AnnaBridge 189:f392fc9709a3 1752 * the configuration information for the specified UART module.
AnnaBridge 189:f392fc9709a3 1753 * @note This procedure could be used for aborting any ongoing Rx transfer started in Interrupt or DMA mode.
AnnaBridge 189:f392fc9709a3 1754 * This procedure performs following operations :
AnnaBridge 189:f392fc9709a3 1755 * - Disable IRDA Interrupts (Rx)
AnnaBridge 189:f392fc9709a3 1756 * - Disable the DMA transfer in the peripheral register (if enabled)
AnnaBridge 189:f392fc9709a3 1757 * - Abort DMA transfer by calling HAL_DMA_Abort_IT (in case of transfer in DMA mode)
AnnaBridge 189:f392fc9709a3 1758 * - Set handle State to READY
AnnaBridge 189:f392fc9709a3 1759 * - At abort completion, call user abort complete callback
AnnaBridge 189:f392fc9709a3 1760 * @note This procedure is executed in Interrupt mode, meaning that abort procedure could be
AnnaBridge 189:f392fc9709a3 1761 * considered as completed only when user abort complete callback is executed (not when exiting function).
AnnaBridge 189:f392fc9709a3 1762 * @retval HAL status
AnnaBridge 189:f392fc9709a3 1763 */
AnnaBridge 189:f392fc9709a3 1764 HAL_StatusTypeDef HAL_IRDA_AbortReceive_IT(IRDA_HandleTypeDef *hirda)
AnnaBridge 189:f392fc9709a3 1765 {
AnnaBridge 189:f392fc9709a3 1766 /* Disable RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts */
AnnaBridge 189:f392fc9709a3 1767 CLEAR_BIT(hirda->Instance->CR1, (USART_CR1_RXNEIE_RXFNEIE | USART_CR1_PEIE));
AnnaBridge 189:f392fc9709a3 1768 CLEAR_BIT(hirda->Instance->CR3, USART_CR3_EIE);
AnnaBridge 189:f392fc9709a3 1769
AnnaBridge 189:f392fc9709a3 1770 /* Disable the IRDA DMA Rx request if enabled */
AnnaBridge 189:f392fc9709a3 1771 if (HAL_IS_BIT_SET(hirda->Instance->CR3, USART_CR3_DMAR))
AnnaBridge 189:f392fc9709a3 1772 {
AnnaBridge 189:f392fc9709a3 1773 CLEAR_BIT(hirda->Instance->CR3, USART_CR3_DMAR);
AnnaBridge 189:f392fc9709a3 1774
AnnaBridge 189:f392fc9709a3 1775 /* Abort the IRDA DMA Rx channel : use non blocking DMA Abort API (callback) */
AnnaBridge 189:f392fc9709a3 1776 if (hirda->hdmarx != NULL)
AnnaBridge 189:f392fc9709a3 1777 {
AnnaBridge 189:f392fc9709a3 1778 /* Set the IRDA DMA Abort callback :
AnnaBridge 189:f392fc9709a3 1779 will lead to call HAL_IRDA_AbortCpltCallback() at end of DMA abort procedure */
AnnaBridge 189:f392fc9709a3 1780 hirda->hdmarx->XferAbortCallback = IRDA_DMARxOnlyAbortCallback;
AnnaBridge 189:f392fc9709a3 1781
AnnaBridge 189:f392fc9709a3 1782 /* Abort DMA RX */
AnnaBridge 189:f392fc9709a3 1783 if (HAL_DMA_Abort_IT(hirda->hdmarx) != HAL_OK)
AnnaBridge 189:f392fc9709a3 1784 {
AnnaBridge 189:f392fc9709a3 1785 /* Call Directly hirda->hdmarx->XferAbortCallback function in case of error */
AnnaBridge 189:f392fc9709a3 1786 hirda->hdmarx->XferAbortCallback(hirda->hdmarx);
AnnaBridge 189:f392fc9709a3 1787 }
AnnaBridge 189:f392fc9709a3 1788 }
AnnaBridge 189:f392fc9709a3 1789 else
AnnaBridge 189:f392fc9709a3 1790 {
AnnaBridge 189:f392fc9709a3 1791 /* Reset Rx transfer counter */
AnnaBridge 189:f392fc9709a3 1792 hirda->RxXferCount = 0U;
AnnaBridge 189:f392fc9709a3 1793
AnnaBridge 189:f392fc9709a3 1794 /* Clear the Error flags in the ICR register */
AnnaBridge 189:f392fc9709a3 1795 __HAL_IRDA_CLEAR_FLAG(hirda, IRDA_CLEAR_OREF | IRDA_CLEAR_NEF | IRDA_CLEAR_PEF | IRDA_CLEAR_FEF);
AnnaBridge 189:f392fc9709a3 1796
AnnaBridge 189:f392fc9709a3 1797 /* Restore hirda->RxState to Ready */
AnnaBridge 189:f392fc9709a3 1798 hirda->RxState = HAL_IRDA_STATE_READY;
AnnaBridge 189:f392fc9709a3 1799
AnnaBridge 189:f392fc9709a3 1800 /* As no DMA to be aborted, call directly user Abort complete callback */
AnnaBridge 189:f392fc9709a3 1801 #if (USE_HAL_IRDA_REGISTER_CALLBACKS == 1)
AnnaBridge 189:f392fc9709a3 1802 /* Call registered Abort Receive Complete Callback */
AnnaBridge 189:f392fc9709a3 1803 hirda->AbortReceiveCpltCallback(hirda);
AnnaBridge 189:f392fc9709a3 1804 #else
AnnaBridge 189:f392fc9709a3 1805 /* Call legacy weak Abort Receive Complete Callback */
AnnaBridge 189:f392fc9709a3 1806 HAL_IRDA_AbortReceiveCpltCallback(hirda);
AnnaBridge 189:f392fc9709a3 1807 #endif /* USE_HAL_IRDA_REGISTER_CALLBACK */
AnnaBridge 189:f392fc9709a3 1808 }
AnnaBridge 189:f392fc9709a3 1809 }
AnnaBridge 189:f392fc9709a3 1810 else
AnnaBridge 189:f392fc9709a3 1811 {
AnnaBridge 189:f392fc9709a3 1812 /* Reset Rx transfer counter */
AnnaBridge 189:f392fc9709a3 1813 hirda->RxXferCount = 0U;
AnnaBridge 189:f392fc9709a3 1814
AnnaBridge 189:f392fc9709a3 1815 /* Clear the Error flags in the ICR register */
AnnaBridge 189:f392fc9709a3 1816 __HAL_IRDA_CLEAR_FLAG(hirda, IRDA_CLEAR_OREF | IRDA_CLEAR_NEF | IRDA_CLEAR_PEF | IRDA_CLEAR_FEF);
AnnaBridge 189:f392fc9709a3 1817
AnnaBridge 189:f392fc9709a3 1818 /* Restore hirda->RxState to Ready */
AnnaBridge 189:f392fc9709a3 1819 hirda->RxState = HAL_IRDA_STATE_READY;
AnnaBridge 189:f392fc9709a3 1820
AnnaBridge 189:f392fc9709a3 1821 /* As no DMA to be aborted, call directly user Abort complete callback */
AnnaBridge 189:f392fc9709a3 1822 #if (USE_HAL_IRDA_REGISTER_CALLBACKS == 1)
AnnaBridge 189:f392fc9709a3 1823 /* Call registered Abort Receive Complete Callback */
AnnaBridge 189:f392fc9709a3 1824 hirda->AbortReceiveCpltCallback(hirda);
AnnaBridge 189:f392fc9709a3 1825 #else
AnnaBridge 189:f392fc9709a3 1826 /* Call legacy weak Abort Receive Complete Callback */
AnnaBridge 189:f392fc9709a3 1827 HAL_IRDA_AbortReceiveCpltCallback(hirda);
AnnaBridge 189:f392fc9709a3 1828 #endif /* USE_HAL_IRDA_REGISTER_CALLBACK */
AnnaBridge 189:f392fc9709a3 1829 }
AnnaBridge 189:f392fc9709a3 1830
AnnaBridge 189:f392fc9709a3 1831 return HAL_OK;
AnnaBridge 189:f392fc9709a3 1832 }
AnnaBridge 189:f392fc9709a3 1833
AnnaBridge 189:f392fc9709a3 1834 /**
AnnaBridge 189:f392fc9709a3 1835 * @brief Handle IRDA interrupt request.
AnnaBridge 189:f392fc9709a3 1836 * @param hirda Pointer to a IRDA_HandleTypeDef structure that contains
AnnaBridge 189:f392fc9709a3 1837 * the configuration information for the specified IRDA module.
AnnaBridge 189:f392fc9709a3 1838 * @retval None
AnnaBridge 189:f392fc9709a3 1839 */
AnnaBridge 189:f392fc9709a3 1840 void HAL_IRDA_IRQHandler(IRDA_HandleTypeDef *hirda)
AnnaBridge 189:f392fc9709a3 1841 {
AnnaBridge 189:f392fc9709a3 1842 uint32_t isrflags = READ_REG(hirda->Instance->ISR);
AnnaBridge 189:f392fc9709a3 1843 uint32_t cr1its = READ_REG(hirda->Instance->CR1);
AnnaBridge 189:f392fc9709a3 1844 uint32_t cr3its;
AnnaBridge 189:f392fc9709a3 1845 uint32_t errorflags;
AnnaBridge 189:f392fc9709a3 1846 uint32_t errorcode;
AnnaBridge 189:f392fc9709a3 1847
AnnaBridge 189:f392fc9709a3 1848 /* If no error occurs */
AnnaBridge 189:f392fc9709a3 1849 errorflags = (isrflags & (uint32_t)(USART_ISR_PE | USART_ISR_FE | USART_ISR_ORE | USART_ISR_NE));
AnnaBridge 189:f392fc9709a3 1850 if (errorflags == 0U)
AnnaBridge 189:f392fc9709a3 1851 {
AnnaBridge 189:f392fc9709a3 1852 /* IRDA in mode Receiver ---------------------------------------------------*/
AnnaBridge 189:f392fc9709a3 1853 if (((isrflags & USART_ISR_RXNE_RXFNE) != 0U) && ((cr1its & USART_CR1_RXNEIE_RXFNEIE) != 0U))
AnnaBridge 189:f392fc9709a3 1854 {
AnnaBridge 189:f392fc9709a3 1855 IRDA_Receive_IT(hirda);
AnnaBridge 189:f392fc9709a3 1856 return;
AnnaBridge 189:f392fc9709a3 1857 }
AnnaBridge 189:f392fc9709a3 1858 }
AnnaBridge 189:f392fc9709a3 1859
AnnaBridge 189:f392fc9709a3 1860 /* If some errors occur */
AnnaBridge 189:f392fc9709a3 1861 cr3its = READ_REG(hirda->Instance->CR3);
AnnaBridge 189:f392fc9709a3 1862 if ((errorflags != 0U)
AnnaBridge 189:f392fc9709a3 1863 && (((cr3its & USART_CR3_EIE) != 0U)
AnnaBridge 189:f392fc9709a3 1864 || ((cr1its & (USART_CR1_RXNEIE_RXFNEIE | USART_CR1_PEIE)) != 0U)))
AnnaBridge 189:f392fc9709a3 1865 {
AnnaBridge 189:f392fc9709a3 1866 /* IRDA parity error interrupt occurred -------------------------------------*/
AnnaBridge 189:f392fc9709a3 1867 if (((isrflags & USART_ISR_PE) != 0U) && ((cr1its & USART_CR1_PEIE) != 0U))
AnnaBridge 189:f392fc9709a3 1868 {
AnnaBridge 189:f392fc9709a3 1869 __HAL_IRDA_CLEAR_IT(hirda, IRDA_CLEAR_PEF);
AnnaBridge 189:f392fc9709a3 1870
AnnaBridge 189:f392fc9709a3 1871 hirda->ErrorCode |= HAL_IRDA_ERROR_PE;
AnnaBridge 189:f392fc9709a3 1872 }
AnnaBridge 189:f392fc9709a3 1873
AnnaBridge 189:f392fc9709a3 1874 /* IRDA frame error interrupt occurred --------------------------------------*/
AnnaBridge 189:f392fc9709a3 1875 if (((isrflags & USART_ISR_FE) != 0U) && ((cr3its & USART_CR3_EIE) != 0U))
AnnaBridge 189:f392fc9709a3 1876 {
AnnaBridge 189:f392fc9709a3 1877 __HAL_IRDA_CLEAR_IT(hirda, IRDA_CLEAR_FEF);
AnnaBridge 189:f392fc9709a3 1878
AnnaBridge 189:f392fc9709a3 1879 hirda->ErrorCode |= HAL_IRDA_ERROR_FE;
AnnaBridge 189:f392fc9709a3 1880 }
AnnaBridge 189:f392fc9709a3 1881
AnnaBridge 189:f392fc9709a3 1882 /* IRDA noise error interrupt occurred --------------------------------------*/
AnnaBridge 189:f392fc9709a3 1883 if (((isrflags & USART_ISR_NE) != 0U) && ((cr3its & USART_CR3_EIE) != 0U))
AnnaBridge 189:f392fc9709a3 1884 {
AnnaBridge 189:f392fc9709a3 1885 __HAL_IRDA_CLEAR_IT(hirda, IRDA_CLEAR_NEF);
AnnaBridge 189:f392fc9709a3 1886
AnnaBridge 189:f392fc9709a3 1887 hirda->ErrorCode |= HAL_IRDA_ERROR_NE;
AnnaBridge 189:f392fc9709a3 1888 }
AnnaBridge 189:f392fc9709a3 1889
AnnaBridge 189:f392fc9709a3 1890 /* IRDA Over-Run interrupt occurred -----------------------------------------*/
AnnaBridge 189:f392fc9709a3 1891 if (((isrflags & USART_ISR_ORE) != 0U) &&
AnnaBridge 189:f392fc9709a3 1892 (((cr1its & USART_CR1_RXNEIE_RXFNEIE) != 0U) || ((cr3its & USART_CR3_EIE) != 0U)))
AnnaBridge 189:f392fc9709a3 1893 {
AnnaBridge 189:f392fc9709a3 1894 __HAL_IRDA_CLEAR_IT(hirda, IRDA_CLEAR_OREF);
AnnaBridge 189:f392fc9709a3 1895
AnnaBridge 189:f392fc9709a3 1896 hirda->ErrorCode |= HAL_IRDA_ERROR_ORE;
AnnaBridge 189:f392fc9709a3 1897 }
AnnaBridge 189:f392fc9709a3 1898
AnnaBridge 189:f392fc9709a3 1899 /* Call IRDA Error Call back function if need be --------------------------*/
AnnaBridge 189:f392fc9709a3 1900 if (hirda->ErrorCode != HAL_IRDA_ERROR_NONE)
AnnaBridge 189:f392fc9709a3 1901 {
AnnaBridge 189:f392fc9709a3 1902 /* IRDA in mode Receiver ---------------------------------------------------*/
AnnaBridge 189:f392fc9709a3 1903 if (((isrflags & USART_ISR_RXNE_RXFNE) != 0U) && ((cr1its & USART_CR1_RXNEIE_RXFNEIE) != 0U))
AnnaBridge 189:f392fc9709a3 1904 {
AnnaBridge 189:f392fc9709a3 1905 IRDA_Receive_IT(hirda);
AnnaBridge 189:f392fc9709a3 1906 }
AnnaBridge 189:f392fc9709a3 1907
AnnaBridge 189:f392fc9709a3 1908 /* If Overrun error occurs, or if any error occurs in DMA mode reception,
AnnaBridge 189:f392fc9709a3 1909 consider error as blocking */
AnnaBridge 189:f392fc9709a3 1910 errorcode = hirda->ErrorCode;
AnnaBridge 189:f392fc9709a3 1911 if ((HAL_IS_BIT_SET(hirda->Instance->CR3, USART_CR3_DMAR)) ||
AnnaBridge 189:f392fc9709a3 1912 ((errorcode & HAL_IRDA_ERROR_ORE) != 0U))
AnnaBridge 189:f392fc9709a3 1913 {
AnnaBridge 189:f392fc9709a3 1914 /* Blocking error : transfer is aborted
AnnaBridge 189:f392fc9709a3 1915 Set the IRDA state ready to be able to start again the process,
AnnaBridge 189:f392fc9709a3 1916 Disable Rx Interrupts, and disable Rx DMA request, if ongoing */
AnnaBridge 189:f392fc9709a3 1917 IRDA_EndRxTransfer(hirda);
AnnaBridge 189:f392fc9709a3 1918
AnnaBridge 189:f392fc9709a3 1919 /* Disable the IRDA DMA Rx request if enabled */
AnnaBridge 189:f392fc9709a3 1920 if (HAL_IS_BIT_SET(hirda->Instance->CR3, USART_CR3_DMAR))
AnnaBridge 189:f392fc9709a3 1921 {
AnnaBridge 189:f392fc9709a3 1922 CLEAR_BIT(hirda->Instance->CR3, USART_CR3_DMAR);
AnnaBridge 189:f392fc9709a3 1923
AnnaBridge 189:f392fc9709a3 1924 /* Abort the IRDA DMA Rx channel */
AnnaBridge 189:f392fc9709a3 1925 if (hirda->hdmarx != NULL)
AnnaBridge 189:f392fc9709a3 1926 {
AnnaBridge 189:f392fc9709a3 1927 /* Set the IRDA DMA Abort callback :
AnnaBridge 189:f392fc9709a3 1928 will lead to call HAL_IRDA_ErrorCallback() at end of DMA abort procedure */
AnnaBridge 189:f392fc9709a3 1929 hirda->hdmarx->XferAbortCallback = IRDA_DMAAbortOnError;
AnnaBridge 189:f392fc9709a3 1930
AnnaBridge 189:f392fc9709a3 1931 /* Abort DMA RX */
AnnaBridge 189:f392fc9709a3 1932 if (HAL_DMA_Abort_IT(hirda->hdmarx) != HAL_OK)
AnnaBridge 189:f392fc9709a3 1933 {
AnnaBridge 189:f392fc9709a3 1934 /* Call Directly hirda->hdmarx->XferAbortCallback function in case of error */
AnnaBridge 189:f392fc9709a3 1935 hirda->hdmarx->XferAbortCallback(hirda->hdmarx);
AnnaBridge 189:f392fc9709a3 1936 }
AnnaBridge 189:f392fc9709a3 1937 }
AnnaBridge 189:f392fc9709a3 1938 else
AnnaBridge 189:f392fc9709a3 1939 {
AnnaBridge 189:f392fc9709a3 1940 #if (USE_HAL_IRDA_REGISTER_CALLBACKS == 1)
AnnaBridge 189:f392fc9709a3 1941 /* Call registered user error callback */
AnnaBridge 189:f392fc9709a3 1942 hirda->ErrorCallback(hirda);
AnnaBridge 189:f392fc9709a3 1943 #else
AnnaBridge 189:f392fc9709a3 1944 /* Call legacy weak user error callback */
AnnaBridge 189:f392fc9709a3 1945 HAL_IRDA_ErrorCallback(hirda);
AnnaBridge 189:f392fc9709a3 1946 #endif /* USE_HAL_IRDA_REGISTER_CALLBACK */
AnnaBridge 189:f392fc9709a3 1947 }
AnnaBridge 189:f392fc9709a3 1948 }
AnnaBridge 189:f392fc9709a3 1949 else
AnnaBridge 189:f392fc9709a3 1950 {
AnnaBridge 189:f392fc9709a3 1951 #if (USE_HAL_IRDA_REGISTER_CALLBACKS == 1)
AnnaBridge 189:f392fc9709a3 1952 /* Call registered user error callback */
AnnaBridge 189:f392fc9709a3 1953 hirda->ErrorCallback(hirda);
AnnaBridge 189:f392fc9709a3 1954 #else
AnnaBridge 189:f392fc9709a3 1955 /* Call legacy weak user error callback */
AnnaBridge 189:f392fc9709a3 1956 HAL_IRDA_ErrorCallback(hirda);
AnnaBridge 189:f392fc9709a3 1957 #endif /* USE_HAL_IRDA_REGISTER_CALLBACK */
AnnaBridge 189:f392fc9709a3 1958 }
AnnaBridge 189:f392fc9709a3 1959 }
AnnaBridge 189:f392fc9709a3 1960 else
AnnaBridge 189:f392fc9709a3 1961 {
AnnaBridge 189:f392fc9709a3 1962 /* Non Blocking error : transfer could go on.
AnnaBridge 189:f392fc9709a3 1963 Error is notified to user through user error callback */
AnnaBridge 189:f392fc9709a3 1964 #if (USE_HAL_IRDA_REGISTER_CALLBACKS == 1)
AnnaBridge 189:f392fc9709a3 1965 /* Call registered user error callback */
AnnaBridge 189:f392fc9709a3 1966 hirda->ErrorCallback(hirda);
AnnaBridge 189:f392fc9709a3 1967 #else
AnnaBridge 189:f392fc9709a3 1968 /* Call legacy weak user error callback */
AnnaBridge 189:f392fc9709a3 1969 HAL_IRDA_ErrorCallback(hirda);
AnnaBridge 189:f392fc9709a3 1970 #endif /* USE_HAL_IRDA_REGISTER_CALLBACK */
AnnaBridge 189:f392fc9709a3 1971 hirda->ErrorCode = HAL_IRDA_ERROR_NONE;
AnnaBridge 189:f392fc9709a3 1972 }
AnnaBridge 189:f392fc9709a3 1973 }
AnnaBridge 189:f392fc9709a3 1974 return;
AnnaBridge 189:f392fc9709a3 1975
AnnaBridge 189:f392fc9709a3 1976 } /* End if some error occurs */
AnnaBridge 189:f392fc9709a3 1977
AnnaBridge 189:f392fc9709a3 1978 /* IRDA in mode Transmitter ------------------------------------------------*/
AnnaBridge 189:f392fc9709a3 1979 if (((isrflags & USART_ISR_TXE_TXFNF) != 0U) && ((cr1its & USART_CR1_TXEIE_TXFNFIE) != 0U))
AnnaBridge 189:f392fc9709a3 1980 {
AnnaBridge 189:f392fc9709a3 1981 IRDA_Transmit_IT(hirda);
AnnaBridge 189:f392fc9709a3 1982 return;
AnnaBridge 189:f392fc9709a3 1983 }
AnnaBridge 189:f392fc9709a3 1984
AnnaBridge 189:f392fc9709a3 1985 /* IRDA in mode Transmitter (transmission end) -----------------------------*/
AnnaBridge 189:f392fc9709a3 1986 if (((isrflags & USART_ISR_TC) != 0U) && ((cr1its & USART_CR1_TCIE) != 0U))
AnnaBridge 189:f392fc9709a3 1987 {
AnnaBridge 189:f392fc9709a3 1988 IRDA_EndTransmit_IT(hirda);
AnnaBridge 189:f392fc9709a3 1989 return;
AnnaBridge 189:f392fc9709a3 1990 }
AnnaBridge 189:f392fc9709a3 1991
AnnaBridge 189:f392fc9709a3 1992 }
AnnaBridge 189:f392fc9709a3 1993
AnnaBridge 189:f392fc9709a3 1994 /**
AnnaBridge 189:f392fc9709a3 1995 * @brief Tx Transfer completed callback.
AnnaBridge 189:f392fc9709a3 1996 * @param hirda Pointer to a IRDA_HandleTypeDef structure that contains
AnnaBridge 189:f392fc9709a3 1997 * the configuration information for the specified IRDA module.
AnnaBridge 189:f392fc9709a3 1998 * @retval None
AnnaBridge 189:f392fc9709a3 1999 */
AnnaBridge 189:f392fc9709a3 2000 __weak void HAL_IRDA_TxCpltCallback(IRDA_HandleTypeDef *hirda)
AnnaBridge 189:f392fc9709a3 2001 {
AnnaBridge 189:f392fc9709a3 2002 /* Prevent unused argument(s) compilation warning */
AnnaBridge 189:f392fc9709a3 2003 UNUSED(hirda);
AnnaBridge 189:f392fc9709a3 2004
AnnaBridge 189:f392fc9709a3 2005 /* NOTE : This function should not be modified, when the callback is needed,
AnnaBridge 189:f392fc9709a3 2006 the HAL_IRDA_TxCpltCallback can be implemented in the user file.
AnnaBridge 189:f392fc9709a3 2007 */
AnnaBridge 189:f392fc9709a3 2008 }
AnnaBridge 189:f392fc9709a3 2009
AnnaBridge 189:f392fc9709a3 2010 /**
AnnaBridge 189:f392fc9709a3 2011 * @brief Tx Half Transfer completed callback.
AnnaBridge 189:f392fc9709a3 2012 * @param hirda Pointer to a IRDA_HandleTypeDef structure that contains
AnnaBridge 189:f392fc9709a3 2013 * the configuration information for the specified USART module.
AnnaBridge 189:f392fc9709a3 2014 * @retval None
AnnaBridge 189:f392fc9709a3 2015 */
AnnaBridge 189:f392fc9709a3 2016 __weak void HAL_IRDA_TxHalfCpltCallback(IRDA_HandleTypeDef *hirda)
AnnaBridge 189:f392fc9709a3 2017 {
AnnaBridge 189:f392fc9709a3 2018 /* Prevent unused argument(s) compilation warning */
AnnaBridge 189:f392fc9709a3 2019 UNUSED(hirda);
AnnaBridge 189:f392fc9709a3 2020
AnnaBridge 189:f392fc9709a3 2021 /* NOTE : This function should not be modified, when the callback is needed,
AnnaBridge 189:f392fc9709a3 2022 the HAL_IRDA_TxHalfCpltCallback can be implemented in the user file.
AnnaBridge 189:f392fc9709a3 2023 */
AnnaBridge 189:f392fc9709a3 2024 }
AnnaBridge 189:f392fc9709a3 2025
AnnaBridge 189:f392fc9709a3 2026 /**
AnnaBridge 189:f392fc9709a3 2027 * @brief Rx Transfer completed callback.
AnnaBridge 189:f392fc9709a3 2028 * @param hirda Pointer to a IRDA_HandleTypeDef structure that contains
AnnaBridge 189:f392fc9709a3 2029 * the configuration information for the specified IRDA module.
AnnaBridge 189:f392fc9709a3 2030 * @retval None
AnnaBridge 189:f392fc9709a3 2031 */
AnnaBridge 189:f392fc9709a3 2032 __weak void HAL_IRDA_RxCpltCallback(IRDA_HandleTypeDef *hirda)
AnnaBridge 189:f392fc9709a3 2033 {
AnnaBridge 189:f392fc9709a3 2034 /* Prevent unused argument(s) compilation warning */
AnnaBridge 189:f392fc9709a3 2035 UNUSED(hirda);
AnnaBridge 189:f392fc9709a3 2036
AnnaBridge 189:f392fc9709a3 2037 /* NOTE : This function should not be modified, when the callback is needed,
AnnaBridge 189:f392fc9709a3 2038 the HAL_IRDA_RxCpltCallback can be implemented in the user file.
AnnaBridge 189:f392fc9709a3 2039 */
AnnaBridge 189:f392fc9709a3 2040 }
AnnaBridge 189:f392fc9709a3 2041
AnnaBridge 189:f392fc9709a3 2042 /**
AnnaBridge 189:f392fc9709a3 2043 * @brief Rx Half Transfer complete callback.
AnnaBridge 189:f392fc9709a3 2044 * @param hirda Pointer to a IRDA_HandleTypeDef structure that contains
AnnaBridge 189:f392fc9709a3 2045 * the configuration information for the specified IRDA module.
AnnaBridge 189:f392fc9709a3 2046 * @retval None
AnnaBridge 189:f392fc9709a3 2047 */
AnnaBridge 189:f392fc9709a3 2048 __weak void HAL_IRDA_RxHalfCpltCallback(IRDA_HandleTypeDef *hirda)
AnnaBridge 189:f392fc9709a3 2049 {
AnnaBridge 189:f392fc9709a3 2050 /* Prevent unused argument(s) compilation warning */
AnnaBridge 189:f392fc9709a3 2051 UNUSED(hirda);
AnnaBridge 189:f392fc9709a3 2052
AnnaBridge 189:f392fc9709a3 2053 /* NOTE : This function should not be modified, when the callback is needed,
AnnaBridge 189:f392fc9709a3 2054 the HAL_IRDA_RxHalfCpltCallback can be implemented in the user file.
AnnaBridge 189:f392fc9709a3 2055 */
AnnaBridge 189:f392fc9709a3 2056 }
AnnaBridge 189:f392fc9709a3 2057
AnnaBridge 189:f392fc9709a3 2058 /**
AnnaBridge 189:f392fc9709a3 2059 * @brief IRDA error callback.
AnnaBridge 189:f392fc9709a3 2060 * @param hirda Pointer to a IRDA_HandleTypeDef structure that contains
AnnaBridge 189:f392fc9709a3 2061 * the configuration information for the specified IRDA module.
AnnaBridge 189:f392fc9709a3 2062 * @retval None
AnnaBridge 189:f392fc9709a3 2063 */
AnnaBridge 189:f392fc9709a3 2064 __weak void HAL_IRDA_ErrorCallback(IRDA_HandleTypeDef *hirda)
AnnaBridge 189:f392fc9709a3 2065 {
AnnaBridge 189:f392fc9709a3 2066 /* Prevent unused argument(s) compilation warning */
AnnaBridge 189:f392fc9709a3 2067 UNUSED(hirda);
AnnaBridge 189:f392fc9709a3 2068
AnnaBridge 189:f392fc9709a3 2069 /* NOTE : This function should not be modified, when the callback is needed,
AnnaBridge 189:f392fc9709a3 2070 the HAL_IRDA_ErrorCallback can be implemented in the user file.
AnnaBridge 189:f392fc9709a3 2071 */
AnnaBridge 189:f392fc9709a3 2072 }
AnnaBridge 189:f392fc9709a3 2073
AnnaBridge 189:f392fc9709a3 2074 /**
AnnaBridge 189:f392fc9709a3 2075 * @brief IRDA Abort Complete callback.
AnnaBridge 189:f392fc9709a3 2076 * @param hirda Pointer to a IRDA_HandleTypeDef structure that contains
AnnaBridge 189:f392fc9709a3 2077 * the configuration information for the specified IRDA module.
AnnaBridge 189:f392fc9709a3 2078 * @retval None
AnnaBridge 189:f392fc9709a3 2079 */
AnnaBridge 189:f392fc9709a3 2080 __weak void HAL_IRDA_AbortCpltCallback(IRDA_HandleTypeDef *hirda)
AnnaBridge 189:f392fc9709a3 2081 {
AnnaBridge 189:f392fc9709a3 2082 /* Prevent unused argument(s) compilation warning */
AnnaBridge 189:f392fc9709a3 2083 UNUSED(hirda);
AnnaBridge 189:f392fc9709a3 2084
AnnaBridge 189:f392fc9709a3 2085 /* NOTE : This function should not be modified, when the callback is needed,
AnnaBridge 189:f392fc9709a3 2086 the HAL_IRDA_AbortCpltCallback can be implemented in the user file.
AnnaBridge 189:f392fc9709a3 2087 */
AnnaBridge 189:f392fc9709a3 2088 }
AnnaBridge 189:f392fc9709a3 2089
AnnaBridge 189:f392fc9709a3 2090 /**
AnnaBridge 189:f392fc9709a3 2091 * @brief IRDA Abort Complete callback.
AnnaBridge 189:f392fc9709a3 2092 * @param hirda Pointer to a IRDA_HandleTypeDef structure that contains
AnnaBridge 189:f392fc9709a3 2093 * the configuration information for the specified IRDA module.
AnnaBridge 189:f392fc9709a3 2094 * @retval None
AnnaBridge 189:f392fc9709a3 2095 */
AnnaBridge 189:f392fc9709a3 2096 __weak void HAL_IRDA_AbortTransmitCpltCallback(IRDA_HandleTypeDef *hirda)
AnnaBridge 189:f392fc9709a3 2097 {
AnnaBridge 189:f392fc9709a3 2098 /* Prevent unused argument(s) compilation warning */
AnnaBridge 189:f392fc9709a3 2099 UNUSED(hirda);
AnnaBridge 189:f392fc9709a3 2100
AnnaBridge 189:f392fc9709a3 2101 /* NOTE : This function should not be modified, when the callback is needed,
AnnaBridge 189:f392fc9709a3 2102 the HAL_IRDA_AbortTransmitCpltCallback can be implemented in the user file.
AnnaBridge 189:f392fc9709a3 2103 */
AnnaBridge 189:f392fc9709a3 2104 }
AnnaBridge 189:f392fc9709a3 2105
AnnaBridge 189:f392fc9709a3 2106 /**
AnnaBridge 189:f392fc9709a3 2107 * @brief IRDA Abort Receive Complete callback.
AnnaBridge 189:f392fc9709a3 2108 * @param hirda Pointer to a IRDA_HandleTypeDef structure that contains
AnnaBridge 189:f392fc9709a3 2109 * the configuration information for the specified IRDA module.
AnnaBridge 189:f392fc9709a3 2110 * @retval None
AnnaBridge 189:f392fc9709a3 2111 */
AnnaBridge 189:f392fc9709a3 2112 __weak void HAL_IRDA_AbortReceiveCpltCallback(IRDA_HandleTypeDef *hirda)
AnnaBridge 189:f392fc9709a3 2113 {
AnnaBridge 189:f392fc9709a3 2114 /* Prevent unused argument(s) compilation warning */
AnnaBridge 189:f392fc9709a3 2115 UNUSED(hirda);
AnnaBridge 189:f392fc9709a3 2116
AnnaBridge 189:f392fc9709a3 2117 /* NOTE : This function should not be modified, when the callback is needed,
AnnaBridge 189:f392fc9709a3 2118 the HAL_IRDA_AbortReceiveCpltCallback can be implemented in the user file.
AnnaBridge 189:f392fc9709a3 2119 */
AnnaBridge 189:f392fc9709a3 2120 }
AnnaBridge 189:f392fc9709a3 2121
AnnaBridge 189:f392fc9709a3 2122 /**
AnnaBridge 189:f392fc9709a3 2123 * @}
AnnaBridge 189:f392fc9709a3 2124 */
AnnaBridge 189:f392fc9709a3 2125
AnnaBridge 189:f392fc9709a3 2126 /** @defgroup IRDA_Exported_Functions_Group4 Peripheral State and Error functions
AnnaBridge 189:f392fc9709a3 2127 * @brief IRDA State and Errors functions
AnnaBridge 189:f392fc9709a3 2128 *
AnnaBridge 189:f392fc9709a3 2129 @verbatim
AnnaBridge 189:f392fc9709a3 2130 ==============================================================================
AnnaBridge 189:f392fc9709a3 2131 ##### Peripheral State and Error functions #####
AnnaBridge 189:f392fc9709a3 2132 ==============================================================================
AnnaBridge 189:f392fc9709a3 2133 [..]
AnnaBridge 189:f392fc9709a3 2134 This subsection provides a set of functions allowing to return the State of IrDA
AnnaBridge 189:f392fc9709a3 2135 communication process and also return Peripheral Errors occurred during communication process
AnnaBridge 189:f392fc9709a3 2136 (+) HAL_IRDA_GetState() API can be helpful to check in run-time the state
AnnaBridge 189:f392fc9709a3 2137 of the IRDA peripheral handle.
AnnaBridge 189:f392fc9709a3 2138 (+) HAL_IRDA_GetError() checks in run-time errors that could occur during
AnnaBridge 189:f392fc9709a3 2139 communication.
AnnaBridge 189:f392fc9709a3 2140
AnnaBridge 189:f392fc9709a3 2141 @endverbatim
AnnaBridge 189:f392fc9709a3 2142 * @{
AnnaBridge 189:f392fc9709a3 2143 */
AnnaBridge 189:f392fc9709a3 2144
AnnaBridge 189:f392fc9709a3 2145 /**
AnnaBridge 189:f392fc9709a3 2146 * @brief Return the IRDA handle state.
AnnaBridge 189:f392fc9709a3 2147 * @param hirda Pointer to a IRDA_HandleTypeDef structure that contains
AnnaBridge 189:f392fc9709a3 2148 * the configuration information for the specified IRDA module.
AnnaBridge 189:f392fc9709a3 2149 * @retval HAL state
AnnaBridge 189:f392fc9709a3 2150 */
AnnaBridge 189:f392fc9709a3 2151 HAL_IRDA_StateTypeDef HAL_IRDA_GetState(IRDA_HandleTypeDef *hirda)
AnnaBridge 189:f392fc9709a3 2152 {
AnnaBridge 189:f392fc9709a3 2153 /* Return IRDA handle state */
AnnaBridge 189:f392fc9709a3 2154 uint32_t temp1, temp2;
AnnaBridge 189:f392fc9709a3 2155 temp1 = (uint32_t)hirda->gState;
AnnaBridge 189:f392fc9709a3 2156 temp2 = (uint32_t)hirda->RxState;
AnnaBridge 189:f392fc9709a3 2157
AnnaBridge 189:f392fc9709a3 2158 return (HAL_IRDA_StateTypeDef)(temp1 | temp2);
AnnaBridge 189:f392fc9709a3 2159 }
AnnaBridge 189:f392fc9709a3 2160
AnnaBridge 189:f392fc9709a3 2161 /**
AnnaBridge 189:f392fc9709a3 2162 * @brief Return the IRDA handle error code.
AnnaBridge 189:f392fc9709a3 2163 * @param hirda Pointer to a IRDA_HandleTypeDef structure that contains
AnnaBridge 189:f392fc9709a3 2164 * the configuration information for the specified IRDA module.
AnnaBridge 189:f392fc9709a3 2165 * @retval IRDA Error Code
AnnaBridge 189:f392fc9709a3 2166 */
AnnaBridge 189:f392fc9709a3 2167 uint32_t HAL_IRDA_GetError(IRDA_HandleTypeDef *hirda)
AnnaBridge 189:f392fc9709a3 2168 {
AnnaBridge 189:f392fc9709a3 2169 return hirda->ErrorCode;
AnnaBridge 189:f392fc9709a3 2170 }
AnnaBridge 189:f392fc9709a3 2171
AnnaBridge 189:f392fc9709a3 2172 /**
AnnaBridge 189:f392fc9709a3 2173 * @}
AnnaBridge 189:f392fc9709a3 2174 */
AnnaBridge 189:f392fc9709a3 2175
AnnaBridge 189:f392fc9709a3 2176 /**
AnnaBridge 189:f392fc9709a3 2177 * @}
AnnaBridge 189:f392fc9709a3 2178 */
AnnaBridge 189:f392fc9709a3 2179
AnnaBridge 189:f392fc9709a3 2180 /** @defgroup IRDA_Private_Functions IRDA Private Functions
AnnaBridge 189:f392fc9709a3 2181 * @{
AnnaBridge 189:f392fc9709a3 2182 */
AnnaBridge 189:f392fc9709a3 2183
AnnaBridge 189:f392fc9709a3 2184 #if (USE_HAL_IRDA_REGISTER_CALLBACKS == 1)
AnnaBridge 189:f392fc9709a3 2185 /**
AnnaBridge 189:f392fc9709a3 2186 * @brief Initialize the callbacks to their default values.
AnnaBridge 189:f392fc9709a3 2187 * @param hirda IRDA handle.
AnnaBridge 189:f392fc9709a3 2188 * @retval none
AnnaBridge 189:f392fc9709a3 2189 */
AnnaBridge 189:f392fc9709a3 2190 void IRDA_InitCallbacksToDefault(IRDA_HandleTypeDef *hirda)
AnnaBridge 189:f392fc9709a3 2191 {
AnnaBridge 189:f392fc9709a3 2192 /* Init the IRDA Callback settings */
AnnaBridge 189:f392fc9709a3 2193 hirda->TxHalfCpltCallback = HAL_IRDA_TxHalfCpltCallback; /* Legacy weak TxHalfCpltCallback */
AnnaBridge 189:f392fc9709a3 2194 hirda->TxCpltCallback = HAL_IRDA_TxCpltCallback; /* Legacy weak TxCpltCallback */
AnnaBridge 189:f392fc9709a3 2195 hirda->RxHalfCpltCallback = HAL_IRDA_RxHalfCpltCallback; /* Legacy weak RxHalfCpltCallback */
AnnaBridge 189:f392fc9709a3 2196 hirda->RxCpltCallback = HAL_IRDA_RxCpltCallback; /* Legacy weak RxCpltCallback */
AnnaBridge 189:f392fc9709a3 2197 hirda->ErrorCallback = HAL_IRDA_ErrorCallback; /* Legacy weak ErrorCallback */
AnnaBridge 189:f392fc9709a3 2198 hirda->AbortCpltCallback = HAL_IRDA_AbortCpltCallback; /* Legacy weak AbortCpltCallback */
AnnaBridge 189:f392fc9709a3 2199 hirda->AbortTransmitCpltCallback = HAL_IRDA_AbortTransmitCpltCallback; /* Legacy weak AbortTransmitCpltCallback */
AnnaBridge 189:f392fc9709a3 2200 hirda->AbortReceiveCpltCallback = HAL_IRDA_AbortReceiveCpltCallback; /* Legacy weak AbortReceiveCpltCallback */
AnnaBridge 189:f392fc9709a3 2201
AnnaBridge 189:f392fc9709a3 2202 }
AnnaBridge 189:f392fc9709a3 2203 #endif /* USE_HAL_IRDA_REGISTER_CALLBACKS */
AnnaBridge 189:f392fc9709a3 2204
AnnaBridge 189:f392fc9709a3 2205 /**
AnnaBridge 189:f392fc9709a3 2206 * @brief Configure the IRDA peripheral.
AnnaBridge 189:f392fc9709a3 2207 * @param hirda Pointer to a IRDA_HandleTypeDef structure that contains
AnnaBridge 189:f392fc9709a3 2208 * the configuration information for the specified IRDA module.
AnnaBridge 189:f392fc9709a3 2209 * @retval HAL status
AnnaBridge 189:f392fc9709a3 2210 */
AnnaBridge 189:f392fc9709a3 2211 static HAL_StatusTypeDef IRDA_SetConfig(IRDA_HandleTypeDef *hirda)
AnnaBridge 189:f392fc9709a3 2212 {
AnnaBridge 189:f392fc9709a3 2213 uint32_t tmpreg;
AnnaBridge 189:f392fc9709a3 2214 IRDA_ClockSourceTypeDef clocksource;
AnnaBridge 189:f392fc9709a3 2215 HAL_StatusTypeDef ret = HAL_OK;
AnnaBridge 189:f392fc9709a3 2216 const uint16_t IRDAPrescTable[12] = {1U, 2U, 4U, 6U, 8U, 10U, 12U, 16U, 32U, 64U, 128U, 256U};
AnnaBridge 189:f392fc9709a3 2217 PLL2_ClocksTypeDef pll2_clocks;
AnnaBridge 189:f392fc9709a3 2218 PLL3_ClocksTypeDef pll3_clocks;
AnnaBridge 189:f392fc9709a3 2219
AnnaBridge 189:f392fc9709a3 2220 /* Check the communication parameters */
AnnaBridge 189:f392fc9709a3 2221 assert_param(IS_IRDA_BAUDRATE(hirda->Init.BaudRate));
AnnaBridge 189:f392fc9709a3 2222 assert_param(IS_IRDA_WORD_LENGTH(hirda->Init.WordLength));
AnnaBridge 189:f392fc9709a3 2223 assert_param(IS_IRDA_PARITY(hirda->Init.Parity));
AnnaBridge 189:f392fc9709a3 2224 assert_param(IS_IRDA_TX_RX_MODE(hirda->Init.Mode));
AnnaBridge 189:f392fc9709a3 2225 assert_param(IS_IRDA_PRESCALER(hirda->Init.Prescaler));
AnnaBridge 189:f392fc9709a3 2226 assert_param(IS_IRDA_POWERMODE(hirda->Init.PowerMode));
AnnaBridge 189:f392fc9709a3 2227 assert_param(IS_IRDA_CLOCKPRESCALER(hirda->Init.ClockPrescaler));
AnnaBridge 189:f392fc9709a3 2228
AnnaBridge 189:f392fc9709a3 2229 /*-------------------------- USART CR1 Configuration -----------------------*/
AnnaBridge 189:f392fc9709a3 2230 /* Configure the IRDA Word Length, Parity and transfer Mode:
AnnaBridge 189:f392fc9709a3 2231 Set the M bits according to hirda->Init.WordLength value
AnnaBridge 189:f392fc9709a3 2232 Set PCE and PS bits according to hirda->Init.Parity value
AnnaBridge 189:f392fc9709a3 2233 Set TE and RE bits according to hirda->Init.Mode value */
AnnaBridge 189:f392fc9709a3 2234 tmpreg = (uint32_t)hirda->Init.WordLength | hirda->Init.Parity | hirda->Init.Mode ;
AnnaBridge 189:f392fc9709a3 2235
AnnaBridge 189:f392fc9709a3 2236 MODIFY_REG(hirda->Instance->CR1, IRDA_CR1_FIELDS, tmpreg);
AnnaBridge 189:f392fc9709a3 2237
AnnaBridge 189:f392fc9709a3 2238 /*-------------------------- USART CR3 Configuration -----------------------*/
AnnaBridge 189:f392fc9709a3 2239 MODIFY_REG(hirda->Instance->CR3, USART_CR3_IRLP, hirda->Init.PowerMode);
AnnaBridge 189:f392fc9709a3 2240
AnnaBridge 189:f392fc9709a3 2241 /*--------------------- USART clock PRESC Configuration ----------------*/
AnnaBridge 189:f392fc9709a3 2242 /* Configure
AnnaBridge 189:f392fc9709a3 2243 * - IRDA Clock Prescaler: set PRESCALER according to hirda->Init.ClockPrescaler value */
AnnaBridge 189:f392fc9709a3 2244 MODIFY_REG(hirda->Instance->PRESC, USART_PRESC_PRESCALER, hirda->Init.ClockPrescaler);
AnnaBridge 189:f392fc9709a3 2245
AnnaBridge 189:f392fc9709a3 2246 /*-------------------------- USART GTPR Configuration ----------------------*/
AnnaBridge 189:f392fc9709a3 2247 MODIFY_REG(hirda->Instance->GTPR, (uint16_t)USART_GTPR_PSC, hirda->Init.Prescaler);
AnnaBridge 189:f392fc9709a3 2248
AnnaBridge 189:f392fc9709a3 2249 /*-------------------------- USART BRR Configuration -----------------------*/
AnnaBridge 189:f392fc9709a3 2250 IRDA_GETCLOCKSOURCE(hirda, clocksource);
AnnaBridge 189:f392fc9709a3 2251 tmpreg = 0U;
AnnaBridge 189:f392fc9709a3 2252 switch (clocksource)
AnnaBridge 189:f392fc9709a3 2253 {
AnnaBridge 189:f392fc9709a3 2254 case IRDA_CLOCKSOURCE_D2PCLK1:
AnnaBridge 189:f392fc9709a3 2255 tmpreg = (uint16_t)(IRDA_DIV_SAMPLING16(HAL_RCC_GetPCLK1Freq(), hirda->Init.BaudRate, hirda->Init.ClockPrescaler));
AnnaBridge 189:f392fc9709a3 2256 break;
AnnaBridge 189:f392fc9709a3 2257 case IRDA_CLOCKSOURCE_D2PCLK2:
AnnaBridge 189:f392fc9709a3 2258 tmpreg = (uint16_t)(IRDA_DIV_SAMPLING16(HAL_RCC_GetPCLK2Freq(), hirda->Init.BaudRate, hirda->Init.ClockPrescaler));
AnnaBridge 189:f392fc9709a3 2259 break;
AnnaBridge 189:f392fc9709a3 2260 case IRDA_CLOCKSOURCE_PLL2Q:
AnnaBridge 189:f392fc9709a3 2261 HAL_RCCEx_GetPLL2ClockFreq(&pll2_clocks);
AnnaBridge 189:f392fc9709a3 2262 tmpreg = (uint16_t)(IRDA_DIV_SAMPLING16(pll2_clocks.PLL2_Q_Frequency, hirda->Init.BaudRate, hirda->Init.ClockPrescaler));
AnnaBridge 189:f392fc9709a3 2263 break;
AnnaBridge 189:f392fc9709a3 2264 case IRDA_CLOCKSOURCE_PLL3Q:
AnnaBridge 189:f392fc9709a3 2265 HAL_RCCEx_GetPLL3ClockFreq(&pll3_clocks);
AnnaBridge 189:f392fc9709a3 2266 tmpreg = (uint16_t)(IRDA_DIV_SAMPLING16(pll3_clocks.PLL3_Q_Frequency, hirda->Init.BaudRate, hirda->Init.ClockPrescaler));
AnnaBridge 189:f392fc9709a3 2267 break;
AnnaBridge 189:f392fc9709a3 2268 case IRDA_CLOCKSOURCE_CSI:
AnnaBridge 189:f392fc9709a3 2269 tmpreg = (uint16_t)(IRDA_DIV_SAMPLING16(CSI_VALUE, hirda->Init.BaudRate, hirda->Init.ClockPrescaler));
AnnaBridge 189:f392fc9709a3 2270 break;
AnnaBridge 189:f392fc9709a3 2271 case IRDA_CLOCKSOURCE_HSI:
AnnaBridge 189:f392fc9709a3 2272 tmpreg = (uint16_t)(IRDA_DIV_SAMPLING16(HSI_VALUE, hirda->Init.BaudRate, hirda->Init.ClockPrescaler));
AnnaBridge 189:f392fc9709a3 2273 break;
AnnaBridge 189:f392fc9709a3 2274 case IRDA_CLOCKSOURCE_LSE:
AnnaBridge 189:f392fc9709a3 2275 tmpreg = (uint16_t)(IRDA_DIV_SAMPLING16((uint32_t)LSE_VALUE, hirda->Init.BaudRate, hirda->Init.ClockPrescaler));
AnnaBridge 189:f392fc9709a3 2276 break;
AnnaBridge 189:f392fc9709a3 2277 default:
AnnaBridge 189:f392fc9709a3 2278 ret = HAL_ERROR;
AnnaBridge 189:f392fc9709a3 2279 break;
AnnaBridge 189:f392fc9709a3 2280 }
AnnaBridge 189:f392fc9709a3 2281
AnnaBridge 189:f392fc9709a3 2282 /* USARTDIV must be greater than or equal to 0d16 */
AnnaBridge 189:f392fc9709a3 2283 if ((tmpreg >= USART_BRR_MIN) && (tmpreg <= USART_BRR_MAX))
AnnaBridge 189:f392fc9709a3 2284 {
AnnaBridge 189:f392fc9709a3 2285 hirda->Instance->BRR = tmpreg;
AnnaBridge 189:f392fc9709a3 2286 }
AnnaBridge 189:f392fc9709a3 2287 else
AnnaBridge 189:f392fc9709a3 2288 {
AnnaBridge 189:f392fc9709a3 2289 ret = HAL_ERROR;
AnnaBridge 189:f392fc9709a3 2290 }
AnnaBridge 189:f392fc9709a3 2291
AnnaBridge 189:f392fc9709a3 2292 return ret;
AnnaBridge 189:f392fc9709a3 2293 }
AnnaBridge 189:f392fc9709a3 2294
AnnaBridge 189:f392fc9709a3 2295 /**
AnnaBridge 189:f392fc9709a3 2296 * @brief Check the IRDA Idle State.
AnnaBridge 189:f392fc9709a3 2297 * @param hirda Pointer to a IRDA_HandleTypeDef structure that contains
AnnaBridge 189:f392fc9709a3 2298 * the configuration information for the specified IRDA module.
AnnaBridge 189:f392fc9709a3 2299 * @retval HAL status
AnnaBridge 189:f392fc9709a3 2300 */
AnnaBridge 189:f392fc9709a3 2301 static HAL_StatusTypeDef IRDA_CheckIdleState(IRDA_HandleTypeDef *hirda)
AnnaBridge 189:f392fc9709a3 2302 {
AnnaBridge 189:f392fc9709a3 2303 uint32_t tickstart;
AnnaBridge 189:f392fc9709a3 2304
AnnaBridge 189:f392fc9709a3 2305 /* Initialize the IRDA ErrorCode */
AnnaBridge 189:f392fc9709a3 2306 hirda->ErrorCode = HAL_IRDA_ERROR_NONE;
AnnaBridge 189:f392fc9709a3 2307
AnnaBridge 189:f392fc9709a3 2308 /* Init tickstart for timeout managment*/
AnnaBridge 189:f392fc9709a3 2309 tickstart = HAL_GetTick();
AnnaBridge 189:f392fc9709a3 2310
AnnaBridge 189:f392fc9709a3 2311 /* Check if the Transmitter is enabled */
AnnaBridge 189:f392fc9709a3 2312 if ((hirda->Instance->CR1 & USART_CR1_TE) == USART_CR1_TE)
AnnaBridge 189:f392fc9709a3 2313 {
AnnaBridge 189:f392fc9709a3 2314 /* Wait until TEACK flag is set */
AnnaBridge 189:f392fc9709a3 2315 if (IRDA_WaitOnFlagUntilTimeout(hirda, USART_ISR_TEACK, RESET, tickstart, IRDA_TEACK_REACK_TIMEOUT) != HAL_OK)
AnnaBridge 189:f392fc9709a3 2316 {
AnnaBridge 189:f392fc9709a3 2317 /* Timeout occurred */
AnnaBridge 189:f392fc9709a3 2318 return HAL_TIMEOUT;
AnnaBridge 189:f392fc9709a3 2319 }
AnnaBridge 189:f392fc9709a3 2320 }
AnnaBridge 189:f392fc9709a3 2321 /* Check if the Receiver is enabled */
AnnaBridge 189:f392fc9709a3 2322 if ((hirda->Instance->CR1 & USART_CR1_RE) == USART_CR1_RE)
AnnaBridge 189:f392fc9709a3 2323 {
AnnaBridge 189:f392fc9709a3 2324 /* Wait until REACK flag is set */
AnnaBridge 189:f392fc9709a3 2325 if (IRDA_WaitOnFlagUntilTimeout(hirda, USART_ISR_REACK, RESET, tickstart, IRDA_TEACK_REACK_TIMEOUT) != HAL_OK)
AnnaBridge 189:f392fc9709a3 2326 {
AnnaBridge 189:f392fc9709a3 2327 /* Timeout occurred */
AnnaBridge 189:f392fc9709a3 2328 return HAL_TIMEOUT;
AnnaBridge 189:f392fc9709a3 2329 }
AnnaBridge 189:f392fc9709a3 2330 }
AnnaBridge 189:f392fc9709a3 2331
AnnaBridge 189:f392fc9709a3 2332 /* Initialize the IRDA state*/
AnnaBridge 189:f392fc9709a3 2333 hirda->gState = HAL_IRDA_STATE_READY;
AnnaBridge 189:f392fc9709a3 2334 hirda->RxState = HAL_IRDA_STATE_READY;
AnnaBridge 189:f392fc9709a3 2335
AnnaBridge 189:f392fc9709a3 2336 /* Process Unlocked */
AnnaBridge 189:f392fc9709a3 2337 __HAL_UNLOCK(hirda);
AnnaBridge 189:f392fc9709a3 2338
AnnaBridge 189:f392fc9709a3 2339 return HAL_OK;
AnnaBridge 189:f392fc9709a3 2340 }
AnnaBridge 189:f392fc9709a3 2341
AnnaBridge 189:f392fc9709a3 2342 /**
AnnaBridge 189:f392fc9709a3 2343 * @brief Handle IRDA Communication Timeout.
AnnaBridge 189:f392fc9709a3 2344 * @param hirda Pointer to a IRDA_HandleTypeDef structure that contains
AnnaBridge 189:f392fc9709a3 2345 * the configuration information for the specified IRDA module.
AnnaBridge 189:f392fc9709a3 2346 * @param Flag Specifies the IRDA flag to check.
AnnaBridge 189:f392fc9709a3 2347 * @param Status Flag status (SET or RESET)
AnnaBridge 189:f392fc9709a3 2348 * @param Tickstart Tick start value
AnnaBridge 189:f392fc9709a3 2349 * @param Timeout Timeout duration
AnnaBridge 189:f392fc9709a3 2350 * @retval HAL status
AnnaBridge 189:f392fc9709a3 2351 */
AnnaBridge 189:f392fc9709a3 2352 static HAL_StatusTypeDef IRDA_WaitOnFlagUntilTimeout(IRDA_HandleTypeDef *hirda, uint32_t Flag, FlagStatus Status, uint32_t Tickstart, uint32_t Timeout)
AnnaBridge 189:f392fc9709a3 2353 {
AnnaBridge 189:f392fc9709a3 2354 /* Wait until flag is set */
AnnaBridge 189:f392fc9709a3 2355 while ((__HAL_IRDA_GET_FLAG(hirda, Flag) ? SET : RESET) == Status)
AnnaBridge 189:f392fc9709a3 2356 {
AnnaBridge 189:f392fc9709a3 2357 /* Check for the Timeout */
AnnaBridge 189:f392fc9709a3 2358 if (Timeout != HAL_MAX_DELAY)
AnnaBridge 189:f392fc9709a3 2359 {
AnnaBridge 189:f392fc9709a3 2360 if (((HAL_GetTick() - Tickstart) > Timeout) || (Timeout == 0U))
AnnaBridge 189:f392fc9709a3 2361 {
AnnaBridge 189:f392fc9709a3 2362 /* Disable TXE, RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts for the interrupt process */
AnnaBridge 189:f392fc9709a3 2363 CLEAR_BIT(hirda->Instance->CR1, (USART_CR1_RXNEIE_RXFNEIE | USART_CR1_PEIE | USART_CR1_TXEIE_TXFNFIE));
AnnaBridge 189:f392fc9709a3 2364 CLEAR_BIT(hirda->Instance->CR3, USART_CR3_EIE);
AnnaBridge 189:f392fc9709a3 2365
AnnaBridge 189:f392fc9709a3 2366 hirda->gState = HAL_IRDA_STATE_READY;
AnnaBridge 189:f392fc9709a3 2367 hirda->RxState = HAL_IRDA_STATE_READY;
AnnaBridge 189:f392fc9709a3 2368
AnnaBridge 189:f392fc9709a3 2369 /* Process Unlocked */
AnnaBridge 189:f392fc9709a3 2370 __HAL_UNLOCK(hirda);
AnnaBridge 189:f392fc9709a3 2371 return HAL_TIMEOUT;
AnnaBridge 189:f392fc9709a3 2372 }
AnnaBridge 189:f392fc9709a3 2373 }
AnnaBridge 189:f392fc9709a3 2374 }
AnnaBridge 189:f392fc9709a3 2375 return HAL_OK;
AnnaBridge 189:f392fc9709a3 2376 }
AnnaBridge 189:f392fc9709a3 2377
AnnaBridge 189:f392fc9709a3 2378
AnnaBridge 189:f392fc9709a3 2379 /**
AnnaBridge 189:f392fc9709a3 2380 * @brief End ongoing Tx transfer on IRDA peripheral (following error detection or Transmit completion).
AnnaBridge 189:f392fc9709a3 2381 * @param hirda Pointer to a IRDA_HandleTypeDef structure that contains
AnnaBridge 189:f392fc9709a3 2382 * the configuration information for the specified IRDA module.
AnnaBridge 189:f392fc9709a3 2383 * @retval None
AnnaBridge 189:f392fc9709a3 2384 */
AnnaBridge 189:f392fc9709a3 2385 static void IRDA_EndTxTransfer(IRDA_HandleTypeDef *hirda)
AnnaBridge 189:f392fc9709a3 2386 {
AnnaBridge 189:f392fc9709a3 2387 /* Disable TXEIE and TCIE interrupts */
AnnaBridge 189:f392fc9709a3 2388 CLEAR_BIT(hirda->Instance->CR1, (USART_CR1_TXEIE_TXFNFIE | USART_CR1_TCIE));
AnnaBridge 189:f392fc9709a3 2389
AnnaBridge 189:f392fc9709a3 2390 /* At end of Tx process, restore hirda->gState to Ready */
AnnaBridge 189:f392fc9709a3 2391 hirda->gState = HAL_IRDA_STATE_READY;
AnnaBridge 189:f392fc9709a3 2392 }
AnnaBridge 189:f392fc9709a3 2393
AnnaBridge 189:f392fc9709a3 2394
AnnaBridge 189:f392fc9709a3 2395 /**
AnnaBridge 189:f392fc9709a3 2396 * @brief End ongoing Rx transfer on UART peripheral (following error detection or Reception completion).
AnnaBridge 189:f392fc9709a3 2397 * @param hirda Pointer to a IRDA_HandleTypeDef structure that contains
AnnaBridge 189:f392fc9709a3 2398 * the configuration information for the specified IRDA module.
AnnaBridge 189:f392fc9709a3 2399 * @retval None
AnnaBridge 189:f392fc9709a3 2400 */
AnnaBridge 189:f392fc9709a3 2401 static void IRDA_EndRxTransfer(IRDA_HandleTypeDef *hirda)
AnnaBridge 189:f392fc9709a3 2402 {
AnnaBridge 189:f392fc9709a3 2403 /* Disable RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts */
AnnaBridge 189:f392fc9709a3 2404 CLEAR_BIT(hirda->Instance->CR1, (USART_CR1_RXNEIE_RXFNEIE | USART_CR1_PEIE));
AnnaBridge 189:f392fc9709a3 2405 CLEAR_BIT(hirda->Instance->CR3, USART_CR3_EIE);
AnnaBridge 189:f392fc9709a3 2406
AnnaBridge 189:f392fc9709a3 2407 /* At end of Rx process, restore hirda->RxState to Ready */
AnnaBridge 189:f392fc9709a3 2408 hirda->RxState = HAL_IRDA_STATE_READY;
AnnaBridge 189:f392fc9709a3 2409 }
AnnaBridge 189:f392fc9709a3 2410
AnnaBridge 189:f392fc9709a3 2411
AnnaBridge 189:f392fc9709a3 2412 /**
AnnaBridge 189:f392fc9709a3 2413 * @brief DMA IRDA transmit process complete callback.
AnnaBridge 189:f392fc9709a3 2414 * @param hdma Pointer to a DMA_HandleTypeDef structure that contains
AnnaBridge 189:f392fc9709a3 2415 * the configuration information for the specified DMA module.
AnnaBridge 189:f392fc9709a3 2416 * @retval None
AnnaBridge 189:f392fc9709a3 2417 */
AnnaBridge 189:f392fc9709a3 2418 static void IRDA_DMATransmitCplt(DMA_HandleTypeDef *hdma)
AnnaBridge 189:f392fc9709a3 2419 {
AnnaBridge 189:f392fc9709a3 2420 IRDA_HandleTypeDef *hirda = (IRDA_HandleTypeDef *)(hdma->Parent);
AnnaBridge 189:f392fc9709a3 2421
AnnaBridge 189:f392fc9709a3 2422 /* DMA Normal mode */
AnnaBridge 189:f392fc9709a3 2423 if (hdma->Init.Mode != DMA_CIRCULAR)
AnnaBridge 189:f392fc9709a3 2424 {
AnnaBridge 189:f392fc9709a3 2425 hirda->TxXferCount = 0U;
AnnaBridge 189:f392fc9709a3 2426
AnnaBridge 189:f392fc9709a3 2427 /* Disable the DMA transfer for transmit request by resetting the DMAT bit
AnnaBridge 189:f392fc9709a3 2428 in the IRDA CR3 register */
AnnaBridge 189:f392fc9709a3 2429 CLEAR_BIT(hirda->Instance->CR3, USART_CR3_DMAT);
AnnaBridge 189:f392fc9709a3 2430
AnnaBridge 189:f392fc9709a3 2431 /* Enable the IRDA Transmit Complete Interrupt */
AnnaBridge 189:f392fc9709a3 2432 SET_BIT(hirda->Instance->CR1, USART_CR1_TCIE);
AnnaBridge 189:f392fc9709a3 2433 }
AnnaBridge 189:f392fc9709a3 2434 /* DMA Circular mode */
AnnaBridge 189:f392fc9709a3 2435 else
AnnaBridge 189:f392fc9709a3 2436 {
AnnaBridge 189:f392fc9709a3 2437 #if (USE_HAL_IRDA_REGISTER_CALLBACKS == 1)
AnnaBridge 189:f392fc9709a3 2438 /* Call registered Tx complete callback */
AnnaBridge 189:f392fc9709a3 2439 hirda->TxCpltCallback(hirda);
AnnaBridge 189:f392fc9709a3 2440 #else
AnnaBridge 189:f392fc9709a3 2441 /* Call legacy weak Tx complete callback */
AnnaBridge 189:f392fc9709a3 2442 HAL_IRDA_TxCpltCallback(hirda);
AnnaBridge 189:f392fc9709a3 2443 #endif /* USE_HAL_IRDA_REGISTER_CALLBACK */
AnnaBridge 189:f392fc9709a3 2444 }
AnnaBridge 189:f392fc9709a3 2445
AnnaBridge 189:f392fc9709a3 2446 }
AnnaBridge 189:f392fc9709a3 2447
AnnaBridge 189:f392fc9709a3 2448 /**
AnnaBridge 189:f392fc9709a3 2449 * @brief DMA IRDA transmit process half complete callback.
AnnaBridge 189:f392fc9709a3 2450 * @param hdma Pointer to a DMA_HandleTypeDef structure that contains
AnnaBridge 189:f392fc9709a3 2451 * the configuration information for the specified DMA module.
AnnaBridge 189:f392fc9709a3 2452 * @retval None
AnnaBridge 189:f392fc9709a3 2453 */
AnnaBridge 189:f392fc9709a3 2454 static void IRDA_DMATransmitHalfCplt(DMA_HandleTypeDef *hdma)
AnnaBridge 189:f392fc9709a3 2455 {
AnnaBridge 189:f392fc9709a3 2456 IRDA_HandleTypeDef *hirda = (IRDA_HandleTypeDef *)(hdma->Parent);
AnnaBridge 189:f392fc9709a3 2457
AnnaBridge 189:f392fc9709a3 2458 #if (USE_HAL_IRDA_REGISTER_CALLBACKS == 1)
AnnaBridge 189:f392fc9709a3 2459 /* Call registered Tx Half complete callback */
AnnaBridge 189:f392fc9709a3 2460 hirda->TxHalfCpltCallback(hirda);
AnnaBridge 189:f392fc9709a3 2461 #else
AnnaBridge 189:f392fc9709a3 2462 /* Call legacy weak Tx complete callback */
AnnaBridge 189:f392fc9709a3 2463 HAL_IRDA_TxHalfCpltCallback(hirda);
AnnaBridge 189:f392fc9709a3 2464 #endif /* USE_HAL_IRDA_REGISTER_CALLBACK */
AnnaBridge 189:f392fc9709a3 2465 }
AnnaBridge 189:f392fc9709a3 2466
AnnaBridge 189:f392fc9709a3 2467 /**
AnnaBridge 189:f392fc9709a3 2468 * @brief DMA IRDA receive process complete callback.
AnnaBridge 189:f392fc9709a3 2469 * @param hdma Pointer to a DMA_HandleTypeDef structure that contains
AnnaBridge 189:f392fc9709a3 2470 * the configuration information for the specified DMA module.
AnnaBridge 189:f392fc9709a3 2471 * @retval None
AnnaBridge 189:f392fc9709a3 2472 */
AnnaBridge 189:f392fc9709a3 2473 static void IRDA_DMAReceiveCplt(DMA_HandleTypeDef *hdma)
AnnaBridge 189:f392fc9709a3 2474 {
AnnaBridge 189:f392fc9709a3 2475 IRDA_HandleTypeDef *hirda = (IRDA_HandleTypeDef *)(hdma->Parent);
AnnaBridge 189:f392fc9709a3 2476
AnnaBridge 189:f392fc9709a3 2477 /* DMA Normal mode */
AnnaBridge 189:f392fc9709a3 2478 if (hdma->Init.Mode != DMA_CIRCULAR)
AnnaBridge 189:f392fc9709a3 2479 {
AnnaBridge 189:f392fc9709a3 2480 hirda->RxXferCount = 0U;
AnnaBridge 189:f392fc9709a3 2481
AnnaBridge 189:f392fc9709a3 2482 /* Disable PE and ERR (Frame error, noise error, overrun error) interrupts */
AnnaBridge 189:f392fc9709a3 2483 CLEAR_BIT(hirda->Instance->CR1, USART_CR1_PEIE);
AnnaBridge 189:f392fc9709a3 2484 CLEAR_BIT(hirda->Instance->CR3, USART_CR3_EIE);
AnnaBridge 189:f392fc9709a3 2485
AnnaBridge 189:f392fc9709a3 2486 /* Disable the DMA transfer for the receiver request by resetting the DMAR bit
AnnaBridge 189:f392fc9709a3 2487 in the IRDA CR3 register */
AnnaBridge 189:f392fc9709a3 2488 CLEAR_BIT(hirda->Instance->CR3, USART_CR3_DMAR);
AnnaBridge 189:f392fc9709a3 2489
AnnaBridge 189:f392fc9709a3 2490 /* At end of Rx process, restore hirda->RxState to Ready */
AnnaBridge 189:f392fc9709a3 2491 hirda->RxState = HAL_IRDA_STATE_READY;
AnnaBridge 189:f392fc9709a3 2492 }
AnnaBridge 189:f392fc9709a3 2493
AnnaBridge 189:f392fc9709a3 2494 #if (USE_HAL_IRDA_REGISTER_CALLBACKS == 1)
AnnaBridge 189:f392fc9709a3 2495 /* Call registered Rx complete callback */
AnnaBridge 189:f392fc9709a3 2496 hirda->RxCpltCallback(hirda);
AnnaBridge 189:f392fc9709a3 2497 #else
AnnaBridge 189:f392fc9709a3 2498 /* Call legacy weak Rx complete callback */
AnnaBridge 189:f392fc9709a3 2499 HAL_IRDA_RxCpltCallback(hirda);
AnnaBridge 189:f392fc9709a3 2500 #endif /* USE_HAL_IRDA_REGISTER_CALLBACKS */
AnnaBridge 189:f392fc9709a3 2501 }
AnnaBridge 189:f392fc9709a3 2502
AnnaBridge 189:f392fc9709a3 2503 /**
AnnaBridge 189:f392fc9709a3 2504 * @brief DMA IRDA receive process half complete callback.
AnnaBridge 189:f392fc9709a3 2505 * @param hdma Pointer to a DMA_HandleTypeDef structure that contains
AnnaBridge 189:f392fc9709a3 2506 * the configuration information for the specified DMA module.
AnnaBridge 189:f392fc9709a3 2507 * @retval None
AnnaBridge 189:f392fc9709a3 2508 */
AnnaBridge 189:f392fc9709a3 2509 static void IRDA_DMAReceiveHalfCplt(DMA_HandleTypeDef *hdma)
AnnaBridge 189:f392fc9709a3 2510 {
AnnaBridge 189:f392fc9709a3 2511 IRDA_HandleTypeDef *hirda = (IRDA_HandleTypeDef *)(hdma->Parent);
AnnaBridge 189:f392fc9709a3 2512
AnnaBridge 189:f392fc9709a3 2513 #if (USE_HAL_IRDA_REGISTER_CALLBACKS == 1)
AnnaBridge 189:f392fc9709a3 2514 /*Call registered Rx Half complete callback*/
AnnaBridge 189:f392fc9709a3 2515 hirda->RxHalfCpltCallback(hirda);
AnnaBridge 189:f392fc9709a3 2516 #else
AnnaBridge 189:f392fc9709a3 2517 /* Call legacy weak Rx Half complete callback */
AnnaBridge 189:f392fc9709a3 2518 HAL_IRDA_RxHalfCpltCallback(hirda);
AnnaBridge 189:f392fc9709a3 2519 #endif /* USE_HAL_IRDA_REGISTER_CALLBACK */
AnnaBridge 189:f392fc9709a3 2520 }
AnnaBridge 189:f392fc9709a3 2521
AnnaBridge 189:f392fc9709a3 2522 /**
AnnaBridge 189:f392fc9709a3 2523 * @brief DMA IRDA communication error callback.
AnnaBridge 189:f392fc9709a3 2524 * @param hdma Pointer to a DMA_HandleTypeDef structure that contains
AnnaBridge 189:f392fc9709a3 2525 * the configuration information for the specified DMA module.
AnnaBridge 189:f392fc9709a3 2526 * @retval None
AnnaBridge 189:f392fc9709a3 2527 */
AnnaBridge 189:f392fc9709a3 2528 static void IRDA_DMAError(DMA_HandleTypeDef *hdma)
AnnaBridge 189:f392fc9709a3 2529 {
AnnaBridge 189:f392fc9709a3 2530 IRDA_HandleTypeDef *hirda = (IRDA_HandleTypeDef *)(hdma->Parent);
AnnaBridge 189:f392fc9709a3 2531
AnnaBridge 189:f392fc9709a3 2532 /* Stop IRDA DMA Tx request if ongoing */
AnnaBridge 189:f392fc9709a3 2533 if (hirda->gState == HAL_IRDA_STATE_BUSY_TX)
AnnaBridge 189:f392fc9709a3 2534 {
AnnaBridge 189:f392fc9709a3 2535 if (HAL_IS_BIT_SET(hirda->Instance->CR3, USART_CR3_DMAT))
AnnaBridge 189:f392fc9709a3 2536 {
AnnaBridge 189:f392fc9709a3 2537 hirda->TxXferCount = 0U;
AnnaBridge 189:f392fc9709a3 2538 IRDA_EndTxTransfer(hirda);
AnnaBridge 189:f392fc9709a3 2539 }
AnnaBridge 189:f392fc9709a3 2540 }
AnnaBridge 189:f392fc9709a3 2541
AnnaBridge 189:f392fc9709a3 2542 /* Stop IRDA DMA Rx request if ongoing */
AnnaBridge 189:f392fc9709a3 2543 if (hirda->RxState == HAL_IRDA_STATE_BUSY_RX)
AnnaBridge 189:f392fc9709a3 2544 {
AnnaBridge 189:f392fc9709a3 2545 if (HAL_IS_BIT_SET(hirda->Instance->CR3, USART_CR3_DMAR))
AnnaBridge 189:f392fc9709a3 2546 {
AnnaBridge 189:f392fc9709a3 2547 hirda->RxXferCount = 0U;
AnnaBridge 189:f392fc9709a3 2548 IRDA_EndRxTransfer(hirda);
AnnaBridge 189:f392fc9709a3 2549 }
AnnaBridge 189:f392fc9709a3 2550 }
AnnaBridge 189:f392fc9709a3 2551
AnnaBridge 189:f392fc9709a3 2552 hirda->ErrorCode |= HAL_IRDA_ERROR_DMA;
AnnaBridge 189:f392fc9709a3 2553 #if (USE_HAL_IRDA_REGISTER_CALLBACKS == 1)
AnnaBridge 189:f392fc9709a3 2554 /* Call registered user error callback */
AnnaBridge 189:f392fc9709a3 2555 hirda->ErrorCallback(hirda);
AnnaBridge 189:f392fc9709a3 2556 #else
AnnaBridge 189:f392fc9709a3 2557 /* Call legacy weak user error callback */
AnnaBridge 189:f392fc9709a3 2558 HAL_IRDA_ErrorCallback(hirda);
AnnaBridge 189:f392fc9709a3 2559 #endif /* USE_HAL_IRDA_REGISTER_CALLBACK */
AnnaBridge 189:f392fc9709a3 2560 }
AnnaBridge 189:f392fc9709a3 2561
AnnaBridge 189:f392fc9709a3 2562 /**
AnnaBridge 189:f392fc9709a3 2563 * @brief DMA IRDA communication abort callback, when initiated by HAL services on Error
AnnaBridge 189:f392fc9709a3 2564 * (To be called at end of DMA Abort procedure following error occurrence).
AnnaBridge 189:f392fc9709a3 2565 * @param hdma DMA handle.
AnnaBridge 189:f392fc9709a3 2566 * @retval None
AnnaBridge 189:f392fc9709a3 2567 */
AnnaBridge 189:f392fc9709a3 2568 static void IRDA_DMAAbortOnError(DMA_HandleTypeDef *hdma)
AnnaBridge 189:f392fc9709a3 2569 {
AnnaBridge 189:f392fc9709a3 2570 IRDA_HandleTypeDef *hirda = (IRDA_HandleTypeDef *)(hdma->Parent);
AnnaBridge 189:f392fc9709a3 2571 hirda->RxXferCount = 0U;
AnnaBridge 189:f392fc9709a3 2572 hirda->TxXferCount = 0U;
AnnaBridge 189:f392fc9709a3 2573
AnnaBridge 189:f392fc9709a3 2574 #if (USE_HAL_IRDA_REGISTER_CALLBACKS == 1)
AnnaBridge 189:f392fc9709a3 2575 /* Call registered user error callback */
AnnaBridge 189:f392fc9709a3 2576 hirda->ErrorCallback(hirda);
AnnaBridge 189:f392fc9709a3 2577 #else
AnnaBridge 189:f392fc9709a3 2578 /* Call legacy weak user error callback */
AnnaBridge 189:f392fc9709a3 2579 HAL_IRDA_ErrorCallback(hirda);
AnnaBridge 189:f392fc9709a3 2580 #endif /* USE_HAL_IRDA_REGISTER_CALLBACK */
AnnaBridge 189:f392fc9709a3 2581 }
AnnaBridge 189:f392fc9709a3 2582
AnnaBridge 189:f392fc9709a3 2583 /**
AnnaBridge 189:f392fc9709a3 2584 * @brief DMA IRDA Tx communication abort callback, when initiated by user
AnnaBridge 189:f392fc9709a3 2585 * (To be called at end of DMA Tx Abort procedure following user abort request).
AnnaBridge 189:f392fc9709a3 2586 * @note When this callback is executed, User Abort complete call back is called only if no
AnnaBridge 189:f392fc9709a3 2587 * Abort still ongoing for Rx DMA Handle.
AnnaBridge 189:f392fc9709a3 2588 * @param hdma DMA handle.
AnnaBridge 189:f392fc9709a3 2589 * @retval None
AnnaBridge 189:f392fc9709a3 2590 */
AnnaBridge 189:f392fc9709a3 2591 static void IRDA_DMATxAbortCallback(DMA_HandleTypeDef *hdma)
AnnaBridge 189:f392fc9709a3 2592 {
AnnaBridge 189:f392fc9709a3 2593 IRDA_HandleTypeDef *hirda = (IRDA_HandleTypeDef *)(hdma->Parent);
AnnaBridge 189:f392fc9709a3 2594
AnnaBridge 189:f392fc9709a3 2595 hirda->hdmatx->XferAbortCallback = NULL;
AnnaBridge 189:f392fc9709a3 2596
AnnaBridge 189:f392fc9709a3 2597 /* Check if an Abort process is still ongoing */
AnnaBridge 189:f392fc9709a3 2598 if (hirda->hdmarx != NULL)
AnnaBridge 189:f392fc9709a3 2599 {
AnnaBridge 189:f392fc9709a3 2600 if (hirda->hdmarx->XferAbortCallback != NULL)
AnnaBridge 189:f392fc9709a3 2601 {
AnnaBridge 189:f392fc9709a3 2602 return;
AnnaBridge 189:f392fc9709a3 2603 }
AnnaBridge 189:f392fc9709a3 2604 }
AnnaBridge 189:f392fc9709a3 2605
AnnaBridge 189:f392fc9709a3 2606 /* No Abort process still ongoing : All DMA channels are aborted, call user Abort Complete callback */
AnnaBridge 189:f392fc9709a3 2607 hirda->TxXferCount = 0U;
AnnaBridge 189:f392fc9709a3 2608 hirda->RxXferCount = 0U;
AnnaBridge 189:f392fc9709a3 2609
AnnaBridge 189:f392fc9709a3 2610 /* Reset errorCode */
AnnaBridge 189:f392fc9709a3 2611 hirda->ErrorCode = HAL_IRDA_ERROR_NONE;
AnnaBridge 189:f392fc9709a3 2612
AnnaBridge 189:f392fc9709a3 2613 /* Clear the Error flags in the ICR register */
AnnaBridge 189:f392fc9709a3 2614 __HAL_IRDA_CLEAR_FLAG(hirda, IRDA_CLEAR_OREF | IRDA_CLEAR_NEF | IRDA_CLEAR_PEF | IRDA_CLEAR_FEF);
AnnaBridge 189:f392fc9709a3 2615
AnnaBridge 189:f392fc9709a3 2616 /* Restore hirda->gState and hirda->RxState to Ready */
AnnaBridge 189:f392fc9709a3 2617 hirda->gState = HAL_IRDA_STATE_READY;
AnnaBridge 189:f392fc9709a3 2618 hirda->RxState = HAL_IRDA_STATE_READY;
AnnaBridge 189:f392fc9709a3 2619
AnnaBridge 189:f392fc9709a3 2620 /* Call user Abort complete callback */
AnnaBridge 189:f392fc9709a3 2621 #if (USE_HAL_IRDA_REGISTER_CALLBACKS == 1)
AnnaBridge 189:f392fc9709a3 2622 /* Call registered Abort complete callback */
AnnaBridge 189:f392fc9709a3 2623 hirda->AbortCpltCallback(hirda);
AnnaBridge 189:f392fc9709a3 2624 #else
AnnaBridge 189:f392fc9709a3 2625 /* Call legacy weak Abort complete callback */
AnnaBridge 189:f392fc9709a3 2626 HAL_IRDA_AbortCpltCallback(hirda);
AnnaBridge 189:f392fc9709a3 2627 #endif /* USE_HAL_IRDA_REGISTER_CALLBACK */
AnnaBridge 189:f392fc9709a3 2628 }
AnnaBridge 189:f392fc9709a3 2629
AnnaBridge 189:f392fc9709a3 2630
AnnaBridge 189:f392fc9709a3 2631 /**
AnnaBridge 189:f392fc9709a3 2632 * @brief DMA IRDA Rx communication abort callback, when initiated by user
AnnaBridge 189:f392fc9709a3 2633 * (To be called at end of DMA Rx Abort procedure following user abort request).
AnnaBridge 189:f392fc9709a3 2634 * @note When this callback is executed, User Abort complete call back is called only if no
AnnaBridge 189:f392fc9709a3 2635 * Abort still ongoing for Tx DMA Handle.
AnnaBridge 189:f392fc9709a3 2636 * @param hdma DMA handle.
AnnaBridge 189:f392fc9709a3 2637 * @retval None
AnnaBridge 189:f392fc9709a3 2638 */
AnnaBridge 189:f392fc9709a3 2639 static void IRDA_DMARxAbortCallback(DMA_HandleTypeDef *hdma)
AnnaBridge 189:f392fc9709a3 2640 {
AnnaBridge 189:f392fc9709a3 2641 IRDA_HandleTypeDef *hirda = (IRDA_HandleTypeDef *)(hdma->Parent);
AnnaBridge 189:f392fc9709a3 2642
AnnaBridge 189:f392fc9709a3 2643 hirda->hdmarx->XferAbortCallback = NULL;
AnnaBridge 189:f392fc9709a3 2644
AnnaBridge 189:f392fc9709a3 2645 /* Check if an Abort process is still ongoing */
AnnaBridge 189:f392fc9709a3 2646 if (hirda->hdmatx != NULL)
AnnaBridge 189:f392fc9709a3 2647 {
AnnaBridge 189:f392fc9709a3 2648 if (hirda->hdmatx->XferAbortCallback != NULL)
AnnaBridge 189:f392fc9709a3 2649 {
AnnaBridge 189:f392fc9709a3 2650 return;
AnnaBridge 189:f392fc9709a3 2651 }
AnnaBridge 189:f392fc9709a3 2652 }
AnnaBridge 189:f392fc9709a3 2653
AnnaBridge 189:f392fc9709a3 2654 /* No Abort process still ongoing : All DMA channels are aborted, call user Abort Complete callback */
AnnaBridge 189:f392fc9709a3 2655 hirda->TxXferCount = 0U;
AnnaBridge 189:f392fc9709a3 2656 hirda->RxXferCount = 0U;
AnnaBridge 189:f392fc9709a3 2657
AnnaBridge 189:f392fc9709a3 2658 /* Reset errorCode */
AnnaBridge 189:f392fc9709a3 2659 hirda->ErrorCode = HAL_IRDA_ERROR_NONE;
AnnaBridge 189:f392fc9709a3 2660
AnnaBridge 189:f392fc9709a3 2661 /* Clear the Error flags in the ICR register */
AnnaBridge 189:f392fc9709a3 2662 __HAL_IRDA_CLEAR_FLAG(hirda, IRDA_CLEAR_OREF | IRDA_CLEAR_NEF | IRDA_CLEAR_PEF | IRDA_CLEAR_FEF);
AnnaBridge 189:f392fc9709a3 2663
AnnaBridge 189:f392fc9709a3 2664 /* Restore hirda->gState and hirda->RxState to Ready */
AnnaBridge 189:f392fc9709a3 2665 hirda->gState = HAL_IRDA_STATE_READY;
AnnaBridge 189:f392fc9709a3 2666 hirda->RxState = HAL_IRDA_STATE_READY;
AnnaBridge 189:f392fc9709a3 2667
AnnaBridge 189:f392fc9709a3 2668 /* Call user Abort complete callback */
AnnaBridge 189:f392fc9709a3 2669 #if (USE_HAL_IRDA_REGISTER_CALLBACKS == 1)
AnnaBridge 189:f392fc9709a3 2670 /* Call registered Abort complete callback */
AnnaBridge 189:f392fc9709a3 2671 hirda->AbortCpltCallback(hirda);
AnnaBridge 189:f392fc9709a3 2672 #else
AnnaBridge 189:f392fc9709a3 2673 /* Call legacy weak Abort complete callback */
AnnaBridge 189:f392fc9709a3 2674 HAL_IRDA_AbortCpltCallback(hirda);
AnnaBridge 189:f392fc9709a3 2675 #endif /* USE_HAL_IRDA_REGISTER_CALLBACK */
AnnaBridge 189:f392fc9709a3 2676 }
AnnaBridge 189:f392fc9709a3 2677
AnnaBridge 189:f392fc9709a3 2678
AnnaBridge 189:f392fc9709a3 2679 /**
AnnaBridge 189:f392fc9709a3 2680 * @brief DMA IRDA Tx communication abort callback, when initiated by user by a call to
AnnaBridge 189:f392fc9709a3 2681 * HAL_IRDA_AbortTransmit_IT API (Abort only Tx transfer)
AnnaBridge 189:f392fc9709a3 2682 * (This callback is executed at end of DMA Tx Abort procedure following user abort request,
AnnaBridge 189:f392fc9709a3 2683 * and leads to user Tx Abort Complete callback execution).
AnnaBridge 189:f392fc9709a3 2684 * @param hdma DMA handle.
AnnaBridge 189:f392fc9709a3 2685 * @retval None
AnnaBridge 189:f392fc9709a3 2686 */
AnnaBridge 189:f392fc9709a3 2687 static void IRDA_DMATxOnlyAbortCallback(DMA_HandleTypeDef *hdma)
AnnaBridge 189:f392fc9709a3 2688 {
AnnaBridge 189:f392fc9709a3 2689 IRDA_HandleTypeDef *hirda = (IRDA_HandleTypeDef *)(hdma->Parent);
AnnaBridge 189:f392fc9709a3 2690
AnnaBridge 189:f392fc9709a3 2691 hirda->TxXferCount = 0U;
AnnaBridge 189:f392fc9709a3 2692
AnnaBridge 189:f392fc9709a3 2693 /* Restore hirda->gState to Ready */
AnnaBridge 189:f392fc9709a3 2694 hirda->gState = HAL_IRDA_STATE_READY;
AnnaBridge 189:f392fc9709a3 2695
AnnaBridge 189:f392fc9709a3 2696 /* Call user Abort complete callback */
AnnaBridge 189:f392fc9709a3 2697 #if (USE_HAL_IRDA_REGISTER_CALLBACKS == 1)
AnnaBridge 189:f392fc9709a3 2698 /* Call registered Abort Transmit Complete Callback */
AnnaBridge 189:f392fc9709a3 2699 hirda->AbortTransmitCpltCallback(hirda);
AnnaBridge 189:f392fc9709a3 2700 #else
AnnaBridge 189:f392fc9709a3 2701 /* Call legacy weak Abort Transmit Complete Callback */
AnnaBridge 189:f392fc9709a3 2702 HAL_IRDA_AbortTransmitCpltCallback(hirda);
AnnaBridge 189:f392fc9709a3 2703 #endif /* USE_HAL_IRDA_REGISTER_CALLBACK */
AnnaBridge 189:f392fc9709a3 2704 }
AnnaBridge 189:f392fc9709a3 2705
AnnaBridge 189:f392fc9709a3 2706 /**
AnnaBridge 189:f392fc9709a3 2707 * @brief DMA IRDA Rx communication abort callback, when initiated by user by a call to
AnnaBridge 189:f392fc9709a3 2708 * HAL_IRDA_AbortReceive_IT API (Abort only Rx transfer)
AnnaBridge 189:f392fc9709a3 2709 * (This callback is executed at end of DMA Rx Abort procedure following user abort request,
AnnaBridge 189:f392fc9709a3 2710 * and leads to user Rx Abort Complete callback execution).
AnnaBridge 189:f392fc9709a3 2711 * @param hdma DMA handle.
AnnaBridge 189:f392fc9709a3 2712 * @retval None
AnnaBridge 189:f392fc9709a3 2713 */
AnnaBridge 189:f392fc9709a3 2714 static void IRDA_DMARxOnlyAbortCallback(DMA_HandleTypeDef *hdma)
AnnaBridge 189:f392fc9709a3 2715 {
AnnaBridge 189:f392fc9709a3 2716 IRDA_HandleTypeDef *hirda = (IRDA_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;
AnnaBridge 189:f392fc9709a3 2717
AnnaBridge 189:f392fc9709a3 2718 hirda->RxXferCount = 0U;
AnnaBridge 189:f392fc9709a3 2719
AnnaBridge 189:f392fc9709a3 2720 /* Clear the Error flags in the ICR register */
AnnaBridge 189:f392fc9709a3 2721 __HAL_IRDA_CLEAR_FLAG(hirda, IRDA_CLEAR_OREF | IRDA_CLEAR_NEF | IRDA_CLEAR_PEF | IRDA_CLEAR_FEF);
AnnaBridge 189:f392fc9709a3 2722
AnnaBridge 189:f392fc9709a3 2723 /* Restore hirda->RxState to Ready */
AnnaBridge 189:f392fc9709a3 2724 hirda->RxState = HAL_IRDA_STATE_READY;
AnnaBridge 189:f392fc9709a3 2725
AnnaBridge 189:f392fc9709a3 2726 /* Call user Abort complete callback */
AnnaBridge 189:f392fc9709a3 2727 #if (USE_HAL_IRDA_REGISTER_CALLBACKS == 1)
AnnaBridge 189:f392fc9709a3 2728 /* Call registered Abort Receive Complete Callback */
AnnaBridge 189:f392fc9709a3 2729 hirda->AbortReceiveCpltCallback(hirda);
AnnaBridge 189:f392fc9709a3 2730 #else
AnnaBridge 189:f392fc9709a3 2731 /* Call legacy weak Abort Receive Complete Callback */
AnnaBridge 189:f392fc9709a3 2732 HAL_IRDA_AbortReceiveCpltCallback(hirda);
AnnaBridge 189:f392fc9709a3 2733 #endif /* USE_HAL_IRDA_REGISTER_CALLBACK */
AnnaBridge 189:f392fc9709a3 2734 }
AnnaBridge 189:f392fc9709a3 2735
AnnaBridge 189:f392fc9709a3 2736 /**
AnnaBridge 189:f392fc9709a3 2737 * @brief Send an amount of data in interrupt mode.
AnnaBridge 189:f392fc9709a3 2738 * @note Function is called under interruption only, once
AnnaBridge 189:f392fc9709a3 2739 * interruptions have been enabled by HAL_IRDA_Transmit_IT().
AnnaBridge 189:f392fc9709a3 2740 * @param hirda Pointer to a IRDA_HandleTypeDef structure that contains
AnnaBridge 189:f392fc9709a3 2741 * the configuration information for the specified IRDA module.
AnnaBridge 189:f392fc9709a3 2742 * @retval None
AnnaBridge 189:f392fc9709a3 2743 */
AnnaBridge 189:f392fc9709a3 2744 static void IRDA_Transmit_IT(IRDA_HandleTypeDef *hirda)
AnnaBridge 189:f392fc9709a3 2745 {
AnnaBridge 189:f392fc9709a3 2746 uint16_t *tmp;
AnnaBridge 189:f392fc9709a3 2747
AnnaBridge 189:f392fc9709a3 2748 /* Check that a Tx process is ongoing */
AnnaBridge 189:f392fc9709a3 2749 if (hirda->gState == HAL_IRDA_STATE_BUSY_TX)
AnnaBridge 189:f392fc9709a3 2750 {
AnnaBridge 189:f392fc9709a3 2751 if (hirda->TxXferCount == 0U)
AnnaBridge 189:f392fc9709a3 2752 {
AnnaBridge 189:f392fc9709a3 2753 /* Disable the IRDA Transmit Data Register Empty Interrupt */
AnnaBridge 189:f392fc9709a3 2754 CLEAR_BIT(hirda->Instance->CR1, USART_CR1_TXEIE_TXFNFIE);
AnnaBridge 189:f392fc9709a3 2755
AnnaBridge 189:f392fc9709a3 2756 /* Enable the IRDA Transmit Complete Interrupt */
AnnaBridge 189:f392fc9709a3 2757 SET_BIT(hirda->Instance->CR1, USART_CR1_TCIE);
AnnaBridge 189:f392fc9709a3 2758 }
AnnaBridge 189:f392fc9709a3 2759 else
AnnaBridge 189:f392fc9709a3 2760 {
AnnaBridge 189:f392fc9709a3 2761 if ((hirda->Init.WordLength == IRDA_WORDLENGTH_9B) && (hirda->Init.Parity == IRDA_PARITY_NONE))
AnnaBridge 189:f392fc9709a3 2762 {
AnnaBridge 189:f392fc9709a3 2763 tmp = (uint16_t *) hirda->pTxBuffPtr; /* Derogation R.11.3 */
AnnaBridge 189:f392fc9709a3 2764 hirda->Instance->TDR = (uint16_t)(*tmp & 0x01FFU);
AnnaBridge 189:f392fc9709a3 2765 hirda->pTxBuffPtr += 2U;
AnnaBridge 189:f392fc9709a3 2766 }
AnnaBridge 189:f392fc9709a3 2767 else
AnnaBridge 189:f392fc9709a3 2768 {
AnnaBridge 189:f392fc9709a3 2769 hirda->Instance->TDR = (uint8_t)(*hirda->pTxBuffPtr & 0xFFU);
AnnaBridge 189:f392fc9709a3 2770 hirda->pTxBuffPtr++;
AnnaBridge 189:f392fc9709a3 2771 }
AnnaBridge 189:f392fc9709a3 2772 hirda->TxXferCount--;
AnnaBridge 189:f392fc9709a3 2773 }
AnnaBridge 189:f392fc9709a3 2774 }
AnnaBridge 189:f392fc9709a3 2775 }
AnnaBridge 189:f392fc9709a3 2776
AnnaBridge 189:f392fc9709a3 2777 /**
AnnaBridge 189:f392fc9709a3 2778 * @brief Wrap up transmission in non-blocking mode.
AnnaBridge 189:f392fc9709a3 2779 * @param hirda Pointer to a IRDA_HandleTypeDef structure that contains
AnnaBridge 189:f392fc9709a3 2780 * the configuration information for the specified IRDA module.
AnnaBridge 189:f392fc9709a3 2781 * @retval None
AnnaBridge 189:f392fc9709a3 2782 */
AnnaBridge 189:f392fc9709a3 2783 static void IRDA_EndTransmit_IT(IRDA_HandleTypeDef *hirda)
AnnaBridge 189:f392fc9709a3 2784 {
AnnaBridge 189:f392fc9709a3 2785 /* Disable the IRDA Transmit Complete Interrupt */
AnnaBridge 189:f392fc9709a3 2786 CLEAR_BIT(hirda->Instance->CR1, USART_CR1_TCIE);
AnnaBridge 189:f392fc9709a3 2787
AnnaBridge 189:f392fc9709a3 2788 /* Tx process is ended, restore hirda->gState to Ready */
AnnaBridge 189:f392fc9709a3 2789 hirda->gState = HAL_IRDA_STATE_READY;
AnnaBridge 189:f392fc9709a3 2790
AnnaBridge 189:f392fc9709a3 2791 #if (USE_HAL_IRDA_REGISTER_CALLBACKS == 1)
AnnaBridge 189:f392fc9709a3 2792 /* Call registered Tx complete callback */
AnnaBridge 189:f392fc9709a3 2793 hirda->TxCpltCallback(hirda);
AnnaBridge 189:f392fc9709a3 2794 #else
AnnaBridge 189:f392fc9709a3 2795 /* Call legacy weak Tx complete callback */
AnnaBridge 189:f392fc9709a3 2796 HAL_IRDA_TxCpltCallback(hirda);
AnnaBridge 189:f392fc9709a3 2797 #endif /* USE_HAL_IRDA_REGISTER_CALLBACK */
AnnaBridge 189:f392fc9709a3 2798 }
AnnaBridge 189:f392fc9709a3 2799
AnnaBridge 189:f392fc9709a3 2800 /**
AnnaBridge 189:f392fc9709a3 2801 * @brief Receive an amount of data in interrupt mode.
AnnaBridge 189:f392fc9709a3 2802 * @note Function is called under interruption only, once
AnnaBridge 189:f392fc9709a3 2803 * interruptions have been enabled by HAL_IRDA_Receive_IT()
AnnaBridge 189:f392fc9709a3 2804 * @param hirda Pointer to a IRDA_HandleTypeDef structure that contains
AnnaBridge 189:f392fc9709a3 2805 * the configuration information for the specified IRDA module.
AnnaBridge 189:f392fc9709a3 2806 * @retval None
AnnaBridge 189:f392fc9709a3 2807 */
AnnaBridge 189:f392fc9709a3 2808 static void IRDA_Receive_IT(IRDA_HandleTypeDef *hirda)
AnnaBridge 189:f392fc9709a3 2809 {
AnnaBridge 189:f392fc9709a3 2810 uint16_t *tmp;
AnnaBridge 189:f392fc9709a3 2811 uint16_t uhMask = hirda->Mask;
AnnaBridge 189:f392fc9709a3 2812 uint16_t uhdata;
AnnaBridge 189:f392fc9709a3 2813
AnnaBridge 189:f392fc9709a3 2814 /* Check that a Rx process is ongoing */
AnnaBridge 189:f392fc9709a3 2815 if (hirda->RxState == HAL_IRDA_STATE_BUSY_RX)
AnnaBridge 189:f392fc9709a3 2816 {
AnnaBridge 189:f392fc9709a3 2817 uhdata = (uint16_t) READ_REG(hirda->Instance->RDR);
AnnaBridge 189:f392fc9709a3 2818 if ((hirda->Init.WordLength == IRDA_WORDLENGTH_9B) && (hirda->Init.Parity == IRDA_PARITY_NONE))
AnnaBridge 189:f392fc9709a3 2819 {
AnnaBridge 189:f392fc9709a3 2820 tmp = (uint16_t *) hirda->pRxBuffPtr; /* Derogation R.11.3 */
AnnaBridge 189:f392fc9709a3 2821 *tmp = (uint16_t)(uhdata & uhMask);
AnnaBridge 189:f392fc9709a3 2822 hirda->pRxBuffPtr += 2U;
AnnaBridge 189:f392fc9709a3 2823 }
AnnaBridge 189:f392fc9709a3 2824 else
AnnaBridge 189:f392fc9709a3 2825 {
AnnaBridge 189:f392fc9709a3 2826 *hirda->pRxBuffPtr = (uint8_t)(uhdata & (uint8_t)uhMask);
AnnaBridge 189:f392fc9709a3 2827 hirda->pRxBuffPtr++;
AnnaBridge 189:f392fc9709a3 2828 }
AnnaBridge 189:f392fc9709a3 2829
AnnaBridge 189:f392fc9709a3 2830 hirda->RxXferCount--;
AnnaBridge 189:f392fc9709a3 2831 if (hirda->RxXferCount == 0U)
AnnaBridge 189:f392fc9709a3 2832 {
AnnaBridge 189:f392fc9709a3 2833 /* Disable the IRDA Parity Error Interrupt and RXNE interrupt */
AnnaBridge 189:f392fc9709a3 2834 CLEAR_BIT(hirda->Instance->CR1, (USART_CR1_RXNEIE_RXFNEIE | USART_CR1_PEIE));
AnnaBridge 189:f392fc9709a3 2835
AnnaBridge 189:f392fc9709a3 2836 /* Disable the IRDA Error Interrupt: (Frame error, noise error, overrun error) */
AnnaBridge 189:f392fc9709a3 2837 CLEAR_BIT(hirda->Instance->CR3, USART_CR3_EIE);
AnnaBridge 189:f392fc9709a3 2838
AnnaBridge 189:f392fc9709a3 2839 /* Rx process is completed, restore hirda->RxState to Ready */
AnnaBridge 189:f392fc9709a3 2840 hirda->RxState = HAL_IRDA_STATE_READY;
AnnaBridge 189:f392fc9709a3 2841
AnnaBridge 189:f392fc9709a3 2842 #if (USE_HAL_IRDA_REGISTER_CALLBACKS == 1)
AnnaBridge 189:f392fc9709a3 2843 /* Call registered Rx complete callback */
AnnaBridge 189:f392fc9709a3 2844 hirda->RxCpltCallback(hirda);
AnnaBridge 189:f392fc9709a3 2845 #else
AnnaBridge 189:f392fc9709a3 2846 /* Call legacy weak Rx complete callback */
AnnaBridge 189:f392fc9709a3 2847 HAL_IRDA_RxCpltCallback(hirda);
AnnaBridge 189:f392fc9709a3 2848 #endif /* USE_HAL_IRDA_REGISTER_CALLBACKS */
AnnaBridge 189:f392fc9709a3 2849 }
AnnaBridge 189:f392fc9709a3 2850 }
AnnaBridge 189:f392fc9709a3 2851 else
AnnaBridge 189:f392fc9709a3 2852 {
AnnaBridge 189:f392fc9709a3 2853 /* Clear RXNE interrupt flag */
AnnaBridge 189:f392fc9709a3 2854 __HAL_IRDA_SEND_REQ(hirda, IRDA_RXDATA_FLUSH_REQUEST);
AnnaBridge 189:f392fc9709a3 2855 }
AnnaBridge 189:f392fc9709a3 2856 }
AnnaBridge 189:f392fc9709a3 2857
AnnaBridge 189:f392fc9709a3 2858 /**
AnnaBridge 189:f392fc9709a3 2859 * @}
AnnaBridge 189:f392fc9709a3 2860 */
AnnaBridge 189:f392fc9709a3 2861
AnnaBridge 189:f392fc9709a3 2862 #endif /* HAL_IRDA_MODULE_ENABLED */
AnnaBridge 189:f392fc9709a3 2863 /**
AnnaBridge 189:f392fc9709a3 2864 * @}
AnnaBridge 189:f392fc9709a3 2865 */
AnnaBridge 189:f392fc9709a3 2866
AnnaBridge 189:f392fc9709a3 2867 /**
AnnaBridge 189:f392fc9709a3 2868 * @}
AnnaBridge 189:f392fc9709a3 2869 */
AnnaBridge 189:f392fc9709a3 2870
AnnaBridge 189:f392fc9709a3 2871 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/