1 /**
2   ******************************************************************************
3   * @file    stm32l4xx_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) 2017 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 STM32L4xx_HAL_IRDA_EX_H
21 #define STM32L4xx_HAL_IRDA_EX_H
22 
23 #ifdef __cplusplus
24 extern "C" {
25 #endif
26 
27 /* Includes ------------------------------------------------------------------*/
28 #include "stm32l4xx_hal_def.h"
29 
30 /** @addtogroup STM32L4xx_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 (STM32L471xx) || defined (STM32L475xx) || defined (STM32L476xx) \
73  || defined (STM32L485xx) || defined (STM32L486xx) \
74  || defined (STM32L496xx) || defined (STM32L4A6xx) \
75  || defined (STM32L4P5xx) || defined (STM32L4Q5xx) \
76  || defined (STM32L4R5xx) || defined (STM32L4R7xx) \
77  || defined (STM32L4R9xx) || defined (STM32L4S5xx) || defined (STM32L4S7xx) || defined (STM32L4S9xx)
78 #define IRDA_GETCLOCKSOURCE(__HANDLE__,__CLOCKSOURCE__)       \
79   do {                                                        \
80     if((__HANDLE__)->Instance == USART1)                      \
81     {                                                         \
82       switch(__HAL_RCC_GET_USART1_SOURCE())                   \
83       {                                                       \
84         case RCC_USART1CLKSOURCE_PCLK2:                       \
85           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_PCLK2;         \
86           break;                                              \
87         case RCC_USART1CLKSOURCE_HSI:                         \
88           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_HSI;           \
89           break;                                              \
90         case RCC_USART1CLKSOURCE_SYSCLK:                      \
91           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_SYSCLK;        \
92           break;                                              \
93         case RCC_USART1CLKSOURCE_LSE:                         \
94           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_LSE;           \
95           break;                                              \
96         default:                                              \
97           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_UNDEFINED;     \
98           break;                                              \
99       }                                                       \
100     }                                                         \
101     else if((__HANDLE__)->Instance == USART2)                 \
102     {                                                         \
103       switch(__HAL_RCC_GET_USART2_SOURCE())                   \
104       {                                                       \
105         case RCC_USART2CLKSOURCE_PCLK1:                       \
106           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_PCLK1;         \
107           break;                                              \
108         case RCC_USART2CLKSOURCE_HSI:                         \
109           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_HSI;           \
110           break;                                              \
111         case RCC_USART2CLKSOURCE_SYSCLK:                      \
112           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_SYSCLK;        \
113           break;                                              \
114         case RCC_USART2CLKSOURCE_LSE:                         \
115           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_LSE;           \
116           break;                                              \
117         default:                                              \
118           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_UNDEFINED;     \
119           break;                                              \
120       }                                                       \
121     }                                                         \
122     else if((__HANDLE__)->Instance == USART3)                 \
123     {                                                         \
124       switch(__HAL_RCC_GET_USART3_SOURCE())                   \
125       {                                                       \
126         case RCC_USART3CLKSOURCE_PCLK1:                       \
127           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_PCLK1;         \
128           break;                                              \
129         case RCC_USART3CLKSOURCE_HSI:                         \
130           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_HSI;           \
131           break;                                              \
132         case RCC_USART3CLKSOURCE_SYSCLK:                      \
133           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_SYSCLK;        \
134           break;                                              \
135         case RCC_USART3CLKSOURCE_LSE:                         \
136           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_LSE;           \
137           break;                                              \
138         default:                                              \
139           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_UNDEFINED;     \
140           break;                                              \
141       }                                                       \
142     }                                                         \
143     else if((__HANDLE__)->Instance == UART4)                  \
144     {                                                         \
145       switch(__HAL_RCC_GET_UART4_SOURCE())                    \
146       {                                                       \
147         case RCC_UART4CLKSOURCE_PCLK1:                        \
148           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_PCLK1;         \
149           break;                                              \
150         case RCC_UART4CLKSOURCE_HSI:                          \
151           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_HSI;           \
152           break;                                              \
153         case RCC_UART4CLKSOURCE_SYSCLK:                       \
154           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_SYSCLK;        \
155           break;                                              \
156         case RCC_UART4CLKSOURCE_LSE:                          \
157           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_LSE;           \
158           break;                                              \
159         default:                                              \
160           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_UNDEFINED;     \
161           break;                                              \
162       }                                                       \
163     }                                                         \
164     else if ((__HANDLE__)->Instance == UART5)                 \
165     {                                                         \
166       switch(__HAL_RCC_GET_UART5_SOURCE())                    \
167       {                                                       \
168         case RCC_UART5CLKSOURCE_PCLK1:                        \
169           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_PCLK1;         \
170           break;                                              \
171         case RCC_UART5CLKSOURCE_HSI:                          \
172           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_HSI;           \
173           break;                                              \
174         case RCC_UART5CLKSOURCE_SYSCLK:                       \
175           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_SYSCLK;        \
176           break;                                              \
177         case RCC_UART5CLKSOURCE_LSE:                          \
178           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_LSE;           \
179           break;                                              \
180         default:                                              \
181           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_UNDEFINED;     \
182           break;                                              \
183       }                                                       \
184     }                                                         \
185     else                                                      \
186     {                                                         \
187       (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_UNDEFINED;         \
188     }                                                         \
189   } while(0)
190 #elif defined(STM32L412xx) || defined(STM32L422xx) \
191    || defined(STM32L431xx) || defined(STM32L433xx) || defined(STM32L443xx)
192 #define IRDA_GETCLOCKSOURCE(__HANDLE__,__CLOCKSOURCE__)       \
193   do {                                                        \
194     if((__HANDLE__)->Instance == USART1)                      \
195     {                                                         \
196       switch(__HAL_RCC_GET_USART1_SOURCE())                   \
197       {                                                       \
198         case RCC_USART1CLKSOURCE_PCLK2:                       \
199           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_PCLK2;         \
200           break;                                              \
201         case RCC_USART1CLKSOURCE_HSI:                         \
202           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_HSI;           \
203           break;                                              \
204         case RCC_USART1CLKSOURCE_SYSCLK:                      \
205           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_SYSCLK;        \
206           break;                                              \
207         case RCC_USART1CLKSOURCE_LSE:                         \
208           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_LSE;           \
209           break;                                              \
210         default:                                              \
211           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_UNDEFINED;     \
212           break;                                              \
213       }                                                       \
214     }                                                         \
215     else if((__HANDLE__)->Instance == USART2)                 \
216     {                                                         \
217       switch(__HAL_RCC_GET_USART2_SOURCE())                   \
218       {                                                       \
219         case RCC_USART2CLKSOURCE_PCLK1:                       \
220           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_PCLK1;         \
221           break;                                              \
222         case RCC_USART2CLKSOURCE_HSI:                         \
223           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_HSI;           \
224           break;                                              \
225         case RCC_USART2CLKSOURCE_SYSCLK:                      \
226           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_SYSCLK;        \
227           break;                                              \
228         case RCC_USART2CLKSOURCE_LSE:                         \
229           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_LSE;           \
230           break;                                              \
231         default:                                              \
232           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_UNDEFINED;     \
233           break;                                              \
234       }                                                       \
235     }                                                         \
236     else if((__HANDLE__)->Instance == USART3)                 \
237     {                                                         \
238       switch(__HAL_RCC_GET_USART3_SOURCE())                   \
239       {                                                       \
240         case RCC_USART3CLKSOURCE_PCLK1:                       \
241           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_PCLK1;         \
242           break;                                              \
243         case RCC_USART3CLKSOURCE_HSI:                         \
244           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_HSI;           \
245           break;                                              \
246         case RCC_USART3CLKSOURCE_SYSCLK:                      \
247           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_SYSCLK;        \
248           break;                                              \
249         case RCC_USART3CLKSOURCE_LSE:                         \
250           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_LSE;           \
251           break;                                              \
252         default:                                              \
253           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_UNDEFINED;     \
254           break;                                              \
255       }                                                       \
256     }                                                         \
257     else                                                      \
258     {                                                         \
259       (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_UNDEFINED;         \
260     }                                                         \
261   } while(0)
262 #elif defined (STM32L432xx) || defined (STM32L442xx)
263 #define IRDA_GETCLOCKSOURCE(__HANDLE__,__CLOCKSOURCE__)       \
264   do {                                                        \
265     if((__HANDLE__)->Instance == USART1)                      \
266     {                                                         \
267       switch(__HAL_RCC_GET_USART1_SOURCE())                   \
268       {                                                       \
269         case RCC_USART1CLKSOURCE_PCLK2:                       \
270           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_PCLK2;         \
271           break;                                              \
272         case RCC_USART1CLKSOURCE_HSI:                         \
273           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_HSI;           \
274           break;                                              \
275         case RCC_USART1CLKSOURCE_SYSCLK:                      \
276           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_SYSCLK;        \
277           break;                                              \
278         case RCC_USART1CLKSOURCE_LSE:                         \
279           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_LSE;           \
280           break;                                              \
281         default:                                              \
282           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_UNDEFINED;     \
283           break;                                              \
284       }                                                       \
285     }                                                         \
286     else if((__HANDLE__)->Instance == USART2)                 \
287     {                                                         \
288       switch(__HAL_RCC_GET_USART2_SOURCE())                   \
289       {                                                       \
290         case RCC_USART2CLKSOURCE_PCLK1:                       \
291           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_PCLK1;         \
292           break;                                              \
293         case RCC_USART2CLKSOURCE_HSI:                         \
294           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_HSI;           \
295           break;                                              \
296         case RCC_USART2CLKSOURCE_SYSCLK:                      \
297           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_SYSCLK;        \
298           break;                                              \
299         case RCC_USART2CLKSOURCE_LSE:                         \
300           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_LSE;           \
301           break;                                              \
302         default:                                              \
303           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_UNDEFINED;     \
304           break;                                              \
305       }                                                       \
306     }                                                         \
307     else                                                      \
308     {                                                         \
309       (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_UNDEFINED;         \
310     }                                                         \
311   } while(0)
312 #elif defined (STM32L451xx) || defined (STM32L452xx) || defined (STM32L462xx)
313 #define IRDA_GETCLOCKSOURCE(__HANDLE__,__CLOCKSOURCE__)       \
314   do {                                                        \
315     if((__HANDLE__)->Instance == USART1)                      \
316     {                                                         \
317       switch(__HAL_RCC_GET_USART1_SOURCE())                   \
318       {                                                       \
319         case RCC_USART1CLKSOURCE_PCLK2:                       \
320           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_PCLK2;         \
321           break;                                              \
322         case RCC_USART1CLKSOURCE_HSI:                         \
323           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_HSI;           \
324           break;                                              \
325         case RCC_USART1CLKSOURCE_SYSCLK:                      \
326           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_SYSCLK;        \
327           break;                                              \
328         case RCC_USART1CLKSOURCE_LSE:                         \
329           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_LSE;           \
330           break;                                              \
331         default:                                              \
332           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_UNDEFINED;     \
333           break;                                              \
334       }                                                       \
335     }                                                         \
336     else if((__HANDLE__)->Instance == USART2)                 \
337     {                                                         \
338       switch(__HAL_RCC_GET_USART2_SOURCE())                   \
339       {                                                       \
340         case RCC_USART2CLKSOURCE_PCLK1:                       \
341           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_PCLK1;         \
342           break;                                              \
343         case RCC_USART2CLKSOURCE_HSI:                         \
344           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_HSI;           \
345           break;                                              \
346         case RCC_USART2CLKSOURCE_SYSCLK:                      \
347           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_SYSCLK;        \
348           break;                                              \
349         case RCC_USART2CLKSOURCE_LSE:                         \
350           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_LSE;           \
351           break;                                              \
352         default:                                              \
353           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_UNDEFINED;     \
354           break;                                              \
355       }                                                       \
356     }                                                         \
357     else if((__HANDLE__)->Instance == USART3)                 \
358     {                                                         \
359       switch(__HAL_RCC_GET_USART3_SOURCE())                   \
360       {                                                       \
361         case RCC_USART3CLKSOURCE_PCLK1:                       \
362           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_PCLK1;         \
363           break;                                              \
364         case RCC_USART3CLKSOURCE_HSI:                         \
365           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_HSI;           \
366           break;                                              \
367         case RCC_USART3CLKSOURCE_SYSCLK:                      \
368           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_SYSCLK;        \
369           break;                                              \
370         case RCC_USART3CLKSOURCE_LSE:                         \
371           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_LSE;           \
372           break;                                              \
373         default:                                              \
374           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_UNDEFINED;     \
375           break;                                              \
376       }                                                       \
377     }                                                         \
378     else if((__HANDLE__)->Instance == UART4)                  \
379     {                                                         \
380       switch(__HAL_RCC_GET_UART4_SOURCE())                    \
381       {                                                       \
382         case RCC_UART4CLKSOURCE_PCLK1:                        \
383           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_PCLK1;         \
384           break;                                              \
385         case RCC_UART4CLKSOURCE_HSI:                          \
386           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_HSI;           \
387           break;                                              \
388         case RCC_UART4CLKSOURCE_SYSCLK:                       \
389           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_SYSCLK;        \
390           break;                                              \
391         case RCC_UART4CLKSOURCE_LSE:                          \
392           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_LSE;           \
393           break;                                              \
394         default:                                              \
395           (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_UNDEFINED;     \
396           break;                                              \
397       }                                                       \
398     }                                                         \
399     else                                                      \
400     {                                                         \
401       (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_UNDEFINED;         \
402     }                                                         \
403   } while(0)
404 #endif /* STM32L471xx  ||  STM32L475xx  ||  STM32L476xx  ||  STM32L485xx  ||  STM32L486xx  ||
405         * STM32L496xx  ||  STM32L4A6xx  ||
406         * STM32L4P5xx  ||  STM32L4Q5xx  ||
407         * STM32L4R5xx  ||  STM32L4R7xx  ||  STM32L4R9xx  ||  STM32L4S5xx  ||  STM32L4S7xx  ||  STM32L4S9xx
408         */
409 
410 /** @brief  Compute the mask to apply to retrieve the received data
411   *         according to the word length and to the parity bits activation.
412   * @param  __HANDLE__ specifies the IRDA Handle.
413   * @retval None, the mask to apply to the associated UART RDR register is stored in (__HANDLE__)->Mask field.
414   */
415 #define IRDA_MASK_COMPUTATION(__HANDLE__)                             \
416   do {                                                                \
417     if ((__HANDLE__)->Init.WordLength == IRDA_WORDLENGTH_9B)          \
418     {                                                                 \
419       if ((__HANDLE__)->Init.Parity == IRDA_PARITY_NONE)              \
420       {                                                               \
421         (__HANDLE__)->Mask = 0x01FFU ;                                \
422       }                                                               \
423       else                                                            \
424       {                                                               \
425         (__HANDLE__)->Mask = 0x00FFU ;                                \
426       }                                                               \
427     }                                                                 \
428     else if ((__HANDLE__)->Init.WordLength == IRDA_WORDLENGTH_8B)     \
429     {                                                                 \
430       if ((__HANDLE__)->Init.Parity == IRDA_PARITY_NONE)              \
431       {                                                               \
432         (__HANDLE__)->Mask = 0x00FFU ;                                \
433       }                                                               \
434       else                                                            \
435       {                                                               \
436         (__HANDLE__)->Mask = 0x007FU ;                                \
437       }                                                               \
438     }                                                                 \
439     else if ((__HANDLE__)->Init.WordLength == IRDA_WORDLENGTH_7B)     \
440     {                                                                 \
441       if ((__HANDLE__)->Init.Parity == IRDA_PARITY_NONE)              \
442       {                                                               \
443         (__HANDLE__)->Mask = 0x007FU ;                                \
444       }                                                               \
445       else                                                            \
446       {                                                               \
447         (__HANDLE__)->Mask = 0x003FU ;                                \
448       }                                                               \
449     }                                                                 \
450     else                                                              \
451     {                                                                 \
452       (__HANDLE__)->Mask = 0x0000U;                                   \
453     }                                                                 \
454   } while(0U)
455 
456 /** @brief Ensure that IRDA frame length is valid.
457   * @param __LENGTH__ IRDA frame length.
458   * @retval SET (__LENGTH__ is valid) or RESET (__LENGTH__ is invalid)
459   */
460 #define IS_IRDA_WORD_LENGTH(__LENGTH__) (((__LENGTH__) == IRDA_WORDLENGTH_7B) || \
461                                          ((__LENGTH__) == IRDA_WORDLENGTH_8B) || \
462                                          ((__LENGTH__) == IRDA_WORDLENGTH_9B))
463 /**
464   * @}
465   */
466 
467 /* Exported functions --------------------------------------------------------*/
468 
469 /**
470   * @}
471   */
472 
473 /**
474   * @}
475   */
476 
477 #ifdef __cplusplus
478 }
479 #endif
480 
481 #endif /* STM32L4xx_HAL_IRDA_EX_H */
482 
483