mbed library sources

Dependents:   frdm_kl05z_gpio_test

Fork of mbed-src by mbed official

Committer:
mbed_official
Date:
Sat Feb 08 19:45:06 2014 +0000
Revision:
87:085cde657901
Child:
106:ced8cbb51063
Synchronized with git revision 9272cdeb45ec7e6077641536509413da8fd2ebc2

Full URL: https://github.com/mbedmicro/mbed/commit/9272cdeb45ec7e6077641536509413da8fd2ebc2/

Add NUCLEO_F401RE, improvements

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 87:085cde657901 5 * @version V1.0.0RC2
mbed_official 87:085cde657901 6 * @date 04-February-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 87:085cde657901 10 * + Initialization and de-initialization functions
mbed_official 87:085cde657901 11 * + IO operation functions
mbed_official 87:085cde657901 12 * + Peripheral State and Errors functions
mbed_official 87:085cde657901 13 *
mbed_official 87:085cde657901 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 87:085cde657901 19 The IRDA HAL driver can be used as follow:
mbed_official 87:085cde657901 20
mbed_official 87:085cde657901 21 (#) Declare a IRDA_HandleTypeDef handle structure.
mbed_official 87:085cde657901 22 (#) Initialize the IRDA low level resources by implement 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 87:085cde657901 50 (#) Three mode of operations 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 87:085cde657901 143 /* Private macro -------------------------------------------------------------*/
mbed_official 87:085cde657901 144 /* Private variables ---------------------------------------------------------*/
mbed_official 87:085cde657901 145 /* Private function prototypes -----------------------------------------------*/
mbed_official 87:085cde657901 146 static void IRDA_SetConfig (IRDA_HandleTypeDef *hirda);
mbed_official 87:085cde657901 147 static HAL_StatusTypeDef IRDA_Transmit_IT(IRDA_HandleTypeDef *hirda);
mbed_official 87:085cde657901 148 static HAL_StatusTypeDef IRDA_Receive_IT(IRDA_HandleTypeDef *hirda);
mbed_official 87:085cde657901 149 static void IRDA_DMATransmitCplt(DMA_HandleTypeDef *hdma);
mbed_official 87:085cde657901 150 static void IRDA_DMAReceiveCplt(DMA_HandleTypeDef *hdma);
mbed_official 87:085cde657901 151 static void IRDA_DMAError(DMA_HandleTypeDef *hdma);
mbed_official 87:085cde657901 152 static HAL_StatusTypeDef IRDA_WaitOnFlagUntilTimeout(IRDA_HandleTypeDef *hirda, uint32_t Flag, FlagStatus Status, uint32_t Timeout);
mbed_official 87:085cde657901 153
mbed_official 87:085cde657901 154 /* Private functions ---------------------------------------------------------*/
mbed_official 87:085cde657901 155
mbed_official 87:085cde657901 156 /** @defgroup IRDA_Private_Functions
mbed_official 87:085cde657901 157 * @{
mbed_official 87:085cde657901 158 */
mbed_official 87:085cde657901 159
mbed_official 87:085cde657901 160 /** @defgroup IRDA_Group1 IrDA Initialization and de-initialization functions
mbed_official 87:085cde657901 161 * @brief Initialization and Configuration functions
mbed_official 87:085cde657901 162 *
mbed_official 87:085cde657901 163 @verbatim
mbed_official 87:085cde657901 164
mbed_official 87:085cde657901 165 ===============================================================================
mbed_official 87:085cde657901 166 ##### Initialization and Configuration functions #####
mbed_official 87:085cde657901 167 ===============================================================================
mbed_official 87:085cde657901 168 [..]
mbed_official 87:085cde657901 169 This subsection provides a set of functions allowing to initialize the USARTx or the UARTy
mbed_official 87:085cde657901 170 in IrDA mode.
mbed_official 87:085cde657901 171 (+) For the asynchronous mode only these parameters can be configured:
mbed_official 87:085cde657901 172 (++) BaudRate
mbed_official 87:085cde657901 173 (++) WordLength
mbed_official 87:085cde657901 174 (++) Parity: If the parity is enabled, then the MSB bit of the data written
mbed_official 87:085cde657901 175 in the data register is transmitted but is changed by the parity bit.
mbed_official 87:085cde657901 176 Depending on the frame length defined by the M bit (8-bits or 9-bits),
mbed_official 87:085cde657901 177 the possible IRDA frame formats are as listed in the following table:
mbed_official 87:085cde657901 178 +-------------------------------------------------------------+
mbed_official 87:085cde657901 179 | M bit | PCE bit | IRDA frame |
mbed_official 87:085cde657901 180 |---------------------|---------------------------------------|
mbed_official 87:085cde657901 181 | 0 | 0 | | SB | 8 bit data | STB | |
mbed_official 87:085cde657901 182 |---------|-----------|---------------------------------------|
mbed_official 87:085cde657901 183 | 0 | 1 | | SB | 7 bit data | PB | STB | |
mbed_official 87:085cde657901 184 |---------|-----------|---------------------------------------|
mbed_official 87:085cde657901 185 | 1 | 0 | | SB | 9 bit data | STB | |
mbed_official 87:085cde657901 186 |---------|-----------|---------------------------------------|
mbed_official 87:085cde657901 187 | 1 | 1 | | SB | 8 bit data | PB | STB | |
mbed_official 87:085cde657901 188 +-------------------------------------------------------------+
mbed_official 87:085cde657901 189 (++) Prescaler: A pulse of width less than two and greater than one PSC period(s) may or may
mbed_official 87:085cde657901 190 not be rejected. The receiver set up time should be managed by software. The IrDA physical layer
mbed_official 87:085cde657901 191 specification specifies a minimum of 10 ms delay between transmission and
mbed_official 87:085cde657901 192 reception (IrDA is a half duplex protocol).
mbed_official 87:085cde657901 193 (++) Mode: Receiver/transmitter modes
mbed_official 87:085cde657901 194 (++) IrDAMode: the IrDA can operate in the Normal mode or in the Low power mode.
mbed_official 87:085cde657901 195 [..]
mbed_official 87:085cde657901 196 The HAL_IRDA_Init() API follows IRDA configuration procedures (details for the procedures
mbed_official 87:085cde657901 197 are available in reference manual).
mbed_official 87:085cde657901 198
mbed_official 87:085cde657901 199 @endverbatim
mbed_official 87:085cde657901 200 * @{
mbed_official 87:085cde657901 201 */
mbed_official 87:085cde657901 202
mbed_official 87:085cde657901 203 /**
mbed_official 87:085cde657901 204 * @brief Initializes the IRDA mode according to the specified
mbed_official 87:085cde657901 205 * parameters in the IRDA_InitTypeDef and create the associated handle.
mbed_official 87:085cde657901 206 * @param hirda: IRDA handle
mbed_official 87:085cde657901 207 * @retval HAL status
mbed_official 87:085cde657901 208 */
mbed_official 87:085cde657901 209 HAL_StatusTypeDef HAL_IRDA_Init(IRDA_HandleTypeDef *hirda)
mbed_official 87:085cde657901 210 {
mbed_official 87:085cde657901 211 /* Check the IRDA handle allocation */
mbed_official 87:085cde657901 212 if(hirda == NULL)
mbed_official 87:085cde657901 213 {
mbed_official 87:085cde657901 214 return HAL_ERROR;
mbed_official 87:085cde657901 215 }
mbed_official 87:085cde657901 216
mbed_official 87:085cde657901 217 /* Check the IRDA instance parameters */
mbed_official 87:085cde657901 218 assert_param(IS_IRDA_INSTANCE(hirda->Instance));
mbed_official 87:085cde657901 219 /* Check the IRDA mode parameter in the IRDA handle */
mbed_official 87:085cde657901 220 assert_param(IS_IRDA_POWERMODE(hirda->Init.IrDAMode));
mbed_official 87:085cde657901 221
mbed_official 87:085cde657901 222 if(hirda->State == HAL_IRDA_STATE_RESET)
mbed_official 87:085cde657901 223 {
mbed_official 87:085cde657901 224 /* Init the low level hardware : GPIO, CLOCK, CORTEX...etc */
mbed_official 87:085cde657901 225 HAL_IRDA_MspInit(hirda);
mbed_official 87:085cde657901 226 }
mbed_official 87:085cde657901 227
mbed_official 87:085cde657901 228 hirda->State = HAL_IRDA_STATE_BUSY;
mbed_official 87:085cde657901 229
mbed_official 87:085cde657901 230 /* Disable the IRDA peripheral */
mbed_official 87:085cde657901 231 __IRDA_DISABLE(hirda);
mbed_official 87:085cde657901 232
mbed_official 87:085cde657901 233 /* Set the IRDA communication parameters */
mbed_official 87:085cde657901 234 IRDA_SetConfig(hirda);
mbed_official 87:085cde657901 235
mbed_official 87:085cde657901 236 /* In IrDA mode, the following bits must be kept cleared:
mbed_official 87:085cde657901 237 - LINEN, STOP and CLKEN bits in the USART_CR2 register,
mbed_official 87:085cde657901 238 - SCEN and HDSEL bits in the USART_CR3 register.*/
mbed_official 87:085cde657901 239 hirda->Instance->CR2 &= ~(USART_CR2_LINEN | USART_CR2_STOP | USART_CR2_CLKEN);
mbed_official 87:085cde657901 240 hirda->Instance->CR3 &= ~(USART_CR3_SCEN | USART_CR3_HDSEL);
mbed_official 87:085cde657901 241
mbed_official 87:085cde657901 242 /* Enable the IRDA peripheral */
mbed_official 87:085cde657901 243 __IRDA_ENABLE(hirda);
mbed_official 87:085cde657901 244
mbed_official 87:085cde657901 245 /* Set the prescaler */
mbed_official 87:085cde657901 246 MODIFY_REG(hirda->Instance->GTPR, USART_GTPR_PSC, hirda->Init.Prescaler);
mbed_official 87:085cde657901 247
mbed_official 87:085cde657901 248 /* Configure the IrDA mode */
mbed_official 87:085cde657901 249 MODIFY_REG(hirda->Instance->CR3, USART_CR3_IRLP, hirda->Init.IrDAMode);
mbed_official 87:085cde657901 250
mbed_official 87:085cde657901 251 /* Enable the IrDA mode by setting the IREN bit in the CR3 register */
mbed_official 87:085cde657901 252 hirda->Instance->CR3 |= USART_CR3_IREN;
mbed_official 87:085cde657901 253
mbed_official 87:085cde657901 254 /* Initialize the IRDA state*/
mbed_official 87:085cde657901 255 hirda->ErrorCode = HAL_IRDA_ERROR_NONE;
mbed_official 87:085cde657901 256 hirda->State= HAL_IRDA_STATE_READY;
mbed_official 87:085cde657901 257
mbed_official 87:085cde657901 258 return HAL_OK;
mbed_official 87:085cde657901 259 }
mbed_official 87:085cde657901 260
mbed_official 87:085cde657901 261 /**
mbed_official 87:085cde657901 262 * @brief DeInitializes the IRDA peripheral
mbed_official 87:085cde657901 263 * @param hirda: IRDA handle
mbed_official 87:085cde657901 264 * @retval HAL status
mbed_official 87:085cde657901 265 */
mbed_official 87:085cde657901 266 HAL_StatusTypeDef HAL_IRDA_DeInit(IRDA_HandleTypeDef *hirda)
mbed_official 87:085cde657901 267 {
mbed_official 87:085cde657901 268 /* Check the IRDA handle allocation */
mbed_official 87:085cde657901 269 if(hirda == NULL)
mbed_official 87:085cde657901 270 {
mbed_official 87:085cde657901 271 return HAL_ERROR;
mbed_official 87:085cde657901 272 }
mbed_official 87:085cde657901 273
mbed_official 87:085cde657901 274 /* Check the parameters */
mbed_official 87:085cde657901 275 assert_param(IS_IRDA_INSTANCE(hirda->Instance));
mbed_official 87:085cde657901 276
mbed_official 87:085cde657901 277 hirda->State = HAL_IRDA_STATE_BUSY;
mbed_official 87:085cde657901 278
mbed_official 87:085cde657901 279 /* DeInit the low level hardware */
mbed_official 87:085cde657901 280 HAL_IRDA_MspDeInit(hirda);
mbed_official 87:085cde657901 281
mbed_official 87:085cde657901 282 hirda->ErrorCode = HAL_IRDA_ERROR_NONE;
mbed_official 87:085cde657901 283 hirda->State = HAL_IRDA_STATE_RESET;
mbed_official 87:085cde657901 284
mbed_official 87:085cde657901 285 return HAL_OK;
mbed_official 87:085cde657901 286 }
mbed_official 87:085cde657901 287
mbed_official 87:085cde657901 288 /**
mbed_official 87:085cde657901 289 * @brief IRDA MSP Init.
mbed_official 87:085cde657901 290 * @param hirda: IRDA handle
mbed_official 87:085cde657901 291 * @retval None
mbed_official 87:085cde657901 292 */
mbed_official 87:085cde657901 293 __weak void HAL_IRDA_MspInit(IRDA_HandleTypeDef *hirda)
mbed_official 87:085cde657901 294 {
mbed_official 87:085cde657901 295 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 87:085cde657901 296 the HAL_IRDA_MspInit could be implenetd in the user file
mbed_official 87:085cde657901 297 */
mbed_official 87:085cde657901 298 }
mbed_official 87:085cde657901 299
mbed_official 87:085cde657901 300 /**
mbed_official 87:085cde657901 301 * @brief IRDA MSP DeInit.
mbed_official 87:085cde657901 302 * @param hirda: IRDA handle
mbed_official 87:085cde657901 303 * @retval None
mbed_official 87:085cde657901 304 */
mbed_official 87:085cde657901 305 __weak void HAL_IRDA_MspDeInit(IRDA_HandleTypeDef *hirda)
mbed_official 87:085cde657901 306 {
mbed_official 87:085cde657901 307 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 87:085cde657901 308 the HAL_IRDA_MspDeInit could be implenetd in the user file
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 */
mbed_official 87:085cde657901 315
mbed_official 87:085cde657901 316 /** @defgroup IRDA_Group2 IO operation functions
mbed_official 87:085cde657901 317 * @brief IRDA Transmit/Receive functions
mbed_official 87:085cde657901 318 *
mbed_official 87:085cde657901 319 @verbatim
mbed_official 87:085cde657901 320 ===============================================================================
mbed_official 87:085cde657901 321 ##### IO operation functions #####
mbed_official 87:085cde657901 322 ===============================================================================
mbed_official 87:085cde657901 323 This subsection provides a set of functions allowing to manage the IRDA data transfers.
mbed_official 87:085cde657901 324 [..]
mbed_official 87:085cde657901 325 IrDA is a half duplex communication protocol. If the Transmitter is busy, any data
mbed_official 87:085cde657901 326 on the IrDA receive line will be ignored by the IrDA decoder and if the Receiver
mbed_official 87:085cde657901 327 is busy, data on the TX from the USART to IrDA will not be encoded by IrDA.
mbed_official 87:085cde657901 328 While receiving data, transmission should be avoided as the data to be transmitted
mbed_official 87:085cde657901 329 could be corrupted.
mbed_official 87:085cde657901 330
mbed_official 87:085cde657901 331 (#) There are two mode of transfer:
mbed_official 87:085cde657901 332 (++) Blocking mode: The communication is performed in polling mode.
mbed_official 87:085cde657901 333 The HAL status of all data processing is returned by the same function
mbed_official 87:085cde657901 334 after finishing transfer.
mbed_official 87:085cde657901 335 (++) No-Blocking mode: The communication is performed using Interrupts
mbed_official 87:085cde657901 336 or DMA, These API's return the HAL status.
mbed_official 87:085cde657901 337 The end of the data processing will be indicated through the
mbed_official 87:085cde657901 338 dedicated IRDA IRQ when using Interrupt mode or the DMA IRQ when
mbed_official 87:085cde657901 339 using DMA mode.
mbed_official 87:085cde657901 340 The HAL_IRDA_TxCpltCallback(), HAL_IRDA_RxCpltCallback() user callbacks
mbed_official 87:085cde657901 341 will be executed respectivelly at the end of the transmit or Receive process
mbed_official 87:085cde657901 342 The HAL_IRDA_ErrorCallback()user callback will be executed when a communication error is detected
mbed_official 87:085cde657901 343
mbed_official 87:085cde657901 344 (#) Blocking mode API's are :
mbed_official 87:085cde657901 345 (++) HAL_IRDA_Transmit()
mbed_official 87:085cde657901 346 (++) HAL_IRDA_Receive()
mbed_official 87:085cde657901 347
mbed_official 87:085cde657901 348 (#) Non-Blocking mode API's with Interrupt are :
mbed_official 87:085cde657901 349 (++) HAL_IRDA_Transmit_IT()
mbed_official 87:085cde657901 350 (++) HAL_IRDA_Receive_IT()
mbed_official 87:085cde657901 351 (++) HAL_IRDA_IRQHandler()
mbed_official 87:085cde657901 352
mbed_official 87:085cde657901 353 (#) No-Blocking mode functions with DMA are :
mbed_official 87:085cde657901 354 (++) HAL_IRDA_Transmit_DMA()
mbed_official 87:085cde657901 355 (++) HAL_IRDA_Receive_DMA()
mbed_official 87:085cde657901 356
mbed_official 87:085cde657901 357 (#) A set of Transfer Complete Callbacks are provided in No_Blocking mode:
mbed_official 87:085cde657901 358 (++) HAL_IRDA_TxCpltCallback()
mbed_official 87:085cde657901 359 (++) HAL_IRDA_RxCpltCallback()
mbed_official 87:085cde657901 360 (++) HAL_IRDA_ErrorCallback()
mbed_official 87:085cde657901 361
mbed_official 87:085cde657901 362 @endverbatim
mbed_official 87:085cde657901 363 * @{
mbed_official 87:085cde657901 364 */
mbed_official 87:085cde657901 365
mbed_official 87:085cde657901 366 /**
mbed_official 87:085cde657901 367 * @brief Sends an amount of data in blocking mode.
mbed_official 87:085cde657901 368 * @param hirda: IRDA handle
mbed_official 87:085cde657901 369 * @param pData: Pointer to data buffer
mbed_official 87:085cde657901 370 * @param Size: Amount of data to be sent
mbed_official 87:085cde657901 371 * @param Timeout: Specify timeout value
mbed_official 87:085cde657901 372 * @retval HAL status
mbed_official 87:085cde657901 373 */
mbed_official 87:085cde657901 374 HAL_StatusTypeDef HAL_IRDA_Transmit(IRDA_HandleTypeDef *hirda, uint8_t *pData, uint16_t Size, uint32_t Timeout)
mbed_official 87:085cde657901 375 {
mbed_official 87:085cde657901 376 uint16_t* tmp;
mbed_official 87:085cde657901 377 uint32_t tmp1 = 0;
mbed_official 87:085cde657901 378
mbed_official 87:085cde657901 379 tmp1 = hirda->State;
mbed_official 87:085cde657901 380 if((tmp1 == HAL_IRDA_STATE_READY) || (tmp1 == HAL_IRDA_STATE_BUSY_RX))
mbed_official 87:085cde657901 381 {
mbed_official 87:085cde657901 382 if((pData == NULL) || (Size == 0))
mbed_official 87:085cde657901 383 {
mbed_official 87:085cde657901 384 return HAL_ERROR;
mbed_official 87:085cde657901 385 }
mbed_official 87:085cde657901 386
mbed_official 87:085cde657901 387 /* Process Locked */
mbed_official 87:085cde657901 388 __HAL_LOCK(hirda);
mbed_official 87:085cde657901 389
mbed_official 87:085cde657901 390 hirda->ErrorCode = HAL_IRDA_ERROR_NONE;
mbed_official 87:085cde657901 391 if(hirda->State == HAL_IRDA_STATE_BUSY_RX)
mbed_official 87:085cde657901 392 {
mbed_official 87:085cde657901 393 hirda->State = HAL_IRDA_STATE_BUSY_TX_RX;
mbed_official 87:085cde657901 394 }
mbed_official 87:085cde657901 395 else
mbed_official 87:085cde657901 396 {
mbed_official 87:085cde657901 397 hirda->State = HAL_IRDA_STATE_BUSY_TX;
mbed_official 87:085cde657901 398 }
mbed_official 87:085cde657901 399
mbed_official 87:085cde657901 400 hirda->TxXferSize = Size;
mbed_official 87:085cde657901 401 hirda->TxXferCount = Size;
mbed_official 87:085cde657901 402 while(hirda->TxXferCount > 0)
mbed_official 87:085cde657901 403 {
mbed_official 87:085cde657901 404 hirda->TxXferCount--;
mbed_official 87:085cde657901 405 if(hirda->Init.WordLength == IRDA_WORDLENGTH_9B)
mbed_official 87:085cde657901 406 {
mbed_official 87:085cde657901 407 if(IRDA_WaitOnFlagUntilTimeout(hirda, IRDA_FLAG_TXE, RESET, Timeout) != HAL_OK)
mbed_official 87:085cde657901 408 {
mbed_official 87:085cde657901 409 return HAL_TIMEOUT;
mbed_official 87:085cde657901 410 }
mbed_official 87:085cde657901 411 tmp = (uint16_t*) pData;
mbed_official 87:085cde657901 412 hirda->Instance->DR = (*tmp & (uint16_t)0x01FF);
mbed_official 87:085cde657901 413 if(hirda->Init.Parity == IRDA_PARITY_NONE)
mbed_official 87:085cde657901 414 {
mbed_official 87:085cde657901 415 pData +=2;
mbed_official 87:085cde657901 416 }
mbed_official 87:085cde657901 417 else
mbed_official 87:085cde657901 418 {
mbed_official 87:085cde657901 419 pData +=1;
mbed_official 87:085cde657901 420 }
mbed_official 87:085cde657901 421 }
mbed_official 87:085cde657901 422 else
mbed_official 87:085cde657901 423 {
mbed_official 87:085cde657901 424 if(IRDA_WaitOnFlagUntilTimeout(hirda, IRDA_FLAG_TXE, RESET, Timeout) != HAL_OK)
mbed_official 87:085cde657901 425 {
mbed_official 87:085cde657901 426 return HAL_TIMEOUT;
mbed_official 87:085cde657901 427 }
mbed_official 87:085cde657901 428 hirda->Instance->DR = (*pData++ & (uint8_t)0xFF);
mbed_official 87:085cde657901 429 }
mbed_official 87:085cde657901 430 }
mbed_official 87:085cde657901 431
mbed_official 87:085cde657901 432 if(IRDA_WaitOnFlagUntilTimeout(hirda, IRDA_FLAG_TC, RESET, Timeout) != HAL_OK)
mbed_official 87:085cde657901 433 {
mbed_official 87:085cde657901 434 return HAL_TIMEOUT;
mbed_official 87:085cde657901 435 }
mbed_official 87:085cde657901 436
mbed_official 87:085cde657901 437 if(hirda->State == HAL_IRDA_STATE_BUSY_TX_RX)
mbed_official 87:085cde657901 438 {
mbed_official 87:085cde657901 439 hirda->State = HAL_IRDA_STATE_BUSY_RX;
mbed_official 87:085cde657901 440 }
mbed_official 87:085cde657901 441 else
mbed_official 87:085cde657901 442 {
mbed_official 87:085cde657901 443 hirda->State = HAL_IRDA_STATE_READY;
mbed_official 87:085cde657901 444 }
mbed_official 87:085cde657901 445
mbed_official 87:085cde657901 446 /* Process Unlocked */
mbed_official 87:085cde657901 447 __HAL_UNLOCK(hirda);
mbed_official 87:085cde657901 448
mbed_official 87:085cde657901 449 return HAL_OK;
mbed_official 87:085cde657901 450 }
mbed_official 87:085cde657901 451 else
mbed_official 87:085cde657901 452 {
mbed_official 87:085cde657901 453 return HAL_BUSY;
mbed_official 87:085cde657901 454 }
mbed_official 87:085cde657901 455 }
mbed_official 87:085cde657901 456
mbed_official 87:085cde657901 457 /**
mbed_official 87:085cde657901 458 * @brief Receive an amount of data in blocking mode.
mbed_official 87:085cde657901 459 * @param hirda: IRDA handle
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 87:085cde657901 552 * @param hirda: IRDA handle
mbed_official 87:085cde657901 553 * @param pData: Pointer to data buffer
mbed_official 87:085cde657901 554 * @param Size: Amount of data to be sent
mbed_official 87:085cde657901 555 * @retval HAL status
mbed_official 87:085cde657901 556 */
mbed_official 87:085cde657901 557 HAL_StatusTypeDef HAL_IRDA_Transmit_IT(IRDA_HandleTypeDef *hirda, uint8_t *pData, uint16_t Size)
mbed_official 87:085cde657901 558 {
mbed_official 87:085cde657901 559 uint32_t tmp1 = 0;
mbed_official 87:085cde657901 560
mbed_official 87:085cde657901 561 tmp1 = hirda->State;
mbed_official 87:085cde657901 562 if((tmp1 == HAL_IRDA_STATE_READY) || (tmp1 == HAL_IRDA_STATE_BUSY_RX))
mbed_official 87:085cde657901 563 {
mbed_official 87:085cde657901 564 if((pData == NULL) || (Size == 0))
mbed_official 87:085cde657901 565 {
mbed_official 87:085cde657901 566 return HAL_ERROR;
mbed_official 87:085cde657901 567 }
mbed_official 87:085cde657901 568 /* Process Locked */
mbed_official 87:085cde657901 569 __HAL_LOCK(hirda);
mbed_official 87:085cde657901 570
mbed_official 87:085cde657901 571 hirda->pTxBuffPtr = pData;
mbed_official 87:085cde657901 572 hirda->TxXferSize = Size;
mbed_official 87:085cde657901 573 hirda->TxXferCount = Size;
mbed_official 87:085cde657901 574 hirda->ErrorCode = HAL_IRDA_ERROR_NONE;
mbed_official 87:085cde657901 575 if(hirda->State == HAL_IRDA_STATE_BUSY_RX)
mbed_official 87:085cde657901 576 {
mbed_official 87:085cde657901 577 hirda->State = HAL_IRDA_STATE_BUSY_TX_RX;
mbed_official 87:085cde657901 578 }
mbed_official 87:085cde657901 579 else
mbed_official 87:085cde657901 580 {
mbed_official 87:085cde657901 581 hirda->State = HAL_IRDA_STATE_BUSY_TX;
mbed_official 87:085cde657901 582 }
mbed_official 87:085cde657901 583
mbed_official 87:085cde657901 584 /* Enable the IRDA Parity Error Interrupt */
mbed_official 87:085cde657901 585 __HAL_IRDA_ENABLE_IT(hirda, IRDA_IT_PE);
mbed_official 87:085cde657901 586
mbed_official 87:085cde657901 587 /* Enable the IRDA Error Interrupt: (Frame error, noise error, overrun error) */
mbed_official 87:085cde657901 588 __HAL_IRDA_ENABLE_IT(hirda, IRDA_IT_ERR);
mbed_official 87:085cde657901 589
mbed_official 87:085cde657901 590 /* Process Unlocked */
mbed_official 87:085cde657901 591 __HAL_UNLOCK(hirda);
mbed_official 87:085cde657901 592
mbed_official 87:085cde657901 593 /* Enable the IRDA Transmit Complete Interrupt */
mbed_official 87:085cde657901 594 __HAL_IRDA_ENABLE_IT(hirda, IRDA_IT_TC);
mbed_official 87:085cde657901 595
mbed_official 87:085cde657901 596 return HAL_OK;
mbed_official 87:085cde657901 597 }
mbed_official 87:085cde657901 598 else
mbed_official 87:085cde657901 599 {
mbed_official 87:085cde657901 600 return HAL_BUSY;
mbed_official 87:085cde657901 601 }
mbed_official 87:085cde657901 602 }
mbed_official 87:085cde657901 603
mbed_official 87:085cde657901 604 /**
mbed_official 87:085cde657901 605 * @brief Receives an amount of data in non blocking mode.
mbed_official 87:085cde657901 606 * @param hirda: IRDA handle
mbed_official 87:085cde657901 607 * @param pData: Pointer to data buffer
mbed_official 87:085cde657901 608 * @param Size: Amount of data to be received
mbed_official 87:085cde657901 609 * @retval HAL status
mbed_official 87:085cde657901 610 */
mbed_official 87:085cde657901 611 HAL_StatusTypeDef HAL_IRDA_Receive_IT(IRDA_HandleTypeDef *hirda, uint8_t *pData, uint16_t Size)
mbed_official 87:085cde657901 612 {
mbed_official 87:085cde657901 613 uint32_t tmp1 = 0;
mbed_official 87:085cde657901 614
mbed_official 87:085cde657901 615 tmp1 = hirda->State;
mbed_official 87:085cde657901 616 if((tmp1 == HAL_IRDA_STATE_READY) || (tmp1 == HAL_IRDA_STATE_BUSY_TX))
mbed_official 87:085cde657901 617 {
mbed_official 87:085cde657901 618 if((pData == NULL) || (Size == 0))
mbed_official 87:085cde657901 619 {
mbed_official 87:085cde657901 620 return HAL_ERROR;
mbed_official 87:085cde657901 621 }
mbed_official 87:085cde657901 622
mbed_official 87:085cde657901 623 /* Process Locked */
mbed_official 87:085cde657901 624 __HAL_LOCK(hirda);
mbed_official 87:085cde657901 625
mbed_official 87:085cde657901 626 hirda->pRxBuffPtr = pData;
mbed_official 87:085cde657901 627 hirda->RxXferSize = Size;
mbed_official 87:085cde657901 628 hirda->RxXferCount = Size;
mbed_official 87:085cde657901 629 hirda->ErrorCode = HAL_IRDA_ERROR_NONE;
mbed_official 87:085cde657901 630 if(hirda->State == HAL_IRDA_STATE_BUSY_TX)
mbed_official 87:085cde657901 631 {
mbed_official 87:085cde657901 632 hirda->State = HAL_IRDA_STATE_BUSY_TX_RX;
mbed_official 87:085cde657901 633 }
mbed_official 87:085cde657901 634 else
mbed_official 87:085cde657901 635 {
mbed_official 87:085cde657901 636 hirda->State = HAL_IRDA_STATE_BUSY_RX;
mbed_official 87:085cde657901 637 }
mbed_official 87:085cde657901 638
mbed_official 87:085cde657901 639 /* Enable the IRDA Data Register not empty Interrupt */
mbed_official 87:085cde657901 640 __HAL_IRDA_ENABLE_IT(hirda, IRDA_IT_RXNE);
mbed_official 87:085cde657901 641
mbed_official 87:085cde657901 642 /* Enable the IRDA Parity Error Interrupt */
mbed_official 87:085cde657901 643 __HAL_IRDA_ENABLE_IT(hirda, IRDA_IT_PE);
mbed_official 87:085cde657901 644
mbed_official 87:085cde657901 645 /* Enable the IRDA Error Interrupt: (Frame error, noise error, overrun error) */
mbed_official 87:085cde657901 646 __HAL_IRDA_ENABLE_IT(hirda, IRDA_IT_ERR);
mbed_official 87:085cde657901 647
mbed_official 87:085cde657901 648 /* Process Unlocked */
mbed_official 87:085cde657901 649 __HAL_UNLOCK(hirda);
mbed_official 87:085cde657901 650
mbed_official 87:085cde657901 651 return HAL_OK;
mbed_official 87:085cde657901 652 }
mbed_official 87:085cde657901 653 else
mbed_official 87:085cde657901 654 {
mbed_official 87:085cde657901 655 return HAL_BUSY;
mbed_official 87:085cde657901 656 }
mbed_official 87:085cde657901 657 }
mbed_official 87:085cde657901 658
mbed_official 87:085cde657901 659 /**
mbed_official 87:085cde657901 660 * @brief Sends an amount of data in non blocking mode.
mbed_official 87:085cde657901 661 * @param hirda: IRDA handle
mbed_official 87:085cde657901 662 * @param pData: Pointer to data buffer
mbed_official 87:085cde657901 663 * @param Size: Amount of data to be sent
mbed_official 87:085cde657901 664 * @retval HAL status
mbed_official 87:085cde657901 665 */
mbed_official 87:085cde657901 666 HAL_StatusTypeDef HAL_IRDA_Transmit_DMA(IRDA_HandleTypeDef *hirda, uint8_t *pData, uint16_t Size)
mbed_official 87:085cde657901 667 {
mbed_official 87:085cde657901 668 uint32_t *tmp;
mbed_official 87:085cde657901 669 uint32_t tmp1 = 0;
mbed_official 87:085cde657901 670
mbed_official 87:085cde657901 671 tmp1 = hirda->State;
mbed_official 87:085cde657901 672 if((tmp1 == HAL_IRDA_STATE_READY) || (tmp1 == HAL_IRDA_STATE_BUSY_RX))
mbed_official 87:085cde657901 673 {
mbed_official 87:085cde657901 674 if((pData == NULL) || (Size == 0))
mbed_official 87:085cde657901 675 {
mbed_official 87:085cde657901 676 return HAL_ERROR;
mbed_official 87:085cde657901 677 }
mbed_official 87:085cde657901 678
mbed_official 87:085cde657901 679 /* Process Locked */
mbed_official 87:085cde657901 680 __HAL_LOCK(hirda);
mbed_official 87:085cde657901 681
mbed_official 87:085cde657901 682 hirda->pTxBuffPtr = pData;
mbed_official 87:085cde657901 683 hirda->TxXferSize = Size;
mbed_official 87:085cde657901 684 hirda->TxXferCount = Size;
mbed_official 87:085cde657901 685 hirda->ErrorCode = HAL_IRDA_ERROR_NONE;
mbed_official 87:085cde657901 686
mbed_official 87:085cde657901 687 if(hirda->State == HAL_IRDA_STATE_BUSY_RX)
mbed_official 87:085cde657901 688 {
mbed_official 87:085cde657901 689 hirda->State = HAL_IRDA_STATE_BUSY_TX_RX;
mbed_official 87:085cde657901 690 }
mbed_official 87:085cde657901 691 else
mbed_official 87:085cde657901 692 {
mbed_official 87:085cde657901 693 hirda->State = HAL_IRDA_STATE_BUSY_TX;
mbed_official 87:085cde657901 694 }
mbed_official 87:085cde657901 695
mbed_official 87:085cde657901 696 /* Set the IRDA DMA transfert complete callback */
mbed_official 87:085cde657901 697 hirda->hdmatx->XferCpltCallback = IRDA_DMATransmitCplt;
mbed_official 87:085cde657901 698
mbed_official 87:085cde657901 699 /* Set the DMA error callback */
mbed_official 87:085cde657901 700 hirda->hdmatx->XferErrorCallback = IRDA_DMAError;
mbed_official 87:085cde657901 701
mbed_official 87:085cde657901 702 /* Enable the IRDA transmit DMA Stream */
mbed_official 87:085cde657901 703 tmp = (uint32_t*)&pData;
mbed_official 87:085cde657901 704 HAL_DMA_Start_IT(hirda->hdmatx, *(uint32_t*)tmp, (uint32_t)&hirda->Instance->DR, Size);
mbed_official 87:085cde657901 705
mbed_official 87:085cde657901 706 /* Enable the DMA transfer for transmit request by setting the DMAT bit
mbed_official 87:085cde657901 707 in the USART CR3 register */
mbed_official 87:085cde657901 708 hirda->Instance->CR3 |= USART_CR3_DMAT;
mbed_official 87:085cde657901 709
mbed_official 87:085cde657901 710 /* Process Unlocked */
mbed_official 87:085cde657901 711 __HAL_UNLOCK(hirda);
mbed_official 87:085cde657901 712
mbed_official 87:085cde657901 713 return HAL_OK;
mbed_official 87:085cde657901 714 }
mbed_official 87:085cde657901 715 else
mbed_official 87:085cde657901 716 {
mbed_official 87:085cde657901 717 return HAL_BUSY;
mbed_official 87:085cde657901 718 }
mbed_official 87:085cde657901 719 }
mbed_official 87:085cde657901 720
mbed_official 87:085cde657901 721 /**
mbed_official 87:085cde657901 722 * @brief Receives an amount of data in non blocking mode.
mbed_official 87:085cde657901 723 * @param hirda: IRDA handle
mbed_official 87:085cde657901 724 * @param pData: Pointer to data buffer
mbed_official 87:085cde657901 725 * @param Size: Amount of data to be received
mbed_official 87:085cde657901 726 * @note When the IRDA parity is enabled (PCE = 1) the data received contain the parity bit.
mbed_official 87:085cde657901 727 * @retval HAL status
mbed_official 87:085cde657901 728 */
mbed_official 87:085cde657901 729 HAL_StatusTypeDef HAL_IRDA_Receive_DMA(IRDA_HandleTypeDef *hirda, uint8_t *pData, uint16_t Size)
mbed_official 87:085cde657901 730 {
mbed_official 87:085cde657901 731 uint32_t *tmp;
mbed_official 87:085cde657901 732 uint32_t tmp1 = 0;
mbed_official 87:085cde657901 733
mbed_official 87:085cde657901 734 tmp1 = hirda->State;
mbed_official 87:085cde657901 735 if((tmp1 == HAL_IRDA_STATE_READY) || (tmp1 == HAL_IRDA_STATE_BUSY_TX))
mbed_official 87:085cde657901 736 {
mbed_official 87:085cde657901 737 if((pData == NULL) || (Size == 0))
mbed_official 87:085cde657901 738 {
mbed_official 87:085cde657901 739 return HAL_ERROR;
mbed_official 87:085cde657901 740 }
mbed_official 87:085cde657901 741
mbed_official 87:085cde657901 742 /* Process Locked */
mbed_official 87:085cde657901 743 __HAL_LOCK(hirda);
mbed_official 87:085cde657901 744
mbed_official 87:085cde657901 745 hirda->pRxBuffPtr = pData;
mbed_official 87:085cde657901 746 hirda->RxXferSize = Size;
mbed_official 87:085cde657901 747 hirda->ErrorCode = HAL_IRDA_ERROR_NONE;
mbed_official 87:085cde657901 748 if(hirda->State == HAL_IRDA_STATE_BUSY_TX)
mbed_official 87:085cde657901 749 {
mbed_official 87:085cde657901 750 hirda->State = HAL_IRDA_STATE_BUSY_TX_RX;
mbed_official 87:085cde657901 751 }
mbed_official 87:085cde657901 752 else
mbed_official 87:085cde657901 753 {
mbed_official 87:085cde657901 754 hirda->State = HAL_IRDA_STATE_BUSY_RX;
mbed_official 87:085cde657901 755 }
mbed_official 87:085cde657901 756
mbed_official 87:085cde657901 757 /* Set the IRDA DMA transfert complete callback */
mbed_official 87:085cde657901 758 hirda->hdmarx->XferCpltCallback = IRDA_DMAReceiveCplt;
mbed_official 87:085cde657901 759
mbed_official 87:085cde657901 760 /* Set the DMA error callback */
mbed_official 87:085cde657901 761 hirda->hdmarx->XferErrorCallback = IRDA_DMAError;
mbed_official 87:085cde657901 762
mbed_official 87:085cde657901 763 /* Enable the DMA Stream */
mbed_official 87:085cde657901 764 tmp = (uint32_t*)&pData;
mbed_official 87:085cde657901 765 HAL_DMA_Start_IT(hirda->hdmarx, (uint32_t)&hirda->Instance->DR, *(uint32_t*)tmp, Size);
mbed_official 87:085cde657901 766
mbed_official 87:085cde657901 767 /* Enable the DMA transfer for the receiver request by setting the DMAR bit
mbed_official 87:085cde657901 768 in the USART CR3 register */
mbed_official 87:085cde657901 769 hirda->Instance->CR3 |= USART_CR3_DMAR;
mbed_official 87:085cde657901 770
mbed_official 87:085cde657901 771 /* Process Unlocked */
mbed_official 87:085cde657901 772 __HAL_UNLOCK(hirda);
mbed_official 87:085cde657901 773
mbed_official 87:085cde657901 774 return HAL_OK;
mbed_official 87:085cde657901 775 }
mbed_official 87:085cde657901 776 else
mbed_official 87:085cde657901 777 {
mbed_official 87:085cde657901 778 return HAL_BUSY;
mbed_official 87:085cde657901 779 }
mbed_official 87:085cde657901 780 }
mbed_official 87:085cde657901 781
mbed_official 87:085cde657901 782 /**
mbed_official 87:085cde657901 783 * @brief This function handles IRDA interrupt request.
mbed_official 87:085cde657901 784 * @param hirda: IRDA handle
mbed_official 87:085cde657901 785 * @retval None
mbed_official 87:085cde657901 786 */
mbed_official 87:085cde657901 787 void HAL_IRDA_IRQHandler(IRDA_HandleTypeDef *hirda)
mbed_official 87:085cde657901 788 {
mbed_official 87:085cde657901 789 uint32_t tmp1 = 0, tmp2 =0;
mbed_official 87:085cde657901 790
mbed_official 87:085cde657901 791 tmp1 = __HAL_IRDA_GET_FLAG(hirda, IRDA_FLAG_PE);
mbed_official 87:085cde657901 792 tmp2 = __HAL_IRDA_GET_IT_SOURCE(hirda, IRDA_IT_PE);
mbed_official 87:085cde657901 793 /* IRDA parity error interrupt occured -------------------------------------*/
mbed_official 87:085cde657901 794 if((tmp1 != RESET) && (tmp2 != RESET))
mbed_official 87:085cde657901 795 {
mbed_official 87:085cde657901 796 __HAL_IRDA_CLEAR_FLAG(hirda, IRDA_FLAG_PE);
mbed_official 87:085cde657901 797 hirda->ErrorCode |= HAL_IRDA_ERROR_PE;
mbed_official 87:085cde657901 798 }
mbed_official 87:085cde657901 799
mbed_official 87:085cde657901 800 tmp1 = __HAL_IRDA_GET_FLAG(hirda, IRDA_FLAG_FE);
mbed_official 87:085cde657901 801 tmp2 = __HAL_IRDA_GET_IT_SOURCE(hirda, IRDA_IT_ERR);
mbed_official 87:085cde657901 802 /* IRDA frame error interrupt occured --------------------------------------*/
mbed_official 87:085cde657901 803 if((tmp1 != RESET) && (tmp2 != RESET))
mbed_official 87:085cde657901 804 {
mbed_official 87:085cde657901 805 __HAL_IRDA_CLEAR_FLAG(hirda, IRDA_FLAG_FE);
mbed_official 87:085cde657901 806 hirda->ErrorCode |= HAL_IRDA_ERROR_FE;
mbed_official 87:085cde657901 807 }
mbed_official 87:085cde657901 808
mbed_official 87:085cde657901 809 tmp1 = __HAL_IRDA_GET_FLAG(hirda, IRDA_FLAG_NE);
mbed_official 87:085cde657901 810 tmp2 = __HAL_IRDA_GET_IT_SOURCE(hirda, IRDA_IT_ERR);
mbed_official 87:085cde657901 811 /* IRDA noise error interrupt occured --------------------------------------*/
mbed_official 87:085cde657901 812 if((tmp1 != RESET) && (tmp2 != RESET))
mbed_official 87:085cde657901 813 {
mbed_official 87:085cde657901 814 __HAL_IRDA_CLEAR_FLAG(hirda, IRDA_FLAG_NE);
mbed_official 87:085cde657901 815 hirda->ErrorCode |= HAL_IRDA_ERROR_NE;
mbed_official 87:085cde657901 816 }
mbed_official 87:085cde657901 817
mbed_official 87:085cde657901 818 tmp1 = __HAL_IRDA_GET_FLAG(hirda, IRDA_FLAG_ORE);
mbed_official 87:085cde657901 819 tmp2 = __HAL_IRDA_GET_IT_SOURCE(hirda, IRDA_IT_ERR);
mbed_official 87:085cde657901 820 /* IRDA Over-Run interrupt occured -----------------------------------------*/
mbed_official 87:085cde657901 821 if((tmp1 != RESET) && (tmp2 != RESET))
mbed_official 87:085cde657901 822 {
mbed_official 87:085cde657901 823 __HAL_IRDA_CLEAR_FLAG(hirda, IRDA_FLAG_ORE);
mbed_official 87:085cde657901 824 hirda->ErrorCode |= HAL_IRDA_ERROR_ORE;
mbed_official 87:085cde657901 825 }
mbed_official 87:085cde657901 826
mbed_official 87:085cde657901 827 /* Call the Error call Back in case of Errors */
mbed_official 87:085cde657901 828 if(hirda->ErrorCode != HAL_IRDA_ERROR_NONE)
mbed_official 87:085cde657901 829 {
mbed_official 87:085cde657901 830 /* Set the IRDA state ready to be able to start again the process */
mbed_official 87:085cde657901 831 hirda->State = HAL_IRDA_STATE_READY;
mbed_official 87:085cde657901 832 HAL_IRDA_ErrorCallback(hirda);
mbed_official 87:085cde657901 833 }
mbed_official 87:085cde657901 834
mbed_official 87:085cde657901 835 tmp1 = __HAL_IRDA_GET_FLAG(hirda, IRDA_FLAG_RXNE);
mbed_official 87:085cde657901 836 tmp2 = __HAL_IRDA_GET_IT_SOURCE(hirda, IRDA_IT_RXNE);
mbed_official 87:085cde657901 837 /* IRDA in mode Receiver ---------------------------------------------------*/
mbed_official 87:085cde657901 838 if((tmp1 != RESET) && (tmp2 != RESET))
mbed_official 87:085cde657901 839 {
mbed_official 87:085cde657901 840 IRDA_Receive_IT(hirda);
mbed_official 87:085cde657901 841 __HAL_IRDA_CLEAR_FLAG(hirda, IRDA_IT_RXNE);
mbed_official 87:085cde657901 842 }
mbed_official 87:085cde657901 843
mbed_official 87:085cde657901 844 tmp1 = __HAL_IRDA_GET_FLAG(hirda, IRDA_FLAG_TC);
mbed_official 87:085cde657901 845 tmp2 = __HAL_IRDA_GET_IT_SOURCE(hirda, IRDA_IT_TC);
mbed_official 87:085cde657901 846 /* IRDA in mode Transmitter ------------------------------------------------*/
mbed_official 87:085cde657901 847 if((tmp1 != RESET) &&(tmp2 != RESET))
mbed_official 87:085cde657901 848 {
mbed_official 87:085cde657901 849 IRDA_Transmit_IT(hirda);
mbed_official 87:085cde657901 850 __HAL_IRDA_CLEAR_FLAG(hirda, IRDA_IT_TC);
mbed_official 87:085cde657901 851 }
mbed_official 87:085cde657901 852 }
mbed_official 87:085cde657901 853
mbed_official 87:085cde657901 854 /**
mbed_official 87:085cde657901 855 * @brief Tx Transfer complete callbacks.
mbed_official 87:085cde657901 856 * @param hirda: IRDA handle
mbed_official 87:085cde657901 857 * @retval None
mbed_official 87:085cde657901 858 */
mbed_official 87:085cde657901 859 __weak void HAL_IRDA_TxCpltCallback(IRDA_HandleTypeDef *hirda)
mbed_official 87:085cde657901 860 {
mbed_official 87:085cde657901 861 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 87:085cde657901 862 the HAL_IRDA_TxCpltCallback could be implemented in the user file
mbed_official 87:085cde657901 863 */
mbed_official 87:085cde657901 864 }
mbed_official 87:085cde657901 865
mbed_official 87:085cde657901 866 /**
mbed_official 87:085cde657901 867 * @brief Rx Transfer complete callbacks.
mbed_official 87:085cde657901 868 * @param hirda: IRDA handle
mbed_official 87:085cde657901 869 * @retval None
mbed_official 87:085cde657901 870 */
mbed_official 87:085cde657901 871 __weak void HAL_IRDA_RxCpltCallback(IRDA_HandleTypeDef *hirda)
mbed_official 87:085cde657901 872 {
mbed_official 87:085cde657901 873 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 87:085cde657901 874 the HAL_IRDA_TxCpltCallback could be implemented in the user file
mbed_official 87:085cde657901 875 */
mbed_official 87:085cde657901 876 }
mbed_official 87:085cde657901 877
mbed_official 87:085cde657901 878 /**
mbed_official 87:085cde657901 879 * @brief IRDA error callbacks.
mbed_official 87:085cde657901 880 * @param hirda: IRDA handle
mbed_official 87:085cde657901 881 * @retval None
mbed_official 87:085cde657901 882 */
mbed_official 87:085cde657901 883 __weak void HAL_IRDA_ErrorCallback(IRDA_HandleTypeDef *hirda)
mbed_official 87:085cde657901 884 {
mbed_official 87:085cde657901 885 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 87:085cde657901 886 the HAL_IRDA_ErrorCallback could be implemented in the user file
mbed_official 87:085cde657901 887 */
mbed_official 87:085cde657901 888 }
mbed_official 87:085cde657901 889
mbed_official 87:085cde657901 890 /**
mbed_official 87:085cde657901 891 * @}
mbed_official 87:085cde657901 892 */
mbed_official 87:085cde657901 893
mbed_official 87:085cde657901 894 /** @defgroup IRDA_Group3 Peripheral State and Errors functions
mbed_official 87:085cde657901 895 * @brief IRDA State and Errors functions
mbed_official 87:085cde657901 896 *
mbed_official 87:085cde657901 897 @verbatim
mbed_official 87:085cde657901 898 ==============================================================================
mbed_official 87:085cde657901 899 ##### Peripheral State and Errors functions #####
mbed_official 87:085cde657901 900 ==============================================================================
mbed_official 87:085cde657901 901 [..]
mbed_official 87:085cde657901 902 This subsection provides a set of functions allowing to return the State of IrDA
mbed_official 87:085cde657901 903 communication process, return Peripheral Errors occured during communication process
mbed_official 87:085cde657901 904 (+) HAL_IRDA_GetState() API can be helpful to check in run-time the state of the IrDA peripheral.
mbed_official 87:085cde657901 905 (+) HAL_IRDA_GetError() check in run-time errors that could be occured durung communication.
mbed_official 87:085cde657901 906
mbed_official 87:085cde657901 907 @endverbatim
mbed_official 87:085cde657901 908 * @{
mbed_official 87:085cde657901 909 */
mbed_official 87:085cde657901 910
mbed_official 87:085cde657901 911 /**
mbed_official 87:085cde657901 912 * @brief Returns the IRDA state.
mbed_official 87:085cde657901 913 * @param hirda: IRDA handle
mbed_official 87:085cde657901 914 * @retval HAL state
mbed_official 87:085cde657901 915 */
mbed_official 87:085cde657901 916 HAL_IRDA_StateTypeDef HAL_IRDA_GetState(IRDA_HandleTypeDef *hirda)
mbed_official 87:085cde657901 917 {
mbed_official 87:085cde657901 918 return hirda->State;
mbed_official 87:085cde657901 919 }
mbed_official 87:085cde657901 920
mbed_official 87:085cde657901 921 /**
mbed_official 87:085cde657901 922 * @brief Return the IARDA error code
mbed_official 87:085cde657901 923 * @param hirda : pointer to a IRDA_HandleTypeDef structure that contains
mbed_official 87:085cde657901 924 * the configuration information for the specified IRDA.
mbed_official 87:085cde657901 925 * @retval IRDA Error Code
mbed_official 87:085cde657901 926 */
mbed_official 87:085cde657901 927 uint32_t HAL_IRDA_GetError(IRDA_HandleTypeDef *hirda)
mbed_official 87:085cde657901 928 {
mbed_official 87:085cde657901 929 return hirda->ErrorCode;
mbed_official 87:085cde657901 930 }
mbed_official 87:085cde657901 931
mbed_official 87:085cde657901 932 /**
mbed_official 87:085cde657901 933 * @}
mbed_official 87:085cde657901 934 */
mbed_official 87:085cde657901 935
mbed_official 87:085cde657901 936 /**
mbed_official 87:085cde657901 937 * @brief DMA IRDA transmit process complete callback.
mbed_official 87:085cde657901 938 * @param hdma : DMA handle
mbed_official 87:085cde657901 939 * @retval None
mbed_official 87:085cde657901 940 */
mbed_official 87:085cde657901 941 static void IRDA_DMATransmitCplt(DMA_HandleTypeDef *hdma)
mbed_official 87:085cde657901 942 {
mbed_official 87:085cde657901 943 IRDA_HandleTypeDef* hirda = ( IRDA_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
mbed_official 87:085cde657901 944
mbed_official 87:085cde657901 945 hirda->TxXferCount = 0;
mbed_official 87:085cde657901 946
mbed_official 87:085cde657901 947 if(hirda->State == HAL_IRDA_STATE_BUSY_TX_RX)
mbed_official 87:085cde657901 948 {
mbed_official 87:085cde657901 949 hirda->State = HAL_IRDA_STATE_BUSY_RX;
mbed_official 87:085cde657901 950 }
mbed_official 87:085cde657901 951 else
mbed_official 87:085cde657901 952 {
mbed_official 87:085cde657901 953 hirda->State = HAL_IRDA_STATE_READY;
mbed_official 87:085cde657901 954 }
mbed_official 87:085cde657901 955 HAL_IRDA_TxCpltCallback(hirda);
mbed_official 87:085cde657901 956 }
mbed_official 87:085cde657901 957
mbed_official 87:085cde657901 958 /**
mbed_official 87:085cde657901 959 * @brief DMA IRDA receive process complete callback.
mbed_official 87:085cde657901 960 * @param hdma: DMA handle
mbed_official 87:085cde657901 961 * @retval None
mbed_official 87:085cde657901 962 */
mbed_official 87:085cde657901 963 static void IRDA_DMAReceiveCplt(DMA_HandleTypeDef *hdma)
mbed_official 87:085cde657901 964 {
mbed_official 87:085cde657901 965 IRDA_HandleTypeDef* hirda = ( IRDA_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
mbed_official 87:085cde657901 966
mbed_official 87:085cde657901 967 hirda->RxXferCount = 0;
mbed_official 87:085cde657901 968
mbed_official 87:085cde657901 969 if(hirda->State == HAL_IRDA_STATE_BUSY_TX_RX)
mbed_official 87:085cde657901 970 {
mbed_official 87:085cde657901 971 hirda->State = HAL_IRDA_STATE_BUSY_TX;
mbed_official 87:085cde657901 972 }
mbed_official 87:085cde657901 973 else
mbed_official 87:085cde657901 974 {
mbed_official 87:085cde657901 975 hirda->State = HAL_IRDA_STATE_READY;
mbed_official 87:085cde657901 976 }
mbed_official 87:085cde657901 977
mbed_official 87:085cde657901 978 HAL_IRDA_RxCpltCallback(hirda);
mbed_official 87:085cde657901 979 }
mbed_official 87:085cde657901 980
mbed_official 87:085cde657901 981 /**
mbed_official 87:085cde657901 982 * @brief DMA IRDA communication error callback.
mbed_official 87:085cde657901 983 * @param hdma: DMA handle
mbed_official 87:085cde657901 984 * @retval None
mbed_official 87:085cde657901 985 */
mbed_official 87:085cde657901 986 static void IRDA_DMAError(DMA_HandleTypeDef *hdma)
mbed_official 87:085cde657901 987 {
mbed_official 87:085cde657901 988 IRDA_HandleTypeDef* hirda = ( IRDA_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
mbed_official 87:085cde657901 989
mbed_official 87:085cde657901 990 hirda->RxXferCount = 0;
mbed_official 87:085cde657901 991 hirda->TxXferCount = 0;
mbed_official 87:085cde657901 992 hirda->ErrorCode |= HAL_IRDA_ERROR_DMA;
mbed_official 87:085cde657901 993 hirda->State= HAL_IRDA_STATE_READY;
mbed_official 87:085cde657901 994
mbed_official 87:085cde657901 995 HAL_IRDA_ErrorCallback(hirda);
mbed_official 87:085cde657901 996 }
mbed_official 87:085cde657901 997
mbed_official 87:085cde657901 998 /**
mbed_official 87:085cde657901 999 * @brief This function handles IRDA Communication Timeout.
mbed_official 87:085cde657901 1000 * @param hirda: IRDA handle
mbed_official 87:085cde657901 1001 * @param Flag: specifies the IRDA flag to check.
mbed_official 87:085cde657901 1002 * @param Status: The new Flag status (SET or RESET).
mbed_official 87:085cde657901 1003 * @param Timeout: Timeout duration
mbed_official 87:085cde657901 1004 * @retval HAL status
mbed_official 87:085cde657901 1005 */
mbed_official 87:085cde657901 1006 static HAL_StatusTypeDef IRDA_WaitOnFlagUntilTimeout(IRDA_HandleTypeDef *hirda, uint32_t Flag, FlagStatus Status, uint32_t Timeout)
mbed_official 87:085cde657901 1007 {
mbed_official 87:085cde657901 1008 uint32_t timeout = 0;
mbed_official 87:085cde657901 1009
mbed_official 87:085cde657901 1010 timeout = HAL_GetTick() + Timeout;
mbed_official 87:085cde657901 1011
mbed_official 87:085cde657901 1012 /* Wait until flag is set */
mbed_official 87:085cde657901 1013 if(Status == RESET)
mbed_official 87:085cde657901 1014 {
mbed_official 87:085cde657901 1015 while(__HAL_IRDA_GET_FLAG(hirda, Flag) == RESET)
mbed_official 87:085cde657901 1016 {
mbed_official 87:085cde657901 1017 /* Check for the Timeout */
mbed_official 87:085cde657901 1018 if(Timeout != HAL_MAX_DELAY)
mbed_official 87:085cde657901 1019 {
mbed_official 87:085cde657901 1020 if(HAL_GetTick() >= timeout)
mbed_official 87:085cde657901 1021 {
mbed_official 87:085cde657901 1022 /* Disable TXE, RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts for the interrupt process */
mbed_official 87:085cde657901 1023 __HAL_IRDA_DISABLE_IT(hirda, IRDA_IT_TXE);
mbed_official 87:085cde657901 1024 __HAL_IRDA_DISABLE_IT(hirda, IRDA_IT_RXNE);
mbed_official 87:085cde657901 1025 __HAL_IRDA_DISABLE_IT(hirda, IRDA_IT_PE);
mbed_official 87:085cde657901 1026 __HAL_IRDA_DISABLE_IT(hirda, IRDA_IT_ERR);
mbed_official 87:085cde657901 1027
mbed_official 87:085cde657901 1028 hirda->State= HAL_IRDA_STATE_READY;
mbed_official 87:085cde657901 1029
mbed_official 87:085cde657901 1030 /* Process Unlocked */
mbed_official 87:085cde657901 1031 __HAL_UNLOCK(hirda);
mbed_official 87:085cde657901 1032
mbed_official 87:085cde657901 1033 return HAL_TIMEOUT;
mbed_official 87:085cde657901 1034 }
mbed_official 87:085cde657901 1035 }
mbed_official 87:085cde657901 1036 }
mbed_official 87:085cde657901 1037 }
mbed_official 87:085cde657901 1038 else
mbed_official 87:085cde657901 1039 {
mbed_official 87:085cde657901 1040 while(__HAL_IRDA_GET_FLAG(hirda, Flag) != RESET)
mbed_official 87:085cde657901 1041 {
mbed_official 87:085cde657901 1042 /* Check for the Timeout */
mbed_official 87:085cde657901 1043 if(Timeout != HAL_MAX_DELAY)
mbed_official 87:085cde657901 1044 {
mbed_official 87:085cde657901 1045 if(HAL_GetTick() >= timeout)
mbed_official 87:085cde657901 1046 {
mbed_official 87:085cde657901 1047 /* Disable TXE, RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts for the interrupt process */
mbed_official 87:085cde657901 1048 __HAL_IRDA_DISABLE_IT(hirda, IRDA_IT_TXE);
mbed_official 87:085cde657901 1049 __HAL_IRDA_DISABLE_IT(hirda, IRDA_IT_RXNE);
mbed_official 87:085cde657901 1050 __HAL_IRDA_DISABLE_IT(hirda, IRDA_IT_PE);
mbed_official 87:085cde657901 1051 __HAL_IRDA_DISABLE_IT(hirda, IRDA_IT_ERR);
mbed_official 87:085cde657901 1052
mbed_official 87:085cde657901 1053 hirda->State= HAL_IRDA_STATE_READY;
mbed_official 87:085cde657901 1054
mbed_official 87:085cde657901 1055 /* Process Unlocked */
mbed_official 87:085cde657901 1056 __HAL_UNLOCK(hirda);
mbed_official 87:085cde657901 1057
mbed_official 87:085cde657901 1058 return HAL_TIMEOUT;
mbed_official 87:085cde657901 1059 }
mbed_official 87:085cde657901 1060 }
mbed_official 87:085cde657901 1061 }
mbed_official 87:085cde657901 1062 }
mbed_official 87:085cde657901 1063 return HAL_OK;
mbed_official 87:085cde657901 1064 }
mbed_official 87:085cde657901 1065
mbed_official 87:085cde657901 1066 /**
mbed_official 87:085cde657901 1067 * @brief Send an amount of data in non blocking mode.
mbed_official 87:085cde657901 1068 * @param hirda: IRDA handle
mbed_official 87:085cde657901 1069 * @retval HAL status
mbed_official 87:085cde657901 1070 */
mbed_official 87:085cde657901 1071 static HAL_StatusTypeDef IRDA_Transmit_IT(IRDA_HandleTypeDef *hirda)
mbed_official 87:085cde657901 1072 {
mbed_official 87:085cde657901 1073 uint16_t* tmp;
mbed_official 87:085cde657901 1074 uint32_t tmp1 = 0;
mbed_official 87:085cde657901 1075
mbed_official 87:085cde657901 1076 tmp1 = hirda->State;
mbed_official 87:085cde657901 1077 if((tmp1 == HAL_IRDA_STATE_BUSY_TX) || (tmp1 == HAL_IRDA_STATE_BUSY_TX_RX))
mbed_official 87:085cde657901 1078 {
mbed_official 87:085cde657901 1079 /* Process Locked */
mbed_official 87:085cde657901 1080 __HAL_LOCK(hirda);
mbed_official 87:085cde657901 1081
mbed_official 87:085cde657901 1082 if(hirda->Init.WordLength == IRDA_WORDLENGTH_9B)
mbed_official 87:085cde657901 1083 {
mbed_official 87:085cde657901 1084 tmp = (uint16_t*) hirda->pTxBuffPtr;
mbed_official 87:085cde657901 1085 hirda->Instance->DR = (uint16_t)(*tmp & (uint16_t)0x01FF);
mbed_official 87:085cde657901 1086 if(hirda->Init.Parity == IRDA_PARITY_NONE)
mbed_official 87:085cde657901 1087 {
mbed_official 87:085cde657901 1088 hirda->pTxBuffPtr += 2;
mbed_official 87:085cde657901 1089 }
mbed_official 87:085cde657901 1090 else
mbed_official 87:085cde657901 1091 {
mbed_official 87:085cde657901 1092 hirda->pTxBuffPtr += 1;
mbed_official 87:085cde657901 1093 }
mbed_official 87:085cde657901 1094 }
mbed_official 87:085cde657901 1095 else
mbed_official 87:085cde657901 1096 {
mbed_official 87:085cde657901 1097 hirda->Instance->DR = (uint8_t)(*hirda->pTxBuffPtr++ & (uint8_t)0x00FF);
mbed_official 87:085cde657901 1098 }
mbed_official 87:085cde657901 1099
mbed_official 87:085cde657901 1100 if(--hirda->TxXferCount == 0)
mbed_official 87:085cde657901 1101 {
mbed_official 87:085cde657901 1102 /* Disable the IRDA Transmit Complete Interrupt */
mbed_official 87:085cde657901 1103 __HAL_IRDA_DISABLE_IT(hirda, IRDA_IT_TC);
mbed_official 87:085cde657901 1104
mbed_official 87:085cde657901 1105 if(hirda->State == HAL_IRDA_STATE_BUSY_TX_RX)
mbed_official 87:085cde657901 1106 {
mbed_official 87:085cde657901 1107 hirda->State = HAL_IRDA_STATE_BUSY_RX;
mbed_official 87:085cde657901 1108 }
mbed_official 87:085cde657901 1109 else
mbed_official 87:085cde657901 1110 {
mbed_official 87:085cde657901 1111 /* Disable the IRDA Parity Error Interrupt */
mbed_official 87:085cde657901 1112 __HAL_IRDA_DISABLE_IT(hirda, IRDA_IT_PE);
mbed_official 87:085cde657901 1113
mbed_official 87:085cde657901 1114 /* Disable the IRDA Error Interrupt: (Frame error, noise error, overrun error) */
mbed_official 87:085cde657901 1115 __HAL_IRDA_DISABLE_IT(hirda, IRDA_IT_ERR);
mbed_official 87:085cde657901 1116
mbed_official 87:085cde657901 1117 hirda->State = HAL_IRDA_STATE_READY;
mbed_official 87:085cde657901 1118 }
mbed_official 87:085cde657901 1119 /* Call the Process Unlocked before calling the Tx call back API to give the possibiity to
mbed_official 87:085cde657901 1120 start again the Transmission under the Tx call back API */
mbed_official 87:085cde657901 1121 __HAL_UNLOCK(hirda);
mbed_official 87:085cde657901 1122
mbed_official 87:085cde657901 1123 HAL_IRDA_TxCpltCallback(hirda);
mbed_official 87:085cde657901 1124
mbed_official 87:085cde657901 1125 return HAL_OK;
mbed_official 87:085cde657901 1126 }
mbed_official 87:085cde657901 1127 /* Process Unlocked */
mbed_official 87:085cde657901 1128 __HAL_UNLOCK(hirda);
mbed_official 87:085cde657901 1129
mbed_official 87:085cde657901 1130 return HAL_OK;
mbed_official 87:085cde657901 1131 }
mbed_official 87:085cde657901 1132 else
mbed_official 87:085cde657901 1133 {
mbed_official 87:085cde657901 1134 return HAL_BUSY;
mbed_official 87:085cde657901 1135 }
mbed_official 87:085cde657901 1136 }
mbed_official 87:085cde657901 1137
mbed_official 87:085cde657901 1138 /**
mbed_official 87:085cde657901 1139 * @brief Receives an amount of data in non blocking mode.
mbed_official 87:085cde657901 1140 * @param hirda: IRDA handle
mbed_official 87:085cde657901 1141 * @retval HAL status
mbed_official 87:085cde657901 1142 */
mbed_official 87:085cde657901 1143 static HAL_StatusTypeDef IRDA_Receive_IT(IRDA_HandleTypeDef *hirda)
mbed_official 87:085cde657901 1144 {
mbed_official 87:085cde657901 1145 uint16_t* tmp;
mbed_official 87:085cde657901 1146 uint32_t tmp1 = 0;
mbed_official 87:085cde657901 1147
mbed_official 87:085cde657901 1148 tmp1 = hirda->State;
mbed_official 87:085cde657901 1149 if((tmp1 == HAL_IRDA_STATE_BUSY_RX) || (tmp1 == HAL_IRDA_STATE_BUSY_TX_RX))
mbed_official 87:085cde657901 1150 {
mbed_official 87:085cde657901 1151 /* Process Locked */
mbed_official 87:085cde657901 1152 __HAL_LOCK(hirda);
mbed_official 87:085cde657901 1153
mbed_official 87:085cde657901 1154 if(hirda->Init.WordLength == IRDA_WORDLENGTH_9B)
mbed_official 87:085cde657901 1155 {
mbed_official 87:085cde657901 1156 tmp = (uint16_t*) hirda->pRxBuffPtr;
mbed_official 87:085cde657901 1157 if(hirda->Init.Parity == IRDA_PARITY_NONE)
mbed_official 87:085cde657901 1158 {
mbed_official 87:085cde657901 1159 *tmp = (uint16_t)(hirda->Instance->DR & (uint16_t)0x01FF);
mbed_official 87:085cde657901 1160 hirda->pRxBuffPtr += 2;
mbed_official 87:085cde657901 1161 }
mbed_official 87:085cde657901 1162 else
mbed_official 87:085cde657901 1163 {
mbed_official 87:085cde657901 1164 *tmp = (uint16_t)(hirda->Instance->DR & (uint16_t)0x00FF);
mbed_official 87:085cde657901 1165 hirda->pRxBuffPtr += 1;
mbed_official 87:085cde657901 1166 }
mbed_official 87:085cde657901 1167 }
mbed_official 87:085cde657901 1168 else
mbed_official 87:085cde657901 1169 {
mbed_official 87:085cde657901 1170 if(hirda->Init.Parity == IRDA_PARITY_NONE)
mbed_official 87:085cde657901 1171 {
mbed_official 87:085cde657901 1172 *hirda->pRxBuffPtr++ = (uint8_t)(hirda->Instance->DR & (uint8_t)0x00FF);
mbed_official 87:085cde657901 1173 }
mbed_official 87:085cde657901 1174 else
mbed_official 87:085cde657901 1175 {
mbed_official 87:085cde657901 1176 *hirda->pRxBuffPtr++ = (uint8_t)(hirda->Instance->DR & (uint8_t)0x007F);
mbed_official 87:085cde657901 1177 }
mbed_official 87:085cde657901 1178 }
mbed_official 87:085cde657901 1179
mbed_official 87:085cde657901 1180 if(--hirda->RxXferCount == 0)
mbed_official 87:085cde657901 1181 {
mbed_official 87:085cde657901 1182 while(HAL_IS_BIT_SET(hirda->Instance->SR, IRDA_FLAG_RXNE))
mbed_official 87:085cde657901 1183 {
mbed_official 87:085cde657901 1184 }
mbed_official 87:085cde657901 1185 __HAL_IRDA_DISABLE_IT(hirda, IRDA_IT_RXNE);
mbed_official 87:085cde657901 1186
mbed_official 87:085cde657901 1187 if(hirda->State == HAL_IRDA_STATE_BUSY_TX_RX)
mbed_official 87:085cde657901 1188 {
mbed_official 87:085cde657901 1189 hirda->State = HAL_IRDA_STATE_BUSY_TX;
mbed_official 87:085cde657901 1190 }
mbed_official 87:085cde657901 1191 else
mbed_official 87:085cde657901 1192 {
mbed_official 87:085cde657901 1193 /* Disable the IRDA Parity Error Interrupt */
mbed_official 87:085cde657901 1194 __HAL_IRDA_DISABLE_IT(hirda, IRDA_IT_PE);
mbed_official 87:085cde657901 1195
mbed_official 87:085cde657901 1196 /* Disable the IRDA Error Interrupt: (Frame error, noise error, overrun error) */
mbed_official 87:085cde657901 1197 __HAL_IRDA_DISABLE_IT(hirda, IRDA_IT_ERR);
mbed_official 87:085cde657901 1198
mbed_official 87:085cde657901 1199 hirda->State = HAL_IRDA_STATE_READY;
mbed_official 87:085cde657901 1200 }
mbed_official 87:085cde657901 1201 /* Call the Process Unlocked before calling the Rx call back API to give the possibiity to
mbed_official 87:085cde657901 1202 start again the receiption under the Rx call back API */
mbed_official 87:085cde657901 1203 __HAL_UNLOCK(hirda);
mbed_official 87:085cde657901 1204
mbed_official 87:085cde657901 1205 HAL_IRDA_RxCpltCallback(hirda);
mbed_official 87:085cde657901 1206
mbed_official 87:085cde657901 1207 return HAL_OK;
mbed_official 87:085cde657901 1208 }
mbed_official 87:085cde657901 1209
mbed_official 87:085cde657901 1210 /* Process Unlocked */
mbed_official 87:085cde657901 1211 __HAL_UNLOCK(hirda);
mbed_official 87:085cde657901 1212
mbed_official 87:085cde657901 1213 return HAL_OK;
mbed_official 87:085cde657901 1214 }
mbed_official 87:085cde657901 1215 else
mbed_official 87:085cde657901 1216 {
mbed_official 87:085cde657901 1217 return HAL_BUSY;
mbed_official 87:085cde657901 1218 }
mbed_official 87:085cde657901 1219 }
mbed_official 87:085cde657901 1220
mbed_official 87:085cde657901 1221 /**
mbed_official 87:085cde657901 1222 * @brief Configures the IRDA peripheral.
mbed_official 87:085cde657901 1223 * @param hirda: IRDA handle
mbed_official 87:085cde657901 1224 * @retval None
mbed_official 87:085cde657901 1225 */
mbed_official 87:085cde657901 1226 static void IRDA_SetConfig(IRDA_HandleTypeDef *hirda)
mbed_official 87:085cde657901 1227 {
mbed_official 87:085cde657901 1228 uint32_t tmpreg = 0x00;
mbed_official 87:085cde657901 1229
mbed_official 87:085cde657901 1230 /* Check the parameters */
mbed_official 87:085cde657901 1231 assert_param(IS_IRDA_INSTANCE(hirda->Instance));
mbed_official 87:085cde657901 1232 assert_param(IS_IRDA_BAUDRATE(hirda->Init.BaudRate));
mbed_official 87:085cde657901 1233 assert_param(IS_IRDA_WORD_LENGTH(hirda->Init.WordLength));
mbed_official 87:085cde657901 1234 assert_param(IS_IRDA_PARITY(hirda->Init.Parity));
mbed_official 87:085cde657901 1235 assert_param(IS_IRDA_MODE(hirda->Init.Mode));
mbed_official 87:085cde657901 1236
mbed_official 87:085cde657901 1237 /*-------------------------- IRDA CR2 Configuration ------------------------*/
mbed_official 87:085cde657901 1238 /* Clear STOP[13:12] bits */
mbed_official 87:085cde657901 1239 hirda->Instance->CR2 &= (uint32_t)~((uint32_t)USART_CR2_STOP);
mbed_official 87:085cde657901 1240
mbed_official 87:085cde657901 1241 /*-------------------------- USART CR1 Configuration -----------------------*/
mbed_official 87:085cde657901 1242 tmpreg = hirda->Instance->CR1;
mbed_official 87:085cde657901 1243
mbed_official 87:085cde657901 1244 /* Clear M, PCE, PS, TE and RE bits */
mbed_official 87:085cde657901 1245 tmpreg &= (uint32_t)~((uint32_t)(USART_CR1_M | USART_CR1_PCE | USART_CR1_PS | USART_CR1_TE | \
mbed_official 87:085cde657901 1246 USART_CR1_RE));
mbed_official 87:085cde657901 1247
mbed_official 87:085cde657901 1248 /* Configure the USART Word Length, Parity and mode:
mbed_official 87:085cde657901 1249 Set the M bits according to hirda->Init.WordLength value
mbed_official 87:085cde657901 1250 Set PCE and PS bits according to hirda->Init.Parity value
mbed_official 87:085cde657901 1251 Set TE and RE bits according to hirda->Init.Mode value */
mbed_official 87:085cde657901 1252 tmpreg |= (uint32_t)hirda->Init.WordLength | hirda->Init.Parity | hirda->Init.Mode;
mbed_official 87:085cde657901 1253
mbed_official 87:085cde657901 1254 /* Write to USART CR1 */
mbed_official 87:085cde657901 1255 hirda->Instance->CR1 = (uint32_t)tmpreg;
mbed_official 87:085cde657901 1256
mbed_official 87:085cde657901 1257 /*-------------------------- USART CR3 Configuration -----------------------*/
mbed_official 87:085cde657901 1258 /* Clear CTSE and RTSE bits */
mbed_official 87:085cde657901 1259 hirda->Instance->CR3 &= (uint32_t)~((uint32_t)(USART_CR3_RTSE | USART_CR3_CTSE));
mbed_official 87:085cde657901 1260
mbed_official 87:085cde657901 1261 /*-------------------------- USART BRR Configuration -----------------------*/
mbed_official 87:085cde657901 1262 if((hirda->Instance == USART1) || (hirda->Instance == USART6))
mbed_official 87:085cde657901 1263 {
mbed_official 87:085cde657901 1264 hirda->Instance->BRR = __IRDA_BRR(HAL_RCC_GetPCLK2Freq(), hirda->Init.BaudRate);
mbed_official 87:085cde657901 1265 }
mbed_official 87:085cde657901 1266 else
mbed_official 87:085cde657901 1267 {
mbed_official 87:085cde657901 1268 hirda->Instance->BRR = __IRDA_BRR(HAL_RCC_GetPCLK1Freq(), hirda->Init.BaudRate);
mbed_official 87:085cde657901 1269 }
mbed_official 87:085cde657901 1270 }
mbed_official 87:085cde657901 1271 /**
mbed_official 87:085cde657901 1272 * @}
mbed_official 87:085cde657901 1273 */
mbed_official 87:085cde657901 1274
mbed_official 87:085cde657901 1275 /**
mbed_official 87:085cde657901 1276 * @}
mbed_official 87:085cde657901 1277 */
mbed_official 87:085cde657901 1278
mbed_official 87:085cde657901 1279 #endif /* HAL_IRDA_MODULE_ENABLED */
mbed_official 87:085cde657901 1280
mbed_official 87:085cde657901 1281 /**
mbed_official 87:085cde657901 1282 * @}
mbed_official 87:085cde657901 1283 */
mbed_official 87:085cde657901 1284
mbed_official 87:085cde657901 1285 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/