mbed library sources

Fork of mbed-src by mbed official

Committer:
mbed_official
Date:
Thu Aug 20 10:45:13 2015 +0100
Revision:
613:bc40b8d2aec4
Parent:
532:fe11edbda85c
Synchronized with git revision 92ca8c7b60a283b6bb60eb65b183dac1599f0ade

Full URL: https://github.com/mbedmicro/mbed/commit/92ca8c7b60a283b6bb60eb65b183dac1599f0ade/

Nordic: update application start address in GCC linker script

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 235:685d5f11838f 1 /**
mbed_official 235:685d5f11838f 2 ******************************************************************************
mbed_official 235:685d5f11838f 3 * @file stm32f4xx_hal_irda.c
mbed_official 235:685d5f11838f 4 * @author MCD Application Team
mbed_official 613:bc40b8d2aec4 5 * @version V1.3.2
mbed_official 613:bc40b8d2aec4 6 * @date 26-June-2015
mbed_official 235:685d5f11838f 7 * @brief IRDA HAL module driver.
mbed_official 235:685d5f11838f 8 * This file provides firmware functions to manage the following
mbed_official 235:685d5f11838f 9 * functionalities of the IrDA SIR ENDEC block (IrDA):
mbed_official 235:685d5f11838f 10 * + Initialization and de-initialization methods
mbed_official 235:685d5f11838f 11 * + IO operation methods
mbed_official 235:685d5f11838f 12 * + Peripheral Control methods
mbed_official 235:685d5f11838f 13 *
mbed_official 235:685d5f11838f 14 @verbatim
mbed_official 235:685d5f11838f 15 ==============================================================================
mbed_official 235:685d5f11838f 16 ##### How to use this driver #####
mbed_official 235:685d5f11838f 17 ==============================================================================
mbed_official 235:685d5f11838f 18 [..]
mbed_official 235:685d5f11838f 19 The IRDA HAL driver can be used as follows:
mbed_official 235:685d5f11838f 20
mbed_official 235:685d5f11838f 21 (#) Declare a IRDA_HandleTypeDef handle structure.
mbed_official 235:685d5f11838f 22 (#) Initialize the IRDA low level resources by implementing the HAL_IRDA_MspInit() API:
mbed_official 235:685d5f11838f 23 (##) Enable the USARTx interface clock.
mbed_official 235:685d5f11838f 24 (##) IRDA pins configuration:
mbed_official 235:685d5f11838f 25 (+++) Enable the clock for the IRDA GPIOs.
mbed_official 235:685d5f11838f 26 (+++) Configure these IRDA pins as alternate function pull-up.
mbed_official 235:685d5f11838f 27 (##) NVIC configuration if you need to use interrupt process (HAL_IRDA_Transmit_IT()
mbed_official 235:685d5f11838f 28 and HAL_IRDA_Receive_IT() APIs):
mbed_official 235:685d5f11838f 29 (+++) Configure the USARTx interrupt priority.
mbed_official 235:685d5f11838f 30 (+++) Enable the NVIC USART IRQ handle.
mbed_official 235:685d5f11838f 31 (##) DMA Configuration if you need to use DMA process (HAL_IRDA_Transmit_DMA()
mbed_official 235:685d5f11838f 32 and HAL_IRDA_Receive_DMA() APIs):
mbed_official 235:685d5f11838f 33 (+++) Declare a DMA handle structure for the Tx/Rx stream.
mbed_official 235:685d5f11838f 34 (+++) Enable the DMAx interface clock.
mbed_official 235:685d5f11838f 35 (+++) Configure the declared DMA handle structure with the required Tx/Rx parameters.
mbed_official 235:685d5f11838f 36 (+++) Configure the DMA Tx/Rx Stream.
mbed_official 532:fe11edbda85c 37 (+++) Associate the initialized DMA handle to the IRDA DMA Tx/Rx handle.
mbed_official 235:685d5f11838f 38 (+++) Configure the priority and enable the NVIC for the transfer complete interrupt on the DMA Tx/Rx Stream.
mbed_official 235:685d5f11838f 39
mbed_official 235:685d5f11838f 40 (#) Program the Baud Rate, Word Length, Parity, IrDA Mode, Prescaler
mbed_official 235:685d5f11838f 41 and Mode(Receiver/Transmitter) in the hirda Init structure.
mbed_official 235:685d5f11838f 42
mbed_official 235:685d5f11838f 43 (#) Initialize the IRDA registers by calling the HAL_IRDA_Init() API:
mbed_official 235:685d5f11838f 44 (++) This API configures also the low level Hardware GPIO, CLOCK, CORTEX...etc)
mbed_official 532:fe11edbda85c 45 by calling the customized HAL_IRDA_MspInit() API.
mbed_official 235:685d5f11838f 46 -@@- The specific IRDA interrupts (Transmission complete interrupt,
mbed_official 235:685d5f11838f 47 RXNE interrupt and Error Interrupts) will be managed using the macros
mbed_official 235:685d5f11838f 48 __HAL_IRDA_ENABLE_IT() and __HAL_IRDA_DISABLE_IT() inside the transmit and receive process.
mbed_official 235:685d5f11838f 49
mbed_official 235:685d5f11838f 50 (#) Three operation modes are available within this driver :
mbed_official 235:685d5f11838f 51
mbed_official 235:685d5f11838f 52 *** Polling mode IO operation ***
mbed_official 235:685d5f11838f 53 =================================
mbed_official 235:685d5f11838f 54 [..]
mbed_official 235:685d5f11838f 55 (+) Send an amount of data in blocking mode using HAL_IRDA_Transmit()
mbed_official 235:685d5f11838f 56 (+) Receive an amount of data in blocking mode using HAL_IRDA_Receive()
mbed_official 235:685d5f11838f 57
mbed_official 235:685d5f11838f 58 *** Interrupt mode IO operation ***
mbed_official 235:685d5f11838f 59 ===================================
mbed_official 235:685d5f11838f 60 [..]
mbed_official 235:685d5f11838f 61 (+) Send an amount of data in non blocking mode using HAL_IRDA_Transmit_IT()
mbed_official 235:685d5f11838f 62 (+) At transmission end of transfer HAL_IRDA_TxCpltCallback is executed and user can
mbed_official 235:685d5f11838f 63 add his own code by customization of function pointer HAL_IRDA_TxCpltCallback
mbed_official 235:685d5f11838f 64 (+) Receive an amount of data in non blocking mode using HAL_IRDA_Receive_IT()
mbed_official 235:685d5f11838f 65 (+) At reception end of transfer HAL_IRDA_RxCpltCallback is executed and user can
mbed_official 235:685d5f11838f 66 add his own code by customization of function pointer HAL_IRDA_RxCpltCallback
mbed_official 235:685d5f11838f 67 (+) In case of transfer Error, HAL_IRDA_ErrorCallback() function is executed and user can
mbed_official 235:685d5f11838f 68 add his own code by customization of function pointer HAL_IRDA_ErrorCallback
mbed_official 235:685d5f11838f 69
mbed_official 235:685d5f11838f 70 *** DMA mode IO operation ***
mbed_official 235:685d5f11838f 71 =============================
mbed_official 235:685d5f11838f 72 [..]
mbed_official 235:685d5f11838f 73 (+) Send an amount of data in non blocking mode (DMA) using HAL_IRDA_Transmit_DMA()
mbed_official 235:685d5f11838f 74 (+) At transmission end of transfer HAL_IRDA_TxCpltCallback is executed and user can
mbed_official 235:685d5f11838f 75 add his own code by customization of function pointer HAL_IRDA_TxCpltCallback
mbed_official 235:685d5f11838f 76 (+) Receive an amount of data in non blocking mode (DMA) using HAL_IRDA_Receive_DMA()
mbed_official 235:685d5f11838f 77 (+) At reception end of transfer HAL_IRDA_RxCpltCallback is executed and user can
mbed_official 235:685d5f11838f 78 add his own code by customization of function pointer HAL_IRDA_RxCpltCallback
mbed_official 235:685d5f11838f 79 (+) In case of transfer Error, HAL_IRDA_ErrorCallback() function is executed and user can
mbed_official 235:685d5f11838f 80 add his own code by customization of function pointer HAL_IRDA_ErrorCallback
mbed_official 235:685d5f11838f 81
mbed_official 235:685d5f11838f 82 *** IRDA HAL driver macros list ***
mbed_official 235:685d5f11838f 83 ===================================
mbed_official 235:685d5f11838f 84 [..]
mbed_official 235:685d5f11838f 85 Below the list of most used macros in IRDA HAL driver.
mbed_official 235:685d5f11838f 86
mbed_official 235:685d5f11838f 87 (+) __HAL_IRDA_ENABLE: Enable the IRDA peripheral
mbed_official 235:685d5f11838f 88 (+) __HAL_IRDA_DISABLE: Disable the IRDA peripheral
mbed_official 235:685d5f11838f 89 (+) __HAL_IRDA_GET_FLAG : Checks whether the specified IRDA flag is set or not
mbed_official 235:685d5f11838f 90 (+) __HAL_IRDA_CLEAR_FLAG : Clears the specified IRDA pending flag
mbed_official 235:685d5f11838f 91 (+) __HAL_IRDA_ENABLE_IT: Enables the specified IRDA interrupt
mbed_official 235:685d5f11838f 92 (+) __HAL_IRDA_DISABLE_IT: Disables the specified IRDA interrupt
mbed_official 235:685d5f11838f 93
mbed_official 235:685d5f11838f 94 (@) You can refer to the IRDA HAL driver header file for more useful macros
mbed_official 235:685d5f11838f 95
mbed_official 235:685d5f11838f 96 @endverbatim
mbed_official 235:685d5f11838f 97 ******************************************************************************
mbed_official 235:685d5f11838f 98 * @attention
mbed_official 235:685d5f11838f 99 *
mbed_official 532:fe11edbda85c 100 * <h2><center>&copy; COPYRIGHT(c) 2015 STMicroelectronics</center></h2>
mbed_official 235:685d5f11838f 101 *
mbed_official 235:685d5f11838f 102 * Redistribution and use in source and binary forms, with or without modification,
mbed_official 235:685d5f11838f 103 * are permitted provided that the following conditions are met:
mbed_official 235:685d5f11838f 104 * 1. Redistributions of source code must retain the above copyright notice,
mbed_official 235:685d5f11838f 105 * this list of conditions and the following disclaimer.
mbed_official 235:685d5f11838f 106 * 2. Redistributions in binary form must reproduce the above copyright notice,
mbed_official 235:685d5f11838f 107 * this list of conditions and the following disclaimer in the documentation
mbed_official 235:685d5f11838f 108 * and/or other materials provided with the distribution.
mbed_official 235:685d5f11838f 109 * 3. Neither the name of STMicroelectronics nor the names of its contributors
mbed_official 235:685d5f11838f 110 * may be used to endorse or promote products derived from this software
mbed_official 235:685d5f11838f 111 * without specific prior written permission.
mbed_official 235:685d5f11838f 112 *
mbed_official 235:685d5f11838f 113 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
mbed_official 235:685d5f11838f 114 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
mbed_official 235:685d5f11838f 115 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
mbed_official 235:685d5f11838f 116 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
mbed_official 235:685d5f11838f 117 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
mbed_official 235:685d5f11838f 118 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
mbed_official 235:685d5f11838f 119 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
mbed_official 235:685d5f11838f 120 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
mbed_official 235:685d5f11838f 121 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
mbed_official 235:685d5f11838f 122 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
mbed_official 235:685d5f11838f 123 *
mbed_official 235:685d5f11838f 124 ******************************************************************************
mbed_official 235:685d5f11838f 125 */
mbed_official 235:685d5f11838f 126
mbed_official 235:685d5f11838f 127 /* Includes ------------------------------------------------------------------*/
mbed_official 235:685d5f11838f 128 #include "stm32f4xx_hal.h"
mbed_official 235:685d5f11838f 129
mbed_official 235:685d5f11838f 130 /** @addtogroup STM32F4xx_HAL_Driver
mbed_official 235:685d5f11838f 131 * @{
mbed_official 235:685d5f11838f 132 */
mbed_official 235:685d5f11838f 133
mbed_official 532:fe11edbda85c 134 /** @defgroup IRDA IRDA
mbed_official 235:685d5f11838f 135 * @brief HAL IRDA module driver
mbed_official 235:685d5f11838f 136 * @{
mbed_official 235:685d5f11838f 137 */
mbed_official 235:685d5f11838f 138
mbed_official 235:685d5f11838f 139 #ifdef HAL_IRDA_MODULE_ENABLED
mbed_official 235:685d5f11838f 140
mbed_official 235:685d5f11838f 141 /* Private typedef -----------------------------------------------------------*/
mbed_official 235:685d5f11838f 142 /* Private define ------------------------------------------------------------*/
mbed_official 532:fe11edbda85c 143 /** @addtogroup IRDA_Private_Constants
mbed_official 532:fe11edbda85c 144 * @{
mbed_official 532:fe11edbda85c 145 */
mbed_official 235:685d5f11838f 146 #define IRDA_TIMEOUT_VALUE 22000
mbed_official 532:fe11edbda85c 147 /**
mbed_official 532:fe11edbda85c 148 * @}
mbed_official 532:fe11edbda85c 149 */
mbed_official 235:685d5f11838f 150 /* Private macro -------------------------------------------------------------*/
mbed_official 235:685d5f11838f 151 /* Private variables ---------------------------------------------------------*/
mbed_official 235:685d5f11838f 152 /* Private function prototypes -----------------------------------------------*/
mbed_official 532:fe11edbda85c 153 /** @addtogroup IRDA_Private_Functions
mbed_official 532:fe11edbda85c 154 * @{
mbed_official 532:fe11edbda85c 155 */
mbed_official 235:685d5f11838f 156 static void IRDA_SetConfig (IRDA_HandleTypeDef *hirda);
mbed_official 235:685d5f11838f 157 static HAL_StatusTypeDef IRDA_Transmit_IT(IRDA_HandleTypeDef *hirda);
mbed_official 532:fe11edbda85c 158 static HAL_StatusTypeDef IRDA_EndTransmit_IT(IRDA_HandleTypeDef *hirda);
mbed_official 235:685d5f11838f 159 static HAL_StatusTypeDef IRDA_Receive_IT(IRDA_HandleTypeDef *hirda);
mbed_official 235:685d5f11838f 160 static void IRDA_DMATransmitCplt(DMA_HandleTypeDef *hdma);
mbed_official 235:685d5f11838f 161 static void IRDA_DMATransmitHalfCplt(DMA_HandleTypeDef *hdma);
mbed_official 235:685d5f11838f 162 static void IRDA_DMAReceiveCplt(DMA_HandleTypeDef *hdma);
mbed_official 235:685d5f11838f 163 static void IRDA_DMAReceiveHalfCplt(DMA_HandleTypeDef *hdma);
mbed_official 235:685d5f11838f 164 static void IRDA_DMAError(DMA_HandleTypeDef *hdma);
mbed_official 235:685d5f11838f 165 static HAL_StatusTypeDef IRDA_WaitOnFlagUntilTimeout(IRDA_HandleTypeDef *hirda, uint32_t Flag, FlagStatus Status, uint32_t Timeout);
mbed_official 532:fe11edbda85c 166 /**
mbed_official 532:fe11edbda85c 167 * @}
mbed_official 532:fe11edbda85c 168 */
mbed_official 532:fe11edbda85c 169 /* Exported functions --------------------------------------------------------*/
mbed_official 532:fe11edbda85c 170 /** @defgroup IRDA_Exported_Functions IrDA Exported Functions
mbed_official 235:685d5f11838f 171 * @{
mbed_official 235:685d5f11838f 172 */
mbed_official 235:685d5f11838f 173
mbed_official 532:fe11edbda85c 174 /** @defgroup IRDA_Exported_Functions_Group1 IrDA Initialization and de-initialization functions
mbed_official 235:685d5f11838f 175 * @brief Initialization and Configuration functions
mbed_official 235:685d5f11838f 176 *
mbed_official 235:685d5f11838f 177 @verbatim
mbed_official 235:685d5f11838f 178
mbed_official 235:685d5f11838f 179 ===============================================================================
mbed_official 235:685d5f11838f 180 ##### Initialization and Configuration functions #####
mbed_official 235:685d5f11838f 181 ===============================================================================
mbed_official 235:685d5f11838f 182 [..]
mbed_official 235:685d5f11838f 183 This subsection provides a set of functions allowing to initialize the USARTx or the UARTy
mbed_official 235:685d5f11838f 184 in IrDA mode.
mbed_official 235:685d5f11838f 185 (+) For the asynchronous mode only these parameters can be configured:
mbed_official 235:685d5f11838f 186 (++) BaudRate
mbed_official 235:685d5f11838f 187 (++) WordLength
mbed_official 235:685d5f11838f 188 (++) Parity: If the parity is enabled, then the MSB bit of the data written
mbed_official 235:685d5f11838f 189 in the data register is transmitted but is changed by the parity bit.
mbed_official 235:685d5f11838f 190 Depending on the frame length defined by the M bit (8-bits or 9-bits),
mbed_official 235:685d5f11838f 191 please refer to Reference manual for possible IRDA frame formats.
mbed_official 235:685d5f11838f 192 (++) Prescaler: A pulse of width less than two and greater than one PSC period(s) may or may
mbed_official 235:685d5f11838f 193 not be rejected. The receiver set up time should be managed by software. The IrDA physical layer
mbed_official 235:685d5f11838f 194 specification specifies a minimum of 10 ms delay between transmission and
mbed_official 235:685d5f11838f 195 reception (IrDA is a half duplex protocol).
mbed_official 235:685d5f11838f 196 (++) Mode: Receiver/transmitter modes
mbed_official 235:685d5f11838f 197 (++) IrDAMode: the IrDA can operate in the Normal mode or in the Low power mode.
mbed_official 235:685d5f11838f 198 [..]
mbed_official 235:685d5f11838f 199 The HAL_IRDA_Init() API follows IRDA configuration procedures (details for the procedures
mbed_official 235:685d5f11838f 200 are available in reference manual).
mbed_official 235:685d5f11838f 201
mbed_official 235:685d5f11838f 202 @endverbatim
mbed_official 235:685d5f11838f 203 * @{
mbed_official 235:685d5f11838f 204 */
mbed_official 235:685d5f11838f 205
mbed_official 235:685d5f11838f 206 /**
mbed_official 235:685d5f11838f 207 * @brief Initializes the IRDA mode according to the specified
mbed_official 235:685d5f11838f 208 * parameters in the IRDA_InitTypeDef and create the associated handle.
mbed_official 235:685d5f11838f 209 * @param hirda: pointer to a IRDA_HandleTypeDef structure that contains
mbed_official 235:685d5f11838f 210 * the configuration information for the specified IRDA module.
mbed_official 235:685d5f11838f 211 * @retval HAL status
mbed_official 235:685d5f11838f 212 */
mbed_official 235:685d5f11838f 213 HAL_StatusTypeDef HAL_IRDA_Init(IRDA_HandleTypeDef *hirda)
mbed_official 235:685d5f11838f 214 {
mbed_official 235:685d5f11838f 215 /* Check the IRDA handle allocation */
mbed_official 613:bc40b8d2aec4 216 if(hirda == NULL)
mbed_official 235:685d5f11838f 217 {
mbed_official 235:685d5f11838f 218 return HAL_ERROR;
mbed_official 235:685d5f11838f 219 }
mbed_official 235:685d5f11838f 220
mbed_official 235:685d5f11838f 221 /* Check the IRDA instance parameters */
mbed_official 235:685d5f11838f 222 assert_param(IS_IRDA_INSTANCE(hirda->Instance));
mbed_official 235:685d5f11838f 223 /* Check the IRDA mode parameter in the IRDA handle */
mbed_official 235:685d5f11838f 224 assert_param(IS_IRDA_POWERMODE(hirda->Init.IrDAMode));
mbed_official 235:685d5f11838f 225
mbed_official 235:685d5f11838f 226 if(hirda->State == HAL_IRDA_STATE_RESET)
mbed_official 235:685d5f11838f 227 {
mbed_official 532:fe11edbda85c 228 /* Allocate lock resource and initialize it */
mbed_official 532:fe11edbda85c 229 hirda->Lock = HAL_UNLOCKED;
mbed_official 235:685d5f11838f 230 /* Init the low level hardware : GPIO, CLOCK, CORTEX...etc */
mbed_official 235:685d5f11838f 231 HAL_IRDA_MspInit(hirda);
mbed_official 235:685d5f11838f 232 }
mbed_official 235:685d5f11838f 233
mbed_official 235:685d5f11838f 234 hirda->State = HAL_IRDA_STATE_BUSY;
mbed_official 235:685d5f11838f 235
mbed_official 235:685d5f11838f 236 /* Disable the IRDA peripheral */
mbed_official 532:fe11edbda85c 237 __HAL_IRDA_DISABLE(hirda);
mbed_official 235:685d5f11838f 238
mbed_official 235:685d5f11838f 239 /* Set the IRDA communication parameters */
mbed_official 235:685d5f11838f 240 IRDA_SetConfig(hirda);
mbed_official 235:685d5f11838f 241
mbed_official 235:685d5f11838f 242 /* In IrDA mode, the following bits must be kept cleared:
mbed_official 235:685d5f11838f 243 - LINEN, STOP and CLKEN bits in the USART_CR2 register,
mbed_official 235:685d5f11838f 244 - SCEN and HDSEL bits in the USART_CR3 register.*/
mbed_official 235:685d5f11838f 245 hirda->Instance->CR2 &= ~(USART_CR2_LINEN | USART_CR2_STOP | USART_CR2_CLKEN);
mbed_official 235:685d5f11838f 246 hirda->Instance->CR3 &= ~(USART_CR3_SCEN | USART_CR3_HDSEL);
mbed_official 235:685d5f11838f 247
mbed_official 235:685d5f11838f 248 /* Enable the IRDA peripheral */
mbed_official 532:fe11edbda85c 249 __HAL_IRDA_ENABLE(hirda);
mbed_official 235:685d5f11838f 250
mbed_official 235:685d5f11838f 251 /* Set the prescaler */
mbed_official 235:685d5f11838f 252 MODIFY_REG(hirda->Instance->GTPR, USART_GTPR_PSC, hirda->Init.Prescaler);
mbed_official 235:685d5f11838f 253
mbed_official 235:685d5f11838f 254 /* Configure the IrDA mode */
mbed_official 235:685d5f11838f 255 MODIFY_REG(hirda->Instance->CR3, USART_CR3_IRLP, hirda->Init.IrDAMode);
mbed_official 235:685d5f11838f 256
mbed_official 235:685d5f11838f 257 /* Enable the IrDA mode by setting the IREN bit in the CR3 register */
mbed_official 235:685d5f11838f 258 hirda->Instance->CR3 |= USART_CR3_IREN;
mbed_official 235:685d5f11838f 259
mbed_official 235:685d5f11838f 260 /* Initialize the IRDA state*/
mbed_official 235:685d5f11838f 261 hirda->ErrorCode = HAL_IRDA_ERROR_NONE;
mbed_official 235:685d5f11838f 262 hirda->State= HAL_IRDA_STATE_READY;
mbed_official 235:685d5f11838f 263
mbed_official 235:685d5f11838f 264 return HAL_OK;
mbed_official 235:685d5f11838f 265 }
mbed_official 235:685d5f11838f 266
mbed_official 235:685d5f11838f 267 /**
mbed_official 235:685d5f11838f 268 * @brief DeInitializes the IRDA peripheral
mbed_official 235:685d5f11838f 269 * @param hirda: pointer to a IRDA_HandleTypeDef structure that contains
mbed_official 235:685d5f11838f 270 * the configuration information for the specified IRDA module.
mbed_official 235:685d5f11838f 271 * @retval HAL status
mbed_official 235:685d5f11838f 272 */
mbed_official 235:685d5f11838f 273 HAL_StatusTypeDef HAL_IRDA_DeInit(IRDA_HandleTypeDef *hirda)
mbed_official 235:685d5f11838f 274 {
mbed_official 235:685d5f11838f 275 /* Check the IRDA handle allocation */
mbed_official 613:bc40b8d2aec4 276 if(hirda == NULL)
mbed_official 235:685d5f11838f 277 {
mbed_official 235:685d5f11838f 278 return HAL_ERROR;
mbed_official 235:685d5f11838f 279 }
mbed_official 235:685d5f11838f 280
mbed_official 235:685d5f11838f 281 /* Check the parameters */
mbed_official 235:685d5f11838f 282 assert_param(IS_IRDA_INSTANCE(hirda->Instance));
mbed_official 235:685d5f11838f 283
mbed_official 235:685d5f11838f 284 hirda->State = HAL_IRDA_STATE_BUSY;
mbed_official 235:685d5f11838f 285
mbed_official 532:fe11edbda85c 286 /* Disable the Peripheral */
mbed_official 532:fe11edbda85c 287 __HAL_IRDA_DISABLE(hirda);
mbed_official 532:fe11edbda85c 288
mbed_official 235:685d5f11838f 289 /* DeInit the low level hardware */
mbed_official 235:685d5f11838f 290 HAL_IRDA_MspDeInit(hirda);
mbed_official 235:685d5f11838f 291
mbed_official 235:685d5f11838f 292 hirda->ErrorCode = HAL_IRDA_ERROR_NONE;
mbed_official 235:685d5f11838f 293
mbed_official 235:685d5f11838f 294 hirda->State = HAL_IRDA_STATE_RESET;
mbed_official 235:685d5f11838f 295
mbed_official 235:685d5f11838f 296 /* Release Lock */
mbed_official 235:685d5f11838f 297 __HAL_UNLOCK(hirda);
mbed_official 235:685d5f11838f 298
mbed_official 235:685d5f11838f 299 return HAL_OK;
mbed_official 235:685d5f11838f 300 }
mbed_official 235:685d5f11838f 301
mbed_official 235:685d5f11838f 302 /**
mbed_official 235:685d5f11838f 303 * @brief IRDA MSP Init.
mbed_official 235:685d5f11838f 304 * @param hirda: pointer to a IRDA_HandleTypeDef structure that contains
mbed_official 235:685d5f11838f 305 * the configuration information for the specified IRDA module.
mbed_official 235:685d5f11838f 306 * @retval None
mbed_official 235:685d5f11838f 307 */
mbed_official 235:685d5f11838f 308 __weak void HAL_IRDA_MspInit(IRDA_HandleTypeDef *hirda)
mbed_official 235:685d5f11838f 309 {
mbed_official 235:685d5f11838f 310 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 532:fe11edbda85c 311 the HAL_IRDA_MspInit could be implemented in the user file
mbed_official 235:685d5f11838f 312 */
mbed_official 235:685d5f11838f 313 }
mbed_official 235:685d5f11838f 314
mbed_official 235:685d5f11838f 315 /**
mbed_official 235:685d5f11838f 316 * @brief IRDA MSP DeInit.
mbed_official 235:685d5f11838f 317 * @param hirda: pointer to a IRDA_HandleTypeDef structure that contains
mbed_official 235:685d5f11838f 318 * the configuration information for the specified IRDA module.
mbed_official 235:685d5f11838f 319 * @retval None
mbed_official 235:685d5f11838f 320 */
mbed_official 235:685d5f11838f 321 __weak void HAL_IRDA_MspDeInit(IRDA_HandleTypeDef *hirda)
mbed_official 235:685d5f11838f 322 {
mbed_official 235:685d5f11838f 323 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 532:fe11edbda85c 324 the HAL_IRDA_MspDeInit could be implemented in the user file
mbed_official 235:685d5f11838f 325 */
mbed_official 235:685d5f11838f 326 }
mbed_official 235:685d5f11838f 327
mbed_official 235:685d5f11838f 328 /**
mbed_official 235:685d5f11838f 329 * @}
mbed_official 235:685d5f11838f 330 */
mbed_official 235:685d5f11838f 331
mbed_official 532:fe11edbda85c 332 /** @defgroup IRDA_Exported_Functions_Group2 IO operation functions
mbed_official 235:685d5f11838f 333 * @brief IRDA Transmit/Receive functions
mbed_official 235:685d5f11838f 334 *
mbed_official 235:685d5f11838f 335 @verbatim
mbed_official 235:685d5f11838f 336 ===============================================================================
mbed_official 235:685d5f11838f 337 ##### IO operation functions #####
mbed_official 235:685d5f11838f 338 ===============================================================================
mbed_official 235:685d5f11838f 339 This subsection provides a set of functions allowing to manage the IRDA data transfers.
mbed_official 235:685d5f11838f 340 [..]
mbed_official 235:685d5f11838f 341 IrDA is a half duplex communication protocol. If the Transmitter is busy, any data
mbed_official 235:685d5f11838f 342 on the IrDA receive line will be ignored by the IrDA decoder and if the Receiver
mbed_official 235:685d5f11838f 343 is busy, data on the TX from the USART to IrDA will not be encoded by IrDA.
mbed_official 235:685d5f11838f 344 While receiving data, transmission should be avoided as the data to be transmitted
mbed_official 235:685d5f11838f 345 could be corrupted.
mbed_official 235:685d5f11838f 346
mbed_official 235:685d5f11838f 347 (#) There are two modes of transfer:
mbed_official 235:685d5f11838f 348 (++) Blocking mode: The communication is performed in polling mode.
mbed_official 235:685d5f11838f 349 The HAL status of all data processing is returned by the same function
mbed_official 235:685d5f11838f 350 after finishing transfer.
mbed_official 235:685d5f11838f 351 (++) No-Blocking mode: The communication is performed using Interrupts
mbed_official 235:685d5f11838f 352 or DMA, These APIs return the HAL status.
mbed_official 235:685d5f11838f 353 The end of the data processing will be indicated through the
mbed_official 235:685d5f11838f 354 dedicated IRDA IRQ when using Interrupt mode or the DMA IRQ when
mbed_official 235:685d5f11838f 355 using DMA mode.
mbed_official 235:685d5f11838f 356 The HAL_IRDA_TxCpltCallback(), HAL_IRDA_RxCpltCallback() user callbacks
mbed_official 532:fe11edbda85c 357 will be executed respectively at the end of the transmit or Receive process
mbed_official 235:685d5f11838f 358 The HAL_IRDA_ErrorCallback() user callback will be executed when a communication error is detected
mbed_official 235:685d5f11838f 359
mbed_official 235:685d5f11838f 360 (#) Blocking mode API's are :
mbed_official 235:685d5f11838f 361 (++) HAL_IRDA_Transmit()
mbed_official 235:685d5f11838f 362 (++) HAL_IRDA_Receive()
mbed_official 235:685d5f11838f 363
mbed_official 235:685d5f11838f 364 (#) Non Blocking mode APIs with Interrupt are :
mbed_official 235:685d5f11838f 365 (++) HAL_IRDA_Transmit_IT()
mbed_official 235:685d5f11838f 366 (++) HAL_IRDA_Receive_IT()
mbed_official 235:685d5f11838f 367 (++) HAL_IRDA_IRQHandler()
mbed_official 235:685d5f11838f 368
mbed_official 235:685d5f11838f 369 (#) Non Blocking mode functions with DMA are :
mbed_official 235:685d5f11838f 370 (++) HAL_IRDA_Transmit_DMA()
mbed_official 235:685d5f11838f 371 (++) HAL_IRDA_Receive_DMA()
mbed_official 235:685d5f11838f 372
mbed_official 235:685d5f11838f 373 (#) A set of Transfer Complete Callbacks are provided in non Blocking mode:
mbed_official 235:685d5f11838f 374 (++) HAL_IRDA_TxCpltCallback()
mbed_official 235:685d5f11838f 375 (++) HAL_IRDA_RxCpltCallback()
mbed_official 235:685d5f11838f 376 (++) HAL_IRDA_ErrorCallback()
mbed_official 235:685d5f11838f 377
mbed_official 235:685d5f11838f 378 @endverbatim
mbed_official 235:685d5f11838f 379 * @{
mbed_official 235:685d5f11838f 380 */
mbed_official 235:685d5f11838f 381
mbed_official 235:685d5f11838f 382 /**
mbed_official 235:685d5f11838f 383 * @brief Sends an amount of data in blocking mode.
mbed_official 235:685d5f11838f 384 * @param hirda: pointer to a IRDA_HandleTypeDef structure that contains
mbed_official 235:685d5f11838f 385 * the configuration information for the specified IRDA module.
mbed_official 235:685d5f11838f 386 * @param pData: Pointer to data buffer
mbed_official 235:685d5f11838f 387 * @param Size: Amount of data to be sent
mbed_official 235:685d5f11838f 388 * @param Timeout: Specify timeout value
mbed_official 235:685d5f11838f 389 * @retval HAL status
mbed_official 235:685d5f11838f 390 */
mbed_official 235:685d5f11838f 391 HAL_StatusTypeDef HAL_IRDA_Transmit(IRDA_HandleTypeDef *hirda, uint8_t *pData, uint16_t Size, uint32_t Timeout)
mbed_official 235:685d5f11838f 392 {
mbed_official 235:685d5f11838f 393 uint16_t* tmp;
mbed_official 235:685d5f11838f 394 uint32_t tmp1 = 0;
mbed_official 235:685d5f11838f 395
mbed_official 235:685d5f11838f 396 tmp1 = hirda->State;
mbed_official 235:685d5f11838f 397 if((tmp1 == HAL_IRDA_STATE_READY) || (tmp1 == HAL_IRDA_STATE_BUSY_RX))
mbed_official 235:685d5f11838f 398 {
mbed_official 613:bc40b8d2aec4 399 if((pData == NULL) || (Size == 0))
mbed_official 235:685d5f11838f 400 {
mbed_official 235:685d5f11838f 401 return HAL_ERROR;
mbed_official 235:685d5f11838f 402 }
mbed_official 235:685d5f11838f 403
mbed_official 235:685d5f11838f 404 /* Process Locked */
mbed_official 235:685d5f11838f 405 __HAL_LOCK(hirda);
mbed_official 235:685d5f11838f 406
mbed_official 235:685d5f11838f 407 hirda->ErrorCode = HAL_IRDA_ERROR_NONE;
mbed_official 235:685d5f11838f 408 if(hirda->State == HAL_IRDA_STATE_BUSY_RX)
mbed_official 235:685d5f11838f 409 {
mbed_official 235:685d5f11838f 410 hirda->State = HAL_IRDA_STATE_BUSY_TX_RX;
mbed_official 235:685d5f11838f 411 }
mbed_official 235:685d5f11838f 412 else
mbed_official 235:685d5f11838f 413 {
mbed_official 235:685d5f11838f 414 hirda->State = HAL_IRDA_STATE_BUSY_TX;
mbed_official 235:685d5f11838f 415 }
mbed_official 235:685d5f11838f 416
mbed_official 235:685d5f11838f 417 hirda->TxXferSize = Size;
mbed_official 235:685d5f11838f 418 hirda->TxXferCount = Size;
mbed_official 235:685d5f11838f 419 while(hirda->TxXferCount > 0)
mbed_official 235:685d5f11838f 420 {
mbed_official 235:685d5f11838f 421 hirda->TxXferCount--;
mbed_official 235:685d5f11838f 422 if(hirda->Init.WordLength == IRDA_WORDLENGTH_9B)
mbed_official 235:685d5f11838f 423 {
mbed_official 235:685d5f11838f 424 if(IRDA_WaitOnFlagUntilTimeout(hirda, IRDA_FLAG_TXE, RESET, Timeout) != HAL_OK)
mbed_official 235:685d5f11838f 425 {
mbed_official 235:685d5f11838f 426 return HAL_TIMEOUT;
mbed_official 235:685d5f11838f 427 }
mbed_official 235:685d5f11838f 428 tmp = (uint16_t*) pData;
mbed_official 235:685d5f11838f 429 hirda->Instance->DR = (*tmp & (uint16_t)0x01FF);
mbed_official 235:685d5f11838f 430 if(hirda->Init.Parity == IRDA_PARITY_NONE)
mbed_official 235:685d5f11838f 431 {
mbed_official 235:685d5f11838f 432 pData +=2;
mbed_official 235:685d5f11838f 433 }
mbed_official 235:685d5f11838f 434 else
mbed_official 235:685d5f11838f 435 {
mbed_official 235:685d5f11838f 436 pData +=1;
mbed_official 235:685d5f11838f 437 }
mbed_official 235:685d5f11838f 438 }
mbed_official 235:685d5f11838f 439 else
mbed_official 235:685d5f11838f 440 {
mbed_official 235:685d5f11838f 441 if(IRDA_WaitOnFlagUntilTimeout(hirda, IRDA_FLAG_TXE, RESET, Timeout) != HAL_OK)
mbed_official 235:685d5f11838f 442 {
mbed_official 235:685d5f11838f 443 return HAL_TIMEOUT;
mbed_official 235:685d5f11838f 444 }
mbed_official 235:685d5f11838f 445 hirda->Instance->DR = (*pData++ & (uint8_t)0xFF);
mbed_official 235:685d5f11838f 446 }
mbed_official 235:685d5f11838f 447 }
mbed_official 235:685d5f11838f 448
mbed_official 235:685d5f11838f 449 if(IRDA_WaitOnFlagUntilTimeout(hirda, IRDA_FLAG_TC, RESET, Timeout) != HAL_OK)
mbed_official 235:685d5f11838f 450 {
mbed_official 235:685d5f11838f 451 return HAL_TIMEOUT;
mbed_official 235:685d5f11838f 452 }
mbed_official 235:685d5f11838f 453
mbed_official 235:685d5f11838f 454 if(hirda->State == HAL_IRDA_STATE_BUSY_TX_RX)
mbed_official 235:685d5f11838f 455 {
mbed_official 235:685d5f11838f 456 hirda->State = HAL_IRDA_STATE_BUSY_RX;
mbed_official 235:685d5f11838f 457 }
mbed_official 235:685d5f11838f 458 else
mbed_official 235:685d5f11838f 459 {
mbed_official 235:685d5f11838f 460 hirda->State = HAL_IRDA_STATE_READY;
mbed_official 235:685d5f11838f 461 }
mbed_official 235:685d5f11838f 462
mbed_official 235:685d5f11838f 463 /* Process Unlocked */
mbed_official 235:685d5f11838f 464 __HAL_UNLOCK(hirda);
mbed_official 235:685d5f11838f 465
mbed_official 235:685d5f11838f 466 return HAL_OK;
mbed_official 235:685d5f11838f 467 }
mbed_official 235:685d5f11838f 468 else
mbed_official 235:685d5f11838f 469 {
mbed_official 235:685d5f11838f 470 return HAL_BUSY;
mbed_official 235:685d5f11838f 471 }
mbed_official 235:685d5f11838f 472 }
mbed_official 235:685d5f11838f 473
mbed_official 235:685d5f11838f 474 /**
mbed_official 235:685d5f11838f 475 * @brief Receive an amount of data in blocking mode.
mbed_official 235:685d5f11838f 476 * @param hirda: pointer to a IRDA_HandleTypeDef structure that contains
mbed_official 235:685d5f11838f 477 * the configuration information for the specified IRDA module.
mbed_official 235:685d5f11838f 478 * @param pData: Pointer to data buffer
mbed_official 235:685d5f11838f 479 * @param Size: Amount of data to be received
mbed_official 235:685d5f11838f 480 * @param Timeout: Specify timeout value
mbed_official 235:685d5f11838f 481 * @retval HAL status
mbed_official 235:685d5f11838f 482 */
mbed_official 235:685d5f11838f 483 HAL_StatusTypeDef HAL_IRDA_Receive(IRDA_HandleTypeDef *hirda, uint8_t *pData, uint16_t Size, uint32_t Timeout)
mbed_official 235:685d5f11838f 484 {
mbed_official 235:685d5f11838f 485 uint16_t* tmp;
mbed_official 235:685d5f11838f 486 uint32_t tmp1 = 0;
mbed_official 235:685d5f11838f 487
mbed_official 235:685d5f11838f 488 tmp1 = hirda->State;
mbed_official 235:685d5f11838f 489 if((tmp1 == HAL_IRDA_STATE_READY) || (tmp1 == HAL_IRDA_STATE_BUSY_TX))
mbed_official 235:685d5f11838f 490 {
mbed_official 613:bc40b8d2aec4 491 if((pData == NULL) || (Size == 0))
mbed_official 235:685d5f11838f 492 {
mbed_official 235:685d5f11838f 493 return HAL_ERROR;
mbed_official 235:685d5f11838f 494 }
mbed_official 235:685d5f11838f 495
mbed_official 235:685d5f11838f 496 /* Process Locked */
mbed_official 235:685d5f11838f 497 __HAL_LOCK(hirda);
mbed_official 235:685d5f11838f 498
mbed_official 235:685d5f11838f 499 hirda->ErrorCode = HAL_IRDA_ERROR_NONE;
mbed_official 235:685d5f11838f 500 if(hirda->State == HAL_IRDA_STATE_BUSY_TX)
mbed_official 235:685d5f11838f 501 {
mbed_official 235:685d5f11838f 502 hirda->State = HAL_IRDA_STATE_BUSY_TX_RX;
mbed_official 235:685d5f11838f 503 }
mbed_official 235:685d5f11838f 504 else
mbed_official 235:685d5f11838f 505 {
mbed_official 235:685d5f11838f 506 hirda->State = HAL_IRDA_STATE_BUSY_RX;
mbed_official 235:685d5f11838f 507 }
mbed_official 235:685d5f11838f 508 hirda->RxXferSize = Size;
mbed_official 235:685d5f11838f 509 hirda->RxXferCount = Size;
mbed_official 235:685d5f11838f 510 /* Check the remain data to be received */
mbed_official 235:685d5f11838f 511 while(hirda->RxXferCount > 0)
mbed_official 235:685d5f11838f 512 {
mbed_official 235:685d5f11838f 513 hirda->RxXferCount--;
mbed_official 235:685d5f11838f 514 if(hirda->Init.WordLength == IRDA_WORDLENGTH_9B)
mbed_official 235:685d5f11838f 515 {
mbed_official 235:685d5f11838f 516 if(IRDA_WaitOnFlagUntilTimeout(hirda, IRDA_FLAG_RXNE, RESET, Timeout) != HAL_OK)
mbed_official 235:685d5f11838f 517 {
mbed_official 235:685d5f11838f 518 return HAL_TIMEOUT;
mbed_official 235:685d5f11838f 519 }
mbed_official 235:685d5f11838f 520 tmp = (uint16_t*) pData ;
mbed_official 235:685d5f11838f 521 if(hirda->Init.Parity == IRDA_PARITY_NONE)
mbed_official 235:685d5f11838f 522 {
mbed_official 235:685d5f11838f 523 *tmp = (uint16_t)(hirda->Instance->DR & (uint16_t)0x01FF);
mbed_official 235:685d5f11838f 524 pData +=2;
mbed_official 235:685d5f11838f 525 }
mbed_official 235:685d5f11838f 526 else
mbed_official 235:685d5f11838f 527 {
mbed_official 235:685d5f11838f 528 *tmp = (uint16_t)(hirda->Instance->DR & (uint16_t)0x00FF);
mbed_official 235:685d5f11838f 529 pData +=1;
mbed_official 235:685d5f11838f 530 }
mbed_official 235:685d5f11838f 531 }
mbed_official 235:685d5f11838f 532 else
mbed_official 235:685d5f11838f 533 {
mbed_official 235:685d5f11838f 534 if(IRDA_WaitOnFlagUntilTimeout(hirda, IRDA_FLAG_RXNE, RESET, Timeout) != HAL_OK)
mbed_official 235:685d5f11838f 535 {
mbed_official 235:685d5f11838f 536 return HAL_TIMEOUT;
mbed_official 235:685d5f11838f 537 }
mbed_official 235:685d5f11838f 538 if(hirda->Init.Parity == IRDA_PARITY_NONE)
mbed_official 235:685d5f11838f 539 {
mbed_official 235:685d5f11838f 540 *pData++ = (uint8_t)(hirda->Instance->DR & (uint8_t)0x00FF);
mbed_official 235:685d5f11838f 541 }
mbed_official 235:685d5f11838f 542 else
mbed_official 235:685d5f11838f 543 {
mbed_official 235:685d5f11838f 544 *pData++ = (uint8_t)(hirda->Instance->DR & (uint8_t)0x007F);
mbed_official 235:685d5f11838f 545 }
mbed_official 235:685d5f11838f 546 }
mbed_official 235:685d5f11838f 547 }
mbed_official 235:685d5f11838f 548 if(hirda->State == HAL_IRDA_STATE_BUSY_TX_RX)
mbed_official 235:685d5f11838f 549 {
mbed_official 235:685d5f11838f 550 hirda->State = HAL_IRDA_STATE_BUSY_TX;
mbed_official 235:685d5f11838f 551 }
mbed_official 235:685d5f11838f 552 else
mbed_official 235:685d5f11838f 553 {
mbed_official 235:685d5f11838f 554 hirda->State = HAL_IRDA_STATE_READY;
mbed_official 235:685d5f11838f 555 }
mbed_official 235:685d5f11838f 556
mbed_official 235:685d5f11838f 557 /* Process Unlocked */
mbed_official 235:685d5f11838f 558 __HAL_UNLOCK(hirda);
mbed_official 235:685d5f11838f 559
mbed_official 235:685d5f11838f 560 return HAL_OK;
mbed_official 235:685d5f11838f 561 }
mbed_official 235:685d5f11838f 562 else
mbed_official 235:685d5f11838f 563 {
mbed_official 235:685d5f11838f 564 return HAL_BUSY;
mbed_official 235:685d5f11838f 565 }
mbed_official 235:685d5f11838f 566 }
mbed_official 235:685d5f11838f 567
mbed_official 235:685d5f11838f 568 /**
mbed_official 235:685d5f11838f 569 * @brief Send an amount of data in non blocking mode.
mbed_official 235:685d5f11838f 570 * @param hirda: pointer to a IRDA_HandleTypeDef structure that contains
mbed_official 235:685d5f11838f 571 * the configuration information for the specified IRDA module.
mbed_official 235:685d5f11838f 572 * @param pData: Pointer to data buffer
mbed_official 235:685d5f11838f 573 * @param Size: Amount of data to be sent
mbed_official 235:685d5f11838f 574 * @retval HAL status
mbed_official 235:685d5f11838f 575 */
mbed_official 235:685d5f11838f 576 HAL_StatusTypeDef HAL_IRDA_Transmit_IT(IRDA_HandleTypeDef *hirda, uint8_t *pData, uint16_t Size)
mbed_official 235:685d5f11838f 577 {
mbed_official 235:685d5f11838f 578 uint32_t tmp1 = 0;
mbed_official 235:685d5f11838f 579
mbed_official 235:685d5f11838f 580 tmp1 = hirda->State;
mbed_official 235:685d5f11838f 581 if((tmp1 == HAL_IRDA_STATE_READY) || (tmp1 == HAL_IRDA_STATE_BUSY_RX))
mbed_official 235:685d5f11838f 582 {
mbed_official 613:bc40b8d2aec4 583 if((pData == NULL) || (Size == 0))
mbed_official 235:685d5f11838f 584 {
mbed_official 235:685d5f11838f 585 return HAL_ERROR;
mbed_official 235:685d5f11838f 586 }
mbed_official 235:685d5f11838f 587 /* Process Locked */
mbed_official 235:685d5f11838f 588 __HAL_LOCK(hirda);
mbed_official 235:685d5f11838f 589
mbed_official 235:685d5f11838f 590 hirda->pTxBuffPtr = pData;
mbed_official 235:685d5f11838f 591 hirda->TxXferSize = Size;
mbed_official 235:685d5f11838f 592 hirda->TxXferCount = Size;
mbed_official 235:685d5f11838f 593 hirda->ErrorCode = HAL_IRDA_ERROR_NONE;
mbed_official 235:685d5f11838f 594 if(hirda->State == HAL_IRDA_STATE_BUSY_RX)
mbed_official 235:685d5f11838f 595 {
mbed_official 235:685d5f11838f 596 hirda->State = HAL_IRDA_STATE_BUSY_TX_RX;
mbed_official 235:685d5f11838f 597 }
mbed_official 235:685d5f11838f 598 else
mbed_official 235:685d5f11838f 599 {
mbed_official 235:685d5f11838f 600 hirda->State = HAL_IRDA_STATE_BUSY_TX;
mbed_official 235:685d5f11838f 601 }
mbed_official 235:685d5f11838f 602
mbed_official 532:fe11edbda85c 603 /* Process Unlocked */
mbed_official 532:fe11edbda85c 604 __HAL_UNLOCK(hirda);
mbed_official 532:fe11edbda85c 605
mbed_official 235:685d5f11838f 606 /* Enable the IRDA Error Interrupt: (Frame error, noise error, overrun error) */
mbed_official 235:685d5f11838f 607 __HAL_IRDA_ENABLE_IT(hirda, IRDA_IT_ERR);
mbed_official 532:fe11edbda85c 608
mbed_official 235:685d5f11838f 609 /* Enable the IRDA Transmit Data Register Empty Interrupt */
mbed_official 235:685d5f11838f 610 __HAL_IRDA_ENABLE_IT(hirda, IRDA_IT_TXE);
mbed_official 235:685d5f11838f 611
mbed_official 235:685d5f11838f 612 return HAL_OK;
mbed_official 235:685d5f11838f 613 }
mbed_official 235:685d5f11838f 614 else
mbed_official 235:685d5f11838f 615 {
mbed_official 235:685d5f11838f 616 return HAL_BUSY;
mbed_official 235:685d5f11838f 617 }
mbed_official 235:685d5f11838f 618 }
mbed_official 235:685d5f11838f 619
mbed_official 235:685d5f11838f 620 /**
mbed_official 235:685d5f11838f 621 * @brief Receives an amount of data in non blocking mode.
mbed_official 235:685d5f11838f 622 * @param hirda: pointer to a IRDA_HandleTypeDef structure that contains
mbed_official 235:685d5f11838f 623 * the configuration information for the specified IRDA module.
mbed_official 235:685d5f11838f 624 * @param pData: Pointer to data buffer
mbed_official 235:685d5f11838f 625 * @param Size: Amount of data to be received
mbed_official 235:685d5f11838f 626 * @retval HAL status
mbed_official 235:685d5f11838f 627 */
mbed_official 235:685d5f11838f 628 HAL_StatusTypeDef HAL_IRDA_Receive_IT(IRDA_HandleTypeDef *hirda, uint8_t *pData, uint16_t Size)
mbed_official 235:685d5f11838f 629 {
mbed_official 235:685d5f11838f 630 uint32_t tmp1 = 0;
mbed_official 235:685d5f11838f 631
mbed_official 235:685d5f11838f 632 tmp1 = hirda->State;
mbed_official 235:685d5f11838f 633 if((tmp1 == HAL_IRDA_STATE_READY) || (tmp1 == HAL_IRDA_STATE_BUSY_TX))
mbed_official 235:685d5f11838f 634 {
mbed_official 613:bc40b8d2aec4 635 if((pData == NULL) || (Size == 0))
mbed_official 235:685d5f11838f 636 {
mbed_official 235:685d5f11838f 637 return HAL_ERROR;
mbed_official 235:685d5f11838f 638 }
mbed_official 235:685d5f11838f 639
mbed_official 235:685d5f11838f 640 /* Process Locked */
mbed_official 235:685d5f11838f 641 __HAL_LOCK(hirda);
mbed_official 235:685d5f11838f 642
mbed_official 235:685d5f11838f 643 hirda->pRxBuffPtr = pData;
mbed_official 235:685d5f11838f 644 hirda->RxXferSize = Size;
mbed_official 235:685d5f11838f 645 hirda->RxXferCount = Size;
mbed_official 235:685d5f11838f 646 hirda->ErrorCode = HAL_IRDA_ERROR_NONE;
mbed_official 235:685d5f11838f 647 if(hirda->State == HAL_IRDA_STATE_BUSY_TX)
mbed_official 235:685d5f11838f 648 {
mbed_official 235:685d5f11838f 649 hirda->State = HAL_IRDA_STATE_BUSY_TX_RX;
mbed_official 235:685d5f11838f 650 }
mbed_official 235:685d5f11838f 651 else
mbed_official 235:685d5f11838f 652 {
mbed_official 235:685d5f11838f 653 hirda->State = HAL_IRDA_STATE_BUSY_RX;
mbed_official 235:685d5f11838f 654 }
mbed_official 235:685d5f11838f 655
mbed_official 532:fe11edbda85c 656 /* Process Unlocked */
mbed_official 532:fe11edbda85c 657 __HAL_UNLOCK(hirda);
mbed_official 532:fe11edbda85c 658
mbed_official 235:685d5f11838f 659 /* Enable the IRDA Data Register not empty Interrupt */
mbed_official 235:685d5f11838f 660 __HAL_IRDA_ENABLE_IT(hirda, IRDA_IT_RXNE);
mbed_official 532:fe11edbda85c 661
mbed_official 235:685d5f11838f 662 /* Enable the IRDA Parity Error Interrupt */
mbed_official 235:685d5f11838f 663 __HAL_IRDA_ENABLE_IT(hirda, IRDA_IT_PE);
mbed_official 532:fe11edbda85c 664
mbed_official 235:685d5f11838f 665 /* Enable the IRDA Error Interrupt: (Frame error, noise error, overrun error) */
mbed_official 235:685d5f11838f 666 __HAL_IRDA_ENABLE_IT(hirda, IRDA_IT_ERR);
mbed_official 235:685d5f11838f 667
mbed_official 235:685d5f11838f 668 return HAL_OK;
mbed_official 235:685d5f11838f 669 }
mbed_official 235:685d5f11838f 670 else
mbed_official 235:685d5f11838f 671 {
mbed_official 235:685d5f11838f 672 return HAL_BUSY;
mbed_official 235:685d5f11838f 673 }
mbed_official 235:685d5f11838f 674 }
mbed_official 235:685d5f11838f 675
mbed_official 235:685d5f11838f 676 /**
mbed_official 235:685d5f11838f 677 * @brief Sends an amount of data in non blocking mode.
mbed_official 235:685d5f11838f 678 * @param hirda: pointer to a IRDA_HandleTypeDef structure that contains
mbed_official 235:685d5f11838f 679 * the configuration information for the specified IRDA module.
mbed_official 235:685d5f11838f 680 * @param pData: Pointer to data buffer
mbed_official 235:685d5f11838f 681 * @param Size: Amount of data to be sent
mbed_official 235:685d5f11838f 682 * @retval HAL status
mbed_official 235:685d5f11838f 683 */
mbed_official 235:685d5f11838f 684 HAL_StatusTypeDef HAL_IRDA_Transmit_DMA(IRDA_HandleTypeDef *hirda, uint8_t *pData, uint16_t Size)
mbed_official 235:685d5f11838f 685 {
mbed_official 235:685d5f11838f 686 uint32_t *tmp;
mbed_official 235:685d5f11838f 687 uint32_t tmp1 = 0;
mbed_official 235:685d5f11838f 688
mbed_official 235:685d5f11838f 689 tmp1 = hirda->State;
mbed_official 235:685d5f11838f 690 if((tmp1 == HAL_IRDA_STATE_READY) || (tmp1 == HAL_IRDA_STATE_BUSY_RX))
mbed_official 235:685d5f11838f 691 {
mbed_official 613:bc40b8d2aec4 692 if((pData == NULL) || (Size == 0))
mbed_official 235:685d5f11838f 693 {
mbed_official 235:685d5f11838f 694 return HAL_ERROR;
mbed_official 235:685d5f11838f 695 }
mbed_official 235:685d5f11838f 696
mbed_official 235:685d5f11838f 697 /* Process Locked */
mbed_official 235:685d5f11838f 698 __HAL_LOCK(hirda);
mbed_official 235:685d5f11838f 699
mbed_official 235:685d5f11838f 700 hirda->pTxBuffPtr = pData;
mbed_official 235:685d5f11838f 701 hirda->TxXferSize = Size;
mbed_official 235:685d5f11838f 702 hirda->TxXferCount = Size;
mbed_official 235:685d5f11838f 703 hirda->ErrorCode = HAL_IRDA_ERROR_NONE;
mbed_official 235:685d5f11838f 704
mbed_official 235:685d5f11838f 705 if(hirda->State == HAL_IRDA_STATE_BUSY_RX)
mbed_official 235:685d5f11838f 706 {
mbed_official 235:685d5f11838f 707 hirda->State = HAL_IRDA_STATE_BUSY_TX_RX;
mbed_official 235:685d5f11838f 708 }
mbed_official 235:685d5f11838f 709 else
mbed_official 235:685d5f11838f 710 {
mbed_official 235:685d5f11838f 711 hirda->State = HAL_IRDA_STATE_BUSY_TX;
mbed_official 235:685d5f11838f 712 }
mbed_official 235:685d5f11838f 713
mbed_official 532:fe11edbda85c 714 /* Set the IRDA DMA transfer complete callback */
mbed_official 235:685d5f11838f 715 hirda->hdmatx->XferCpltCallback = IRDA_DMATransmitCplt;
mbed_official 235:685d5f11838f 716
mbed_official 532:fe11edbda85c 717 /* Set the IRDA DMA half transfer complete callback */
mbed_official 235:685d5f11838f 718 hirda->hdmatx->XferHalfCpltCallback = IRDA_DMATransmitHalfCplt;
mbed_official 235:685d5f11838f 719
mbed_official 235:685d5f11838f 720 /* Set the DMA error callback */
mbed_official 235:685d5f11838f 721 hirda->hdmatx->XferErrorCallback = IRDA_DMAError;
mbed_official 235:685d5f11838f 722
mbed_official 235:685d5f11838f 723 /* Enable the IRDA transmit DMA Stream */
mbed_official 235:685d5f11838f 724 tmp = (uint32_t*)&pData;
mbed_official 235:685d5f11838f 725 HAL_DMA_Start_IT(hirda->hdmatx, *(uint32_t*)tmp, (uint32_t)&hirda->Instance->DR, Size);
mbed_official 235:685d5f11838f 726
mbed_official 532:fe11edbda85c 727 /* Clear the TC flag in the SR register by writing 0 to it */
mbed_official 532:fe11edbda85c 728 __HAL_IRDA_CLEAR_FLAG(hirda, IRDA_FLAG_TC);
mbed_official 532:fe11edbda85c 729
mbed_official 235:685d5f11838f 730 /* Enable the DMA transfer for transmit request by setting the DMAT bit
mbed_official 235:685d5f11838f 731 in the USART CR3 register */
mbed_official 235:685d5f11838f 732 hirda->Instance->CR3 |= USART_CR3_DMAT;
mbed_official 235:685d5f11838f 733
mbed_official 235:685d5f11838f 734 /* Process Unlocked */
mbed_official 235:685d5f11838f 735 __HAL_UNLOCK(hirda);
mbed_official 235:685d5f11838f 736
mbed_official 235:685d5f11838f 737 return HAL_OK;
mbed_official 235:685d5f11838f 738 }
mbed_official 235:685d5f11838f 739 else
mbed_official 235:685d5f11838f 740 {
mbed_official 235:685d5f11838f 741 return HAL_BUSY;
mbed_official 235:685d5f11838f 742 }
mbed_official 235:685d5f11838f 743 }
mbed_official 235:685d5f11838f 744
mbed_official 235:685d5f11838f 745 /**
mbed_official 235:685d5f11838f 746 * @brief Receives an amount of data in non blocking mode.
mbed_official 235:685d5f11838f 747 * @param hirda: pointer to a IRDA_HandleTypeDef structure that contains
mbed_official 235:685d5f11838f 748 * the configuration information for the specified IRDA module.
mbed_official 235:685d5f11838f 749 * @param pData: Pointer to data buffer
mbed_official 235:685d5f11838f 750 * @param Size: Amount of data to be received
mbed_official 235:685d5f11838f 751 * @note When the IRDA parity is enabled (PCE = 1) the data received contain the parity bit.
mbed_official 235:685d5f11838f 752 * @retval HAL status
mbed_official 235:685d5f11838f 753 */
mbed_official 235:685d5f11838f 754 HAL_StatusTypeDef HAL_IRDA_Receive_DMA(IRDA_HandleTypeDef *hirda, uint8_t *pData, uint16_t Size)
mbed_official 235:685d5f11838f 755 {
mbed_official 235:685d5f11838f 756 uint32_t *tmp;
mbed_official 235:685d5f11838f 757 uint32_t tmp1 = 0;
mbed_official 235:685d5f11838f 758
mbed_official 235:685d5f11838f 759 tmp1 = hirda->State;
mbed_official 235:685d5f11838f 760 if((tmp1 == HAL_IRDA_STATE_READY) || (tmp1 == HAL_IRDA_STATE_BUSY_TX))
mbed_official 235:685d5f11838f 761 {
mbed_official 613:bc40b8d2aec4 762 if((pData == NULL) || (Size == 0))
mbed_official 235:685d5f11838f 763 {
mbed_official 235:685d5f11838f 764 return HAL_ERROR;
mbed_official 235:685d5f11838f 765 }
mbed_official 235:685d5f11838f 766
mbed_official 235:685d5f11838f 767 /* Process Locked */
mbed_official 235:685d5f11838f 768 __HAL_LOCK(hirda);
mbed_official 235:685d5f11838f 769
mbed_official 235:685d5f11838f 770 hirda->pRxBuffPtr = pData;
mbed_official 235:685d5f11838f 771 hirda->RxXferSize = Size;
mbed_official 235:685d5f11838f 772 hirda->ErrorCode = HAL_IRDA_ERROR_NONE;
mbed_official 235:685d5f11838f 773 if(hirda->State == HAL_IRDA_STATE_BUSY_TX)
mbed_official 235:685d5f11838f 774 {
mbed_official 235:685d5f11838f 775 hirda->State = HAL_IRDA_STATE_BUSY_TX_RX;
mbed_official 235:685d5f11838f 776 }
mbed_official 235:685d5f11838f 777 else
mbed_official 235:685d5f11838f 778 {
mbed_official 235:685d5f11838f 779 hirda->State = HAL_IRDA_STATE_BUSY_RX;
mbed_official 235:685d5f11838f 780 }
mbed_official 235:685d5f11838f 781
mbed_official 532:fe11edbda85c 782 /* Set the IRDA DMA transfer complete callback */
mbed_official 235:685d5f11838f 783 hirda->hdmarx->XferCpltCallback = IRDA_DMAReceiveCplt;
mbed_official 235:685d5f11838f 784
mbed_official 532:fe11edbda85c 785 /* Set the IRDA DMA half transfer complete callback */
mbed_official 235:685d5f11838f 786 hirda->hdmarx->XferHalfCpltCallback = IRDA_DMAReceiveHalfCplt;
mbed_official 235:685d5f11838f 787
mbed_official 235:685d5f11838f 788 /* Set the DMA error callback */
mbed_official 235:685d5f11838f 789 hirda->hdmarx->XferErrorCallback = IRDA_DMAError;
mbed_official 235:685d5f11838f 790
mbed_official 235:685d5f11838f 791 /* Enable the DMA Stream */
mbed_official 235:685d5f11838f 792 tmp = (uint32_t*)&pData;
mbed_official 235:685d5f11838f 793 HAL_DMA_Start_IT(hirda->hdmarx, (uint32_t)&hirda->Instance->DR, *(uint32_t*)tmp, Size);
mbed_official 235:685d5f11838f 794
mbed_official 235:685d5f11838f 795 /* Enable the DMA transfer for the receiver request by setting the DMAR bit
mbed_official 235:685d5f11838f 796 in the USART CR3 register */
mbed_official 235:685d5f11838f 797 hirda->Instance->CR3 |= USART_CR3_DMAR;
mbed_official 235:685d5f11838f 798
mbed_official 235:685d5f11838f 799 /* Process Unlocked */
mbed_official 235:685d5f11838f 800 __HAL_UNLOCK(hirda);
mbed_official 235:685d5f11838f 801
mbed_official 235:685d5f11838f 802 return HAL_OK;
mbed_official 235:685d5f11838f 803 }
mbed_official 235:685d5f11838f 804 else
mbed_official 235:685d5f11838f 805 {
mbed_official 235:685d5f11838f 806 return HAL_BUSY;
mbed_official 235:685d5f11838f 807 }
mbed_official 235:685d5f11838f 808 }
mbed_official 235:685d5f11838f 809
mbed_official 235:685d5f11838f 810 /**
mbed_official 235:685d5f11838f 811 * @brief Pauses the DMA Transfer.
mbed_official 235:685d5f11838f 812 * @param hirda: pointer to a IRDA_HandleTypeDef structure that contains
mbed_official 235:685d5f11838f 813 * the configuration information for the specified IRDA module.
mbed_official 235:685d5f11838f 814 * @retval HAL status
mbed_official 235:685d5f11838f 815 */
mbed_official 235:685d5f11838f 816 HAL_StatusTypeDef HAL_IRDA_DMAPause(IRDA_HandleTypeDef *hirda)
mbed_official 235:685d5f11838f 817 {
mbed_official 235:685d5f11838f 818 /* Process Locked */
mbed_official 235:685d5f11838f 819 __HAL_LOCK(hirda);
mbed_official 235:685d5f11838f 820
mbed_official 235:685d5f11838f 821 if(hirda->State == HAL_IRDA_STATE_BUSY_TX)
mbed_official 235:685d5f11838f 822 {
mbed_official 235:685d5f11838f 823 /* Disable the UART DMA Tx request */
mbed_official 235:685d5f11838f 824 hirda->Instance->CR3 &= (uint32_t)(~USART_CR3_DMAT);
mbed_official 235:685d5f11838f 825 }
mbed_official 235:685d5f11838f 826 else if(hirda->State == HAL_IRDA_STATE_BUSY_RX)
mbed_official 235:685d5f11838f 827 {
mbed_official 235:685d5f11838f 828 /* Disable the UART DMA Rx request */
mbed_official 235:685d5f11838f 829 hirda->Instance->CR3 &= (uint32_t)(~USART_CR3_DMAR);
mbed_official 235:685d5f11838f 830 }
mbed_official 235:685d5f11838f 831 else if (hirda->State == HAL_IRDA_STATE_BUSY_TX_RX)
mbed_official 235:685d5f11838f 832 {
mbed_official 235:685d5f11838f 833 /* Disable the UART DMA Tx & Rx requests */
mbed_official 235:685d5f11838f 834 hirda->Instance->CR3 &= (uint32_t)(~USART_CR3_DMAT);
mbed_official 235:685d5f11838f 835 hirda->Instance->CR3 &= (uint32_t)(~USART_CR3_DMAR);
mbed_official 235:685d5f11838f 836 }
mbed_official 532:fe11edbda85c 837 else
mbed_official 532:fe11edbda85c 838 {
mbed_official 532:fe11edbda85c 839 /* Process Unlocked */
mbed_official 532:fe11edbda85c 840 __HAL_UNLOCK(hirda);
mbed_official 532:fe11edbda85c 841
mbed_official 532:fe11edbda85c 842 return HAL_ERROR;
mbed_official 532:fe11edbda85c 843 }
mbed_official 235:685d5f11838f 844
mbed_official 235:685d5f11838f 845 /* Process Unlocked */
mbed_official 235:685d5f11838f 846 __HAL_UNLOCK(hirda);
mbed_official 235:685d5f11838f 847
mbed_official 235:685d5f11838f 848 return HAL_OK;
mbed_official 235:685d5f11838f 849 }
mbed_official 235:685d5f11838f 850
mbed_official 235:685d5f11838f 851 /**
mbed_official 235:685d5f11838f 852 * @brief Resumes the DMA Transfer.
mbed_official 235:685d5f11838f 853 * @param hirda: pointer to a IRDA_HandleTypeDef structure that contains
mbed_official 235:685d5f11838f 854 * the configuration information for the specified UART module.
mbed_official 235:685d5f11838f 855 * @retval HAL status
mbed_official 235:685d5f11838f 856 */
mbed_official 235:685d5f11838f 857 HAL_StatusTypeDef HAL_IRDA_DMAResume(IRDA_HandleTypeDef *hirda)
mbed_official 235:685d5f11838f 858 {
mbed_official 235:685d5f11838f 859 /* Process Locked */
mbed_official 235:685d5f11838f 860 __HAL_LOCK(hirda);
mbed_official 235:685d5f11838f 861
mbed_official 235:685d5f11838f 862 if(hirda->State == HAL_IRDA_STATE_BUSY_TX)
mbed_official 235:685d5f11838f 863 {
mbed_official 235:685d5f11838f 864 /* Enable the UART DMA Tx request */
mbed_official 235:685d5f11838f 865 hirda->Instance->CR3 |= USART_CR3_DMAT;
mbed_official 235:685d5f11838f 866 }
mbed_official 235:685d5f11838f 867 else if(hirda->State == HAL_IRDA_STATE_BUSY_RX)
mbed_official 235:685d5f11838f 868 {
mbed_official 532:fe11edbda85c 869 /* Clear the Overrun flag before resuming the Rx transfer */
mbed_official 235:685d5f11838f 870 __HAL_IRDA_CLEAR_OREFLAG(hirda);
mbed_official 235:685d5f11838f 871 /* Enable the UART DMA Rx request */
mbed_official 235:685d5f11838f 872 hirda->Instance->CR3 |= USART_CR3_DMAR;
mbed_official 235:685d5f11838f 873 }
mbed_official 235:685d5f11838f 874 else if(hirda->State == HAL_IRDA_STATE_BUSY_TX_RX)
mbed_official 235:685d5f11838f 875 {
mbed_official 532:fe11edbda85c 876 /* Clear the Overrun flag before resuming the Rx transfer */
mbed_official 235:685d5f11838f 877 __HAL_IRDA_CLEAR_OREFLAG(hirda);
mbed_official 235:685d5f11838f 878 /* Enable the UART DMA Tx & Rx request */
mbed_official 235:685d5f11838f 879 hirda->Instance->CR3 |= USART_CR3_DMAT;
mbed_official 235:685d5f11838f 880 hirda->Instance->CR3 |= USART_CR3_DMAR;
mbed_official 235:685d5f11838f 881 }
mbed_official 532:fe11edbda85c 882 else
mbed_official 532:fe11edbda85c 883 {
mbed_official 532:fe11edbda85c 884 /* Process Unlocked */
mbed_official 532:fe11edbda85c 885 __HAL_UNLOCK(hirda);
mbed_official 235:685d5f11838f 886
mbed_official 532:fe11edbda85c 887 return HAL_ERROR;
mbed_official 532:fe11edbda85c 888 }
mbed_official 532:fe11edbda85c 889
mbed_official 235:685d5f11838f 890 /* Process Unlocked */
mbed_official 235:685d5f11838f 891 __HAL_UNLOCK(hirda);
mbed_official 235:685d5f11838f 892
mbed_official 235:685d5f11838f 893 return HAL_OK;
mbed_official 235:685d5f11838f 894 }
mbed_official 235:685d5f11838f 895
mbed_official 235:685d5f11838f 896 /**
mbed_official 235:685d5f11838f 897 * @brief Stops the DMA Transfer.
mbed_official 235:685d5f11838f 898 * @param hirda: pointer to a IRDA_HandleTypeDef structure that contains
mbed_official 235:685d5f11838f 899 * the configuration information for the specified UART module.
mbed_official 235:685d5f11838f 900 * @retval HAL status
mbed_official 235:685d5f11838f 901 */
mbed_official 235:685d5f11838f 902 HAL_StatusTypeDef HAL_IRDA_DMAStop(IRDA_HandleTypeDef *hirda)
mbed_official 235:685d5f11838f 903 {
mbed_official 235:685d5f11838f 904 /* The Lock is not implemented on this API to allow the user application
mbed_official 235:685d5f11838f 905 to call the HAL UART API under callbacks HAL_UART_TxCpltCallback() / HAL_UART_RxCpltCallback():
mbed_official 235:685d5f11838f 906 when calling HAL_DMA_Abort() API the DMA TX/RX Transfer complete interrupt is generated
mbed_official 235:685d5f11838f 907 and the correspond call back is executed HAL_UART_TxCpltCallback() / HAL_UART_RxCpltCallback()
mbed_official 235:685d5f11838f 908 */
mbed_official 235:685d5f11838f 909
mbed_official 235:685d5f11838f 910 /* Disable the UART Tx/Rx DMA requests */
mbed_official 235:685d5f11838f 911 hirda->Instance->CR3 &= ~USART_CR3_DMAT;
mbed_official 235:685d5f11838f 912 hirda->Instance->CR3 &= ~USART_CR3_DMAR;
mbed_official 235:685d5f11838f 913
mbed_official 235:685d5f11838f 914 /* Abort the UART DMA tx Stream */
mbed_official 613:bc40b8d2aec4 915 if(hirda->hdmatx != NULL)
mbed_official 235:685d5f11838f 916 {
mbed_official 235:685d5f11838f 917 HAL_DMA_Abort(hirda->hdmatx);
mbed_official 235:685d5f11838f 918 }
mbed_official 235:685d5f11838f 919 /* Abort the UART DMA rx Stream */
mbed_official 613:bc40b8d2aec4 920 if(hirda->hdmarx != NULL)
mbed_official 235:685d5f11838f 921 {
mbed_official 235:685d5f11838f 922 HAL_DMA_Abort(hirda->hdmarx);
mbed_official 235:685d5f11838f 923 }
mbed_official 235:685d5f11838f 924
mbed_official 235:685d5f11838f 925 hirda->State = HAL_IRDA_STATE_READY;
mbed_official 235:685d5f11838f 926
mbed_official 235:685d5f11838f 927 return HAL_OK;
mbed_official 235:685d5f11838f 928 }
mbed_official 235:685d5f11838f 929
mbed_official 235:685d5f11838f 930 /**
mbed_official 235:685d5f11838f 931 * @brief This function handles IRDA interrupt request.
mbed_official 235:685d5f11838f 932 * @param hirda: pointer to a IRDA_HandleTypeDef structure that contains
mbed_official 235:685d5f11838f 933 * the configuration information for the specified IRDA module.
mbed_official 235:685d5f11838f 934 * @retval None
mbed_official 235:685d5f11838f 935 */
mbed_official 235:685d5f11838f 936 void HAL_IRDA_IRQHandler(IRDA_HandleTypeDef *hirda)
mbed_official 235:685d5f11838f 937 {
mbed_official 235:685d5f11838f 938 uint32_t tmp1 = 0, tmp2 =0;
mbed_official 235:685d5f11838f 939
mbed_official 235:685d5f11838f 940 tmp1 = __HAL_IRDA_GET_FLAG(hirda, IRDA_FLAG_PE);
mbed_official 235:685d5f11838f 941 tmp2 = __HAL_IRDA_GET_IT_SOURCE(hirda, IRDA_IT_PE);
mbed_official 235:685d5f11838f 942 /* IRDA parity error interrupt occurred -------------------------------------*/
mbed_official 235:685d5f11838f 943 if((tmp1 != RESET) && (tmp2 != RESET))
mbed_official 235:685d5f11838f 944 {
mbed_official 235:685d5f11838f 945 __HAL_IRDA_CLEAR_PEFLAG(hirda);
mbed_official 235:685d5f11838f 946 hirda->ErrorCode |= HAL_IRDA_ERROR_PE;
mbed_official 235:685d5f11838f 947 }
mbed_official 235:685d5f11838f 948
mbed_official 235:685d5f11838f 949 tmp1 = __HAL_IRDA_GET_FLAG(hirda, IRDA_FLAG_FE);
mbed_official 235:685d5f11838f 950 tmp2 = __HAL_IRDA_GET_IT_SOURCE(hirda, IRDA_IT_ERR);
mbed_official 235:685d5f11838f 951 /* IRDA frame error interrupt occurred --------------------------------------*/
mbed_official 235:685d5f11838f 952 if((tmp1 != RESET) && (tmp2 != RESET))
mbed_official 235:685d5f11838f 953 {
mbed_official 235:685d5f11838f 954 __HAL_IRDA_CLEAR_FEFLAG(hirda);
mbed_official 235:685d5f11838f 955 hirda->ErrorCode |= HAL_IRDA_ERROR_FE;
mbed_official 235:685d5f11838f 956 }
mbed_official 235:685d5f11838f 957
mbed_official 235:685d5f11838f 958 tmp1 = __HAL_IRDA_GET_FLAG(hirda, IRDA_FLAG_NE);
mbed_official 235:685d5f11838f 959 tmp2 = __HAL_IRDA_GET_IT_SOURCE(hirda, IRDA_IT_ERR);
mbed_official 235:685d5f11838f 960 /* IRDA noise error interrupt occurred --------------------------------------*/
mbed_official 235:685d5f11838f 961 if((tmp1 != RESET) && (tmp2 != RESET))
mbed_official 235:685d5f11838f 962 {
mbed_official 235:685d5f11838f 963 __HAL_IRDA_CLEAR_NEFLAG(hirda);
mbed_official 235:685d5f11838f 964 hirda->ErrorCode |= HAL_IRDA_ERROR_NE;
mbed_official 235:685d5f11838f 965 }
mbed_official 235:685d5f11838f 966
mbed_official 235:685d5f11838f 967 tmp1 = __HAL_IRDA_GET_FLAG(hirda, IRDA_FLAG_ORE);
mbed_official 235:685d5f11838f 968 tmp2 = __HAL_IRDA_GET_IT_SOURCE(hirda, IRDA_IT_ERR);
mbed_official 235:685d5f11838f 969 /* IRDA Over-Run interrupt occurred -----------------------------------------*/
mbed_official 235:685d5f11838f 970 if((tmp1 != RESET) && (tmp2 != RESET))
mbed_official 235:685d5f11838f 971 {
mbed_official 235:685d5f11838f 972 __HAL_IRDA_CLEAR_OREFLAG(hirda);
mbed_official 235:685d5f11838f 973 hirda->ErrorCode |= HAL_IRDA_ERROR_ORE;
mbed_official 235:685d5f11838f 974 }
mbed_official 235:685d5f11838f 975
mbed_official 235:685d5f11838f 976 /* Call the Error call Back in case of Errors */
mbed_official 235:685d5f11838f 977 if(hirda->ErrorCode != HAL_IRDA_ERROR_NONE)
mbed_official 235:685d5f11838f 978 {
mbed_official 235:685d5f11838f 979 /* Set the IRDA state ready to be able to start again the process */
mbed_official 235:685d5f11838f 980 hirda->State = HAL_IRDA_STATE_READY;
mbed_official 235:685d5f11838f 981 HAL_IRDA_ErrorCallback(hirda);
mbed_official 235:685d5f11838f 982 }
mbed_official 235:685d5f11838f 983
mbed_official 235:685d5f11838f 984 tmp1 = __HAL_IRDA_GET_FLAG(hirda, IRDA_FLAG_RXNE);
mbed_official 235:685d5f11838f 985 tmp2 = __HAL_IRDA_GET_IT_SOURCE(hirda, IRDA_IT_RXNE);
mbed_official 235:685d5f11838f 986 /* IRDA in mode Receiver ---------------------------------------------------*/
mbed_official 235:685d5f11838f 987 if((tmp1 != RESET) && (tmp2 != RESET))
mbed_official 235:685d5f11838f 988 {
mbed_official 235:685d5f11838f 989 IRDA_Receive_IT(hirda);
mbed_official 235:685d5f11838f 990 }
mbed_official 235:685d5f11838f 991
mbed_official 235:685d5f11838f 992 tmp1 = __HAL_IRDA_GET_FLAG(hirda, IRDA_FLAG_TXE);
mbed_official 235:685d5f11838f 993 tmp2 = __HAL_IRDA_GET_IT_SOURCE(hirda, IRDA_IT_TXE);
mbed_official 235:685d5f11838f 994 /* IRDA in mode Transmitter ------------------------------------------------*/
mbed_official 235:685d5f11838f 995 if((tmp1 != RESET) &&(tmp2 != RESET))
mbed_official 235:685d5f11838f 996 {
mbed_official 235:685d5f11838f 997 IRDA_Transmit_IT(hirda);
mbed_official 235:685d5f11838f 998 }
mbed_official 532:fe11edbda85c 999
mbed_official 532:fe11edbda85c 1000 tmp1 = __HAL_IRDA_GET_FLAG(hirda, IRDA_FLAG_TC);
mbed_official 532:fe11edbda85c 1001 tmp2 = __HAL_IRDA_GET_IT_SOURCE(hirda, IRDA_IT_TC);
mbed_official 532:fe11edbda85c 1002 /* IRDA in mode Transmitter (transmission end) -----------------------------*/
mbed_official 532:fe11edbda85c 1003 if((tmp1 != RESET) && (tmp2 != RESET))
mbed_official 532:fe11edbda85c 1004 {
mbed_official 532:fe11edbda85c 1005 IRDA_EndTransmit_IT(hirda);
mbed_official 532:fe11edbda85c 1006 }
mbed_official 235:685d5f11838f 1007 }
mbed_official 235:685d5f11838f 1008
mbed_official 235:685d5f11838f 1009 /**
mbed_official 235:685d5f11838f 1010 * @brief Tx Transfer complete callbacks.
mbed_official 235:685d5f11838f 1011 * @param hirda: pointer to a IRDA_HandleTypeDef structure that contains
mbed_official 235:685d5f11838f 1012 * the configuration information for the specified IRDA module.
mbed_official 235:685d5f11838f 1013 * @retval None
mbed_official 235:685d5f11838f 1014 */
mbed_official 235:685d5f11838f 1015 __weak void HAL_IRDA_TxCpltCallback(IRDA_HandleTypeDef *hirda)
mbed_official 235:685d5f11838f 1016 {
mbed_official 235:685d5f11838f 1017 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 235:685d5f11838f 1018 the HAL_IRDA_TxCpltCallback could be implemented in the user file
mbed_official 235:685d5f11838f 1019 */
mbed_official 235:685d5f11838f 1020 }
mbed_official 235:685d5f11838f 1021
mbed_official 235:685d5f11838f 1022 /**
mbed_official 235:685d5f11838f 1023 * @brief Tx Half Transfer completed callbacks.
mbed_official 235:685d5f11838f 1024 * @param hirda: pointer to a IRDA_HandleTypeDef structure that contains
mbed_official 235:685d5f11838f 1025 * the configuration information for the specified USART module.
mbed_official 235:685d5f11838f 1026 * @retval None
mbed_official 235:685d5f11838f 1027 */
mbed_official 235:685d5f11838f 1028 __weak void HAL_IRDA_TxHalfCpltCallback(IRDA_HandleTypeDef *hirda)
mbed_official 235:685d5f11838f 1029 {
mbed_official 235:685d5f11838f 1030 /* NOTE: This function Should not be modified, when the callback is needed,
mbed_official 235:685d5f11838f 1031 the HAL_IRDA_TxHalfCpltCallback could be implemented in the user file
mbed_official 235:685d5f11838f 1032 */
mbed_official 235:685d5f11838f 1033 }
mbed_official 235:685d5f11838f 1034
mbed_official 235:685d5f11838f 1035 /**
mbed_official 235:685d5f11838f 1036 * @brief Rx Transfer complete callbacks.
mbed_official 235:685d5f11838f 1037 * @param hirda: pointer to a IRDA_HandleTypeDef structure that contains
mbed_official 235:685d5f11838f 1038 * the configuration information for the specified IRDA module.
mbed_official 235:685d5f11838f 1039 * @retval None
mbed_official 235:685d5f11838f 1040 */
mbed_official 235:685d5f11838f 1041 __weak void HAL_IRDA_RxCpltCallback(IRDA_HandleTypeDef *hirda)
mbed_official 235:685d5f11838f 1042 {
mbed_official 235:685d5f11838f 1043 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 235:685d5f11838f 1044 the HAL_IRDA_RxCpltCallback could be implemented in the user file
mbed_official 235:685d5f11838f 1045 */
mbed_official 235:685d5f11838f 1046 }
mbed_official 235:685d5f11838f 1047
mbed_official 235:685d5f11838f 1048 /**
mbed_official 235:685d5f11838f 1049 * @brief Rx Half Transfer complete callbacks.
mbed_official 235:685d5f11838f 1050 * @param hirda: pointer to a IRDA_HandleTypeDef structure that contains
mbed_official 235:685d5f11838f 1051 * the configuration information for the specified IRDA module.
mbed_official 235:685d5f11838f 1052 * @retval None
mbed_official 235:685d5f11838f 1053 */
mbed_official 235:685d5f11838f 1054 __weak void HAL_IRDA_RxHalfCpltCallback(IRDA_HandleTypeDef *hirda)
mbed_official 235:685d5f11838f 1055 {
mbed_official 235:685d5f11838f 1056 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 235:685d5f11838f 1057 the HAL_IRDA_RxHalfCpltCallback could be implemented in the user file
mbed_official 235:685d5f11838f 1058 */
mbed_official 235:685d5f11838f 1059 }
mbed_official 235:685d5f11838f 1060
mbed_official 235:685d5f11838f 1061 /**
mbed_official 235:685d5f11838f 1062 * @brief IRDA error callbacks.
mbed_official 235:685d5f11838f 1063 * @param hirda: pointer to a IRDA_HandleTypeDef structure that contains
mbed_official 235:685d5f11838f 1064 * the configuration information for the specified IRDA module.
mbed_official 235:685d5f11838f 1065 * @retval None
mbed_official 235:685d5f11838f 1066 */
mbed_official 235:685d5f11838f 1067 __weak void HAL_IRDA_ErrorCallback(IRDA_HandleTypeDef *hirda)
mbed_official 235:685d5f11838f 1068 {
mbed_official 235:685d5f11838f 1069 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 235:685d5f11838f 1070 the HAL_IRDA_ErrorCallback could be implemented in the user file
mbed_official 235:685d5f11838f 1071 */
mbed_official 235:685d5f11838f 1072 }
mbed_official 235:685d5f11838f 1073
mbed_official 235:685d5f11838f 1074 /**
mbed_official 235:685d5f11838f 1075 * @}
mbed_official 235:685d5f11838f 1076 */
mbed_official 235:685d5f11838f 1077
mbed_official 532:fe11edbda85c 1078 /** @defgroup IRDA_Exported_Functions_Group3 Peripheral State and Errors functions
mbed_official 235:685d5f11838f 1079 * @brief IRDA State and Errors functions
mbed_official 235:685d5f11838f 1080 *
mbed_official 235:685d5f11838f 1081 @verbatim
mbed_official 235:685d5f11838f 1082 ==============================================================================
mbed_official 235:685d5f11838f 1083 ##### Peripheral State and Errors functions #####
mbed_official 235:685d5f11838f 1084 ==============================================================================
mbed_official 235:685d5f11838f 1085 [..]
mbed_official 235:685d5f11838f 1086 This subsection provides a set of functions allowing to return the State of IrDA
mbed_official 235:685d5f11838f 1087 communication process and also return Peripheral Errors occurred during communication process
mbed_official 235:685d5f11838f 1088 (+) HAL_IRDA_GetState() API can be helpful to check in run-time the state of the IrDA peripheral.
mbed_official 235:685d5f11838f 1089 (+) HAL_IRDA_GetError() check in run-time errors that could be occurred during communication.
mbed_official 235:685d5f11838f 1090
mbed_official 235:685d5f11838f 1091 @endverbatim
mbed_official 235:685d5f11838f 1092 * @{
mbed_official 235:685d5f11838f 1093 */
mbed_official 235:685d5f11838f 1094
mbed_official 235:685d5f11838f 1095 /**
mbed_official 235:685d5f11838f 1096 * @brief Returns the IRDA state.
mbed_official 235:685d5f11838f 1097 * @param hirda: pointer to a IRDA_HandleTypeDef structure that contains
mbed_official 235:685d5f11838f 1098 * the configuration information for the specified IRDA module.
mbed_official 235:685d5f11838f 1099 * @retval HAL state
mbed_official 235:685d5f11838f 1100 */
mbed_official 235:685d5f11838f 1101 HAL_IRDA_StateTypeDef HAL_IRDA_GetState(IRDA_HandleTypeDef *hirda)
mbed_official 235:685d5f11838f 1102 {
mbed_official 235:685d5f11838f 1103 return hirda->State;
mbed_official 235:685d5f11838f 1104 }
mbed_official 235:685d5f11838f 1105
mbed_official 235:685d5f11838f 1106 /**
mbed_official 235:685d5f11838f 1107 * @brief Return the IARDA error code
mbed_official 235:685d5f11838f 1108 * @param hirda : pointer to a IRDA_HandleTypeDef structure that contains
mbed_official 235:685d5f11838f 1109 * the configuration information for the specified IRDA.
mbed_official 235:685d5f11838f 1110 * @retval IRDA Error Code
mbed_official 235:685d5f11838f 1111 */
mbed_official 235:685d5f11838f 1112 uint32_t HAL_IRDA_GetError(IRDA_HandleTypeDef *hirda)
mbed_official 235:685d5f11838f 1113 {
mbed_official 235:685d5f11838f 1114 return hirda->ErrorCode;
mbed_official 235:685d5f11838f 1115 }
mbed_official 235:685d5f11838f 1116
mbed_official 235:685d5f11838f 1117 /**
mbed_official 235:685d5f11838f 1118 * @}
mbed_official 235:685d5f11838f 1119 */
mbed_official 235:685d5f11838f 1120
mbed_official 235:685d5f11838f 1121 /**
mbed_official 235:685d5f11838f 1122 * @brief DMA IRDA transmit process complete callback.
mbed_official 235:685d5f11838f 1123 * @param hdma : DMA handle
mbed_official 235:685d5f11838f 1124 * @retval None
mbed_official 235:685d5f11838f 1125 */
mbed_official 235:685d5f11838f 1126 static void IRDA_DMATransmitCplt(DMA_HandleTypeDef *hdma)
mbed_official 235:685d5f11838f 1127 {
mbed_official 235:685d5f11838f 1128 IRDA_HandleTypeDef* hirda = ( IRDA_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
mbed_official 235:685d5f11838f 1129 /* DMA Normal mode */
mbed_official 235:685d5f11838f 1130 if((hdma->Instance->CR & DMA_SxCR_CIRC) == 0)
mbed_official 235:685d5f11838f 1131 {
mbed_official 235:685d5f11838f 1132 hirda->TxXferCount = 0;
mbed_official 235:685d5f11838f 1133
mbed_official 235:685d5f11838f 1134 /* Disable the DMA transfer for transmit request by setting the DMAT bit
mbed_official 235:685d5f11838f 1135 in the IRDA CR3 register */
mbed_official 235:685d5f11838f 1136 hirda->Instance->CR3 &= (uint16_t)~((uint16_t)USART_CR3_DMAT);
mbed_official 235:685d5f11838f 1137
mbed_official 532:fe11edbda85c 1138 /* Enable the IRDA Transmit Complete Interrupt */
mbed_official 532:fe11edbda85c 1139 __HAL_IRDA_ENABLE_IT(hirda, IRDA_IT_TC);
mbed_official 235:685d5f11838f 1140 }
mbed_official 235:685d5f11838f 1141 /* DMA Circular mode */
mbed_official 235:685d5f11838f 1142 else
mbed_official 235:685d5f11838f 1143 {
mbed_official 235:685d5f11838f 1144 HAL_IRDA_TxCpltCallback(hirda);
mbed_official 235:685d5f11838f 1145 }
mbed_official 235:685d5f11838f 1146 }
mbed_official 235:685d5f11838f 1147
mbed_official 235:685d5f11838f 1148 /**
mbed_official 235:685d5f11838f 1149 * @brief DMA IRDA receive process half complete callback
mbed_official 235:685d5f11838f 1150 * @param hdma: pointer to a DMA_HandleTypeDef structure that contains
mbed_official 235:685d5f11838f 1151 * the configuration information for the specified DMA module.
mbed_official 235:685d5f11838f 1152 * @retval None
mbed_official 235:685d5f11838f 1153 */
mbed_official 235:685d5f11838f 1154 static void IRDA_DMATransmitHalfCplt(DMA_HandleTypeDef *hdma)
mbed_official 235:685d5f11838f 1155 {
mbed_official 235:685d5f11838f 1156 IRDA_HandleTypeDef* hirda = ( IRDA_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
mbed_official 235:685d5f11838f 1157
mbed_official 235:685d5f11838f 1158 HAL_IRDA_TxHalfCpltCallback(hirda);
mbed_official 235:685d5f11838f 1159 }
mbed_official 235:685d5f11838f 1160
mbed_official 235:685d5f11838f 1161 /**
mbed_official 235:685d5f11838f 1162 * @brief DMA IRDA receive process complete callback.
mbed_official 235:685d5f11838f 1163 * @param hdma: DMA handle
mbed_official 235:685d5f11838f 1164 * @retval None
mbed_official 235:685d5f11838f 1165 */
mbed_official 235:685d5f11838f 1166 static void IRDA_DMAReceiveCplt(DMA_HandleTypeDef *hdma)
mbed_official 235:685d5f11838f 1167 {
mbed_official 235:685d5f11838f 1168 IRDA_HandleTypeDef* hirda = ( IRDA_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
mbed_official 235:685d5f11838f 1169 /* DMA Normal mode */
mbed_official 235:685d5f11838f 1170 if((hdma->Instance->CR & DMA_SxCR_CIRC) == 0)
mbed_official 235:685d5f11838f 1171 {
mbed_official 235:685d5f11838f 1172 hirda->RxXferCount = 0;
mbed_official 235:685d5f11838f 1173
mbed_official 235:685d5f11838f 1174 /* Disable the DMA transfer for the receiver request by setting the DMAR bit
mbed_official 235:685d5f11838f 1175 in the IRDA CR3 register */
mbed_official 235:685d5f11838f 1176 hirda->Instance->CR3 &= (uint16_t)~((uint16_t)USART_CR3_DMAR);
mbed_official 235:685d5f11838f 1177
mbed_official 235:685d5f11838f 1178 if(hirda->State == HAL_IRDA_STATE_BUSY_TX_RX)
mbed_official 235:685d5f11838f 1179 {
mbed_official 235:685d5f11838f 1180 hirda->State = HAL_IRDA_STATE_BUSY_TX;
mbed_official 235:685d5f11838f 1181 }
mbed_official 235:685d5f11838f 1182 else
mbed_official 235:685d5f11838f 1183 {
mbed_official 235:685d5f11838f 1184 hirda->State = HAL_IRDA_STATE_READY;
mbed_official 235:685d5f11838f 1185 }
mbed_official 235:685d5f11838f 1186 }
mbed_official 235:685d5f11838f 1187
mbed_official 235:685d5f11838f 1188 HAL_IRDA_RxCpltCallback(hirda);
mbed_official 235:685d5f11838f 1189 }
mbed_official 235:685d5f11838f 1190
mbed_official 235:685d5f11838f 1191 /**
mbed_official 235:685d5f11838f 1192 * @brief DMA IRDA receive process half complete callback
mbed_official 235:685d5f11838f 1193 * @param hdma: pointer to a DMA_HandleTypeDef structure that contains
mbed_official 235:685d5f11838f 1194 * the configuration information for the specified DMA module.
mbed_official 235:685d5f11838f 1195 * @retval None
mbed_official 235:685d5f11838f 1196 */
mbed_official 235:685d5f11838f 1197 static void IRDA_DMAReceiveHalfCplt(DMA_HandleTypeDef *hdma)
mbed_official 235:685d5f11838f 1198 {
mbed_official 235:685d5f11838f 1199 IRDA_HandleTypeDef* hirda = ( IRDA_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
mbed_official 235:685d5f11838f 1200
mbed_official 235:685d5f11838f 1201 HAL_IRDA_RxHalfCpltCallback(hirda);
mbed_official 235:685d5f11838f 1202 }
mbed_official 235:685d5f11838f 1203
mbed_official 235:685d5f11838f 1204 /**
mbed_official 235:685d5f11838f 1205 * @brief DMA IRDA communication error callback.
mbed_official 235:685d5f11838f 1206 * @param hdma: DMA handle
mbed_official 235:685d5f11838f 1207 * @retval None
mbed_official 235:685d5f11838f 1208 */
mbed_official 235:685d5f11838f 1209 static void IRDA_DMAError(DMA_HandleTypeDef *hdma)
mbed_official 235:685d5f11838f 1210 {
mbed_official 235:685d5f11838f 1211 IRDA_HandleTypeDef* hirda = ( IRDA_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
mbed_official 235:685d5f11838f 1212
mbed_official 235:685d5f11838f 1213 hirda->RxXferCount = 0;
mbed_official 235:685d5f11838f 1214 hirda->TxXferCount = 0;
mbed_official 235:685d5f11838f 1215 hirda->ErrorCode |= HAL_IRDA_ERROR_DMA;
mbed_official 235:685d5f11838f 1216 hirda->State= HAL_IRDA_STATE_READY;
mbed_official 235:685d5f11838f 1217
mbed_official 235:685d5f11838f 1218 HAL_IRDA_ErrorCallback(hirda);
mbed_official 235:685d5f11838f 1219 }
mbed_official 235:685d5f11838f 1220
mbed_official 235:685d5f11838f 1221 /**
mbed_official 235:685d5f11838f 1222 * @brief This function handles IRDA Communication Timeout.
mbed_official 235:685d5f11838f 1223 * @param hirda: pointer to a IRDA_HandleTypeDef structure that contains
mbed_official 235:685d5f11838f 1224 * the configuration information for the specified IRDA module.
mbed_official 235:685d5f11838f 1225 * @param Flag: specifies the IRDA flag to check.
mbed_official 235:685d5f11838f 1226 * @param Status: The new Flag status (SET or RESET).
mbed_official 235:685d5f11838f 1227 * @param Timeout: Timeout duration
mbed_official 235:685d5f11838f 1228 * @retval HAL status
mbed_official 235:685d5f11838f 1229 */
mbed_official 235:685d5f11838f 1230 static HAL_StatusTypeDef IRDA_WaitOnFlagUntilTimeout(IRDA_HandleTypeDef *hirda, uint32_t Flag, FlagStatus Status, uint32_t Timeout)
mbed_official 235:685d5f11838f 1231 {
mbed_official 235:685d5f11838f 1232 uint32_t tickstart = 0;
mbed_official 235:685d5f11838f 1233
mbed_official 235:685d5f11838f 1234 /* Get tick */
mbed_official 235:685d5f11838f 1235 tickstart = HAL_GetTick();
mbed_official 235:685d5f11838f 1236
mbed_official 235:685d5f11838f 1237 /* Wait until flag is set */
mbed_official 235:685d5f11838f 1238 if(Status == RESET)
mbed_official 235:685d5f11838f 1239 {
mbed_official 235:685d5f11838f 1240 while(__HAL_IRDA_GET_FLAG(hirda, Flag) == RESET)
mbed_official 235:685d5f11838f 1241 {
mbed_official 235:685d5f11838f 1242 /* Check for the Timeout */
mbed_official 235:685d5f11838f 1243 if(Timeout != HAL_MAX_DELAY)
mbed_official 235:685d5f11838f 1244 {
mbed_official 235:685d5f11838f 1245 if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout))
mbed_official 235:685d5f11838f 1246 {
mbed_official 235:685d5f11838f 1247 /* Disable TXE, RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts for the interrupt process */
mbed_official 235:685d5f11838f 1248 __HAL_IRDA_DISABLE_IT(hirda, IRDA_IT_TXE);
mbed_official 235:685d5f11838f 1249 __HAL_IRDA_DISABLE_IT(hirda, IRDA_IT_RXNE);
mbed_official 235:685d5f11838f 1250 __HAL_IRDA_DISABLE_IT(hirda, IRDA_IT_PE);
mbed_official 235:685d5f11838f 1251 __HAL_IRDA_DISABLE_IT(hirda, IRDA_IT_ERR);
mbed_official 235:685d5f11838f 1252
mbed_official 235:685d5f11838f 1253 hirda->State= HAL_IRDA_STATE_READY;
mbed_official 235:685d5f11838f 1254
mbed_official 235:685d5f11838f 1255 /* Process Unlocked */
mbed_official 235:685d5f11838f 1256 __HAL_UNLOCK(hirda);
mbed_official 235:685d5f11838f 1257
mbed_official 235:685d5f11838f 1258 return HAL_TIMEOUT;
mbed_official 235:685d5f11838f 1259 }
mbed_official 235:685d5f11838f 1260 }
mbed_official 235:685d5f11838f 1261 }
mbed_official 235:685d5f11838f 1262 }
mbed_official 235:685d5f11838f 1263 else
mbed_official 235:685d5f11838f 1264 {
mbed_official 235:685d5f11838f 1265 while(__HAL_IRDA_GET_FLAG(hirda, Flag) != RESET)
mbed_official 235:685d5f11838f 1266 {
mbed_official 235:685d5f11838f 1267 /* Check for the Timeout */
mbed_official 235:685d5f11838f 1268 if(Timeout != HAL_MAX_DELAY)
mbed_official 235:685d5f11838f 1269 {
mbed_official 235:685d5f11838f 1270 if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout))
mbed_official 235:685d5f11838f 1271 {
mbed_official 235:685d5f11838f 1272 /* Disable TXE, RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts for the interrupt process */
mbed_official 235:685d5f11838f 1273 __HAL_IRDA_DISABLE_IT(hirda, IRDA_IT_TXE);
mbed_official 235:685d5f11838f 1274 __HAL_IRDA_DISABLE_IT(hirda, IRDA_IT_RXNE);
mbed_official 235:685d5f11838f 1275 __HAL_IRDA_DISABLE_IT(hirda, IRDA_IT_PE);
mbed_official 235:685d5f11838f 1276 __HAL_IRDA_DISABLE_IT(hirda, IRDA_IT_ERR);
mbed_official 235:685d5f11838f 1277
mbed_official 235:685d5f11838f 1278 hirda->State= HAL_IRDA_STATE_READY;
mbed_official 235:685d5f11838f 1279
mbed_official 235:685d5f11838f 1280 /* Process Unlocked */
mbed_official 235:685d5f11838f 1281 __HAL_UNLOCK(hirda);
mbed_official 235:685d5f11838f 1282
mbed_official 235:685d5f11838f 1283 return HAL_TIMEOUT;
mbed_official 235:685d5f11838f 1284 }
mbed_official 235:685d5f11838f 1285 }
mbed_official 235:685d5f11838f 1286 }
mbed_official 235:685d5f11838f 1287 }
mbed_official 235:685d5f11838f 1288 return HAL_OK;
mbed_official 235:685d5f11838f 1289 }
mbed_official 235:685d5f11838f 1290
mbed_official 235:685d5f11838f 1291 /**
mbed_official 235:685d5f11838f 1292 * @brief Send an amount of data in non blocking mode.
mbed_official 235:685d5f11838f 1293 * @param hirda: pointer to a IRDA_HandleTypeDef structure that contains
mbed_official 235:685d5f11838f 1294 * the configuration information for the specified IRDA module.
mbed_official 235:685d5f11838f 1295 * @retval HAL status
mbed_official 235:685d5f11838f 1296 */
mbed_official 235:685d5f11838f 1297 static HAL_StatusTypeDef IRDA_Transmit_IT(IRDA_HandleTypeDef *hirda)
mbed_official 235:685d5f11838f 1298 {
mbed_official 235:685d5f11838f 1299 uint16_t* tmp;
mbed_official 235:685d5f11838f 1300 uint32_t tmp1 = 0;
mbed_official 235:685d5f11838f 1301
mbed_official 235:685d5f11838f 1302 tmp1 = hirda->State;
mbed_official 235:685d5f11838f 1303 if((tmp1 == HAL_IRDA_STATE_BUSY_TX) || (tmp1 == HAL_IRDA_STATE_BUSY_TX_RX))
mbed_official 235:685d5f11838f 1304 {
mbed_official 235:685d5f11838f 1305 if(hirda->Init.WordLength == IRDA_WORDLENGTH_9B)
mbed_official 235:685d5f11838f 1306 {
mbed_official 235:685d5f11838f 1307 tmp = (uint16_t*) hirda->pTxBuffPtr;
mbed_official 235:685d5f11838f 1308 hirda->Instance->DR = (uint16_t)(*tmp & (uint16_t)0x01FF);
mbed_official 235:685d5f11838f 1309 if(hirda->Init.Parity == IRDA_PARITY_NONE)
mbed_official 235:685d5f11838f 1310 {
mbed_official 235:685d5f11838f 1311 hirda->pTxBuffPtr += 2;
mbed_official 235:685d5f11838f 1312 }
mbed_official 235:685d5f11838f 1313 else
mbed_official 235:685d5f11838f 1314 {
mbed_official 235:685d5f11838f 1315 hirda->pTxBuffPtr += 1;
mbed_official 235:685d5f11838f 1316 }
mbed_official 235:685d5f11838f 1317 }
mbed_official 235:685d5f11838f 1318 else
mbed_official 235:685d5f11838f 1319 {
mbed_official 235:685d5f11838f 1320 hirda->Instance->DR = (uint8_t)(*hirda->pTxBuffPtr++ & (uint8_t)0x00FF);
mbed_official 235:685d5f11838f 1321 }
mbed_official 235:685d5f11838f 1322
mbed_official 235:685d5f11838f 1323 if(--hirda->TxXferCount == 0)
mbed_official 235:685d5f11838f 1324 {
mbed_official 235:685d5f11838f 1325 /* Disable the IRDA Transmit Data Register Empty Interrupt */
mbed_official 235:685d5f11838f 1326 __HAL_IRDA_DISABLE_IT(hirda, IRDA_IT_TXE);
mbed_official 235:685d5f11838f 1327
mbed_official 532:fe11edbda85c 1328 /* Enable the IRDA Transmit Complete Interrupt */
mbed_official 532:fe11edbda85c 1329 __HAL_IRDA_ENABLE_IT(hirda, IRDA_IT_TC);
mbed_official 235:685d5f11838f 1330 }
mbed_official 235:685d5f11838f 1331
mbed_official 235:685d5f11838f 1332 return HAL_OK;
mbed_official 235:685d5f11838f 1333 }
mbed_official 235:685d5f11838f 1334 else
mbed_official 235:685d5f11838f 1335 {
mbed_official 532:fe11edbda85c 1336 return HAL_BUSY;
mbed_official 235:685d5f11838f 1337 }
mbed_official 235:685d5f11838f 1338 }
mbed_official 235:685d5f11838f 1339
mbed_official 235:685d5f11838f 1340 /**
mbed_official 532:fe11edbda85c 1341 * @brief Wraps up transmission in non blocking mode.
mbed_official 532:fe11edbda85c 1342 * @param hirda: pointer to a IRDA_HandleTypeDef structure that contains
mbed_official 532:fe11edbda85c 1343 * the configuration information for the specified IRDA module.
mbed_official 532:fe11edbda85c 1344 * @retval HAL status
mbed_official 532:fe11edbda85c 1345 */
mbed_official 532:fe11edbda85c 1346 static HAL_StatusTypeDef IRDA_EndTransmit_IT(IRDA_HandleTypeDef *hirda)
mbed_official 532:fe11edbda85c 1347 {
mbed_official 532:fe11edbda85c 1348 /* Disable the IRDA Transmit Complete Interrupt */
mbed_official 532:fe11edbda85c 1349 __HAL_IRDA_DISABLE_IT(hirda, IRDA_IT_TC);
mbed_official 532:fe11edbda85c 1350
mbed_official 532:fe11edbda85c 1351 /* Check if a receive process is ongoing or not */
mbed_official 532:fe11edbda85c 1352 if(hirda->State == HAL_IRDA_STATE_BUSY_TX_RX)
mbed_official 532:fe11edbda85c 1353 {
mbed_official 532:fe11edbda85c 1354 hirda->State = HAL_IRDA_STATE_BUSY_RX;
mbed_official 532:fe11edbda85c 1355 }
mbed_official 532:fe11edbda85c 1356 else
mbed_official 532:fe11edbda85c 1357 {
mbed_official 532:fe11edbda85c 1358 /* Disable the IRDA Error Interrupt: (Frame error, noise error, overrun error) */
mbed_official 532:fe11edbda85c 1359 __HAL_IRDA_DISABLE_IT(hirda, IRDA_IT_ERR);
mbed_official 532:fe11edbda85c 1360
mbed_official 532:fe11edbda85c 1361 hirda->State = HAL_IRDA_STATE_READY;
mbed_official 532:fe11edbda85c 1362 }
mbed_official 532:fe11edbda85c 1363
mbed_official 532:fe11edbda85c 1364 HAL_IRDA_TxCpltCallback(hirda);
mbed_official 532:fe11edbda85c 1365
mbed_official 532:fe11edbda85c 1366 return HAL_OK;
mbed_official 532:fe11edbda85c 1367 }
mbed_official 532:fe11edbda85c 1368
mbed_official 532:fe11edbda85c 1369 /**
mbed_official 235:685d5f11838f 1370 * @brief Receives an amount of data in non blocking mode.
mbed_official 235:685d5f11838f 1371 * @param hirda: pointer to a IRDA_HandleTypeDef structure that contains
mbed_official 235:685d5f11838f 1372 * the configuration information for the specified IRDA module.
mbed_official 235:685d5f11838f 1373 * @retval HAL status
mbed_official 235:685d5f11838f 1374 */
mbed_official 235:685d5f11838f 1375 static HAL_StatusTypeDef IRDA_Receive_IT(IRDA_HandleTypeDef *hirda)
mbed_official 235:685d5f11838f 1376 {
mbed_official 235:685d5f11838f 1377 uint16_t* tmp;
mbed_official 235:685d5f11838f 1378 uint32_t tmp1 = 0;
mbed_official 235:685d5f11838f 1379
mbed_official 235:685d5f11838f 1380 tmp1 = hirda->State;
mbed_official 235:685d5f11838f 1381 if((tmp1 == HAL_IRDA_STATE_BUSY_RX) || (tmp1 == HAL_IRDA_STATE_BUSY_TX_RX))
mbed_official 235:685d5f11838f 1382 {
mbed_official 235:685d5f11838f 1383 if(hirda->Init.WordLength == IRDA_WORDLENGTH_9B)
mbed_official 235:685d5f11838f 1384 {
mbed_official 235:685d5f11838f 1385 tmp = (uint16_t*) hirda->pRxBuffPtr;
mbed_official 235:685d5f11838f 1386 if(hirda->Init.Parity == IRDA_PARITY_NONE)
mbed_official 235:685d5f11838f 1387 {
mbed_official 235:685d5f11838f 1388 *tmp = (uint16_t)(hirda->Instance->DR & (uint16_t)0x01FF);
mbed_official 235:685d5f11838f 1389 hirda->pRxBuffPtr += 2;
mbed_official 235:685d5f11838f 1390 }
mbed_official 235:685d5f11838f 1391 else
mbed_official 235:685d5f11838f 1392 {
mbed_official 235:685d5f11838f 1393 *tmp = (uint16_t)(hirda->Instance->DR & (uint16_t)0x00FF);
mbed_official 235:685d5f11838f 1394 hirda->pRxBuffPtr += 1;
mbed_official 235:685d5f11838f 1395 }
mbed_official 235:685d5f11838f 1396 }
mbed_official 235:685d5f11838f 1397 else
mbed_official 235:685d5f11838f 1398 {
mbed_official 235:685d5f11838f 1399 if(hirda->Init.Parity == IRDA_PARITY_NONE)
mbed_official 235:685d5f11838f 1400 {
mbed_official 235:685d5f11838f 1401 *hirda->pRxBuffPtr++ = (uint8_t)(hirda->Instance->DR & (uint8_t)0x00FF);
mbed_official 235:685d5f11838f 1402 }
mbed_official 235:685d5f11838f 1403 else
mbed_official 235:685d5f11838f 1404 {
mbed_official 235:685d5f11838f 1405 *hirda->pRxBuffPtr++ = (uint8_t)(hirda->Instance->DR & (uint8_t)0x007F);
mbed_official 235:685d5f11838f 1406 }
mbed_official 235:685d5f11838f 1407 }
mbed_official 235:685d5f11838f 1408
mbed_official 235:685d5f11838f 1409 if(--hirda->RxXferCount == 0)
mbed_official 235:685d5f11838f 1410 {
mbed_official 235:685d5f11838f 1411
mbed_official 235:685d5f11838f 1412 __HAL_IRDA_DISABLE_IT(hirda, IRDA_IT_RXNE);
mbed_official 235:685d5f11838f 1413
mbed_official 235:685d5f11838f 1414 if(hirda->State == HAL_IRDA_STATE_BUSY_TX_RX)
mbed_official 235:685d5f11838f 1415 {
mbed_official 235:685d5f11838f 1416 hirda->State = HAL_IRDA_STATE_BUSY_TX;
mbed_official 235:685d5f11838f 1417 }
mbed_official 235:685d5f11838f 1418 else
mbed_official 235:685d5f11838f 1419 {
mbed_official 235:685d5f11838f 1420 /* Disable the IRDA Parity Error Interrupt */
mbed_official 235:685d5f11838f 1421 __HAL_IRDA_DISABLE_IT(hirda, IRDA_IT_PE);
mbed_official 235:685d5f11838f 1422
mbed_official 235:685d5f11838f 1423 /* Disable the IRDA Error Interrupt: (Frame error, noise error, overrun error) */
mbed_official 235:685d5f11838f 1424 __HAL_IRDA_DISABLE_IT(hirda, IRDA_IT_ERR);
mbed_official 235:685d5f11838f 1425
mbed_official 235:685d5f11838f 1426 hirda->State = HAL_IRDA_STATE_READY;
mbed_official 235:685d5f11838f 1427 }
mbed_official 235:685d5f11838f 1428 HAL_IRDA_RxCpltCallback(hirda);
mbed_official 235:685d5f11838f 1429
mbed_official 235:685d5f11838f 1430 return HAL_OK;
mbed_official 235:685d5f11838f 1431 }
mbed_official 235:685d5f11838f 1432 return HAL_OK;
mbed_official 235:685d5f11838f 1433 }
mbed_official 235:685d5f11838f 1434 else
mbed_official 235:685d5f11838f 1435 {
mbed_official 235:685d5f11838f 1436 return HAL_BUSY;
mbed_official 235:685d5f11838f 1437 }
mbed_official 235:685d5f11838f 1438 }
mbed_official 235:685d5f11838f 1439
mbed_official 235:685d5f11838f 1440 /**
mbed_official 235:685d5f11838f 1441 * @brief Configures the IRDA peripheral.
mbed_official 235:685d5f11838f 1442 * @param hirda: pointer to a IRDA_HandleTypeDef structure that contains
mbed_official 235:685d5f11838f 1443 * the configuration information for the specified IRDA module.
mbed_official 235:685d5f11838f 1444 * @retval None
mbed_official 235:685d5f11838f 1445 */
mbed_official 235:685d5f11838f 1446 static void IRDA_SetConfig(IRDA_HandleTypeDef *hirda)
mbed_official 235:685d5f11838f 1447 {
mbed_official 235:685d5f11838f 1448 uint32_t tmpreg = 0x00;
mbed_official 235:685d5f11838f 1449
mbed_official 235:685d5f11838f 1450 /* Check the parameters */
mbed_official 235:685d5f11838f 1451 assert_param(IS_IRDA_INSTANCE(hirda->Instance));
mbed_official 235:685d5f11838f 1452 assert_param(IS_IRDA_BAUDRATE(hirda->Init.BaudRate));
mbed_official 235:685d5f11838f 1453 assert_param(IS_IRDA_WORD_LENGTH(hirda->Init.WordLength));
mbed_official 235:685d5f11838f 1454 assert_param(IS_IRDA_PARITY(hirda->Init.Parity));
mbed_official 235:685d5f11838f 1455 assert_param(IS_IRDA_MODE(hirda->Init.Mode));
mbed_official 235:685d5f11838f 1456
mbed_official 235:685d5f11838f 1457 /*-------------------------- IRDA CR2 Configuration ------------------------*/
mbed_official 235:685d5f11838f 1458 /* Clear STOP[13:12] bits */
mbed_official 235:685d5f11838f 1459 hirda->Instance->CR2 &= (uint32_t)~((uint32_t)USART_CR2_STOP);
mbed_official 235:685d5f11838f 1460
mbed_official 235:685d5f11838f 1461 /*-------------------------- USART CR1 Configuration -----------------------*/
mbed_official 235:685d5f11838f 1462 tmpreg = hirda->Instance->CR1;
mbed_official 235:685d5f11838f 1463
mbed_official 235:685d5f11838f 1464 /* Clear M, PCE, PS, TE and RE bits */
mbed_official 235:685d5f11838f 1465 tmpreg &= (uint32_t)~((uint32_t)(USART_CR1_M | USART_CR1_PCE | USART_CR1_PS | USART_CR1_TE | \
mbed_official 235:685d5f11838f 1466 USART_CR1_RE));
mbed_official 235:685d5f11838f 1467
mbed_official 235:685d5f11838f 1468 /* Configure the USART Word Length, Parity and mode:
mbed_official 235:685d5f11838f 1469 Set the M bits according to hirda->Init.WordLength value
mbed_official 235:685d5f11838f 1470 Set PCE and PS bits according to hirda->Init.Parity value
mbed_official 235:685d5f11838f 1471 Set TE and RE bits according to hirda->Init.Mode value */
mbed_official 235:685d5f11838f 1472 tmpreg |= (uint32_t)hirda->Init.WordLength | hirda->Init.Parity | hirda->Init.Mode;
mbed_official 235:685d5f11838f 1473
mbed_official 235:685d5f11838f 1474 /* Write to USART CR1 */
mbed_official 235:685d5f11838f 1475 hirda->Instance->CR1 = (uint32_t)tmpreg;
mbed_official 235:685d5f11838f 1476
mbed_official 235:685d5f11838f 1477 /*-------------------------- USART CR3 Configuration -----------------------*/
mbed_official 235:685d5f11838f 1478 /* Clear CTSE and RTSE bits */
mbed_official 235:685d5f11838f 1479 hirda->Instance->CR3 &= (uint32_t)~((uint32_t)(USART_CR3_RTSE | USART_CR3_CTSE));
mbed_official 235:685d5f11838f 1480
mbed_official 235:685d5f11838f 1481 /*-------------------------- USART BRR Configuration -----------------------*/
mbed_official 235:685d5f11838f 1482 if((hirda->Instance == USART1) || (hirda->Instance == USART6))
mbed_official 235:685d5f11838f 1483 {
mbed_official 532:fe11edbda85c 1484 hirda->Instance->BRR = IRDA_BRR(HAL_RCC_GetPCLK2Freq(), hirda->Init.BaudRate);
mbed_official 235:685d5f11838f 1485 }
mbed_official 235:685d5f11838f 1486 else
mbed_official 235:685d5f11838f 1487 {
mbed_official 532:fe11edbda85c 1488 hirda->Instance->BRR = IRDA_BRR(HAL_RCC_GetPCLK1Freq(), hirda->Init.BaudRate);
mbed_official 235:685d5f11838f 1489 }
mbed_official 235:685d5f11838f 1490 }
mbed_official 235:685d5f11838f 1491 /**
mbed_official 235:685d5f11838f 1492 * @}
mbed_official 235:685d5f11838f 1493 */
mbed_official 235:685d5f11838f 1494
mbed_official 532:fe11edbda85c 1495 #endif /* HAL_IRDA_MODULE_ENABLED */
mbed_official 532:fe11edbda85c 1496 /**
mbed_official 532:fe11edbda85c 1497 * @}
mbed_official 532:fe11edbda85c 1498 */
mbed_official 532:fe11edbda85c 1499
mbed_official 235:685d5f11838f 1500 /**
mbed_official 235:685d5f11838f 1501 * @}
mbed_official 235:685d5f11838f 1502 */
mbed_official 235:685d5f11838f 1503
mbed_official 235:685d5f11838f 1504 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/