fix LPC812 PWM

Dependents:   IR_LED_Send

Fork of mbed-dev by mbed official

Committer:
mbed_official
Date:
Mon May 09 18:30:12 2016 +0100
Revision:
124:6a4a5b7d7324
Parent:
0:9b334a45a8ff
Synchronized with git revision ad75bdcde34d7da9d54b7669010c7fb968a99c7c

Full URL: https://github.com/mbedmicro/mbed/commit/ad75bdcde34d7da9d54b7669010c7fb968a99c7c/

[STMF1] Stm32f1_hal_cube update

Who changed what in which revision?

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