mbed library sources

Dependents:   frdm_kl05z_gpio_test

Fork of mbed-src by mbed official

Committer:
shaoziyang
Date:
Sat Sep 13 14:25:46 2014 +0000
Revision:
323:9e901b0a5aa1
Parent:
226:b062af740e40
test with CLOCK_SETUP = 0

Who changed what in which revision?

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