stm32g0xx_hal_usart_ex.h 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462
  1. /**
  2. ******************************************************************************
  3. * @file stm32g0xx_hal_usart_ex.h
  4. * @author MCD Application Team
  5. * @brief Header file of USART HAL Extended module.
  6. ******************************************************************************
  7. * @attention
  8. *
  9. * Copyright (c) 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_USART_EX_H
  20. #define STM32G0xx_HAL_USART_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 USARTEx
  30. * @{
  31. */
  32. /* Exported types ------------------------------------------------------------*/
  33. /* Exported constants --------------------------------------------------------*/
  34. /** @defgroup USARTEx_Exported_Constants USARTEx Exported Constants
  35. * @{
  36. */
  37. /** @defgroup USARTEx_Word_Length USARTEx Word Length
  38. * @{
  39. */
  40. #define USART_WORDLENGTH_7B (USART_CR1_M1) /*!< 7-bit long USART frame */
  41. #define USART_WORDLENGTH_8B (0x00000000U) /*!< 8-bit long USART frame */
  42. #define USART_WORDLENGTH_9B (USART_CR1_M0) /*!< 9-bit long USART frame */
  43. /**
  44. * @}
  45. */
  46. /** @defgroup USARTEx_Slave_Select_management USARTEx Slave Select Management
  47. * @{
  48. */
  49. #define USART_NSS_HARD 0x00000000U /*!< SPI slave selection depends on NSS input pin */
  50. #define USART_NSS_SOFT USART_CR2_DIS_NSS /*!< SPI slave is always selected and NSS input pin is ignored */
  51. /**
  52. * @}
  53. */
  54. /** @defgroup USARTEx_Slave_Mode USARTEx Synchronous Slave mode enable
  55. * @brief USART SLAVE mode
  56. * @{
  57. */
  58. #define USART_SLAVEMODE_DISABLE 0x00000000U /*!< USART SPI Slave Mode Enable */
  59. #define USART_SLAVEMODE_ENABLE USART_CR2_SLVEN /*!< USART SPI Slave Mode Disable */
  60. /**
  61. * @}
  62. */
  63. /** @defgroup USARTEx_FIFO_mode USARTEx FIFO mode
  64. * @brief USART FIFO mode
  65. * @{
  66. */
  67. #define USART_FIFOMODE_DISABLE 0x00000000U /*!< FIFO mode disable */
  68. #define USART_FIFOMODE_ENABLE USART_CR1_FIFOEN /*!< FIFO mode enable */
  69. /**
  70. * @}
  71. */
  72. /** @defgroup USARTEx_TXFIFO_threshold_level USARTEx TXFIFO threshold level
  73. * @brief USART TXFIFO level
  74. * @{
  75. */
  76. #define USART_TXFIFO_THRESHOLD_1_8 0x00000000U /*!< TXFIFO reaches 1/8 of its depth */
  77. #define USART_TXFIFO_THRESHOLD_1_4 USART_CR3_TXFTCFG_0 /*!< TXFIFO reaches 1/4 of its depth */
  78. #define USART_TXFIFO_THRESHOLD_1_2 USART_CR3_TXFTCFG_1 /*!< TXFIFO reaches 1/2 of its depth */
  79. #define USART_TXFIFO_THRESHOLD_3_4 (USART_CR3_TXFTCFG_0|USART_CR3_TXFTCFG_1) /*!< TXFIFO reaches 3/4 of its depth */
  80. #define USART_TXFIFO_THRESHOLD_7_8 USART_CR3_TXFTCFG_2 /*!< TXFIFO reaches 7/8 of its depth */
  81. #define USART_TXFIFO_THRESHOLD_8_8 (USART_CR3_TXFTCFG_2|USART_CR3_TXFTCFG_0) /*!< TXFIFO becomes empty */
  82. /**
  83. * @}
  84. */
  85. /** @defgroup USARTEx_RXFIFO_threshold_level USARTEx RXFIFO threshold level
  86. * @brief USART RXFIFO level
  87. * @{
  88. */
  89. #define USART_RXFIFO_THRESHOLD_1_8 0x00000000U /*!< RXFIFO FIFO reaches 1/8 of its depth */
  90. #define USART_RXFIFO_THRESHOLD_1_4 USART_CR3_RXFTCFG_0 /*!< RXFIFO FIFO reaches 1/4 of its depth */
  91. #define USART_RXFIFO_THRESHOLD_1_2 USART_CR3_RXFTCFG_1 /*!< RXFIFO FIFO reaches 1/2 of its depth */
  92. #define USART_RXFIFO_THRESHOLD_3_4 (USART_CR3_RXFTCFG_0|USART_CR3_RXFTCFG_1) /*!< RXFIFO FIFO reaches 3/4 of its depth */
  93. #define USART_RXFIFO_THRESHOLD_7_8 USART_CR3_RXFTCFG_2 /*!< RXFIFO FIFO reaches 7/8 of its depth */
  94. #define USART_RXFIFO_THRESHOLD_8_8 (USART_CR3_RXFTCFG_2|USART_CR3_RXFTCFG_0) /*!< RXFIFO FIFO becomes full */
  95. /**
  96. * @}
  97. */
  98. /**
  99. * @}
  100. */
  101. /* Private macros ------------------------------------------------------------*/
  102. /** @defgroup USARTEx_Private_Macros USARTEx Private Macros
  103. * @{
  104. */
  105. /** @brief Report the USART clock source.
  106. * @param __HANDLE__ specifies the USART Handle.
  107. * @param __CLOCKSOURCE__ output variable.
  108. * @retval the USART clocking source, written in __CLOCKSOURCE__.
  109. */
  110. #if defined(STM32G0C1xx) || defined(STM32G0B1xx) || defined(STM32G0B0xx)
  111. #define USART_GETCLOCKSOURCE(__HANDLE__,__CLOCKSOURCE__) \
  112. do { \
  113. if((__HANDLE__)->Instance == USART1) \
  114. { \
  115. switch(__HAL_RCC_GET_USART1_SOURCE()) \
  116. { \
  117. case RCC_USART1CLKSOURCE_PCLK1: \
  118. (__CLOCKSOURCE__) = USART_CLOCKSOURCE_PCLK1; \
  119. break; \
  120. case RCC_USART1CLKSOURCE_HSI: \
  121. (__CLOCKSOURCE__) = USART_CLOCKSOURCE_HSI; \
  122. break; \
  123. case RCC_USART1CLKSOURCE_SYSCLK: \
  124. (__CLOCKSOURCE__) = USART_CLOCKSOURCE_SYSCLK; \
  125. break; \
  126. case RCC_USART1CLKSOURCE_LSE: \
  127. (__CLOCKSOURCE__) = USART_CLOCKSOURCE_LSE; \
  128. break; \
  129. default: \
  130. (__CLOCKSOURCE__) = USART_CLOCKSOURCE_UNDEFINED; \
  131. break; \
  132. } \
  133. } \
  134. else if((__HANDLE__)->Instance == USART2) \
  135. { \
  136. switch(__HAL_RCC_GET_USART2_SOURCE()) \
  137. { \
  138. case RCC_USART2CLKSOURCE_PCLK1: \
  139. (__CLOCKSOURCE__) = USART_CLOCKSOURCE_PCLK1; \
  140. break; \
  141. case RCC_USART2CLKSOURCE_HSI: \
  142. (__CLOCKSOURCE__) = USART_CLOCKSOURCE_HSI; \
  143. break; \
  144. case RCC_USART2CLKSOURCE_SYSCLK: \
  145. (__CLOCKSOURCE__) = USART_CLOCKSOURCE_SYSCLK; \
  146. break; \
  147. case RCC_USART2CLKSOURCE_LSE: \
  148. (__CLOCKSOURCE__) = USART_CLOCKSOURCE_LSE; \
  149. break; \
  150. default: \
  151. (__CLOCKSOURCE__) = USART_CLOCKSOURCE_UNDEFINED; \
  152. break; \
  153. } \
  154. } \
  155. else if((__HANDLE__)->Instance == USART3) \
  156. { \
  157. switch(__HAL_RCC_GET_USART3_SOURCE()) \
  158. { \
  159. case RCC_USART3CLKSOURCE_PCLK1: \
  160. (__CLOCKSOURCE__) = USART_CLOCKSOURCE_PCLK1; \
  161. break; \
  162. case RCC_USART3CLKSOURCE_HSI: \
  163. (__CLOCKSOURCE__) = USART_CLOCKSOURCE_HSI; \
  164. break; \
  165. case RCC_USART3CLKSOURCE_SYSCLK: \
  166. (__CLOCKSOURCE__) = USART_CLOCKSOURCE_SYSCLK; \
  167. break; \
  168. case RCC_USART3CLKSOURCE_LSE: \
  169. (__CLOCKSOURCE__) = USART_CLOCKSOURCE_LSE; \
  170. break; \
  171. default: \
  172. (__CLOCKSOURCE__) = USART_CLOCKSOURCE_UNDEFINED; \
  173. break; \
  174. } \
  175. } \
  176. else if((__HANDLE__)->Instance == USART4) \
  177. { \
  178. (__CLOCKSOURCE__) = USART_CLOCKSOURCE_PCLK1; \
  179. } \
  180. else if((__HANDLE__)->Instance == USART5) \
  181. { \
  182. (__CLOCKSOURCE__) = USART_CLOCKSOURCE_PCLK1; \
  183. } \
  184. else if((__HANDLE__)->Instance == USART6) \
  185. { \
  186. (__CLOCKSOURCE__) = USART_CLOCKSOURCE_PCLK1; \
  187. } \
  188. else \
  189. { \
  190. (__CLOCKSOURCE__) = USART_CLOCKSOURCE_UNDEFINED; \
  191. } \
  192. } while(0U)
  193. #elif defined(STM32G081xx) || defined(STM32G071xx) || defined(STM32G070xx)
  194. #define USART_GETCLOCKSOURCE(__HANDLE__,__CLOCKSOURCE__) \
  195. do { \
  196. if((__HANDLE__)->Instance == USART1) \
  197. { \
  198. switch(__HAL_RCC_GET_USART1_SOURCE()) \
  199. { \
  200. case RCC_USART1CLKSOURCE_PCLK1: \
  201. (__CLOCKSOURCE__) = USART_CLOCKSOURCE_PCLK1; \
  202. break; \
  203. case RCC_USART1CLKSOURCE_HSI: \
  204. (__CLOCKSOURCE__) = USART_CLOCKSOURCE_HSI; \
  205. break; \
  206. case RCC_USART1CLKSOURCE_SYSCLK: \
  207. (__CLOCKSOURCE__) = USART_CLOCKSOURCE_SYSCLK; \
  208. break; \
  209. case RCC_USART1CLKSOURCE_LSE: \
  210. (__CLOCKSOURCE__) = USART_CLOCKSOURCE_LSE; \
  211. break; \
  212. default: \
  213. (__CLOCKSOURCE__) = USART_CLOCKSOURCE_UNDEFINED; \
  214. break; \
  215. } \
  216. } \
  217. else if((__HANDLE__)->Instance == USART2) \
  218. { \
  219. switch(__HAL_RCC_GET_USART2_SOURCE()) \
  220. { \
  221. case RCC_USART2CLKSOURCE_PCLK1: \
  222. (__CLOCKSOURCE__) = USART_CLOCKSOURCE_PCLK1; \
  223. break; \
  224. case RCC_USART2CLKSOURCE_HSI: \
  225. (__CLOCKSOURCE__) = USART_CLOCKSOURCE_HSI; \
  226. break; \
  227. case RCC_USART2CLKSOURCE_SYSCLK: \
  228. (__CLOCKSOURCE__) = USART_CLOCKSOURCE_SYSCLK; \
  229. break; \
  230. case RCC_USART2CLKSOURCE_LSE: \
  231. (__CLOCKSOURCE__) = USART_CLOCKSOURCE_LSE; \
  232. break; \
  233. default: \
  234. (__CLOCKSOURCE__) = USART_CLOCKSOURCE_UNDEFINED; \
  235. break; \
  236. } \
  237. } \
  238. else if((__HANDLE__)->Instance == USART3) \
  239. { \
  240. (__CLOCKSOURCE__) = USART_CLOCKSOURCE_PCLK1; \
  241. } \
  242. else if((__HANDLE__)->Instance == USART4) \
  243. { \
  244. (__CLOCKSOURCE__) = USART_CLOCKSOURCE_PCLK1; \
  245. } \
  246. else \
  247. { \
  248. (__CLOCKSOURCE__) = USART_CLOCKSOURCE_UNDEFINED; \
  249. } \
  250. } while(0U)
  251. #else
  252. #define USART_GETCLOCKSOURCE(__HANDLE__,__CLOCKSOURCE__) \
  253. do { \
  254. if((__HANDLE__)->Instance == USART1) \
  255. { \
  256. switch(__HAL_RCC_GET_USART1_SOURCE()) \
  257. { \
  258. case RCC_USART1CLKSOURCE_PCLK1: \
  259. (__CLOCKSOURCE__) = USART_CLOCKSOURCE_PCLK1; \
  260. break; \
  261. case RCC_USART1CLKSOURCE_HSI: \
  262. (__CLOCKSOURCE__) = USART_CLOCKSOURCE_HSI; \
  263. break; \
  264. case RCC_USART1CLKSOURCE_SYSCLK: \
  265. (__CLOCKSOURCE__) = USART_CLOCKSOURCE_SYSCLK; \
  266. break; \
  267. case RCC_USART1CLKSOURCE_LSE: \
  268. (__CLOCKSOURCE__) = USART_CLOCKSOURCE_LSE; \
  269. break; \
  270. default: \
  271. (__CLOCKSOURCE__) = USART_CLOCKSOURCE_UNDEFINED; \
  272. break; \
  273. } \
  274. } \
  275. else if((__HANDLE__)->Instance == USART2) \
  276. { \
  277. (__CLOCKSOURCE__) = USART_CLOCKSOURCE_PCLK1; \
  278. } \
  279. else \
  280. { \
  281. (__CLOCKSOURCE__) = USART_CLOCKSOURCE_UNDEFINED; \
  282. } \
  283. } while(0U)
  284. #endif /* STM32G0C1xx || STM32G0B1xx || STM32G0B0xx */
  285. /** @brief Compute the USART mask to apply to retrieve the received data
  286. * according to the word length and to the parity bits activation.
  287. * @note If PCE = 1, the parity bit is not included in the data extracted
  288. * by the reception API().
  289. * This masking operation is not carried out in the case of
  290. * DMA transfers.
  291. * @param __HANDLE__ specifies the USART Handle.
  292. * @retval None, the mask to apply to USART RDR register is stored in (__HANDLE__)->Mask field.
  293. */
  294. #define USART_MASK_COMPUTATION(__HANDLE__) \
  295. do { \
  296. if ((__HANDLE__)->Init.WordLength == USART_WORDLENGTH_9B) \
  297. { \
  298. if ((__HANDLE__)->Init.Parity == USART_PARITY_NONE) \
  299. { \
  300. (__HANDLE__)->Mask = 0x01FFU; \
  301. } \
  302. else \
  303. { \
  304. (__HANDLE__)->Mask = 0x00FFU; \
  305. } \
  306. } \
  307. else if ((__HANDLE__)->Init.WordLength == USART_WORDLENGTH_8B) \
  308. { \
  309. if ((__HANDLE__)->Init.Parity == USART_PARITY_NONE) \
  310. { \
  311. (__HANDLE__)->Mask = 0x00FFU; \
  312. } \
  313. else \
  314. { \
  315. (__HANDLE__)->Mask = 0x007FU; \
  316. } \
  317. } \
  318. else if ((__HANDLE__)->Init.WordLength == USART_WORDLENGTH_7B) \
  319. { \
  320. if ((__HANDLE__)->Init.Parity == USART_PARITY_NONE) \
  321. { \
  322. (__HANDLE__)->Mask = 0x007FU; \
  323. } \
  324. else \
  325. { \
  326. (__HANDLE__)->Mask = 0x003FU; \
  327. } \
  328. } \
  329. else \
  330. { \
  331. (__HANDLE__)->Mask = 0x0000U; \
  332. } \
  333. } while(0U)
  334. /**
  335. * @brief Ensure that USART frame length is valid.
  336. * @param __LENGTH__ USART frame length.
  337. * @retval SET (__LENGTH__ is valid) or RESET (__LENGTH__ is invalid)
  338. */
  339. #define IS_USART_WORD_LENGTH(__LENGTH__) (((__LENGTH__) == USART_WORDLENGTH_7B) || \
  340. ((__LENGTH__) == USART_WORDLENGTH_8B) || \
  341. ((__LENGTH__) == USART_WORDLENGTH_9B))
  342. /**
  343. * @brief Ensure that USART Negative Slave Select (NSS) pin management is valid.
  344. * @param __NSS__ USART Negative Slave Select pin management.
  345. * @retval SET (__NSS__ is valid) or RESET (__NSS__ is invalid)
  346. */
  347. #define IS_USART_NSS(__NSS__) (((__NSS__) == USART_NSS_HARD) || \
  348. ((__NSS__) == USART_NSS_SOFT))
  349. /**
  350. * @brief Ensure that USART Slave Mode is valid.
  351. * @param __STATE__ USART Slave Mode.
  352. * @retval SET (__STATE__ is valid) or RESET (__STATE__ is invalid)
  353. */
  354. #define IS_USART_SLAVEMODE(__STATE__) (((__STATE__) == USART_SLAVEMODE_DISABLE ) || \
  355. ((__STATE__) == USART_SLAVEMODE_ENABLE))
  356. /**
  357. * @brief Ensure that USART FIFO mode is valid.
  358. * @param __STATE__ USART FIFO mode.
  359. * @retval SET (__STATE__ is valid) or RESET (__STATE__ is invalid)
  360. */
  361. #define IS_USART_FIFO_MODE_STATE(__STATE__) (((__STATE__) == USART_FIFOMODE_DISABLE ) || \
  362. ((__STATE__) == USART_FIFOMODE_ENABLE))
  363. /**
  364. * @brief Ensure that USART TXFIFO threshold level is valid.
  365. * @param __THRESHOLD__ USART TXFIFO threshold level.
  366. * @retval SET (__THRESHOLD__ is valid) or RESET (__THRESHOLD__ is invalid)
  367. */
  368. #define IS_USART_TXFIFO_THRESHOLD(__THRESHOLD__) (((__THRESHOLD__) == USART_TXFIFO_THRESHOLD_1_8) || \
  369. ((__THRESHOLD__) == USART_TXFIFO_THRESHOLD_1_4) || \
  370. ((__THRESHOLD__) == USART_TXFIFO_THRESHOLD_1_2) || \
  371. ((__THRESHOLD__) == USART_TXFIFO_THRESHOLD_3_4) || \
  372. ((__THRESHOLD__) == USART_TXFIFO_THRESHOLD_7_8) || \
  373. ((__THRESHOLD__) == USART_TXFIFO_THRESHOLD_8_8))
  374. /**
  375. * @brief Ensure that USART RXFIFO threshold level is valid.
  376. * @param __THRESHOLD__ USART RXFIFO threshold level.
  377. * @retval SET (__THRESHOLD__ is valid) or RESET (__THRESHOLD__ is invalid)
  378. */
  379. #define IS_USART_RXFIFO_THRESHOLD(__THRESHOLD__) (((__THRESHOLD__) == USART_RXFIFO_THRESHOLD_1_8) || \
  380. ((__THRESHOLD__) == USART_RXFIFO_THRESHOLD_1_4) || \
  381. ((__THRESHOLD__) == USART_RXFIFO_THRESHOLD_1_2) || \
  382. ((__THRESHOLD__) == USART_RXFIFO_THRESHOLD_3_4) || \
  383. ((__THRESHOLD__) == USART_RXFIFO_THRESHOLD_7_8) || \
  384. ((__THRESHOLD__) == USART_RXFIFO_THRESHOLD_8_8))
  385. /**
  386. * @}
  387. */
  388. /* Exported functions --------------------------------------------------------*/
  389. /** @addtogroup USARTEx_Exported_Functions
  390. * @{
  391. */
  392. /** @addtogroup USARTEx_Exported_Functions_Group1
  393. * @{
  394. */
  395. /* IO operation functions *****************************************************/
  396. void HAL_USARTEx_RxFifoFullCallback(USART_HandleTypeDef *husart);
  397. void HAL_USARTEx_TxFifoEmptyCallback(USART_HandleTypeDef *husart);
  398. /**
  399. * @}
  400. */
  401. /** @addtogroup USARTEx_Exported_Functions_Group2
  402. * @{
  403. */
  404. /* Peripheral Control functions ***********************************************/
  405. HAL_StatusTypeDef HAL_USARTEx_EnableSlaveMode(USART_HandleTypeDef *husart);
  406. HAL_StatusTypeDef HAL_USARTEx_DisableSlaveMode(USART_HandleTypeDef *husart);
  407. HAL_StatusTypeDef HAL_USARTEx_ConfigNSS(USART_HandleTypeDef *husart, uint32_t NSSConfig);
  408. HAL_StatusTypeDef HAL_USARTEx_EnableFifoMode(USART_HandleTypeDef *husart);
  409. HAL_StatusTypeDef HAL_USARTEx_DisableFifoMode(USART_HandleTypeDef *husart);
  410. HAL_StatusTypeDef HAL_USARTEx_SetTxFifoThreshold(USART_HandleTypeDef *husart, uint32_t Threshold);
  411. HAL_StatusTypeDef HAL_USARTEx_SetRxFifoThreshold(USART_HandleTypeDef *husart, uint32_t Threshold);
  412. /**
  413. * @}
  414. */
  415. /**
  416. * @}
  417. */
  418. /**
  419. * @}
  420. */
  421. /**
  422. * @}
  423. */
  424. #ifdef __cplusplus
  425. }
  426. #endif
  427. #endif /* STM32G0xx_HAL_USART_EX_H */