1 /** 2 ****************************************************************************** 3 * @file stm32u5xx_hal_irda_ex.h 4 * @author MCD Application Team 5 * @brief Header file of IRDA HAL Extended module. 6 ****************************************************************************** 7 * @attention 8 * 9 * Copyright (c) 2021 STMicroelectronics. 10 * All rights reserved. 11 * 12 * This software is licensed under terms that can be found in the LICENSE file 13 * in the root directory of this software component. 14 * If no LICENSE file comes with this software, it is provided AS-IS. 15 * 16 ****************************************************************************** 17 */ 18 19 /* Define to prevent recursive inclusion -------------------------------------*/ 20 #ifndef STM32U5xx_HAL_IRDA_EX_H 21 #define STM32U5xx_HAL_IRDA_EX_H 22 23 #ifdef __cplusplus 24 extern "C" { 25 #endif 26 27 /* Includes ------------------------------------------------------------------*/ 28 #include "stm32u5xx_hal_def.h" 29 30 /** @addtogroup STM32U5xx_HAL_Driver 31 * @{ 32 */ 33 34 /** @defgroup IRDAEx IRDAEx 35 * @brief IRDA Extended HAL module driver 36 * @{ 37 */ 38 39 /* Exported types ------------------------------------------------------------*/ 40 /* Exported constants --------------------------------------------------------*/ 41 /** @defgroup IRDAEx_Extended_Exported_Constants IRDAEx Extended Exported Constants 42 * @{ 43 */ 44 45 /** @defgroup IRDAEx_Word_Length IRDAEx Word Length 46 * @{ 47 */ 48 #define IRDA_WORDLENGTH_7B USART_CR1_M1 /*!< 7-bit long frame */ 49 #define IRDA_WORDLENGTH_8B 0x00000000U /*!< 8-bit long frame */ 50 #define IRDA_WORDLENGTH_9B USART_CR1_M0 /*!< 9-bit long frame */ 51 /** 52 * @} 53 */ 54 55 /** 56 * @} 57 */ 58 59 /* Exported macros -----------------------------------------------------------*/ 60 61 /* Private macros ------------------------------------------------------------*/ 62 63 /** @defgroup IRDAEx_Private_Macros IRDAEx Private Macros 64 * @{ 65 */ 66 67 /** @brief Report the IRDA clock source. 68 * @param __HANDLE__ specifies the IRDA Handle. 69 * @param __CLOCKSOURCE__ output variable. 70 * @retval IRDA clocking source, written in __CLOCKSOURCE__. 71 */ 72 #if defined(USART6) 73 #define IRDA_GETCLOCKSOURCE(__HANDLE__,__CLOCKSOURCE__) \ 74 do { \ 75 if((__HANDLE__)->Instance == USART1) \ 76 { \ 77 switch(__HAL_RCC_GET_USART1_SOURCE()) \ 78 { \ 79 case RCC_USART1CLKSOURCE_PCLK2: \ 80 (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_PCLK2; \ 81 break; \ 82 case RCC_USART1CLKSOURCE_HSI: \ 83 (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_HSI; \ 84 break; \ 85 case RCC_USART1CLKSOURCE_SYSCLK: \ 86 (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_SYSCLK; \ 87 break; \ 88 case RCC_USART1CLKSOURCE_LSE: \ 89 (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_LSE; \ 90 break; \ 91 default: \ 92 (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_UNDEFINED; \ 93 break; \ 94 } \ 95 } \ 96 else if((__HANDLE__)->Instance == USART2) \ 97 { \ 98 switch(__HAL_RCC_GET_USART2_SOURCE()) \ 99 { \ 100 case RCC_USART2CLKSOURCE_PCLK1: \ 101 (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_PCLK1; \ 102 break; \ 103 case RCC_USART2CLKSOURCE_HSI: \ 104 (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_HSI; \ 105 break; \ 106 case RCC_USART2CLKSOURCE_SYSCLK: \ 107 (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_SYSCLK; \ 108 break; \ 109 case RCC_USART2CLKSOURCE_LSE: \ 110 (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_LSE; \ 111 break; \ 112 default: \ 113 (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_UNDEFINED; \ 114 break; \ 115 } \ 116 } \ 117 else if((__HANDLE__)->Instance == USART3) \ 118 { \ 119 switch(__HAL_RCC_GET_USART3_SOURCE()) \ 120 { \ 121 case RCC_USART3CLKSOURCE_PCLK1: \ 122 (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_PCLK1; \ 123 break; \ 124 case RCC_USART3CLKSOURCE_HSI: \ 125 (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_HSI; \ 126 break; \ 127 case RCC_USART3CLKSOURCE_SYSCLK: \ 128 (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_SYSCLK; \ 129 break; \ 130 case RCC_USART3CLKSOURCE_LSE: \ 131 (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_LSE; \ 132 break; \ 133 default: \ 134 (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_UNDEFINED; \ 135 break; \ 136 } \ 137 } \ 138 else if((__HANDLE__)->Instance == UART4) \ 139 { \ 140 switch(__HAL_RCC_GET_UART4_SOURCE()) \ 141 { \ 142 case RCC_UART4CLKSOURCE_PCLK1: \ 143 (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_PCLK1; \ 144 break; \ 145 case RCC_UART4CLKSOURCE_HSI: \ 146 (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_HSI; \ 147 break; \ 148 case RCC_UART4CLKSOURCE_SYSCLK: \ 149 (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_SYSCLK; \ 150 break; \ 151 case RCC_UART4CLKSOURCE_LSE: \ 152 (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_LSE; \ 153 break; \ 154 default: \ 155 (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_UNDEFINED; \ 156 break; \ 157 } \ 158 } \ 159 else if((__HANDLE__)->Instance == UART5) \ 160 { \ 161 switch(__HAL_RCC_GET_UART5_SOURCE()) \ 162 { \ 163 case RCC_UART5CLKSOURCE_PCLK1: \ 164 (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_PCLK1; \ 165 break; \ 166 case RCC_UART5CLKSOURCE_HSI: \ 167 (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_HSI; \ 168 break; \ 169 case RCC_UART5CLKSOURCE_SYSCLK: \ 170 (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_SYSCLK; \ 171 break; \ 172 case RCC_UART5CLKSOURCE_LSE: \ 173 (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_LSE; \ 174 break; \ 175 default: \ 176 (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_UNDEFINED; \ 177 break; \ 178 } \ 179 } \ 180 else if((__HANDLE__)->Instance == USART6) \ 181 { \ 182 switch(__HAL_RCC_GET_USART6_SOURCE()) \ 183 { \ 184 case RCC_USART6CLKSOURCE_PCLK1: \ 185 (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_PCLK1; \ 186 break; \ 187 case RCC_USART6CLKSOURCE_SYSCLK: \ 188 (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_SYSCLK; \ 189 break; \ 190 case RCC_USART6CLKSOURCE_HSI: \ 191 (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_HSI; \ 192 break; \ 193 case RCC_USART6CLKSOURCE_LSE: \ 194 (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_LSE; \ 195 break; \ 196 default: \ 197 (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_UNDEFINED; \ 198 break; \ 199 } \ 200 } \ 201 else \ 202 { \ 203 (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_UNDEFINED; \ 204 } \ 205 } while(0U) 206 #elif defined(USART2) 207 #define IRDA_GETCLOCKSOURCE(__HANDLE__,__CLOCKSOURCE__) \ 208 do { \ 209 if((__HANDLE__)->Instance == USART1) \ 210 { \ 211 switch(__HAL_RCC_GET_USART1_SOURCE()) \ 212 { \ 213 case RCC_USART1CLKSOURCE_PCLK2: \ 214 (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_PCLK2; \ 215 break; \ 216 case RCC_USART1CLKSOURCE_HSI: \ 217 (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_HSI; \ 218 break; \ 219 case RCC_USART1CLKSOURCE_SYSCLK: \ 220 (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_SYSCLK; \ 221 break; \ 222 case RCC_USART1CLKSOURCE_LSE: \ 223 (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_LSE; \ 224 break; \ 225 default: \ 226 (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_UNDEFINED; \ 227 break; \ 228 } \ 229 } \ 230 else if((__HANDLE__)->Instance == USART2) \ 231 { \ 232 switch(__HAL_RCC_GET_USART2_SOURCE()) \ 233 { \ 234 case RCC_USART2CLKSOURCE_PCLK1: \ 235 (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_PCLK1; \ 236 break; \ 237 case RCC_USART2CLKSOURCE_HSI: \ 238 (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_HSI; \ 239 break; \ 240 case RCC_USART2CLKSOURCE_SYSCLK: \ 241 (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_SYSCLK; \ 242 break; \ 243 case RCC_USART2CLKSOURCE_LSE: \ 244 (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_LSE; \ 245 break; \ 246 default: \ 247 (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_UNDEFINED; \ 248 break; \ 249 } \ 250 } \ 251 else if((__HANDLE__)->Instance == USART3) \ 252 { \ 253 switch(__HAL_RCC_GET_USART3_SOURCE()) \ 254 { \ 255 case RCC_USART3CLKSOURCE_PCLK1: \ 256 (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_PCLK1; \ 257 break; \ 258 case RCC_USART3CLKSOURCE_HSI: \ 259 (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_HSI; \ 260 break; \ 261 case RCC_USART3CLKSOURCE_SYSCLK: \ 262 (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_SYSCLK; \ 263 break; \ 264 case RCC_USART3CLKSOURCE_LSE: \ 265 (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_LSE; \ 266 break; \ 267 default: \ 268 (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_UNDEFINED; \ 269 break; \ 270 } \ 271 } \ 272 else if((__HANDLE__)->Instance == UART4) \ 273 { \ 274 switch(__HAL_RCC_GET_UART4_SOURCE()) \ 275 { \ 276 case RCC_UART4CLKSOURCE_PCLK1: \ 277 (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_PCLK1; \ 278 break; \ 279 case RCC_UART4CLKSOURCE_HSI: \ 280 (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_HSI; \ 281 break; \ 282 case RCC_UART4CLKSOURCE_SYSCLK: \ 283 (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_SYSCLK; \ 284 break; \ 285 case RCC_UART4CLKSOURCE_LSE: \ 286 (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_LSE; \ 287 break; \ 288 default: \ 289 (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_UNDEFINED; \ 290 break; \ 291 } \ 292 } \ 293 else if((__HANDLE__)->Instance == UART5) \ 294 { \ 295 switch(__HAL_RCC_GET_UART5_SOURCE()) \ 296 { \ 297 case RCC_UART5CLKSOURCE_PCLK1: \ 298 (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_PCLK1; \ 299 break; \ 300 case RCC_UART5CLKSOURCE_HSI: \ 301 (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_HSI; \ 302 break; \ 303 case RCC_UART5CLKSOURCE_SYSCLK: \ 304 (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_SYSCLK; \ 305 break; \ 306 case RCC_UART5CLKSOURCE_LSE: \ 307 (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_LSE; \ 308 break; \ 309 default: \ 310 (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_UNDEFINED; \ 311 break; \ 312 } \ 313 } \ 314 else \ 315 { \ 316 (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_UNDEFINED; \ 317 } \ 318 } while(0U) 319 #else 320 #define IRDA_GETCLOCKSOURCE(__HANDLE__,__CLOCKSOURCE__) \ 321 do { \ 322 if((__HANDLE__)->Instance == USART1) \ 323 { \ 324 switch(__HAL_RCC_GET_USART1_SOURCE()) \ 325 { \ 326 case RCC_USART1CLKSOURCE_PCLK2: \ 327 (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_PCLK2; \ 328 break; \ 329 case RCC_USART1CLKSOURCE_HSI: \ 330 (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_HSI; \ 331 break; \ 332 case RCC_USART1CLKSOURCE_SYSCLK: \ 333 (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_SYSCLK; \ 334 break; \ 335 case RCC_USART1CLKSOURCE_LSE: \ 336 (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_LSE; \ 337 break; \ 338 default: \ 339 (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_UNDEFINED; \ 340 break; \ 341 } \ 342 } \ 343 else if((__HANDLE__)->Instance == USART3) \ 344 { \ 345 switch(__HAL_RCC_GET_USART3_SOURCE()) \ 346 { \ 347 case RCC_USART3CLKSOURCE_PCLK1: \ 348 (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_PCLK1; \ 349 break; \ 350 case RCC_USART3CLKSOURCE_HSI: \ 351 (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_HSI; \ 352 break; \ 353 case RCC_USART3CLKSOURCE_SYSCLK: \ 354 (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_SYSCLK; \ 355 break; \ 356 case RCC_USART3CLKSOURCE_LSE: \ 357 (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_LSE; \ 358 break; \ 359 default: \ 360 (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_UNDEFINED; \ 361 break; \ 362 } \ 363 } \ 364 else if((__HANDLE__)->Instance == UART4) \ 365 { \ 366 switch(__HAL_RCC_GET_UART4_SOURCE()) \ 367 { \ 368 case RCC_UART4CLKSOURCE_PCLK1: \ 369 (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_PCLK1; \ 370 break; \ 371 case RCC_UART4CLKSOURCE_HSI: \ 372 (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_HSI; \ 373 break; \ 374 case RCC_UART4CLKSOURCE_SYSCLK: \ 375 (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_SYSCLK; \ 376 break; \ 377 case RCC_UART4CLKSOURCE_LSE: \ 378 (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_LSE; \ 379 break; \ 380 default: \ 381 (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_UNDEFINED; \ 382 break; \ 383 } \ 384 } \ 385 else if((__HANDLE__)->Instance == UART5) \ 386 { \ 387 switch(__HAL_RCC_GET_UART5_SOURCE()) \ 388 { \ 389 case RCC_UART5CLKSOURCE_PCLK1: \ 390 (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_PCLK1; \ 391 break; \ 392 case RCC_UART5CLKSOURCE_HSI: \ 393 (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_HSI; \ 394 break; \ 395 case RCC_UART5CLKSOURCE_SYSCLK: \ 396 (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_SYSCLK; \ 397 break; \ 398 case RCC_UART5CLKSOURCE_LSE: \ 399 (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_LSE; \ 400 break; \ 401 default: \ 402 (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_UNDEFINED; \ 403 break; \ 404 } \ 405 } \ 406 else \ 407 { \ 408 (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_UNDEFINED; \ 409 } \ 410 } while(0U) 411 #endif /* USART6 */ 412 413 /** @brief Compute the mask to apply to retrieve the received data 414 * according to the word length and to the parity bits activation. 415 * @param __HANDLE__ specifies the IRDA Handle. 416 * @retval None, the mask to apply to the associated UART RDR register is stored in (__HANDLE__)->Mask field. 417 */ 418 #define IRDA_MASK_COMPUTATION(__HANDLE__) \ 419 do { \ 420 if ((__HANDLE__)->Init.WordLength == IRDA_WORDLENGTH_9B) \ 421 { \ 422 if ((__HANDLE__)->Init.Parity == IRDA_PARITY_NONE) \ 423 { \ 424 (__HANDLE__)->Mask = 0x01FFU ; \ 425 } \ 426 else \ 427 { \ 428 (__HANDLE__)->Mask = 0x00FFU ; \ 429 } \ 430 } \ 431 else if ((__HANDLE__)->Init.WordLength == IRDA_WORDLENGTH_8B) \ 432 { \ 433 if ((__HANDLE__)->Init.Parity == IRDA_PARITY_NONE) \ 434 { \ 435 (__HANDLE__)->Mask = 0x00FFU ; \ 436 } \ 437 else \ 438 { \ 439 (__HANDLE__)->Mask = 0x007FU ; \ 440 } \ 441 } \ 442 else if ((__HANDLE__)->Init.WordLength == IRDA_WORDLENGTH_7B) \ 443 { \ 444 if ((__HANDLE__)->Init.Parity == IRDA_PARITY_NONE) \ 445 { \ 446 (__HANDLE__)->Mask = 0x007FU ; \ 447 } \ 448 else \ 449 { \ 450 (__HANDLE__)->Mask = 0x003FU ; \ 451 } \ 452 } \ 453 else \ 454 { \ 455 (__HANDLE__)->Mask = 0x0000U; \ 456 } \ 457 } while(0U) 458 459 /** @brief Ensure that IRDA frame length is valid. 460 * @param __LENGTH__ IRDA frame length. 461 * @retval SET (__LENGTH__ is valid) or RESET (__LENGTH__ is invalid) 462 */ 463 #define IS_IRDA_WORD_LENGTH(__LENGTH__) (((__LENGTH__) == IRDA_WORDLENGTH_7B) || \ 464 ((__LENGTH__) == IRDA_WORDLENGTH_8B) || \ 465 ((__LENGTH__) == IRDA_WORDLENGTH_9B)) 466 /** 467 * @} 468 */ 469 470 /* Exported functions --------------------------------------------------------*/ 471 472 /** 473 * @} 474 */ 475 476 /** 477 * @} 478 */ 479 480 #ifdef __cplusplus 481 } 482 #endif 483 484 #endif /* STM32U5xx_HAL_IRDA_EX_H */ 485