stm32g0xx_hal_uart_ex.h 41 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771
  1. /**
  2. ******************************************************************************
  3. * @file stm32g0xx_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) 2018 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 STM32G0xx_HAL_UART_EX_H
  20. #define STM32G0xx_HAL_UART_EX_H
  21. #ifdef __cplusplus
  22. extern "C" {
  23. #endif
  24. /* Includes ------------------------------------------------------------------*/
  25. #include "stm32g0xx_hal_def.h"
  26. /** @addtogroup STM32G0xx_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. #if defined(STM32G0C1xx) || defined(STM32G0B1xx)
  162. /** @brief Report the UART clock source.
  163. * @param __HANDLE__ specifies the UART Handle.
  164. * @param __CLOCKSOURCE__ output variable.
  165. * @retval UART clocking source, written in __CLOCKSOURCE__.
  166. */
  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_PCLK1: \
  174. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \
  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 == USART4) \
  233. { \
  234. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \
  235. } \
  236. else if((__HANDLE__)->Instance == USART5) \
  237. { \
  238. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \
  239. } \
  240. else if((__HANDLE__)->Instance == USART6) \
  241. { \
  242. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \
  243. } \
  244. else if((__HANDLE__)->Instance == LPUART1) \
  245. { \
  246. switch(__HAL_RCC_GET_LPUART1_SOURCE()) \
  247. { \
  248. case RCC_LPUART1CLKSOURCE_PCLK1: \
  249. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \
  250. break; \
  251. case RCC_LPUART1CLKSOURCE_HSI: \
  252. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI; \
  253. break; \
  254. case RCC_LPUART1CLKSOURCE_SYSCLK: \
  255. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK; \
  256. break; \
  257. case RCC_LPUART1CLKSOURCE_LSE: \
  258. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE; \
  259. break; \
  260. default: \
  261. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \
  262. break; \
  263. } \
  264. } \
  265. else if((__HANDLE__)->Instance == LPUART2) \
  266. { \
  267. switch(__HAL_RCC_GET_LPUART2_SOURCE()) \
  268. { \
  269. case RCC_LPUART2CLKSOURCE_PCLK1: \
  270. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \
  271. break; \
  272. case RCC_LPUART2CLKSOURCE_HSI: \
  273. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI; \
  274. break; \
  275. case RCC_LPUART2CLKSOURCE_SYSCLK: \
  276. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK; \
  277. break; \
  278. case RCC_LPUART2CLKSOURCE_LSE: \
  279. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE; \
  280. break; \
  281. default: \
  282. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \
  283. break; \
  284. } \
  285. } \
  286. else \
  287. { \
  288. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \
  289. } \
  290. } while(0U)
  291. #elif defined(STM32G0B0xx)
  292. /** @brief Report the UART clock source.
  293. * @param __HANDLE__ specifies the UART Handle.
  294. * @param __CLOCKSOURCE__ output variable.
  295. * @retval UART clocking source, written in __CLOCKSOURCE__.
  296. */
  297. #define UART_GETCLOCKSOURCE(__HANDLE__,__CLOCKSOURCE__) \
  298. do { \
  299. if((__HANDLE__)->Instance == USART1) \
  300. { \
  301. switch(__HAL_RCC_GET_USART1_SOURCE()) \
  302. { \
  303. case RCC_USART1CLKSOURCE_PCLK1: \
  304. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \
  305. break; \
  306. case RCC_USART1CLKSOURCE_HSI: \
  307. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI; \
  308. break; \
  309. case RCC_USART1CLKSOURCE_SYSCLK: \
  310. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK; \
  311. break; \
  312. case RCC_USART1CLKSOURCE_LSE: \
  313. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE; \
  314. break; \
  315. default: \
  316. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \
  317. break; \
  318. } \
  319. } \
  320. else if((__HANDLE__)->Instance == USART2) \
  321. { \
  322. switch(__HAL_RCC_GET_USART2_SOURCE()) \
  323. { \
  324. case RCC_USART2CLKSOURCE_PCLK1: \
  325. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \
  326. break; \
  327. case RCC_USART2CLKSOURCE_HSI: \
  328. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI; \
  329. break; \
  330. case RCC_USART2CLKSOURCE_SYSCLK: \
  331. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK; \
  332. break; \
  333. case RCC_USART2CLKSOURCE_LSE: \
  334. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE; \
  335. break; \
  336. default: \
  337. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \
  338. break; \
  339. } \
  340. } \
  341. else if((__HANDLE__)->Instance == USART3) \
  342. { \
  343. switch(__HAL_RCC_GET_USART3_SOURCE()) \
  344. { \
  345. case RCC_USART3CLKSOURCE_PCLK1: \
  346. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \
  347. break; \
  348. case RCC_USART3CLKSOURCE_HSI: \
  349. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI; \
  350. break; \
  351. case RCC_USART3CLKSOURCE_SYSCLK: \
  352. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK; \
  353. break; \
  354. case RCC_USART3CLKSOURCE_LSE: \
  355. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE; \
  356. break; \
  357. default: \
  358. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \
  359. break; \
  360. } \
  361. } \
  362. else if((__HANDLE__)->Instance == USART4) \
  363. { \
  364. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \
  365. } \
  366. else if((__HANDLE__)->Instance == USART5) \
  367. { \
  368. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \
  369. } \
  370. else if((__HANDLE__)->Instance == USART6) \
  371. { \
  372. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \
  373. } \
  374. else \
  375. { \
  376. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \
  377. } \
  378. } while(0U)
  379. #elif defined(STM32G081xx) || defined(STM32G071xx)
  380. /** @brief Report the UART clock source.
  381. * @param __HANDLE__ specifies the UART Handle.
  382. * @param __CLOCKSOURCE__ output variable.
  383. * @retval UART clocking source, written in __CLOCKSOURCE__.
  384. */
  385. #define UART_GETCLOCKSOURCE(__HANDLE__,__CLOCKSOURCE__) \
  386. do { \
  387. if((__HANDLE__)->Instance == USART1) \
  388. { \
  389. switch(__HAL_RCC_GET_USART1_SOURCE()) \
  390. { \
  391. case RCC_USART1CLKSOURCE_PCLK1: \
  392. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \
  393. break; \
  394. case RCC_USART1CLKSOURCE_HSI: \
  395. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI; \
  396. break; \
  397. case RCC_USART1CLKSOURCE_SYSCLK: \
  398. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK; \
  399. break; \
  400. case RCC_USART1CLKSOURCE_LSE: \
  401. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE; \
  402. break; \
  403. default: \
  404. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \
  405. break; \
  406. } \
  407. } \
  408. else if((__HANDLE__)->Instance == USART2) \
  409. { \
  410. switch(__HAL_RCC_GET_USART2_SOURCE()) \
  411. { \
  412. case RCC_USART2CLKSOURCE_PCLK1: \
  413. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \
  414. break; \
  415. case RCC_USART2CLKSOURCE_HSI: \
  416. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI; \
  417. break; \
  418. case RCC_USART2CLKSOURCE_SYSCLK: \
  419. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK; \
  420. break; \
  421. case RCC_USART2CLKSOURCE_LSE: \
  422. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE; \
  423. break; \
  424. default: \
  425. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \
  426. break; \
  427. } \
  428. } \
  429. else if((__HANDLE__)->Instance == USART3) \
  430. { \
  431. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \
  432. } \
  433. else if((__HANDLE__)->Instance == USART4) \
  434. { \
  435. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \
  436. } \
  437. else if((__HANDLE__)->Instance == LPUART1) \
  438. { \
  439. switch(__HAL_RCC_GET_LPUART1_SOURCE()) \
  440. { \
  441. case RCC_LPUART1CLKSOURCE_PCLK1: \
  442. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \
  443. break; \
  444. case RCC_LPUART1CLKSOURCE_HSI: \
  445. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI; \
  446. break; \
  447. case RCC_LPUART1CLKSOURCE_SYSCLK: \
  448. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK; \
  449. break; \
  450. case RCC_LPUART1CLKSOURCE_LSE: \
  451. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE; \
  452. break; \
  453. default: \
  454. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \
  455. break; \
  456. } \
  457. } \
  458. else \
  459. { \
  460. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \
  461. } \
  462. } while(0U)
  463. #elif defined(STM32G070xx)
  464. /** @brief Report the UART clock source.
  465. * @param __HANDLE__ specifies the UART Handle.
  466. * @param __CLOCKSOURCE__ output variable.
  467. * @retval UART clocking source, written in __CLOCKSOURCE__.
  468. */
  469. #define UART_GETCLOCKSOURCE(__HANDLE__,__CLOCKSOURCE__) \
  470. do { \
  471. if((__HANDLE__)->Instance == USART1) \
  472. { \
  473. switch(__HAL_RCC_GET_USART1_SOURCE()) \
  474. { \
  475. case RCC_USART1CLKSOURCE_PCLK1: \
  476. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \
  477. break; \
  478. case RCC_USART1CLKSOURCE_HSI: \
  479. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI; \
  480. break; \
  481. case RCC_USART1CLKSOURCE_SYSCLK: \
  482. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK; \
  483. break; \
  484. case RCC_USART1CLKSOURCE_LSE: \
  485. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE; \
  486. break; \
  487. default: \
  488. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \
  489. break; \
  490. } \
  491. } \
  492. else if((__HANDLE__)->Instance == USART2) \
  493. { \
  494. switch(__HAL_RCC_GET_USART2_SOURCE()) \
  495. { \
  496. case RCC_USART2CLKSOURCE_PCLK1: \
  497. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \
  498. break; \
  499. case RCC_USART2CLKSOURCE_HSI: \
  500. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI; \
  501. break; \
  502. case RCC_USART2CLKSOURCE_SYSCLK: \
  503. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK; \
  504. break; \
  505. case RCC_USART2CLKSOURCE_LSE: \
  506. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE; \
  507. break; \
  508. default: \
  509. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \
  510. break; \
  511. } \
  512. } \
  513. else if((__HANDLE__)->Instance == USART3) \
  514. { \
  515. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \
  516. } \
  517. else if((__HANDLE__)->Instance == USART4) \
  518. { \
  519. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \
  520. } \
  521. else \
  522. { \
  523. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \
  524. } \
  525. } while(0U)
  526. #elif defined(STM32G041xx) || defined(STM32G031xx) || defined(STM32G051xx) || defined(STM32G061xx)
  527. /** @brief Report the UART clock source.
  528. * @param __HANDLE__ specifies the UART Handle.
  529. * @param __CLOCKSOURCE__ output variable.
  530. * @retval UART clocking source, written in __CLOCKSOURCE__.
  531. */
  532. #define UART_GETCLOCKSOURCE(__HANDLE__,__CLOCKSOURCE__) \
  533. do { \
  534. if((__HANDLE__)->Instance == USART1) \
  535. { \
  536. switch(__HAL_RCC_GET_USART1_SOURCE()) \
  537. { \
  538. case RCC_USART1CLKSOURCE_PCLK1: \
  539. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \
  540. break; \
  541. case RCC_USART1CLKSOURCE_HSI: \
  542. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI; \
  543. break; \
  544. case RCC_USART1CLKSOURCE_SYSCLK: \
  545. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK; \
  546. break; \
  547. case RCC_USART1CLKSOURCE_LSE: \
  548. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE; \
  549. break; \
  550. default: \
  551. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \
  552. break; \
  553. } \
  554. } \
  555. else if((__HANDLE__)->Instance == USART2) \
  556. { \
  557. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \
  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. #elif defined(STM32G030xx) || defined(STM32G050xx)
  586. /** @brief Report the UART clock source.
  587. * @param __HANDLE__ specifies the UART Handle.
  588. * @param __CLOCKSOURCE__ output variable.
  589. * @retval UART clocking source, written in __CLOCKSOURCE__.
  590. */
  591. #define UART_GETCLOCKSOURCE(__HANDLE__,__CLOCKSOURCE__) \
  592. do { \
  593. if((__HANDLE__)->Instance == USART1) \
  594. { \
  595. switch(__HAL_RCC_GET_USART1_SOURCE()) \
  596. { \
  597. case RCC_USART1CLKSOURCE_PCLK1: \
  598. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \
  599. break; \
  600. case RCC_USART1CLKSOURCE_HSI: \
  601. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI; \
  602. break; \
  603. case RCC_USART1CLKSOURCE_SYSCLK: \
  604. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK; \
  605. break; \
  606. case RCC_USART1CLKSOURCE_LSE: \
  607. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE; \
  608. break; \
  609. default: \
  610. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \
  611. break; \
  612. } \
  613. } \
  614. else if((__HANDLE__)->Instance == USART2) \
  615. { \
  616. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \
  617. } \
  618. else \
  619. { \
  620. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \
  621. } \
  622. } while(0U)
  623. #endif /* STM32G0C1xx || STM32G0B1xx */
  624. /** @brief Report the UART mask to apply to retrieve the received data
  625. * according to the word length and to the parity bits activation.
  626. * @note If PCE = 1, the parity bit is not included in the data extracted
  627. * by the reception API().
  628. * This masking operation is not carried out in the case of
  629. * DMA transfers.
  630. * @param __HANDLE__ specifies the UART Handle.
  631. * @retval None, the mask to apply to UART RDR register is stored in (__HANDLE__)->Mask field.
  632. */
  633. #define UART_MASK_COMPUTATION(__HANDLE__) \
  634. do { \
  635. if ((__HANDLE__)->Init.WordLength == UART_WORDLENGTH_9B) \
  636. { \
  637. if ((__HANDLE__)->Init.Parity == UART_PARITY_NONE) \
  638. { \
  639. (__HANDLE__)->Mask = 0x01FFU ; \
  640. } \
  641. else \
  642. { \
  643. (__HANDLE__)->Mask = 0x00FFU ; \
  644. } \
  645. } \
  646. else if ((__HANDLE__)->Init.WordLength == UART_WORDLENGTH_8B) \
  647. { \
  648. if ((__HANDLE__)->Init.Parity == UART_PARITY_NONE) \
  649. { \
  650. (__HANDLE__)->Mask = 0x00FFU ; \
  651. } \
  652. else \
  653. { \
  654. (__HANDLE__)->Mask = 0x007FU ; \
  655. } \
  656. } \
  657. else if ((__HANDLE__)->Init.WordLength == UART_WORDLENGTH_7B) \
  658. { \
  659. if ((__HANDLE__)->Init.Parity == UART_PARITY_NONE) \
  660. { \
  661. (__HANDLE__)->Mask = 0x007FU ; \
  662. } \
  663. else \
  664. { \
  665. (__HANDLE__)->Mask = 0x003FU ; \
  666. } \
  667. } \
  668. else \
  669. { \
  670. (__HANDLE__)->Mask = 0x0000U; \
  671. } \
  672. } while(0U)
  673. /**
  674. * @brief Ensure that UART frame length is valid.
  675. * @param __LENGTH__ UART frame length.
  676. * @retval SET (__LENGTH__ is valid) or RESET (__LENGTH__ is invalid)
  677. */
  678. #define IS_UART_WORD_LENGTH(__LENGTH__) (((__LENGTH__) == UART_WORDLENGTH_7B) || \
  679. ((__LENGTH__) == UART_WORDLENGTH_8B) || \
  680. ((__LENGTH__) == UART_WORDLENGTH_9B))
  681. /**
  682. * @brief Ensure that UART wake-up address length is valid.
  683. * @param __ADDRESS__ UART wake-up address length.
  684. * @retval SET (__ADDRESS__ is valid) or RESET (__ADDRESS__ is invalid)
  685. */
  686. #define IS_UART_ADDRESSLENGTH_DETECT(__ADDRESS__) (((__ADDRESS__) == UART_ADDRESS_DETECT_4B) || \
  687. ((__ADDRESS__) == UART_ADDRESS_DETECT_7B))
  688. /**
  689. * @brief Ensure that UART TXFIFO threshold level is valid.
  690. * @param __THRESHOLD__ UART TXFIFO threshold level.
  691. * @retval SET (__THRESHOLD__ is valid) or RESET (__THRESHOLD__ is invalid)
  692. */
  693. #define IS_UART_TXFIFO_THRESHOLD(__THRESHOLD__) (((__THRESHOLD__) == UART_TXFIFO_THRESHOLD_1_8) || \
  694. ((__THRESHOLD__) == UART_TXFIFO_THRESHOLD_1_4) || \
  695. ((__THRESHOLD__) == UART_TXFIFO_THRESHOLD_1_2) || \
  696. ((__THRESHOLD__) == UART_TXFIFO_THRESHOLD_3_4) || \
  697. ((__THRESHOLD__) == UART_TXFIFO_THRESHOLD_7_8) || \
  698. ((__THRESHOLD__) == UART_TXFIFO_THRESHOLD_8_8))
  699. /**
  700. * @brief Ensure that UART RXFIFO threshold level is valid.
  701. * @param __THRESHOLD__ UART RXFIFO threshold level.
  702. * @retval SET (__THRESHOLD__ is valid) or RESET (__THRESHOLD__ is invalid)
  703. */
  704. #define IS_UART_RXFIFO_THRESHOLD(__THRESHOLD__) (((__THRESHOLD__) == UART_RXFIFO_THRESHOLD_1_8) || \
  705. ((__THRESHOLD__) == UART_RXFIFO_THRESHOLD_1_4) || \
  706. ((__THRESHOLD__) == UART_RXFIFO_THRESHOLD_1_2) || \
  707. ((__THRESHOLD__) == UART_RXFIFO_THRESHOLD_3_4) || \
  708. ((__THRESHOLD__) == UART_RXFIFO_THRESHOLD_7_8) || \
  709. ((__THRESHOLD__) == UART_RXFIFO_THRESHOLD_8_8))
  710. /**
  711. * @}
  712. */
  713. /* Private functions ---------------------------------------------------------*/
  714. /**
  715. * @}
  716. */
  717. /**
  718. * @}
  719. */
  720. #ifdef __cplusplus
  721. }
  722. #endif
  723. #endif /* STM32G0xx_HAL_UART_EX_H */