1 /**
2   ******************************************************************************
3   * @file    stm32f3xx_hal_usart_ex.h
4   * @author  MCD Application Team
5   * @brief   Header file of USART HAL Extended module.
6   ******************************************************************************
7   * @attention
8   *
9   * Copyright (c) 2016 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 STM32F3xx_HAL_USART_EX_H
21 #define STM32F3xx_HAL_USART_EX_H
22 
23 #ifdef __cplusplus
24 extern "C" {
25 #endif
26 
27 /* Includes ------------------------------------------------------------------*/
28 #include "stm32f3xx_hal_def.h"
29 
30 /** @addtogroup STM32F3xx_HAL_Driver
31   * @{
32   */
33 
34 /** @addtogroup USARTEx
35   * @{
36   */
37 
38 /* Exported types ------------------------------------------------------------*/
39 /* Exported constants --------------------------------------------------------*/
40 /** @defgroup USARTEx_Exported_Constants USARTEx Exported Constants
41   * @{
42   */
43 
44 /** @defgroup USARTEx_Word_Length USARTEx Word Length
45   * @{
46   */
47 #if  defined(USART_CR1_M0)&& defined(USART_CR1_M1)
48 #define USART_WORDLENGTH_7B                  (USART_CR1_M1)   /*!< 7-bit long USART frame */
49 #define USART_WORDLENGTH_8B                  (0x00000000U)    /*!< 8-bit long USART frame */
50 #define USART_WORDLENGTH_9B                  (USART_CR1_M0)   /*!< 9-bit long USART frame */
51 #elif  defined(USART_CR1_M)
52 #define USART_WORDLENGTH_8B                  (0x00000000U)    /*!< 8-bit long USART frame */
53 #define USART_WORDLENGTH_9B                  (USART_CR1_M)    /*!< 9-bit long USART frame */
54 #endif /* USART_CR1_M0 && USART_CR1_M */
55 /**
56   * @}
57   */
58 
59 
60 /**
61   * @}
62   */
63 
64 /* Private macros ------------------------------------------------------------*/
65 /** @defgroup USARTEx_Private_Macros USARTEx Private Macros
66   * @{
67   */
68 
69 /** @brief  Report the USART clock source.
70   * @param  __HANDLE__ specifies the USART Handle.
71   * @param  __CLOCKSOURCE__ output variable.
72   * @retval the USART clocking source, written in __CLOCKSOURCE__.
73   */
74 /** @brief  Report the USART clock source.
75   * @param  __HANDLE__ specifies the USART Handle.
76   * @param  __CLOCKSOURCE__ output variable.
77   * @retval USART clocking source, written in __CLOCKSOURCE__.
78   */
79 #if defined(STM32F302xE) || defined(STM32F303xE) || defined(STM32F398xx) || defined(STM32F302xC) \
80  || defined(STM32F303xC) || defined(STM32F358xx)
81 #define USART_GETCLOCKSOURCE(__HANDLE__,__CLOCKSOURCE__)      \
82   do {                                                        \
83     if((__HANDLE__)->Instance == USART1)                      \
84     {                                                         \
85       switch(__HAL_RCC_GET_USART1_SOURCE())                   \
86       {                                                       \
87         case RCC_USART1CLKSOURCE_PCLK2:                       \
88           (__CLOCKSOURCE__) = USART_CLOCKSOURCE_PCLK2;        \
89           break;                                              \
90         case RCC_USART1CLKSOURCE_HSI:                         \
91           (__CLOCKSOURCE__) = USART_CLOCKSOURCE_HSI;          \
92           break;                                              \
93         case RCC_USART1CLKSOURCE_SYSCLK:                      \
94           (__CLOCKSOURCE__) = USART_CLOCKSOURCE_SYSCLK;       \
95           break;                                              \
96         case RCC_USART1CLKSOURCE_LSE:                         \
97           (__CLOCKSOURCE__) = USART_CLOCKSOURCE_LSE;          \
98           break;                                              \
99         default:                                              \
100           (__CLOCKSOURCE__) = USART_CLOCKSOURCE_UNDEFINED;    \
101           break;                                              \
102       }                                                       \
103     }                                                         \
104     else if((__HANDLE__)->Instance == USART2)                 \
105     {                                                         \
106       switch(__HAL_RCC_GET_USART2_SOURCE())                   \
107       {                                                       \
108         case RCC_USART2CLKSOURCE_PCLK1:                       \
109           (__CLOCKSOURCE__) = USART_CLOCKSOURCE_PCLK1;        \
110           break;                                              \
111         case RCC_USART2CLKSOURCE_HSI:                         \
112           (__CLOCKSOURCE__) = USART_CLOCKSOURCE_HSI;          \
113           break;                                              \
114         case RCC_USART2CLKSOURCE_SYSCLK:                      \
115           (__CLOCKSOURCE__) = USART_CLOCKSOURCE_SYSCLK;       \
116           break;                                              \
117         case RCC_USART2CLKSOURCE_LSE:                         \
118           (__CLOCKSOURCE__) = USART_CLOCKSOURCE_LSE;          \
119           break;                                              \
120         default:                                              \
121           (__CLOCKSOURCE__) = USART_CLOCKSOURCE_UNDEFINED;    \
122           break;                                              \
123       }                                                       \
124     }                                                         \
125     else if((__HANDLE__)->Instance == USART3)                 \
126     {                                                         \
127       switch(__HAL_RCC_GET_USART3_SOURCE())                   \
128       {                                                       \
129         case RCC_USART3CLKSOURCE_PCLK1:                       \
130           (__CLOCKSOURCE__) = USART_CLOCKSOURCE_PCLK1;        \
131           break;                                              \
132         case RCC_USART3CLKSOURCE_HSI:                         \
133           (__CLOCKSOURCE__) = USART_CLOCKSOURCE_HSI;          \
134           break;                                              \
135         case RCC_USART3CLKSOURCE_SYSCLK:                      \
136           (__CLOCKSOURCE__) = USART_CLOCKSOURCE_SYSCLK;       \
137           break;                                              \
138         case RCC_USART3CLKSOURCE_LSE:                         \
139           (__CLOCKSOURCE__) = USART_CLOCKSOURCE_LSE;          \
140           break;                                              \
141         default:                                              \
142           (__CLOCKSOURCE__) = USART_CLOCKSOURCE_UNDEFINED;    \
143           break;                                              \
144       }                                                       \
145     }                                                         \
146     else                                                      \
147     {                                                         \
148       (__CLOCKSOURCE__) = USART_CLOCKSOURCE_UNDEFINED;        \
149     }                                                         \
150   } while(0U)
151 #elif defined(STM32F303x8) || defined(STM32F334x8) || defined(STM32F328xx) || defined(STM32F301x8) \
152    || defined(STM32F302x8) || defined(STM32F318xx)
153 #define USART_GETCLOCKSOURCE(__HANDLE__,__CLOCKSOURCE__)      \
154   do {                                                        \
155     if((__HANDLE__)->Instance == USART1)                      \
156     {                                                         \
157       switch(__HAL_RCC_GET_USART1_SOURCE())                   \
158       {                                                       \
159         case RCC_USART1CLKSOURCE_PCLK1:                       \
160           (__CLOCKSOURCE__) = USART_CLOCKSOURCE_PCLK1;        \
161           break;                                              \
162         case RCC_USART1CLKSOURCE_HSI:                         \
163           (__CLOCKSOURCE__) = USART_CLOCKSOURCE_HSI;          \
164           break;                                              \
165         case RCC_USART1CLKSOURCE_SYSCLK:                      \
166           (__CLOCKSOURCE__) = USART_CLOCKSOURCE_SYSCLK;       \
167           break;                                              \
168         case RCC_USART1CLKSOURCE_LSE:                         \
169           (__CLOCKSOURCE__) = USART_CLOCKSOURCE_LSE;          \
170           break;                                              \
171         default:                                              \
172           (__CLOCKSOURCE__) = USART_CLOCKSOURCE_UNDEFINED;    \
173           break;                                              \
174       }                                                       \
175     }                                                         \
176     else if((__HANDLE__)->Instance == USART2)                 \
177     {                                                         \
178       (__CLOCKSOURCE__) = USART_CLOCKSOURCE_PCLK1;            \
179     }                                                         \
180     else if((__HANDLE__)->Instance == USART3)                 \
181     {                                                         \
182       (__CLOCKSOURCE__) = USART_CLOCKSOURCE_PCLK1;            \
183     }                                                         \
184     else                                                      \
185     {                                                         \
186       (__CLOCKSOURCE__) = USART_CLOCKSOURCE_UNDEFINED;        \
187     }                                                         \
188   } while(0U)
189 #else
190 #define USART_GETCLOCKSOURCE(__HANDLE__,__CLOCKSOURCE__)      \
191   do {                                                        \
192     if((__HANDLE__)->Instance == USART1)                      \
193     {                                                         \
194       switch(__HAL_RCC_GET_USART1_SOURCE())                   \
195       {                                                       \
196         case RCC_USART1CLKSOURCE_PCLK2:                       \
197           (__CLOCKSOURCE__) = USART_CLOCKSOURCE_PCLK2;        \
198           break;                                              \
199         case RCC_USART1CLKSOURCE_HSI:                         \
200           (__CLOCKSOURCE__) = USART_CLOCKSOURCE_HSI;          \
201           break;                                              \
202         case RCC_USART1CLKSOURCE_SYSCLK:                      \
203           (__CLOCKSOURCE__) = USART_CLOCKSOURCE_SYSCLK;       \
204           break;                                              \
205         case RCC_USART1CLKSOURCE_LSE:                         \
206           (__CLOCKSOURCE__) = USART_CLOCKSOURCE_LSE;          \
207           break;                                              \
208         default:                                              \
209           (__CLOCKSOURCE__) = USART_CLOCKSOURCE_UNDEFINED;    \
210           break;                                              \
211       }                                                       \
212     }                                                         \
213     else if((__HANDLE__)->Instance == USART2)                 \
214     {                                                         \
215       switch(__HAL_RCC_GET_USART2_SOURCE())                   \
216       {                                                       \
217         case RCC_USART2CLKSOURCE_PCLK1:                       \
218           (__CLOCKSOURCE__) = USART_CLOCKSOURCE_PCLK1;        \
219           break;                                              \
220         case RCC_USART2CLKSOURCE_HSI:                         \
221           (__CLOCKSOURCE__) = USART_CLOCKSOURCE_HSI;          \
222           break;                                              \
223         case RCC_USART2CLKSOURCE_SYSCLK:                      \
224           (__CLOCKSOURCE__) = USART_CLOCKSOURCE_SYSCLK;       \
225           break;                                              \
226         case RCC_USART2CLKSOURCE_LSE:                         \
227           (__CLOCKSOURCE__) = USART_CLOCKSOURCE_LSE;          \
228           break;                                              \
229         default:                                              \
230           (__CLOCKSOURCE__) = USART_CLOCKSOURCE_UNDEFINED;    \
231           break;                                              \
232       }                                                       \
233     }                                                         \
234     else if((__HANDLE__)->Instance == USART3)                 \
235     {                                                         \
236       switch(__HAL_RCC_GET_USART3_SOURCE())                   \
237       {                                                       \
238         case RCC_USART3CLKSOURCE_PCLK1:                       \
239           (__CLOCKSOURCE__) = USART_CLOCKSOURCE_PCLK1;        \
240           break;                                              \
241         case RCC_USART3CLKSOURCE_HSI:                         \
242           (__CLOCKSOURCE__) = USART_CLOCKSOURCE_HSI;          \
243           break;                                              \
244         case RCC_USART3CLKSOURCE_SYSCLK:                      \
245           (__CLOCKSOURCE__) = USART_CLOCKSOURCE_SYSCLK;       \
246           break;                                              \
247         case RCC_USART3CLKSOURCE_LSE:                         \
248           (__CLOCKSOURCE__) = USART_CLOCKSOURCE_LSE;          \
249           break;                                              \
250         default:                                              \
251           (__CLOCKSOURCE__) = USART_CLOCKSOURCE_UNDEFINED;    \
252           break;                                              \
253       }                                                       \
254     }                                                         \
255     else                                                      \
256     {                                                         \
257       (__CLOCKSOURCE__) = USART_CLOCKSOURCE_UNDEFINED;        \
258     }                                                         \
259   } while(0U)
260 #endif /* STM32F302xE || STM32F303xE || STM32F398xx || STM32F302xC || STM32F303xC || STM32F358xx  */
261 /** @brief  Compute the USART mask to apply to retrieve the received data
262   *         according to the word length and to the parity bits activation.
263   * @note   If PCE = 1, the parity bit is not included in the data extracted
264   *         by the reception API().
265   *         This masking operation is not carried out in the case of
266   *         DMA transfers.
267   * @param  __HANDLE__ specifies the USART Handle.
268   * @retval None, the mask to apply to USART RDR register is stored in (__HANDLE__)->Mask field.
269   */
270 #if  defined(USART_CR1_M0)&& defined(USART_CR1_M1)
271 #define USART_MASK_COMPUTATION(__HANDLE__)                            \
272   do {                                                                \
273     if ((__HANDLE__)->Init.WordLength == USART_WORDLENGTH_9B)         \
274     {                                                                 \
275       if ((__HANDLE__)->Init.Parity == USART_PARITY_NONE)             \
276       {                                                               \
277         (__HANDLE__)->Mask = 0x01FFU;                                 \
278       }                                                               \
279       else                                                            \
280       {                                                               \
281         (__HANDLE__)->Mask = 0x00FFU;                                 \
282       }                                                               \
283     }                                                                 \
284     else if ((__HANDLE__)->Init.WordLength == USART_WORDLENGTH_8B)    \
285     {                                                                 \
286       if ((__HANDLE__)->Init.Parity == USART_PARITY_NONE)             \
287       {                                                               \
288         (__HANDLE__)->Mask = 0x00FFU;                                 \
289       }                                                               \
290       else                                                            \
291       {                                                               \
292         (__HANDLE__)->Mask = 0x007FU;                                 \
293       }                                                               \
294     }                                                                 \
295     else if ((__HANDLE__)->Init.WordLength == USART_WORDLENGTH_7B)    \
296     {                                                                 \
297       if ((__HANDLE__)->Init.Parity == USART_PARITY_NONE)             \
298       {                                                               \
299         (__HANDLE__)->Mask = 0x007FU;                                 \
300       }                                                               \
301       else                                                            \
302       {                                                               \
303         (__HANDLE__)->Mask = 0x003FU;                                 \
304       }                                                               \
305     }                                                                 \
306     else                                                              \
307     {                                                                 \
308       (__HANDLE__)->Mask = 0x0000U;                                   \
309     }                                                                 \
310   } while(0U)
311 #elif  defined(USART_CR1_M)
312 #define USART_MASK_COMPUTATION(__HANDLE__)                            \
313   do {                                                                \
314     if ((__HANDLE__)->Init.WordLength == USART_WORDLENGTH_9B)         \
315     {                                                                 \
316       if ((__HANDLE__)->Init.Parity == USART_PARITY_NONE)             \
317       {                                                               \
318         (__HANDLE__)->Mask = 0x01FFU;                                 \
319       }                                                               \
320       else                                                            \
321       {                                                               \
322         (__HANDLE__)->Mask = 0x00FFU;                                 \
323       }                                                               \
324     }                                                                 \
325     else if ((__HANDLE__)->Init.WordLength == USART_WORDLENGTH_8B)    \
326     {                                                                 \
327       if ((__HANDLE__)->Init.Parity == USART_PARITY_NONE)             \
328       {                                                               \
329         (__HANDLE__)->Mask = 0x00FFU;                                 \
330       }                                                               \
331       else                                                            \
332       {                                                               \
333         (__HANDLE__)->Mask = 0x007FU;                                 \
334       }                                                               \
335     }                                                                 \
336     else                                                              \
337     {                                                                 \
338       (__HANDLE__)->Mask = 0x0000U;                                   \
339     }                                                                 \
340   } while(0U)
341 #endif  /* USART_CR1_M0 && USART_CR1_M */
342 
343 /**
344   * @brief Ensure that USART frame length is valid.
345   * @param __LENGTH__ USART frame length.
346   * @retval SET (__LENGTH__ is valid) or RESET (__LENGTH__ is invalid)
347   */
348 #if  defined(USART_CR1_M0)&& defined(USART_CR1_M1)
349 #define IS_USART_WORD_LENGTH(__LENGTH__) (((__LENGTH__) == USART_WORDLENGTH_7B) || \
350                                           ((__LENGTH__) == USART_WORDLENGTH_8B) || \
351                                           ((__LENGTH__) == USART_WORDLENGTH_9B))
352 #elif  defined(USART_CR1_M)
353 #define IS_USART_WORD_LENGTH(__LENGTH__) (((__LENGTH__) == USART_WORDLENGTH_8B) || \
354                                           ((__LENGTH__) == USART_WORDLENGTH_9B))
355 #endif /* USART_CR1_M0 && USART_CR1_M */
356 
357 
358 /**
359   * @}
360   */
361 
362 /* Exported functions --------------------------------------------------------*/
363 /** @addtogroup USARTEx_Exported_Functions
364   * @{
365   */
366 
367 /** @addtogroup USARTEx_Exported_Functions_Group1
368   * @{
369   */
370 
371 /* IO operation functions *****************************************************/
372 
373 /**
374   * @}
375   */
376 
377 /** @addtogroup USARTEx_Exported_Functions_Group2
378   * @{
379   */
380 
381 /* Peripheral Control functions ***********************************************/
382 
383 /**
384   * @}
385   */
386 
387 /**
388   * @}
389   */
390 
391 /**
392   * @}
393   */
394 
395 /**
396   * @}
397   */
398 
399 #ifdef __cplusplus
400 }
401 #endif
402 
403 #endif /* STM32F3xx_HAL_USART_EX_H */
404 
405