1 /**
2   ******************************************************************************
3   * @file    stm32wbxx_hal_uart_ex.h
4   * @author  MCD Application Team
5   * @brief   Header file of UART HAL Extended module.
6   ******************************************************************************
7   * @attention
8   *
9   * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
10   * All rights reserved.</center></h2>
11   *
12   * This software component is licensed by ST under BSD 3-Clause license,
13   * the "License"; You may not use this file except in compliance with the
14   * License. You may obtain a copy of the License at:
15   *                        opensource.org/licenses/BSD-3-Clause
16   *
17   ******************************************************************************
18   */
19 
20 /* Define to prevent recursive inclusion -------------------------------------*/
21 #ifndef STM32WBxx_HAL_UART_EX_H
22 #define STM32WBxx_HAL_UART_EX_H
23 
24 #ifdef __cplusplus
25 extern "C" {
26 #endif
27 
28 /* Includes ------------------------------------------------------------------*/
29 #include "stm32wbxx_hal_def.h"
30 
31 /** @addtogroup STM32WBxx_HAL_Driver
32   * @{
33   */
34 
35 /** @addtogroup UARTEx
36   * @{
37   */
38 
39 /* Exported types ------------------------------------------------------------*/
40 /** @defgroup UARTEx_Exported_Types UARTEx Exported Types
41   * @{
42   */
43 
44 /**
45   * @brief  UART wake up from stop mode parameters
46   */
47 typedef struct
48 {
49   uint32_t WakeUpEvent;        /*!< Specifies which event will activate the Wakeup from Stop mode flag (WUF).
50                                     This parameter can be a value of @ref UART_WakeUp_from_Stop_Selection.
51                                     If set to UART_WAKEUP_ON_ADDRESS, the two other fields below must
52                                     be filled up. */
53 
54   uint16_t AddressLength;      /*!< Specifies whether the address is 4 or 7-bit long.
55                                     This parameter can be a value of @ref UARTEx_WakeUp_Address_Length.  */
56 
57   uint8_t Address;             /*!< UART/USART node address (7-bit long max). */
58 } UART_WakeUpTypeDef;
59 
60 /**
61   * @}
62   */
63 
64 /* Exported constants --------------------------------------------------------*/
65 /** @defgroup UARTEx_Exported_Constants UARTEx Exported Constants
66   * @{
67   */
68 
69 /** @defgroup UARTEx_Word_Length UARTEx Word Length
70   * @{
71   */
72 #define UART_WORDLENGTH_7B          USART_CR1_M1   /*!< 7-bit long UART frame */
73 #define UART_WORDLENGTH_8B          0x00000000U    /*!< 8-bit long UART frame */
74 #define UART_WORDLENGTH_9B          USART_CR1_M0   /*!< 9-bit long UART frame */
75 /**
76   * @}
77   */
78 
79 /** @defgroup UARTEx_WakeUp_Address_Length UARTEx WakeUp Address Length
80   * @{
81   */
82 #define UART_ADDRESS_DETECT_4B      0x00000000U      /*!< 4-bit long wake-up address */
83 #define UART_ADDRESS_DETECT_7B      USART_CR2_ADDM7  /*!< 7-bit long wake-up address */
84 /**
85   * @}
86   */
87 
88 /** @defgroup UARTEx_FIFO_mode UARTEx FIFO mode
89   * @brief    UART FIFO mode
90   * @{
91   */
92 #define UART_FIFOMODE_DISABLE       0x00000000U       /*!< FIFO mode disable */
93 #define UART_FIFOMODE_ENABLE        USART_CR1_FIFOEN  /*!< FIFO mode enable  */
94 /**
95   * @}
96   */
97 
98 /** @defgroup UARTEx_TXFIFO_threshold_level UARTEx TXFIFO threshold level
99   * @brief    UART TXFIFO threshold level
100   * @{
101   */
102 #define UART_TXFIFO_THRESHOLD_1_8   0x00000000U                               /*!< TXFIFO reaches 1/8 of its depth */
103 #define UART_TXFIFO_THRESHOLD_1_4   USART_CR3_TXFTCFG_0                       /*!< TXFIFO reaches 1/4 of its depth */
104 #define UART_TXFIFO_THRESHOLD_1_2   USART_CR3_TXFTCFG_1                       /*!< TXFIFO reaches 1/2 of its depth */
105 #define UART_TXFIFO_THRESHOLD_3_4   (USART_CR3_TXFTCFG_0|USART_CR3_TXFTCFG_1) /*!< TXFIFO reaches 3/4 of its depth */
106 #define UART_TXFIFO_THRESHOLD_7_8   USART_CR3_TXFTCFG_2                       /*!< TXFIFO reaches 7/8 of its depth */
107 #define UART_TXFIFO_THRESHOLD_8_8   (USART_CR3_TXFTCFG_2|USART_CR3_TXFTCFG_0) /*!< TXFIFO becomes empty            */
108 /**
109   * @}
110   */
111 
112 /** @defgroup UARTEx_RXFIFO_threshold_level UARTEx RXFIFO threshold level
113   * @brief    UART RXFIFO threshold level
114   * @{
115   */
116 #define UART_RXFIFO_THRESHOLD_1_8   0x00000000U                               /*!< RXFIFO FIFO reaches 1/8 of its depth */
117 #define UART_RXFIFO_THRESHOLD_1_4   USART_CR3_RXFTCFG_0                       /*!< RXFIFO FIFO reaches 1/4 of its depth */
118 #define UART_RXFIFO_THRESHOLD_1_2   USART_CR3_RXFTCFG_1                       /*!< RXFIFO FIFO reaches 1/2 of its depth */
119 #define UART_RXFIFO_THRESHOLD_3_4   (USART_CR3_RXFTCFG_0|USART_CR3_RXFTCFG_1) /*!< RXFIFO FIFO reaches 3/4 of its depth */
120 #define UART_RXFIFO_THRESHOLD_7_8   USART_CR3_RXFTCFG_2                       /*!< RXFIFO FIFO reaches 7/8 of its depth */
121 #define UART_RXFIFO_THRESHOLD_8_8   (USART_CR3_RXFTCFG_2|USART_CR3_RXFTCFG_0) /*!< RXFIFO FIFO becomes full             */
122 /**
123   * @}
124   */
125 
126 /**
127   * @}
128   */
129 
130 /* Exported macros -----------------------------------------------------------*/
131 /* Exported functions --------------------------------------------------------*/
132 /** @addtogroup UARTEx_Exported_Functions
133   * @{
134   */
135 
136 /** @addtogroup UARTEx_Exported_Functions_Group1
137   * @{
138   */
139 
140 /* Initialization and de-initialization functions  ****************************/
141 HAL_StatusTypeDef HAL_RS485Ex_Init(UART_HandleTypeDef *huart, uint32_t Polarity, uint32_t AssertionTime,
142                                    uint32_t DeassertionTime);
143 
144 /**
145   * @}
146   */
147 
148 /** @addtogroup UARTEx_Exported_Functions_Group2
149   * @{
150   */
151 
152 void HAL_UARTEx_WakeupCallback(UART_HandleTypeDef *huart);
153 
154 void HAL_UARTEx_RxFifoFullCallback(UART_HandleTypeDef *huart);
155 void HAL_UARTEx_TxFifoEmptyCallback(UART_HandleTypeDef *huart);
156 
157 /**
158   * @}
159   */
160 
161 /** @addtogroup UARTEx_Exported_Functions_Group3
162   * @{
163   */
164 
165 /* Peripheral Control functions  **********************************************/
166 HAL_StatusTypeDef HAL_UARTEx_StopModeWakeUpSourceConfig(UART_HandleTypeDef *huart, UART_WakeUpTypeDef WakeUpSelection);
167 HAL_StatusTypeDef HAL_UARTEx_EnableStopMode(UART_HandleTypeDef *huart);
168 HAL_StatusTypeDef HAL_UARTEx_DisableStopMode(UART_HandleTypeDef *huart);
169 
170 HAL_StatusTypeDef HAL_MultiProcessorEx_AddressLength_Set(UART_HandleTypeDef *huart, uint32_t AddressLength);
171 
172 HAL_StatusTypeDef HAL_UARTEx_EnableFifoMode(UART_HandleTypeDef *huart);
173 HAL_StatusTypeDef HAL_UARTEx_DisableFifoMode(UART_HandleTypeDef *huart);
174 HAL_StatusTypeDef HAL_UARTEx_SetTxFifoThreshold(UART_HandleTypeDef *huart, uint32_t Threshold);
175 HAL_StatusTypeDef HAL_UARTEx_SetRxFifoThreshold(UART_HandleTypeDef *huart, uint32_t Threshold);
176 
177 /**
178   * @}
179   */
180 
181 /**
182   * @}
183   */
184 
185 /* Private macros ------------------------------------------------------------*/
186 /** @defgroup UARTEx_Private_Macros UARTEx Private Macros
187   * @{
188   */
189 
190 /** @brief  Report the UART clock source.
191   * @param  __HANDLE__ specifies the UART Handle.
192   * @param  __CLOCKSOURCE__ output variable.
193   * @retval UART clocking source, written in __CLOCKSOURCE__.
194   */
195 #if defined (LPUART1)
196 #define UART_GETCLOCKSOURCE(__HANDLE__,__CLOCKSOURCE__)       \
197   do {                                                        \
198     if((__HANDLE__)->Instance == USART1)                      \
199     {                                                         \
200       switch(__HAL_RCC_GET_USART1_SOURCE())                   \
201       {                                                       \
202         case RCC_USART1CLKSOURCE_PCLK2:                       \
203           (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK2;         \
204           break;                                              \
205         case RCC_USART1CLKSOURCE_HSI:                         \
206           (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI;           \
207           break;                                              \
208         case RCC_USART1CLKSOURCE_SYSCLK:                      \
209           (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK;        \
210           break;                                              \
211         case RCC_USART1CLKSOURCE_LSE:                         \
212           (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE;           \
213           break;                                              \
214         default:                                              \
215           (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED;     \
216           break;                                              \
217       }                                                       \
218     }                                                         \
219     else if((__HANDLE__)->Instance == LPUART1)                \
220     {                                                         \
221       switch(__HAL_RCC_GET_LPUART1_SOURCE())                  \
222       {                                                       \
223         case RCC_LPUART1CLKSOURCE_PCLK1:                      \
224           (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1;         \
225           break;                                              \
226         case RCC_LPUART1CLKSOURCE_HSI:                        \
227           (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI;           \
228           break;                                              \
229         case RCC_LPUART1CLKSOURCE_SYSCLK:                     \
230           (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK;        \
231           break;                                              \
232         case RCC_LPUART1CLKSOURCE_LSE:                        \
233           (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE;           \
234           break;                                              \
235         default:                                              \
236           (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED;     \
237           break;                                              \
238       }                                                       \
239     }                                                         \
240     else                                                      \
241     {                                                         \
242       (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED;         \
243     }                                                         \
244   } while(0U)
245 #else
246 #define UART_GETCLOCKSOURCE(__HANDLE__,__CLOCKSOURCE__)       \
247   do {                                                        \
248     if((__HANDLE__)->Instance == USART1)                      \
249     {                                                         \
250       switch(__HAL_RCC_GET_USART1_SOURCE())                   \
251       {                                                       \
252         case RCC_USART1CLKSOURCE_PCLK2:                       \
253           (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK2;         \
254           break;                                              \
255         case RCC_USART1CLKSOURCE_HSI:                         \
256           (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI;           \
257           break;                                              \
258         case RCC_USART1CLKSOURCE_SYSCLK:                      \
259           (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK;        \
260           break;                                              \
261         case RCC_USART1CLKSOURCE_LSE:                         \
262           (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE;           \
263           break;                                              \
264         default:                                              \
265           (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED;     \
266           break;                                              \
267       }                                                       \
268     }                                                         \
269     else                                                      \
270     {                                                         \
271       (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED;         \
272     }                                                         \
273   } while(0U)
274 #endif /* LPUART1 */
275 
276 /** @brief  Report the UART mask to apply to retrieve the received data
277   *         according to the word length and to the parity bits activation.
278   * @note   If PCE = 1, the parity bit is not included in the data extracted
279   *         by the reception API().
280   *         This masking operation is not carried out in the case of
281   *         DMA transfers.
282   * @param  __HANDLE__ specifies the UART Handle.
283   * @retval None, the mask to apply to UART RDR register is stored in (__HANDLE__)->Mask field.
284   */
285 #define UART_MASK_COMPUTATION(__HANDLE__)                             \
286   do {                                                                \
287     if ((__HANDLE__)->Init.WordLength == UART_WORDLENGTH_9B)          \
288     {                                                                 \
289       if ((__HANDLE__)->Init.Parity == UART_PARITY_NONE)              \
290       {                                                               \
291         (__HANDLE__)->Mask = 0x01FFU ;                                \
292       }                                                               \
293       else                                                            \
294       {                                                               \
295         (__HANDLE__)->Mask = 0x00FFU ;                                \
296       }                                                               \
297     }                                                                 \
298     else if ((__HANDLE__)->Init.WordLength == UART_WORDLENGTH_8B)     \
299     {                                                                 \
300       if ((__HANDLE__)->Init.Parity == UART_PARITY_NONE)              \
301       {                                                               \
302         (__HANDLE__)->Mask = 0x00FFU ;                                \
303       }                                                               \
304       else                                                            \
305       {                                                               \
306         (__HANDLE__)->Mask = 0x007FU ;                                \
307       }                                                               \
308     }                                                                 \
309     else if ((__HANDLE__)->Init.WordLength == UART_WORDLENGTH_7B)     \
310     {                                                                 \
311       if ((__HANDLE__)->Init.Parity == UART_PARITY_NONE)              \
312       {                                                               \
313         (__HANDLE__)->Mask = 0x007FU ;                                \
314       }                                                               \
315       else                                                            \
316       {                                                               \
317         (__HANDLE__)->Mask = 0x003FU ;                                \
318       }                                                               \
319     }                                                                 \
320     else                                                              \
321     {                                                                 \
322       (__HANDLE__)->Mask = 0x0000U;                                   \
323     }                                                                 \
324   } while(0U)
325 
326 /**
327   * @brief Ensure that UART frame length is valid.
328   * @param __LENGTH__ UART frame length.
329   * @retval SET (__LENGTH__ is valid) or RESET (__LENGTH__ is invalid)
330   */
331 #define IS_UART_WORD_LENGTH(__LENGTH__) (((__LENGTH__) == UART_WORDLENGTH_7B) || \
332                                          ((__LENGTH__) == UART_WORDLENGTH_8B) || \
333                                          ((__LENGTH__) == UART_WORDLENGTH_9B))
334 
335 /**
336   * @brief Ensure that UART wake-up address length is valid.
337   * @param __ADDRESS__ UART wake-up address length.
338   * @retval SET (__ADDRESS__ is valid) or RESET (__ADDRESS__ is invalid)
339   */
340 #define IS_UART_ADDRESSLENGTH_DETECT(__ADDRESS__) (((__ADDRESS__) == UART_ADDRESS_DETECT_4B) || \
341                                                    ((__ADDRESS__) == UART_ADDRESS_DETECT_7B))
342 
343 /**
344   * @brief Ensure that UART TXFIFO threshold level is valid.
345   * @param __THRESHOLD__ UART TXFIFO threshold level.
346   * @retval SET (__THRESHOLD__ is valid) or RESET (__THRESHOLD__ is invalid)
347   */
348 #define IS_UART_TXFIFO_THRESHOLD(__THRESHOLD__) (((__THRESHOLD__) == UART_TXFIFO_THRESHOLD_1_8) || \
349                                                  ((__THRESHOLD__) == UART_TXFIFO_THRESHOLD_1_4) || \
350                                                  ((__THRESHOLD__) == UART_TXFIFO_THRESHOLD_1_2) || \
351                                                  ((__THRESHOLD__) == UART_TXFIFO_THRESHOLD_3_4) || \
352                                                  ((__THRESHOLD__) == UART_TXFIFO_THRESHOLD_7_8) || \
353                                                  ((__THRESHOLD__) == UART_TXFIFO_THRESHOLD_8_8))
354 
355 /**
356   * @brief Ensure that UART RXFIFO threshold level is valid.
357   * @param __THRESHOLD__ UART RXFIFO threshold level.
358   * @retval SET (__THRESHOLD__ is valid) or RESET (__THRESHOLD__ is invalid)
359   */
360 #define IS_UART_RXFIFO_THRESHOLD(__THRESHOLD__) (((__THRESHOLD__) == UART_RXFIFO_THRESHOLD_1_8) || \
361                                                  ((__THRESHOLD__) == UART_RXFIFO_THRESHOLD_1_4) || \
362                                                  ((__THRESHOLD__) == UART_RXFIFO_THRESHOLD_1_2) || \
363                                                  ((__THRESHOLD__) == UART_RXFIFO_THRESHOLD_3_4) || \
364                                                  ((__THRESHOLD__) == UART_RXFIFO_THRESHOLD_7_8) || \
365                                                  ((__THRESHOLD__) == UART_RXFIFO_THRESHOLD_8_8))
366 
367 /**
368   * @}
369   */
370 
371 /* Private functions ---------------------------------------------------------*/
372 
373 /**
374   * @}
375   */
376 
377 /**
378   * @}
379   */
380 
381 #ifdef __cplusplus
382 }
383 #endif
384 
385 #endif /* STM32WBxx_HAL_UART_EX_H */
386 
387 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
388