stm32g4xx_hal_uart_ex.h 51 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929
  1. /**
  2. ******************************************************************************
  3. * @file stm32g4xx_hal_uart_ex.h
  4. * @author MCD Application Team
  5. * @brief Header file of UART HAL Extended module.
  6. ******************************************************************************
  7. * @attention
  8. *
  9. * Copyright (c) 2019 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. /* Define to prevent recursive inclusion -------------------------------------*/
  19. #ifndef STM32G4xx_HAL_UART_EX_H
  20. #define STM32G4xx_HAL_UART_EX_H
  21. #ifdef __cplusplus
  22. extern "C" {
  23. #endif
  24. /* Includes ------------------------------------------------------------------*/
  25. #include "stm32g4xx_hal_def.h"
  26. /** @addtogroup STM32G4xx_HAL_Driver
  27. * @{
  28. */
  29. /** @addtogroup UARTEx
  30. * @{
  31. */
  32. /* Exported types ------------------------------------------------------------*/
  33. /** @defgroup UARTEx_Exported_Types UARTEx Exported Types
  34. * @{
  35. */
  36. /**
  37. * @brief UART wake up from stop mode parameters
  38. */
  39. typedef struct
  40. {
  41. uint32_t WakeUpEvent; /*!< Specifies which event will activate the Wakeup from Stop mode flag (WUF).
  42. This parameter can be a value of @ref UART_WakeUp_from_Stop_Selection.
  43. If set to UART_WAKEUP_ON_ADDRESS, the two other fields below must
  44. be filled up. */
  45. uint16_t AddressLength; /*!< Specifies whether the address is 4 or 7-bit long.
  46. This parameter can be a value of @ref UARTEx_WakeUp_Address_Length. */
  47. uint8_t Address; /*!< UART/USART node address (7-bit long max). */
  48. } UART_WakeUpTypeDef;
  49. /**
  50. * @}
  51. */
  52. /* Exported constants --------------------------------------------------------*/
  53. /** @defgroup UARTEx_Exported_Constants UARTEx Exported Constants
  54. * @{
  55. */
  56. /** @defgroup UARTEx_Word_Length UARTEx Word Length
  57. * @{
  58. */
  59. #define UART_WORDLENGTH_7B USART_CR1_M1 /*!< 7-bit long UART frame */
  60. #define UART_WORDLENGTH_8B 0x00000000U /*!< 8-bit long UART frame */
  61. #define UART_WORDLENGTH_9B USART_CR1_M0 /*!< 9-bit long UART frame */
  62. /**
  63. * @}
  64. */
  65. /** @defgroup UARTEx_WakeUp_Address_Length UARTEx WakeUp Address Length
  66. * @{
  67. */
  68. #define UART_ADDRESS_DETECT_4B 0x00000000U /*!< 4-bit long wake-up address */
  69. #define UART_ADDRESS_DETECT_7B USART_CR2_ADDM7 /*!< 7-bit long wake-up address */
  70. /**
  71. * @}
  72. */
  73. /** @defgroup UARTEx_FIFO_mode UARTEx FIFO mode
  74. * @brief UART FIFO mode
  75. * @{
  76. */
  77. #define UART_FIFOMODE_DISABLE 0x00000000U /*!< FIFO mode disable */
  78. #define UART_FIFOMODE_ENABLE USART_CR1_FIFOEN /*!< FIFO mode enable */
  79. /**
  80. * @}
  81. */
  82. /** @defgroup UARTEx_TXFIFO_threshold_level UARTEx TXFIFO threshold level
  83. * @brief UART TXFIFO threshold level
  84. * @{
  85. */
  86. #define UART_TXFIFO_THRESHOLD_1_8 0x00000000U /*!< TX FIFO reaches 1/8 of its depth */
  87. #define UART_TXFIFO_THRESHOLD_1_4 USART_CR3_TXFTCFG_0 /*!< TX FIFO reaches 1/4 of its depth */
  88. #define UART_TXFIFO_THRESHOLD_1_2 USART_CR3_TXFTCFG_1 /*!< TX FIFO reaches 1/2 of its depth */
  89. #define UART_TXFIFO_THRESHOLD_3_4 (USART_CR3_TXFTCFG_0|USART_CR3_TXFTCFG_1) /*!< TX FIFO reaches 3/4 of its depth */
  90. #define UART_TXFIFO_THRESHOLD_7_8 USART_CR3_TXFTCFG_2 /*!< TX FIFO reaches 7/8 of its depth */
  91. #define UART_TXFIFO_THRESHOLD_8_8 (USART_CR3_TXFTCFG_2|USART_CR3_TXFTCFG_0) /*!< TX FIFO becomes empty */
  92. /**
  93. * @}
  94. */
  95. /** @defgroup UARTEx_RXFIFO_threshold_level UARTEx RXFIFO threshold level
  96. * @brief UART RXFIFO threshold level
  97. * @{
  98. */
  99. #define UART_RXFIFO_THRESHOLD_1_8 0x00000000U /*!< RX FIFO reaches 1/8 of its depth */
  100. #define UART_RXFIFO_THRESHOLD_1_4 USART_CR3_RXFTCFG_0 /*!< RX FIFO reaches 1/4 of its depth */
  101. #define UART_RXFIFO_THRESHOLD_1_2 USART_CR3_RXFTCFG_1 /*!< RX FIFO reaches 1/2 of its depth */
  102. #define UART_RXFIFO_THRESHOLD_3_4 (USART_CR3_RXFTCFG_0|USART_CR3_RXFTCFG_1) /*!< RX FIFO reaches 3/4 of its depth */
  103. #define UART_RXFIFO_THRESHOLD_7_8 USART_CR3_RXFTCFG_2 /*!< RX FIFO reaches 7/8 of its depth */
  104. #define UART_RXFIFO_THRESHOLD_8_8 (USART_CR3_RXFTCFG_2|USART_CR3_RXFTCFG_0) /*!< RX FIFO becomes full */
  105. /**
  106. * @}
  107. */
  108. /**
  109. * @}
  110. */
  111. /* Exported macros -----------------------------------------------------------*/
  112. /* Exported functions --------------------------------------------------------*/
  113. /** @addtogroup UARTEx_Exported_Functions
  114. * @{
  115. */
  116. /** @addtogroup UARTEx_Exported_Functions_Group1
  117. * @{
  118. */
  119. /* Initialization and de-initialization functions ****************************/
  120. HAL_StatusTypeDef HAL_RS485Ex_Init(UART_HandleTypeDef *huart, uint32_t Polarity, uint32_t AssertionTime,
  121. uint32_t DeassertionTime);
  122. /**
  123. * @}
  124. */
  125. /** @addtogroup UARTEx_Exported_Functions_Group2
  126. * @{
  127. */
  128. void HAL_UARTEx_WakeupCallback(UART_HandleTypeDef *huart);
  129. void HAL_UARTEx_RxFifoFullCallback(UART_HandleTypeDef *huart);
  130. void HAL_UARTEx_TxFifoEmptyCallback(UART_HandleTypeDef *huart);
  131. /**
  132. * @}
  133. */
  134. /** @addtogroup UARTEx_Exported_Functions_Group3
  135. * @{
  136. */
  137. /* Peripheral Control functions **********************************************/
  138. HAL_StatusTypeDef HAL_UARTEx_StopModeWakeUpSourceConfig(UART_HandleTypeDef *huart, UART_WakeUpTypeDef WakeUpSelection);
  139. HAL_StatusTypeDef HAL_UARTEx_EnableStopMode(UART_HandleTypeDef *huart);
  140. HAL_StatusTypeDef HAL_UARTEx_DisableStopMode(UART_HandleTypeDef *huart);
  141. HAL_StatusTypeDef HAL_MultiProcessorEx_AddressLength_Set(UART_HandleTypeDef *huart, uint32_t AddressLength);
  142. HAL_StatusTypeDef HAL_UARTEx_EnableFifoMode(UART_HandleTypeDef *huart);
  143. HAL_StatusTypeDef HAL_UARTEx_DisableFifoMode(UART_HandleTypeDef *huart);
  144. HAL_StatusTypeDef HAL_UARTEx_SetTxFifoThreshold(UART_HandleTypeDef *huart, uint32_t Threshold);
  145. HAL_StatusTypeDef HAL_UARTEx_SetRxFifoThreshold(UART_HandleTypeDef *huart, uint32_t Threshold);
  146. HAL_StatusTypeDef HAL_UARTEx_ReceiveToIdle(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint16_t *RxLen,
  147. uint32_t Timeout);
  148. HAL_StatusTypeDef HAL_UARTEx_ReceiveToIdle_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
  149. HAL_StatusTypeDef HAL_UARTEx_ReceiveToIdle_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
  150. HAL_UART_RxEventTypeTypeDef HAL_UARTEx_GetRxEventType(const UART_HandleTypeDef *huart);
  151. /**
  152. * @}
  153. */
  154. /**
  155. * @}
  156. */
  157. /* Private macros ------------------------------------------------------------*/
  158. /** @defgroup UARTEx_Private_Macros UARTEx Private Macros
  159. * @{
  160. */
  161. /** @brief Report the UART clock source.
  162. * @param __HANDLE__ specifies the UART Handle.
  163. * @param __CLOCKSOURCE__ output variable.
  164. * @retval UART clocking source, written in __CLOCKSOURCE__.
  165. */
  166. #if defined(UART5) && defined(USART3)
  167. #define UART_GETCLOCKSOURCE(__HANDLE__,__CLOCKSOURCE__) \
  168. do { \
  169. if((__HANDLE__)->Instance == USART1) \
  170. { \
  171. switch(__HAL_RCC_GET_USART1_SOURCE()) \
  172. { \
  173. case RCC_USART1CLKSOURCE_PCLK2: \
  174. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK2; \
  175. break; \
  176. case RCC_USART1CLKSOURCE_HSI: \
  177. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI; \
  178. break; \
  179. case RCC_USART1CLKSOURCE_SYSCLK: \
  180. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK; \
  181. break; \
  182. case RCC_USART1CLKSOURCE_LSE: \
  183. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE; \
  184. break; \
  185. default: \
  186. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \
  187. break; \
  188. } \
  189. } \
  190. else if((__HANDLE__)->Instance == USART2) \
  191. { \
  192. switch(__HAL_RCC_GET_USART2_SOURCE()) \
  193. { \
  194. case RCC_USART2CLKSOURCE_PCLK1: \
  195. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \
  196. break; \
  197. case RCC_USART2CLKSOURCE_HSI: \
  198. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI; \
  199. break; \
  200. case RCC_USART2CLKSOURCE_SYSCLK: \
  201. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK; \
  202. break; \
  203. case RCC_USART2CLKSOURCE_LSE: \
  204. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE; \
  205. break; \
  206. default: \
  207. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \
  208. break; \
  209. } \
  210. } \
  211. else if((__HANDLE__)->Instance == USART3) \
  212. { \
  213. switch(__HAL_RCC_GET_USART3_SOURCE()) \
  214. { \
  215. case RCC_USART3CLKSOURCE_PCLK1: \
  216. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \
  217. break; \
  218. case RCC_USART3CLKSOURCE_HSI: \
  219. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI; \
  220. break; \
  221. case RCC_USART3CLKSOURCE_SYSCLK: \
  222. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK; \
  223. break; \
  224. case RCC_USART3CLKSOURCE_LSE: \
  225. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE; \
  226. break; \
  227. default: \
  228. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \
  229. break; \
  230. } \
  231. } \
  232. else if((__HANDLE__)->Instance == UART4) \
  233. { \
  234. switch(__HAL_RCC_GET_UART4_SOURCE()) \
  235. { \
  236. case RCC_UART4CLKSOURCE_PCLK1: \
  237. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \
  238. break; \
  239. case RCC_UART4CLKSOURCE_HSI: \
  240. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI; \
  241. break; \
  242. case RCC_UART4CLKSOURCE_SYSCLK: \
  243. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK; \
  244. break; \
  245. case RCC_UART4CLKSOURCE_LSE: \
  246. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE; \
  247. break; \
  248. default: \
  249. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \
  250. break; \
  251. } \
  252. } \
  253. else if((__HANDLE__)->Instance == UART5) \
  254. { \
  255. switch(__HAL_RCC_GET_UART5_SOURCE()) \
  256. { \
  257. case RCC_UART5CLKSOURCE_PCLK1: \
  258. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \
  259. break; \
  260. case RCC_UART5CLKSOURCE_HSI: \
  261. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI; \
  262. break; \
  263. case RCC_UART5CLKSOURCE_SYSCLK: \
  264. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK; \
  265. break; \
  266. case RCC_UART5CLKSOURCE_LSE: \
  267. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE; \
  268. break; \
  269. default: \
  270. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \
  271. break; \
  272. } \
  273. } \
  274. else if((__HANDLE__)->Instance == LPUART1) \
  275. { \
  276. switch(__HAL_RCC_GET_LPUART1_SOURCE()) \
  277. { \
  278. case RCC_LPUART1CLKSOURCE_PCLK1: \
  279. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \
  280. break; \
  281. case RCC_LPUART1CLKSOURCE_HSI: \
  282. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI; \
  283. break; \
  284. case RCC_LPUART1CLKSOURCE_SYSCLK: \
  285. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK; \
  286. break; \
  287. case RCC_LPUART1CLKSOURCE_LSE: \
  288. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE; \
  289. break; \
  290. default: \
  291. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \
  292. break; \
  293. } \
  294. } \
  295. else \
  296. { \
  297. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \
  298. } \
  299. } while(0U)
  300. #elif defined(UART5) && !defined(USART3)
  301. #define UART_GETCLOCKSOURCE(__HANDLE__,__CLOCKSOURCE__) \
  302. do { \
  303. if((__HANDLE__)->Instance == USART1) \
  304. { \
  305. switch(__HAL_RCC_GET_USART1_SOURCE()) \
  306. { \
  307. case RCC_USART1CLKSOURCE_PCLK2: \
  308. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK2; \
  309. break; \
  310. case RCC_USART1CLKSOURCE_HSI: \
  311. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI; \
  312. break; \
  313. case RCC_USART1CLKSOURCE_SYSCLK: \
  314. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK; \
  315. break; \
  316. case RCC_USART1CLKSOURCE_LSE: \
  317. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE; \
  318. break; \
  319. default: \
  320. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \
  321. break; \
  322. } \
  323. } \
  324. else if((__HANDLE__)->Instance == USART2) \
  325. { \
  326. switch(__HAL_RCC_GET_USART2_SOURCE()) \
  327. { \
  328. case RCC_USART2CLKSOURCE_PCLK1: \
  329. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \
  330. break; \
  331. case RCC_USART2CLKSOURCE_HSI: \
  332. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI; \
  333. break; \
  334. case RCC_USART2CLKSOURCE_SYSCLK: \
  335. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK; \
  336. break; \
  337. case RCC_USART2CLKSOURCE_LSE: \
  338. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE; \
  339. break; \
  340. default: \
  341. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \
  342. break; \
  343. } \
  344. } \
  345. else if((__HANDLE__)->Instance == UART4) \
  346. { \
  347. switch(__HAL_RCC_GET_UART4_SOURCE()) \
  348. { \
  349. case RCC_UART4CLKSOURCE_PCLK1: \
  350. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \
  351. break; \
  352. case RCC_UART4CLKSOURCE_HSI: \
  353. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI; \
  354. break; \
  355. case RCC_UART4CLKSOURCE_SYSCLK: \
  356. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK; \
  357. break; \
  358. case RCC_UART4CLKSOURCE_LSE: \
  359. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE; \
  360. break; \
  361. default: \
  362. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \
  363. break; \
  364. } \
  365. } \
  366. else if((__HANDLE__)->Instance == UART5) \
  367. { \
  368. switch(__HAL_RCC_GET_UART5_SOURCE()) \
  369. { \
  370. case RCC_UART5CLKSOURCE_PCLK1: \
  371. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \
  372. break; \
  373. case RCC_UART5CLKSOURCE_HSI: \
  374. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI; \
  375. break; \
  376. case RCC_UART5CLKSOURCE_SYSCLK: \
  377. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK; \
  378. break; \
  379. case RCC_UART5CLKSOURCE_LSE: \
  380. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE; \
  381. break; \
  382. default: \
  383. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \
  384. break; \
  385. } \
  386. } \
  387. else if((__HANDLE__)->Instance == LPUART1) \
  388. { \
  389. switch(__HAL_RCC_GET_LPUART1_SOURCE()) \
  390. { \
  391. case RCC_LPUART1CLKSOURCE_PCLK1: \
  392. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \
  393. break; \
  394. case RCC_LPUART1CLKSOURCE_HSI: \
  395. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI; \
  396. break; \
  397. case RCC_LPUART1CLKSOURCE_SYSCLK: \
  398. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK; \
  399. break; \
  400. case RCC_LPUART1CLKSOURCE_LSE: \
  401. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE; \
  402. break; \
  403. default: \
  404. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \
  405. break; \
  406. } \
  407. } \
  408. else \
  409. { \
  410. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \
  411. } \
  412. } while(0U)
  413. #elif defined(UART4) && defined(USART3)
  414. #define UART_GETCLOCKSOURCE(__HANDLE__,__CLOCKSOURCE__) \
  415. do { \
  416. if((__HANDLE__)->Instance == USART1) \
  417. { \
  418. switch(__HAL_RCC_GET_USART1_SOURCE()) \
  419. { \
  420. case RCC_USART1CLKSOURCE_PCLK2: \
  421. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK2; \
  422. break; \
  423. case RCC_USART1CLKSOURCE_HSI: \
  424. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI; \
  425. break; \
  426. case RCC_USART1CLKSOURCE_SYSCLK: \
  427. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK; \
  428. break; \
  429. case RCC_USART1CLKSOURCE_LSE: \
  430. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE; \
  431. break; \
  432. default: \
  433. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \
  434. break; \
  435. } \
  436. } \
  437. else if((__HANDLE__)->Instance == USART2) \
  438. { \
  439. switch(__HAL_RCC_GET_USART2_SOURCE()) \
  440. { \
  441. case RCC_USART2CLKSOURCE_PCLK1: \
  442. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \
  443. break; \
  444. case RCC_USART2CLKSOURCE_HSI: \
  445. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI; \
  446. break; \
  447. case RCC_USART2CLKSOURCE_SYSCLK: \
  448. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK; \
  449. break; \
  450. case RCC_USART2CLKSOURCE_LSE: \
  451. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE; \
  452. break; \
  453. default: \
  454. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \
  455. break; \
  456. } \
  457. } \
  458. else if((__HANDLE__)->Instance == USART3) \
  459. { \
  460. switch(__HAL_RCC_GET_USART3_SOURCE()) \
  461. { \
  462. case RCC_USART3CLKSOURCE_PCLK1: \
  463. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \
  464. break; \
  465. case RCC_USART3CLKSOURCE_HSI: \
  466. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI; \
  467. break; \
  468. case RCC_USART3CLKSOURCE_SYSCLK: \
  469. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK; \
  470. break; \
  471. case RCC_USART3CLKSOURCE_LSE: \
  472. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE; \
  473. break; \
  474. default: \
  475. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \
  476. break; \
  477. } \
  478. } \
  479. else if((__HANDLE__)->Instance == UART4) \
  480. { \
  481. switch(__HAL_RCC_GET_UART4_SOURCE()) \
  482. { \
  483. case RCC_UART4CLKSOURCE_PCLK1: \
  484. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \
  485. break; \
  486. case RCC_UART4CLKSOURCE_HSI: \
  487. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI; \
  488. break; \
  489. case RCC_UART4CLKSOURCE_SYSCLK: \
  490. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK; \
  491. break; \
  492. case RCC_UART4CLKSOURCE_LSE: \
  493. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE; \
  494. break; \
  495. default: \
  496. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \
  497. break; \
  498. } \
  499. } \
  500. else if((__HANDLE__)->Instance == LPUART1) \
  501. { \
  502. switch(__HAL_RCC_GET_LPUART1_SOURCE()) \
  503. { \
  504. case RCC_LPUART1CLKSOURCE_PCLK1: \
  505. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \
  506. break; \
  507. case RCC_LPUART1CLKSOURCE_HSI: \
  508. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI; \
  509. break; \
  510. case RCC_LPUART1CLKSOURCE_SYSCLK: \
  511. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK; \
  512. break; \
  513. case RCC_LPUART1CLKSOURCE_LSE: \
  514. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE; \
  515. break; \
  516. default: \
  517. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \
  518. break; \
  519. } \
  520. } \
  521. else \
  522. { \
  523. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \
  524. } \
  525. } while(0U)
  526. #elif defined(UART4) && !defined(USART3)
  527. #define UART_GETCLOCKSOURCE(__HANDLE__,__CLOCKSOURCE__) \
  528. do { \
  529. if((__HANDLE__)->Instance == USART1) \
  530. { \
  531. switch(__HAL_RCC_GET_USART1_SOURCE()) \
  532. { \
  533. case RCC_USART1CLKSOURCE_PCLK2: \
  534. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK2; \
  535. break; \
  536. case RCC_USART1CLKSOURCE_HSI: \
  537. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI; \
  538. break; \
  539. case RCC_USART1CLKSOURCE_SYSCLK: \
  540. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK; \
  541. break; \
  542. case RCC_USART1CLKSOURCE_LSE: \
  543. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE; \
  544. break; \
  545. default: \
  546. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \
  547. break; \
  548. } \
  549. } \
  550. else if((__HANDLE__)->Instance == USART2) \
  551. { \
  552. switch(__HAL_RCC_GET_USART2_SOURCE()) \
  553. { \
  554. case RCC_USART2CLKSOURCE_PCLK1: \
  555. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \
  556. break; \
  557. case RCC_USART2CLKSOURCE_HSI: \
  558. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI; \
  559. break; \
  560. case RCC_USART2CLKSOURCE_SYSCLK: \
  561. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK; \
  562. break; \
  563. case RCC_USART2CLKSOURCE_LSE: \
  564. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE; \
  565. break; \
  566. default: \
  567. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \
  568. break; \
  569. } \
  570. } \
  571. else if((__HANDLE__)->Instance == UART4) \
  572. { \
  573. switch(__HAL_RCC_GET_UART4_SOURCE()) \
  574. { \
  575. case RCC_UART4CLKSOURCE_PCLK1: \
  576. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \
  577. break; \
  578. case RCC_UART4CLKSOURCE_HSI: \
  579. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI; \
  580. break; \
  581. case RCC_UART4CLKSOURCE_SYSCLK: \
  582. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK; \
  583. break; \
  584. case RCC_UART4CLKSOURCE_LSE: \
  585. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE; \
  586. break; \
  587. default: \
  588. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \
  589. break; \
  590. } \
  591. } \
  592. else if((__HANDLE__)->Instance == LPUART1) \
  593. { \
  594. switch(__HAL_RCC_GET_LPUART1_SOURCE()) \
  595. { \
  596. case RCC_LPUART1CLKSOURCE_PCLK1: \
  597. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \
  598. break; \
  599. case RCC_LPUART1CLKSOURCE_HSI: \
  600. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI; \
  601. break; \
  602. case RCC_LPUART1CLKSOURCE_SYSCLK: \
  603. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK; \
  604. break; \
  605. case RCC_LPUART1CLKSOURCE_LSE: \
  606. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE; \
  607. break; \
  608. default: \
  609. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \
  610. break; \
  611. } \
  612. } \
  613. else \
  614. { \
  615. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \
  616. } \
  617. } while(0U)
  618. #elif defined(USART3)
  619. #define UART_GETCLOCKSOURCE(__HANDLE__,__CLOCKSOURCE__) \
  620. do { \
  621. if((__HANDLE__)->Instance == USART1) \
  622. { \
  623. switch(__HAL_RCC_GET_USART1_SOURCE()) \
  624. { \
  625. case RCC_USART1CLKSOURCE_PCLK2: \
  626. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK2; \
  627. break; \
  628. case RCC_USART1CLKSOURCE_HSI: \
  629. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI; \
  630. break; \
  631. case RCC_USART1CLKSOURCE_SYSCLK: \
  632. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK; \
  633. break; \
  634. case RCC_USART1CLKSOURCE_LSE: \
  635. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE; \
  636. break; \
  637. default: \
  638. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \
  639. break; \
  640. } \
  641. } \
  642. else if((__HANDLE__)->Instance == USART2) \
  643. { \
  644. switch(__HAL_RCC_GET_USART2_SOURCE()) \
  645. { \
  646. case RCC_USART2CLKSOURCE_PCLK1: \
  647. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \
  648. break; \
  649. case RCC_USART2CLKSOURCE_HSI: \
  650. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI; \
  651. break; \
  652. case RCC_USART2CLKSOURCE_SYSCLK: \
  653. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK; \
  654. break; \
  655. case RCC_USART2CLKSOURCE_LSE: \
  656. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE; \
  657. break; \
  658. default: \
  659. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \
  660. break; \
  661. } \
  662. } \
  663. else if((__HANDLE__)->Instance == USART3) \
  664. { \
  665. switch(__HAL_RCC_GET_USART3_SOURCE()) \
  666. { \
  667. case RCC_USART3CLKSOURCE_PCLK1: \
  668. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \
  669. break; \
  670. case RCC_USART3CLKSOURCE_HSI: \
  671. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI; \
  672. break; \
  673. case RCC_USART3CLKSOURCE_SYSCLK: \
  674. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK; \
  675. break; \
  676. case RCC_USART3CLKSOURCE_LSE: \
  677. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE; \
  678. break; \
  679. default: \
  680. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \
  681. break; \
  682. } \
  683. } \
  684. else if((__HANDLE__)->Instance == LPUART1) \
  685. { \
  686. switch(__HAL_RCC_GET_LPUART1_SOURCE()) \
  687. { \
  688. case RCC_LPUART1CLKSOURCE_PCLK1: \
  689. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \
  690. break; \
  691. case RCC_LPUART1CLKSOURCE_HSI: \
  692. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI; \
  693. break; \
  694. case RCC_LPUART1CLKSOURCE_SYSCLK: \
  695. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK; \
  696. break; \
  697. case RCC_LPUART1CLKSOURCE_LSE: \
  698. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE; \
  699. break; \
  700. default: \
  701. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \
  702. break; \
  703. } \
  704. } \
  705. else \
  706. { \
  707. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \
  708. } \
  709. } while(0U)
  710. #else
  711. #define UART_GETCLOCKSOURCE(__HANDLE__,__CLOCKSOURCE__) \
  712. do { \
  713. if((__HANDLE__)->Instance == USART1) \
  714. { \
  715. switch(__HAL_RCC_GET_USART1_SOURCE()) \
  716. { \
  717. case RCC_USART1CLKSOURCE_PCLK2: \
  718. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK2; \
  719. break; \
  720. case RCC_USART1CLKSOURCE_HSI: \
  721. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI; \
  722. break; \
  723. case RCC_USART1CLKSOURCE_SYSCLK: \
  724. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK; \
  725. break; \
  726. case RCC_USART1CLKSOURCE_LSE: \
  727. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE; \
  728. break; \
  729. default: \
  730. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \
  731. break; \
  732. } \
  733. } \
  734. else if((__HANDLE__)->Instance == USART2) \
  735. { \
  736. switch(__HAL_RCC_GET_USART2_SOURCE()) \
  737. { \
  738. case RCC_USART2CLKSOURCE_PCLK1: \
  739. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \
  740. break; \
  741. case RCC_USART2CLKSOURCE_HSI: \
  742. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI; \
  743. break; \
  744. case RCC_USART2CLKSOURCE_SYSCLK: \
  745. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK; \
  746. break; \
  747. case RCC_USART2CLKSOURCE_LSE: \
  748. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE; \
  749. break; \
  750. default: \
  751. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \
  752. break; \
  753. } \
  754. } \
  755. else if((__HANDLE__)->Instance == LPUART1) \
  756. { \
  757. switch(__HAL_RCC_GET_LPUART1_SOURCE()) \
  758. { \
  759. case RCC_LPUART1CLKSOURCE_PCLK1: \
  760. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \
  761. break; \
  762. case RCC_LPUART1CLKSOURCE_HSI: \
  763. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI; \
  764. break; \
  765. case RCC_LPUART1CLKSOURCE_SYSCLK: \
  766. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK; \
  767. break; \
  768. case RCC_LPUART1CLKSOURCE_LSE: \
  769. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE; \
  770. break; \
  771. default: \
  772. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \
  773. break; \
  774. } \
  775. } \
  776. else \
  777. { \
  778. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \
  779. } \
  780. } while(0U)
  781. #endif /* UART5 && !USART3 */
  782. /** @brief Report the UART mask to apply to retrieve the received data
  783. * according to the word length and to the parity bits activation.
  784. * @note If PCE = 1, the parity bit is not included in the data extracted
  785. * by the reception API().
  786. * This masking operation is not carried out in the case of
  787. * DMA transfers.
  788. * @param __HANDLE__ specifies the UART Handle.
  789. * @retval None, the mask to apply to UART RDR register is stored in (__HANDLE__)->Mask field.
  790. */
  791. #define UART_MASK_COMPUTATION(__HANDLE__) \
  792. do { \
  793. if ((__HANDLE__)->Init.WordLength == UART_WORDLENGTH_9B) \
  794. { \
  795. if ((__HANDLE__)->Init.Parity == UART_PARITY_NONE) \
  796. { \
  797. (__HANDLE__)->Mask = 0x01FFU ; \
  798. } \
  799. else \
  800. { \
  801. (__HANDLE__)->Mask = 0x00FFU ; \
  802. } \
  803. } \
  804. else if ((__HANDLE__)->Init.WordLength == UART_WORDLENGTH_8B) \
  805. { \
  806. if ((__HANDLE__)->Init.Parity == UART_PARITY_NONE) \
  807. { \
  808. (__HANDLE__)->Mask = 0x00FFU ; \
  809. } \
  810. else \
  811. { \
  812. (__HANDLE__)->Mask = 0x007FU ; \
  813. } \
  814. } \
  815. else if ((__HANDLE__)->Init.WordLength == UART_WORDLENGTH_7B) \
  816. { \
  817. if ((__HANDLE__)->Init.Parity == UART_PARITY_NONE) \
  818. { \
  819. (__HANDLE__)->Mask = 0x007FU ; \
  820. } \
  821. else \
  822. { \
  823. (__HANDLE__)->Mask = 0x003FU ; \
  824. } \
  825. } \
  826. else \
  827. { \
  828. (__HANDLE__)->Mask = 0x0000U; \
  829. } \
  830. } while(0U)
  831. /**
  832. * @brief Ensure that UART frame length is valid.
  833. * @param __LENGTH__ UART frame length.
  834. * @retval SET (__LENGTH__ is valid) or RESET (__LENGTH__ is invalid)
  835. */
  836. #define IS_UART_WORD_LENGTH(__LENGTH__) (((__LENGTH__) == UART_WORDLENGTH_7B) || \
  837. ((__LENGTH__) == UART_WORDLENGTH_8B) || \
  838. ((__LENGTH__) == UART_WORDLENGTH_9B))
  839. /**
  840. * @brief Ensure that UART wake-up address length is valid.
  841. * @param __ADDRESS__ UART wake-up address length.
  842. * @retval SET (__ADDRESS__ is valid) or RESET (__ADDRESS__ is invalid)
  843. */
  844. #define IS_UART_ADDRESSLENGTH_DETECT(__ADDRESS__) (((__ADDRESS__) == UART_ADDRESS_DETECT_4B) || \
  845. ((__ADDRESS__) == UART_ADDRESS_DETECT_7B))
  846. /**
  847. * @brief Ensure that UART TXFIFO threshold level is valid.
  848. * @param __THRESHOLD__ UART TXFIFO threshold level.
  849. * @retval SET (__THRESHOLD__ is valid) or RESET (__THRESHOLD__ is invalid)
  850. */
  851. #define IS_UART_TXFIFO_THRESHOLD(__THRESHOLD__) (((__THRESHOLD__) == UART_TXFIFO_THRESHOLD_1_8) || \
  852. ((__THRESHOLD__) == UART_TXFIFO_THRESHOLD_1_4) || \
  853. ((__THRESHOLD__) == UART_TXFIFO_THRESHOLD_1_2) || \
  854. ((__THRESHOLD__) == UART_TXFIFO_THRESHOLD_3_4) || \
  855. ((__THRESHOLD__) == UART_TXFIFO_THRESHOLD_7_8) || \
  856. ((__THRESHOLD__) == UART_TXFIFO_THRESHOLD_8_8))
  857. /**
  858. * @brief Ensure that UART RXFIFO threshold level is valid.
  859. * @param __THRESHOLD__ UART RXFIFO threshold level.
  860. * @retval SET (__THRESHOLD__ is valid) or RESET (__THRESHOLD__ is invalid)
  861. */
  862. #define IS_UART_RXFIFO_THRESHOLD(__THRESHOLD__) (((__THRESHOLD__) == UART_RXFIFO_THRESHOLD_1_8) || \
  863. ((__THRESHOLD__) == UART_RXFIFO_THRESHOLD_1_4) || \
  864. ((__THRESHOLD__) == UART_RXFIFO_THRESHOLD_1_2) || \
  865. ((__THRESHOLD__) == UART_RXFIFO_THRESHOLD_3_4) || \
  866. ((__THRESHOLD__) == UART_RXFIFO_THRESHOLD_7_8) || \
  867. ((__THRESHOLD__) == UART_RXFIFO_THRESHOLD_8_8))
  868. /**
  869. * @}
  870. */
  871. /* Private functions ---------------------------------------------------------*/
  872. /**
  873. * @}
  874. */
  875. /**
  876. * @}
  877. */
  878. #ifdef __cplusplus
  879. }
  880. #endif
  881. #endif /* STM32G4xx_HAL_UART_EX_H */