stm32l4xx_hal_uart_ex.h 39 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735
  1. /**
  2. ******************************************************************************
  3. * @file stm32l4xx_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) 2017 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. /* Define to prevent recursive inclusion -------------------------------------*/
  20. #ifndef STM32L4xx_HAL_UART_EX_H
  21. #define STM32L4xx_HAL_UART_EX_H
  22. #ifdef __cplusplus
  23. extern "C" {
  24. #endif
  25. /* Includes ------------------------------------------------------------------*/
  26. #include "stm32l4xx_hal_def.h"
  27. /** @addtogroup STM32L4xx_HAL_Driver
  28. * @{
  29. */
  30. /** @addtogroup UARTEx
  31. * @{
  32. */
  33. /* Exported types ------------------------------------------------------------*/
  34. /** @defgroup UARTEx_Exported_Types UARTEx Exported Types
  35. * @{
  36. */
  37. /**
  38. * @brief UART wake up from stop mode parameters
  39. */
  40. typedef struct
  41. {
  42. uint32_t WakeUpEvent; /*!< Specifies which event will activate the Wakeup from Stop mode flag (WUF).
  43. This parameter can be a value of @ref UART_WakeUp_from_Stop_Selection.
  44. If set to UART_WAKEUP_ON_ADDRESS, the two other fields below must
  45. be filled up. */
  46. uint16_t AddressLength; /*!< Specifies whether the address is 4 or 7-bit long.
  47. This parameter can be a value of @ref UARTEx_WakeUp_Address_Length. */
  48. uint8_t Address; /*!< UART/USART node address (7-bit long max). */
  49. } UART_WakeUpTypeDef;
  50. /**
  51. * @}
  52. */
  53. /* Exported constants --------------------------------------------------------*/
  54. /** @defgroup UARTEx_Exported_Constants UARTEx Exported Constants
  55. * @{
  56. */
  57. /** @defgroup UARTEx_Word_Length UARTEx Word Length
  58. * @{
  59. */
  60. #define UART_WORDLENGTH_7B USART_CR1_M1 /*!< 7-bit long UART frame */
  61. #define UART_WORDLENGTH_8B 0x00000000U /*!< 8-bit long UART frame */
  62. #define UART_WORDLENGTH_9B USART_CR1_M0 /*!< 9-bit long UART frame */
  63. /**
  64. * @}
  65. */
  66. /** @defgroup UARTEx_WakeUp_Address_Length UARTEx WakeUp Address Length
  67. * @{
  68. */
  69. #define UART_ADDRESS_DETECT_4B 0x00000000U /*!< 4-bit long wake-up address */
  70. #define UART_ADDRESS_DETECT_7B USART_CR2_ADDM7 /*!< 7-bit long wake-up address */
  71. /**
  72. * @}
  73. */
  74. #if defined(USART_CR1_FIFOEN)
  75. /** @defgroup UARTEx_FIFO_mode UARTEx FIFO mode
  76. * @brief UART FIFO mode
  77. * @{
  78. */
  79. #define UART_FIFOMODE_DISABLE 0x00000000U /*!< FIFO mode disable */
  80. #define UART_FIFOMODE_ENABLE USART_CR1_FIFOEN /*!< FIFO mode enable */
  81. /**
  82. * @}
  83. */
  84. /** @defgroup UARTEx_TXFIFO_threshold_level UARTEx TXFIFO threshold level
  85. * @brief UART TXFIFO threshold level
  86. * @{
  87. */
  88. #define UART_TXFIFO_THRESHOLD_1_8 0x00000000U /*!< TXFIFO reaches 1/8 of its depth */
  89. #define UART_TXFIFO_THRESHOLD_1_4 USART_CR3_TXFTCFG_0 /*!< TXFIFO reaches 1/4 of its depth */
  90. #define UART_TXFIFO_THRESHOLD_1_2 USART_CR3_TXFTCFG_1 /*!< TXFIFO reaches 1/2 of its depth */
  91. #define UART_TXFIFO_THRESHOLD_3_4 (USART_CR3_TXFTCFG_0|USART_CR3_TXFTCFG_1) /*!< TXFIFO reaches 3/4 of its depth */
  92. #define UART_TXFIFO_THRESHOLD_7_8 USART_CR3_TXFTCFG_2 /*!< TXFIFO reaches 7/8 of its depth */
  93. #define UART_TXFIFO_THRESHOLD_8_8 (USART_CR3_TXFTCFG_2|USART_CR3_TXFTCFG_0) /*!< TXFIFO becomes empty */
  94. /**
  95. * @}
  96. */
  97. /** @defgroup UARTEx_RXFIFO_threshold_level UARTEx RXFIFO threshold level
  98. * @brief UART RXFIFO threshold level
  99. * @{
  100. */
  101. #define UART_RXFIFO_THRESHOLD_1_8 0x00000000U /*!< RXFIFO FIFO reaches 1/8 of its depth */
  102. #define UART_RXFIFO_THRESHOLD_1_4 USART_CR3_RXFTCFG_0 /*!< RXFIFO FIFO reaches 1/4 of its depth */
  103. #define UART_RXFIFO_THRESHOLD_1_2 USART_CR3_RXFTCFG_1 /*!< RXFIFO FIFO reaches 1/2 of its depth */
  104. #define UART_RXFIFO_THRESHOLD_3_4 (USART_CR3_RXFTCFG_0|USART_CR3_RXFTCFG_1) /*!< RXFIFO FIFO reaches 3/4 of its depth */
  105. #define UART_RXFIFO_THRESHOLD_7_8 USART_CR3_RXFTCFG_2 /*!< RXFIFO FIFO reaches 7/8 of its depth */
  106. #define UART_RXFIFO_THRESHOLD_8_8 (USART_CR3_RXFTCFG_2|USART_CR3_RXFTCFG_0) /*!< RXFIFO FIFO becomes full */
  107. /**
  108. * @}
  109. */
  110. #endif /* USART_CR1_FIFOEN */
  111. /**
  112. * @}
  113. */
  114. /* Exported macros -----------------------------------------------------------*/
  115. /* Exported functions --------------------------------------------------------*/
  116. /** @addtogroup UARTEx_Exported_Functions
  117. * @{
  118. */
  119. /** @addtogroup UARTEx_Exported_Functions_Group1
  120. * @{
  121. */
  122. /* Initialization and de-initialization functions ****************************/
  123. HAL_StatusTypeDef HAL_RS485Ex_Init(UART_HandleTypeDef *huart, uint32_t Polarity, uint32_t AssertionTime,
  124. uint32_t DeassertionTime);
  125. /**
  126. * @}
  127. */
  128. /** @addtogroup UARTEx_Exported_Functions_Group2
  129. * @{
  130. */
  131. void HAL_UARTEx_WakeupCallback(UART_HandleTypeDef *huart);
  132. #if defined(USART_CR1_FIFOEN)
  133. void HAL_UARTEx_RxFifoFullCallback(UART_HandleTypeDef *huart);
  134. void HAL_UARTEx_TxFifoEmptyCallback(UART_HandleTypeDef *huart);
  135. #endif /* USART_CR1_FIFOEN */
  136. /**
  137. * @}
  138. */
  139. /** @addtogroup UARTEx_Exported_Functions_Group3
  140. * @{
  141. */
  142. /* Peripheral Control functions **********************************************/
  143. HAL_StatusTypeDef HAL_UARTEx_StopModeWakeUpSourceConfig(UART_HandleTypeDef *huart, UART_WakeUpTypeDef WakeUpSelection);
  144. HAL_StatusTypeDef HAL_UARTEx_EnableStopMode(UART_HandleTypeDef *huart);
  145. HAL_StatusTypeDef HAL_UARTEx_DisableStopMode(UART_HandleTypeDef *huart);
  146. #if defined(USART_CR3_UCESM)
  147. HAL_StatusTypeDef HAL_UARTEx_EnableClockStopMode(UART_HandleTypeDef *huart);
  148. HAL_StatusTypeDef HAL_UARTEx_DisableClockStopMode(UART_HandleTypeDef *huart);
  149. #endif /* USART_CR3_UCESM */
  150. HAL_StatusTypeDef HAL_MultiProcessorEx_AddressLength_Set(UART_HandleTypeDef *huart, uint32_t AddressLength);
  151. #if defined(USART_CR1_FIFOEN)
  152. HAL_StatusTypeDef HAL_UARTEx_EnableFifoMode(UART_HandleTypeDef *huart);
  153. HAL_StatusTypeDef HAL_UARTEx_DisableFifoMode(UART_HandleTypeDef *huart);
  154. HAL_StatusTypeDef HAL_UARTEx_SetTxFifoThreshold(UART_HandleTypeDef *huart, uint32_t Threshold);
  155. HAL_StatusTypeDef HAL_UARTEx_SetRxFifoThreshold(UART_HandleTypeDef *huart, uint32_t Threshold);
  156. #endif /* USART_CR1_FIFOEN */
  157. /**
  158. * @}
  159. */
  160. /**
  161. * @}
  162. */
  163. /* Private macros ------------------------------------------------------------*/
  164. /** @defgroup UARTEx_Private_Macros UARTEx Private Macros
  165. * @{
  166. */
  167. /** @brief Report the UART clock source.
  168. * @param __HANDLE__ specifies the UART Handle.
  169. * @param __CLOCKSOURCE__ output variable.
  170. * @retval UART clocking source, written in __CLOCKSOURCE__.
  171. */
  172. #if defined (STM32L471xx) || defined (STM32L475xx) || defined (STM32L476xx) || defined (STM32L485xx) || defined (STM32L486xx) \
  173. || defined (STM32L496xx) || defined (STM32L4A6xx) \
  174. || defined (STM32L4R5xx) || defined (STM32L4R7xx) || defined (STM32L4R9xx) || defined (STM32L4S5xx) || defined (STM32L4S7xx) || defined (STM32L4S9xx)
  175. #define UART_GETCLOCKSOURCE(__HANDLE__,__CLOCKSOURCE__) \
  176. do { \
  177. if((__HANDLE__)->Instance == USART1) \
  178. { \
  179. switch(__HAL_RCC_GET_USART1_SOURCE()) \
  180. { \
  181. case RCC_USART1CLKSOURCE_PCLK2: \
  182. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK2; \
  183. break; \
  184. case RCC_USART1CLKSOURCE_HSI: \
  185. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI; \
  186. break; \
  187. case RCC_USART1CLKSOURCE_SYSCLK: \
  188. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK; \
  189. break; \
  190. case RCC_USART1CLKSOURCE_LSE: \
  191. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE; \
  192. break; \
  193. default: \
  194. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \
  195. break; \
  196. } \
  197. } \
  198. else if((__HANDLE__)->Instance == USART2) \
  199. { \
  200. switch(__HAL_RCC_GET_USART2_SOURCE()) \
  201. { \
  202. case RCC_USART2CLKSOURCE_PCLK1: \
  203. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \
  204. break; \
  205. case RCC_USART2CLKSOURCE_HSI: \
  206. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI; \
  207. break; \
  208. case RCC_USART2CLKSOURCE_SYSCLK: \
  209. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK; \
  210. break; \
  211. case RCC_USART2CLKSOURCE_LSE: \
  212. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE; \
  213. break; \
  214. default: \
  215. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \
  216. break; \
  217. } \
  218. } \
  219. else if((__HANDLE__)->Instance == USART3) \
  220. { \
  221. switch(__HAL_RCC_GET_USART3_SOURCE()) \
  222. { \
  223. case RCC_USART3CLKSOURCE_PCLK1: \
  224. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \
  225. break; \
  226. case RCC_USART3CLKSOURCE_HSI: \
  227. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI; \
  228. break; \
  229. case RCC_USART3CLKSOURCE_SYSCLK: \
  230. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK; \
  231. break; \
  232. case RCC_USART3CLKSOURCE_LSE: \
  233. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE; \
  234. break; \
  235. default: \
  236. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \
  237. break; \
  238. } \
  239. } \
  240. else if((__HANDLE__)->Instance == UART4) \
  241. { \
  242. switch(__HAL_RCC_GET_UART4_SOURCE()) \
  243. { \
  244. case RCC_UART4CLKSOURCE_PCLK1: \
  245. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \
  246. break; \
  247. case RCC_UART4CLKSOURCE_HSI: \
  248. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI; \
  249. break; \
  250. case RCC_UART4CLKSOURCE_SYSCLK: \
  251. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK; \
  252. break; \
  253. case RCC_UART4CLKSOURCE_LSE: \
  254. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE; \
  255. break; \
  256. default: \
  257. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \
  258. break; \
  259. } \
  260. } \
  261. else if((__HANDLE__)->Instance == UART5) \
  262. { \
  263. switch(__HAL_RCC_GET_UART5_SOURCE()) \
  264. { \
  265. case RCC_UART5CLKSOURCE_PCLK1: \
  266. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \
  267. break; \
  268. case RCC_UART5CLKSOURCE_HSI: \
  269. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI; \
  270. break; \
  271. case RCC_UART5CLKSOURCE_SYSCLK: \
  272. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK; \
  273. break; \
  274. case RCC_UART5CLKSOURCE_LSE: \
  275. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE; \
  276. break; \
  277. default: \
  278. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \
  279. break; \
  280. } \
  281. } \
  282. else if((__HANDLE__)->Instance == LPUART1) \
  283. { \
  284. switch(__HAL_RCC_GET_LPUART1_SOURCE()) \
  285. { \
  286. case RCC_LPUART1CLKSOURCE_PCLK1: \
  287. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \
  288. break; \
  289. case RCC_LPUART1CLKSOURCE_HSI: \
  290. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI; \
  291. break; \
  292. case RCC_LPUART1CLKSOURCE_SYSCLK: \
  293. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK; \
  294. break; \
  295. case RCC_LPUART1CLKSOURCE_LSE: \
  296. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE; \
  297. break; \
  298. default: \
  299. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \
  300. break; \
  301. } \
  302. } \
  303. else \
  304. { \
  305. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \
  306. } \
  307. } while(0U)
  308. #elif defined (STM32L412xx) || defined (STM32L422xx) \
  309. || defined (STM32L431xx) || defined (STM32L433xx) || defined (STM32L443xx)
  310. #define UART_GETCLOCKSOURCE(__HANDLE__,__CLOCKSOURCE__) \
  311. do { \
  312. if((__HANDLE__)->Instance == USART1) \
  313. { \
  314. switch(__HAL_RCC_GET_USART1_SOURCE()) \
  315. { \
  316. case RCC_USART1CLKSOURCE_PCLK2: \
  317. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK2; \
  318. break; \
  319. case RCC_USART1CLKSOURCE_HSI: \
  320. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI; \
  321. break; \
  322. case RCC_USART1CLKSOURCE_SYSCLK: \
  323. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK; \
  324. break; \
  325. case RCC_USART1CLKSOURCE_LSE: \
  326. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE; \
  327. break; \
  328. default: \
  329. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \
  330. break; \
  331. } \
  332. } \
  333. else if((__HANDLE__)->Instance == USART2) \
  334. { \
  335. switch(__HAL_RCC_GET_USART2_SOURCE()) \
  336. { \
  337. case RCC_USART2CLKSOURCE_PCLK1: \
  338. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \
  339. break; \
  340. case RCC_USART2CLKSOURCE_HSI: \
  341. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI; \
  342. break; \
  343. case RCC_USART2CLKSOURCE_SYSCLK: \
  344. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK; \
  345. break; \
  346. case RCC_USART2CLKSOURCE_LSE: \
  347. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE; \
  348. break; \
  349. default: \
  350. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \
  351. break; \
  352. } \
  353. } \
  354. else if((__HANDLE__)->Instance == USART3) \
  355. { \
  356. switch(__HAL_RCC_GET_USART3_SOURCE()) \
  357. { \
  358. case RCC_USART3CLKSOURCE_PCLK1: \
  359. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \
  360. break; \
  361. case RCC_USART3CLKSOURCE_HSI: \
  362. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI; \
  363. break; \
  364. case RCC_USART3CLKSOURCE_SYSCLK: \
  365. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK; \
  366. break; \
  367. case RCC_USART3CLKSOURCE_LSE: \
  368. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE; \
  369. break; \
  370. default: \
  371. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \
  372. break; \
  373. } \
  374. } \
  375. else if((__HANDLE__)->Instance == LPUART1) \
  376. { \
  377. switch(__HAL_RCC_GET_LPUART1_SOURCE()) \
  378. { \
  379. case RCC_LPUART1CLKSOURCE_PCLK1: \
  380. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \
  381. break; \
  382. case RCC_LPUART1CLKSOURCE_HSI: \
  383. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI; \
  384. break; \
  385. case RCC_LPUART1CLKSOURCE_SYSCLK: \
  386. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK; \
  387. break; \
  388. case RCC_LPUART1CLKSOURCE_LSE: \
  389. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE; \
  390. break; \
  391. default: \
  392. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \
  393. break; \
  394. } \
  395. } \
  396. else \
  397. { \
  398. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \
  399. } \
  400. } while(0U)
  401. #elif defined (STM32L432xx) || defined (STM32L442xx)
  402. #define UART_GETCLOCKSOURCE(__HANDLE__,__CLOCKSOURCE__) \
  403. do { \
  404. if((__HANDLE__)->Instance == USART1) \
  405. { \
  406. switch(__HAL_RCC_GET_USART1_SOURCE()) \
  407. { \
  408. case RCC_USART1CLKSOURCE_PCLK2: \
  409. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK2; \
  410. break; \
  411. case RCC_USART1CLKSOURCE_HSI: \
  412. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI; \
  413. break; \
  414. case RCC_USART1CLKSOURCE_SYSCLK: \
  415. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK; \
  416. break; \
  417. case RCC_USART1CLKSOURCE_LSE: \
  418. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE; \
  419. break; \
  420. default: \
  421. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \
  422. break; \
  423. } \
  424. } \
  425. else if((__HANDLE__)->Instance == USART2) \
  426. { \
  427. switch(__HAL_RCC_GET_USART2_SOURCE()) \
  428. { \
  429. case RCC_USART2CLKSOURCE_PCLK1: \
  430. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \
  431. break; \
  432. case RCC_USART2CLKSOURCE_HSI: \
  433. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI; \
  434. break; \
  435. case RCC_USART2CLKSOURCE_SYSCLK: \
  436. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK; \
  437. break; \
  438. case RCC_USART2CLKSOURCE_LSE: \
  439. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE; \
  440. break; \
  441. default: \
  442. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \
  443. break; \
  444. } \
  445. } \
  446. else if((__HANDLE__)->Instance == LPUART1) \
  447. { \
  448. switch(__HAL_RCC_GET_LPUART1_SOURCE()) \
  449. { \
  450. case RCC_LPUART1CLKSOURCE_PCLK1: \
  451. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \
  452. break; \
  453. case RCC_LPUART1CLKSOURCE_HSI: \
  454. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI; \
  455. break; \
  456. case RCC_LPUART1CLKSOURCE_SYSCLK: \
  457. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK; \
  458. break; \
  459. case RCC_LPUART1CLKSOURCE_LSE: \
  460. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE; \
  461. break; \
  462. default: \
  463. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \
  464. break; \
  465. } \
  466. } \
  467. else \
  468. { \
  469. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \
  470. } \
  471. } while(0U)
  472. #elif defined (STM32L451xx) || defined (STM32L452xx) || defined (STM32L462xx)
  473. #define UART_GETCLOCKSOURCE(__HANDLE__,__CLOCKSOURCE__) \
  474. do { \
  475. if((__HANDLE__)->Instance == USART1) \
  476. { \
  477. switch(__HAL_RCC_GET_USART1_SOURCE()) \
  478. { \
  479. case RCC_USART1CLKSOURCE_PCLK2: \
  480. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK2; \
  481. break; \
  482. case RCC_USART1CLKSOURCE_HSI: \
  483. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI; \
  484. break; \
  485. case RCC_USART1CLKSOURCE_SYSCLK: \
  486. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK; \
  487. break; \
  488. case RCC_USART1CLKSOURCE_LSE: \
  489. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE; \
  490. break; \
  491. default: \
  492. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \
  493. break; \
  494. } \
  495. } \
  496. else if((__HANDLE__)->Instance == USART2) \
  497. { \
  498. switch(__HAL_RCC_GET_USART2_SOURCE()) \
  499. { \
  500. case RCC_USART2CLKSOURCE_PCLK1: \
  501. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \
  502. break; \
  503. case RCC_USART2CLKSOURCE_HSI: \
  504. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI; \
  505. break; \
  506. case RCC_USART2CLKSOURCE_SYSCLK: \
  507. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK; \
  508. break; \
  509. case RCC_USART2CLKSOURCE_LSE: \
  510. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE; \
  511. break; \
  512. default: \
  513. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \
  514. break; \
  515. } \
  516. } \
  517. else if((__HANDLE__)->Instance == USART3) \
  518. { \
  519. switch(__HAL_RCC_GET_USART3_SOURCE()) \
  520. { \
  521. case RCC_USART3CLKSOURCE_PCLK1: \
  522. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \
  523. break; \
  524. case RCC_USART3CLKSOURCE_HSI: \
  525. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI; \
  526. break; \
  527. case RCC_USART3CLKSOURCE_SYSCLK: \
  528. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK; \
  529. break; \
  530. case RCC_USART3CLKSOURCE_LSE: \
  531. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE; \
  532. break; \
  533. default: \
  534. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \
  535. break; \
  536. } \
  537. } \
  538. else if((__HANDLE__)->Instance == UART4) \
  539. { \
  540. switch(__HAL_RCC_GET_UART4_SOURCE()) \
  541. { \
  542. case RCC_UART4CLKSOURCE_PCLK1: \
  543. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \
  544. break; \
  545. case RCC_UART4CLKSOURCE_HSI: \
  546. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI; \
  547. break; \
  548. case RCC_UART4CLKSOURCE_SYSCLK: \
  549. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK; \
  550. break; \
  551. case RCC_UART4CLKSOURCE_LSE: \
  552. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE; \
  553. break; \
  554. default: \
  555. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \
  556. break; \
  557. } \
  558. } \
  559. else if((__HANDLE__)->Instance == LPUART1) \
  560. { \
  561. switch(__HAL_RCC_GET_LPUART1_SOURCE()) \
  562. { \
  563. case RCC_LPUART1CLKSOURCE_PCLK1: \
  564. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \
  565. break; \
  566. case RCC_LPUART1CLKSOURCE_HSI: \
  567. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI; \
  568. break; \
  569. case RCC_LPUART1CLKSOURCE_SYSCLK: \
  570. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK; \
  571. break; \
  572. case RCC_LPUART1CLKSOURCE_LSE: \
  573. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE; \
  574. break; \
  575. default: \
  576. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \
  577. break; \
  578. } \
  579. } \
  580. else \
  581. { \
  582. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \
  583. } \
  584. } while(0U)
  585. #endif /* STM32L471xx || STM32L475xx || STM32L476xx || STM32L485xx || STM32L486xx ||
  586. * STM32L496xx || STM32L4A6xx ||
  587. * STM32L4R5xx || STM32L4R7xx || STM32L4R9xx || STM32L4S5xx || STM32L4S7xx || STM32L4S9xx
  588. */
  589. /** @brief Report the UART mask to apply to retrieve the received data
  590. * according to the word length and to the parity bits activation.
  591. * @note If PCE = 1, the parity bit is not included in the data extracted
  592. * by the reception API().
  593. * This masking operation is not carried out in the case of
  594. * DMA transfers.
  595. * @param __HANDLE__ specifies the UART Handle.
  596. * @retval None, the mask to apply to UART RDR register is stored in (__HANDLE__)->Mask field.
  597. */
  598. #define UART_MASK_COMPUTATION(__HANDLE__) \
  599. do { \
  600. if ((__HANDLE__)->Init.WordLength == UART_WORDLENGTH_9B) \
  601. { \
  602. if ((__HANDLE__)->Init.Parity == UART_PARITY_NONE) \
  603. { \
  604. (__HANDLE__)->Mask = 0x01FFU ; \
  605. } \
  606. else \
  607. { \
  608. (__HANDLE__)->Mask = 0x00FFU ; \
  609. } \
  610. } \
  611. else if ((__HANDLE__)->Init.WordLength == UART_WORDLENGTH_8B) \
  612. { \
  613. if ((__HANDLE__)->Init.Parity == UART_PARITY_NONE) \
  614. { \
  615. (__HANDLE__)->Mask = 0x00FFU ; \
  616. } \
  617. else \
  618. { \
  619. (__HANDLE__)->Mask = 0x007FU ; \
  620. } \
  621. } \
  622. else if ((__HANDLE__)->Init.WordLength == UART_WORDLENGTH_7B) \
  623. { \
  624. if ((__HANDLE__)->Init.Parity == UART_PARITY_NONE) \
  625. { \
  626. (__HANDLE__)->Mask = 0x007FU ; \
  627. } \
  628. else \
  629. { \
  630. (__HANDLE__)->Mask = 0x003FU ; \
  631. } \
  632. } \
  633. else \
  634. { \
  635. (__HANDLE__)->Mask = 0x0000U; \
  636. } \
  637. } while(0U)
  638. /**
  639. * @brief Ensure that UART frame length is valid.
  640. * @param __LENGTH__ UART frame length.
  641. * @retval SET (__LENGTH__ is valid) or RESET (__LENGTH__ is invalid)
  642. */
  643. #define IS_UART_WORD_LENGTH(__LENGTH__) (((__LENGTH__) == UART_WORDLENGTH_7B) || \
  644. ((__LENGTH__) == UART_WORDLENGTH_8B) || \
  645. ((__LENGTH__) == UART_WORDLENGTH_9B))
  646. /**
  647. * @brief Ensure that UART wake-up address length is valid.
  648. * @param __ADDRESS__ UART wake-up address length.
  649. * @retval SET (__ADDRESS__ is valid) or RESET (__ADDRESS__ is invalid)
  650. */
  651. #define IS_UART_ADDRESSLENGTH_DETECT(__ADDRESS__) (((__ADDRESS__) == UART_ADDRESS_DETECT_4B) || \
  652. ((__ADDRESS__) == UART_ADDRESS_DETECT_7B))
  653. #if defined(USART_CR1_FIFOEN)
  654. /**
  655. * @brief Ensure that UART TXFIFO threshold level is valid.
  656. * @param __THRESHOLD__ UART TXFIFO threshold level.
  657. * @retval SET (__THRESHOLD__ is valid) or RESET (__THRESHOLD__ is invalid)
  658. */
  659. #define IS_UART_TXFIFO_THRESHOLD(__THRESHOLD__) (((__THRESHOLD__) == UART_TXFIFO_THRESHOLD_1_8) || \
  660. ((__THRESHOLD__) == UART_TXFIFO_THRESHOLD_1_4) || \
  661. ((__THRESHOLD__) == UART_TXFIFO_THRESHOLD_1_2) || \
  662. ((__THRESHOLD__) == UART_TXFIFO_THRESHOLD_3_4) || \
  663. ((__THRESHOLD__) == UART_TXFIFO_THRESHOLD_7_8) || \
  664. ((__THRESHOLD__) == UART_TXFIFO_THRESHOLD_8_8))
  665. /**
  666. * @brief Ensure that UART RXFIFO threshold level is valid.
  667. * @param __THRESHOLD__ UART RXFIFO threshold level.
  668. * @retval SET (__THRESHOLD__ is valid) or RESET (__THRESHOLD__ is invalid)
  669. */
  670. #define IS_UART_RXFIFO_THRESHOLD(__THRESHOLD__) (((__THRESHOLD__) == UART_RXFIFO_THRESHOLD_1_8) || \
  671. ((__THRESHOLD__) == UART_RXFIFO_THRESHOLD_1_4) || \
  672. ((__THRESHOLD__) == UART_RXFIFO_THRESHOLD_1_2) || \
  673. ((__THRESHOLD__) == UART_RXFIFO_THRESHOLD_3_4) || \
  674. ((__THRESHOLD__) == UART_RXFIFO_THRESHOLD_7_8) || \
  675. ((__THRESHOLD__) == UART_RXFIFO_THRESHOLD_8_8))
  676. #endif /* USART_CR1_FIFOEN */
  677. /**
  678. * @}
  679. */
  680. /* Private functions ---------------------------------------------------------*/
  681. /**
  682. * @}
  683. */
  684. /**
  685. * @}
  686. */
  687. #ifdef __cplusplus
  688. }
  689. #endif
  690. #endif /* STM32L4xx_HAL_UART_EX_H */
  691. /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/