stm32f0xx_hal_usart_ex.h 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519
  1. /**
  2. ******************************************************************************
  3. * @file stm32f0xx_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) 2016 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 STM32F0xx_HAL_USART_EX_H
  20. #define STM32F0xx_HAL_USART_EX_H
  21. #ifdef __cplusplus
  22. extern "C" {
  23. #endif
  24. /* Includes ------------------------------------------------------------------*/
  25. #include "stm32f0xx_hal_def.h"
  26. /** @addtogroup STM32F0xx_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. #if defined(USART_CR1_M0)&& defined(USART_CR1_M1)
  41. #define USART_WORDLENGTH_7B (USART_CR1_M1) /*!< 7-bit long USART frame */
  42. #define USART_WORDLENGTH_8B (0x00000000U) /*!< 8-bit long USART frame */
  43. #define USART_WORDLENGTH_9B (USART_CR1_M0) /*!< 9-bit long USART frame */
  44. #elif defined(USART_CR1_M)
  45. #define USART_WORDLENGTH_8B (0x00000000U) /*!< 8-bit long USART frame */
  46. #define USART_WORDLENGTH_9B (USART_CR1_M) /*!< 9-bit long USART frame */
  47. #endif /* USART_CR1_M0 && USART_CR1_M */
  48. /**
  49. * @}
  50. */
  51. /**
  52. * @}
  53. */
  54. /* Private macros ------------------------------------------------------------*/
  55. /** @defgroup USARTEx_Private_Macros USARTEx Private Macros
  56. * @{
  57. */
  58. /** @brief Report the USART clock source.
  59. * @param __HANDLE__ specifies the USART Handle.
  60. * @param __CLOCKSOURCE__ output variable.
  61. * @retval the USART clocking source, written in __CLOCKSOURCE__.
  62. */
  63. /** @brief Report the UART clock source.
  64. * @param __HANDLE__ specifies the UART Handle.
  65. * @param __CLOCKSOURCE__ output variable.
  66. * @retval UART clocking source, written in __CLOCKSOURCE__.
  67. */
  68. #if defined(STM32F030x6) || defined(STM32F031x6) || defined(STM32F038xx)
  69. #define USART_GETCLOCKSOURCE(__HANDLE__,__CLOCKSOURCE__) \
  70. do { \
  71. switch(__HAL_RCC_GET_USART1_SOURCE()) \
  72. { \
  73. case RCC_USART1CLKSOURCE_PCLK1: \
  74. (__CLOCKSOURCE__) = USART_CLOCKSOURCE_PCLK1; \
  75. break; \
  76. case RCC_USART1CLKSOURCE_HSI: \
  77. (__CLOCKSOURCE__) = USART_CLOCKSOURCE_HSI; \
  78. break; \
  79. case RCC_USART1CLKSOURCE_SYSCLK: \
  80. (__CLOCKSOURCE__) = USART_CLOCKSOURCE_SYSCLK; \
  81. break; \
  82. case RCC_USART1CLKSOURCE_LSE: \
  83. (__CLOCKSOURCE__) = USART_CLOCKSOURCE_LSE; \
  84. break; \
  85. default: \
  86. (__CLOCKSOURCE__) = USART_CLOCKSOURCE_UNDEFINED; \
  87. break; \
  88. } \
  89. } while(0)
  90. #elif defined (STM32F030x8) || defined (STM32F070x6) || defined (STM32F042x6) || defined (STM32F048xx) \
  91. || defined (STM32F051x8) || defined (STM32F058xx)
  92. #define USART_GETCLOCKSOURCE(__HANDLE__,__CLOCKSOURCE__) \
  93. do { \
  94. if((__HANDLE__)->Instance == USART1) \
  95. { \
  96. switch(__HAL_RCC_GET_USART1_SOURCE()) \
  97. { \
  98. case RCC_USART1CLKSOURCE_PCLK1: \
  99. (__CLOCKSOURCE__) = USART_CLOCKSOURCE_PCLK1; \
  100. break; \
  101. case RCC_USART1CLKSOURCE_HSI: \
  102. (__CLOCKSOURCE__) = USART_CLOCKSOURCE_HSI; \
  103. break; \
  104. case RCC_USART1CLKSOURCE_SYSCLK: \
  105. (__CLOCKSOURCE__) = USART_CLOCKSOURCE_SYSCLK; \
  106. break; \
  107. case RCC_USART1CLKSOURCE_LSE: \
  108. (__CLOCKSOURCE__) = USART_CLOCKSOURCE_LSE; \
  109. break; \
  110. default: \
  111. (__CLOCKSOURCE__) = USART_CLOCKSOURCE_UNDEFINED; \
  112. break; \
  113. } \
  114. } \
  115. else if((__HANDLE__)->Instance == USART2) \
  116. { \
  117. (__CLOCKSOURCE__) = USART_CLOCKSOURCE_PCLK1; \
  118. } \
  119. else \
  120. { \
  121. (__CLOCKSOURCE__) = USART_CLOCKSOURCE_UNDEFINED; \
  122. } \
  123. } while(0)
  124. #elif defined (STM32F070xB)
  125. #define USART_GETCLOCKSOURCE(__HANDLE__,__CLOCKSOURCE__) \
  126. do { \
  127. if((__HANDLE__)->Instance == USART1) \
  128. { \
  129. switch(__HAL_RCC_GET_USART1_SOURCE()) \
  130. { \
  131. case RCC_USART1CLKSOURCE_PCLK1: \
  132. (__CLOCKSOURCE__) = USART_CLOCKSOURCE_PCLK1; \
  133. break; \
  134. case RCC_USART1CLKSOURCE_HSI: \
  135. (__CLOCKSOURCE__) = USART_CLOCKSOURCE_HSI; \
  136. break; \
  137. case RCC_USART1CLKSOURCE_SYSCLK: \
  138. (__CLOCKSOURCE__) = USART_CLOCKSOURCE_SYSCLK; \
  139. break; \
  140. case RCC_USART1CLKSOURCE_LSE: \
  141. (__CLOCKSOURCE__) = USART_CLOCKSOURCE_LSE; \
  142. break; \
  143. default: \
  144. (__CLOCKSOURCE__) = USART_CLOCKSOURCE_UNDEFINED; \
  145. break; \
  146. } \
  147. } \
  148. else if((__HANDLE__)->Instance == USART2) \
  149. { \
  150. (__CLOCKSOURCE__) = USART_CLOCKSOURCE_PCLK1; \
  151. } \
  152. else if((__HANDLE__)->Instance == USART3) \
  153. { \
  154. (__CLOCKSOURCE__) = USART_CLOCKSOURCE_PCLK1; \
  155. } \
  156. else if((__HANDLE__)->Instance == USART4) \
  157. { \
  158. (__CLOCKSOURCE__) = USART_CLOCKSOURCE_PCLK1; \
  159. } \
  160. else \
  161. { \
  162. (__CLOCKSOURCE__) = USART_CLOCKSOURCE_UNDEFINED; \
  163. } \
  164. } while(0)
  165. #elif defined(STM32F071xB) || defined(STM32F072xB) || defined(STM32F078xx)
  166. #define USART_GETCLOCKSOURCE(__HANDLE__,__CLOCKSOURCE__) \
  167. do { \
  168. if((__HANDLE__)->Instance == USART1) \
  169. { \
  170. switch(__HAL_RCC_GET_USART1_SOURCE()) \
  171. { \
  172. case RCC_USART1CLKSOURCE_PCLK1: \
  173. (__CLOCKSOURCE__) = USART_CLOCKSOURCE_PCLK1; \
  174. break; \
  175. case RCC_USART1CLKSOURCE_HSI: \
  176. (__CLOCKSOURCE__) = USART_CLOCKSOURCE_HSI; \
  177. break; \
  178. case RCC_USART1CLKSOURCE_SYSCLK: \
  179. (__CLOCKSOURCE__) = USART_CLOCKSOURCE_SYSCLK; \
  180. break; \
  181. case RCC_USART1CLKSOURCE_LSE: \
  182. (__CLOCKSOURCE__) = USART_CLOCKSOURCE_LSE; \
  183. break; \
  184. default: \
  185. (__CLOCKSOURCE__) = USART_CLOCKSOURCE_UNDEFINED; \
  186. break; \
  187. } \
  188. } \
  189. else if((__HANDLE__)->Instance == USART2) \
  190. { \
  191. switch(__HAL_RCC_GET_USART2_SOURCE()) \
  192. { \
  193. case RCC_USART2CLKSOURCE_PCLK1: \
  194. (__CLOCKSOURCE__) = USART_CLOCKSOURCE_PCLK1; \
  195. break; \
  196. case RCC_USART2CLKSOURCE_HSI: \
  197. (__CLOCKSOURCE__) = USART_CLOCKSOURCE_HSI; \
  198. break; \
  199. case RCC_USART2CLKSOURCE_SYSCLK: \
  200. (__CLOCKSOURCE__) = USART_CLOCKSOURCE_SYSCLK; \
  201. break; \
  202. case RCC_USART2CLKSOURCE_LSE: \
  203. (__CLOCKSOURCE__) = USART_CLOCKSOURCE_LSE; \
  204. break; \
  205. default: \
  206. (__CLOCKSOURCE__) = USART_CLOCKSOURCE_UNDEFINED; \
  207. break; \
  208. } \
  209. } \
  210. else if((__HANDLE__)->Instance == USART3) \
  211. { \
  212. (__CLOCKSOURCE__) = USART_CLOCKSOURCE_PCLK1; \
  213. } \
  214. else if((__HANDLE__)->Instance == USART4) \
  215. { \
  216. (__CLOCKSOURCE__) = USART_CLOCKSOURCE_PCLK1; \
  217. } \
  218. else \
  219. { \
  220. (__CLOCKSOURCE__) = USART_CLOCKSOURCE_UNDEFINED; \
  221. } \
  222. } while(0)
  223. #elif defined(STM32F091xC) || defined (STM32F098xx)
  224. #define USART_GETCLOCKSOURCE(__HANDLE__,__CLOCKSOURCE__) \
  225. do { \
  226. if((__HANDLE__)->Instance == USART1) \
  227. { \
  228. switch(__HAL_RCC_GET_USART1_SOURCE()) \
  229. { \
  230. case RCC_USART1CLKSOURCE_PCLK1: \
  231. (__CLOCKSOURCE__) = USART_CLOCKSOURCE_PCLK1; \
  232. break; \
  233. case RCC_USART1CLKSOURCE_HSI: \
  234. (__CLOCKSOURCE__) = USART_CLOCKSOURCE_HSI; \
  235. break; \
  236. case RCC_USART1CLKSOURCE_SYSCLK: \
  237. (__CLOCKSOURCE__) = USART_CLOCKSOURCE_SYSCLK; \
  238. break; \
  239. case RCC_USART1CLKSOURCE_LSE: \
  240. (__CLOCKSOURCE__) = USART_CLOCKSOURCE_LSE; \
  241. break; \
  242. default: \
  243. (__CLOCKSOURCE__) = USART_CLOCKSOURCE_UNDEFINED; \
  244. break; \
  245. } \
  246. } \
  247. else if((__HANDLE__)->Instance == USART2) \
  248. { \
  249. switch(__HAL_RCC_GET_USART2_SOURCE()) \
  250. { \
  251. case RCC_USART2CLKSOURCE_PCLK1: \
  252. (__CLOCKSOURCE__) = USART_CLOCKSOURCE_PCLK1; \
  253. break; \
  254. case RCC_USART2CLKSOURCE_HSI: \
  255. (__CLOCKSOURCE__) = USART_CLOCKSOURCE_HSI; \
  256. break; \
  257. case RCC_USART2CLKSOURCE_SYSCLK: \
  258. (__CLOCKSOURCE__) = USART_CLOCKSOURCE_SYSCLK; \
  259. break; \
  260. case RCC_USART2CLKSOURCE_LSE: \
  261. (__CLOCKSOURCE__) = USART_CLOCKSOURCE_LSE; \
  262. break; \
  263. default: \
  264. (__CLOCKSOURCE__) = USART_CLOCKSOURCE_UNDEFINED; \
  265. break; \
  266. } \
  267. } \
  268. else if((__HANDLE__)->Instance == USART3) \
  269. { \
  270. switch(__HAL_RCC_GET_USART3_SOURCE()) \
  271. { \
  272. case RCC_USART3CLKSOURCE_PCLK1: \
  273. (__CLOCKSOURCE__) = USART_CLOCKSOURCE_PCLK1; \
  274. break; \
  275. case RCC_USART3CLKSOURCE_HSI: \
  276. (__CLOCKSOURCE__) = USART_CLOCKSOURCE_HSI; \
  277. break; \
  278. case RCC_USART3CLKSOURCE_SYSCLK: \
  279. (__CLOCKSOURCE__) = USART_CLOCKSOURCE_SYSCLK; \
  280. break; \
  281. case RCC_USART3CLKSOURCE_LSE: \
  282. (__CLOCKSOURCE__) = USART_CLOCKSOURCE_LSE; \
  283. break; \
  284. default: \
  285. (__CLOCKSOURCE__) = USART_CLOCKSOURCE_UNDEFINED; \
  286. break; \
  287. } \
  288. } \
  289. else if((__HANDLE__)->Instance == USART4) \
  290. { \
  291. (__CLOCKSOURCE__) = USART_CLOCKSOURCE_PCLK1; \
  292. } \
  293. else if((__HANDLE__)->Instance == USART5) \
  294. { \
  295. (__CLOCKSOURCE__) = USART_CLOCKSOURCE_PCLK1; \
  296. } \
  297. else if((__HANDLE__)->Instance == USART6) \
  298. { \
  299. (__CLOCKSOURCE__) = USART_CLOCKSOURCE_PCLK1; \
  300. } \
  301. else if((__HANDLE__)->Instance == USART7) \
  302. { \
  303. (__CLOCKSOURCE__) = USART_CLOCKSOURCE_PCLK1; \
  304. } \
  305. else if((__HANDLE__)->Instance == USART8) \
  306. { \
  307. (__CLOCKSOURCE__) = USART_CLOCKSOURCE_PCLK1; \
  308. } \
  309. else \
  310. { \
  311. (__CLOCKSOURCE__) = USART_CLOCKSOURCE_UNDEFINED; \
  312. } \
  313. } while(0)
  314. #elif defined(STM32F030xC)
  315. #define USART_GETCLOCKSOURCE(__HANDLE__,__CLOCKSOURCE__) \
  316. do { \
  317. if((__HANDLE__)->Instance == USART1) \
  318. { \
  319. switch(__HAL_RCC_GET_USART1_SOURCE()) \
  320. { \
  321. case RCC_USART1CLKSOURCE_PCLK1: \
  322. (__CLOCKSOURCE__) = USART_CLOCKSOURCE_PCLK1; \
  323. break; \
  324. case RCC_USART1CLKSOURCE_HSI: \
  325. (__CLOCKSOURCE__) = USART_CLOCKSOURCE_HSI; \
  326. break; \
  327. case RCC_USART1CLKSOURCE_SYSCLK: \
  328. (__CLOCKSOURCE__) = USART_CLOCKSOURCE_SYSCLK; \
  329. break; \
  330. case RCC_USART1CLKSOURCE_LSE: \
  331. (__CLOCKSOURCE__) = USART_CLOCKSOURCE_LSE; \
  332. break; \
  333. default: \
  334. (__CLOCKSOURCE__) = USART_CLOCKSOURCE_UNDEFINED; \
  335. break; \
  336. } \
  337. } \
  338. else if((__HANDLE__)->Instance == USART2) \
  339. { \
  340. (__CLOCKSOURCE__) = USART_CLOCKSOURCE_PCLK1; \
  341. } \
  342. else if((__HANDLE__)->Instance == USART3) \
  343. { \
  344. (__CLOCKSOURCE__) = USART_CLOCKSOURCE_PCLK1; \
  345. } \
  346. else if((__HANDLE__)->Instance == USART4) \
  347. { \
  348. (__CLOCKSOURCE__) = USART_CLOCKSOURCE_PCLK1; \
  349. } \
  350. else if((__HANDLE__)->Instance == USART5) \
  351. { \
  352. (__CLOCKSOURCE__) = USART_CLOCKSOURCE_PCLK1; \
  353. } \
  354. else if((__HANDLE__)->Instance == USART6) \
  355. { \
  356. (__CLOCKSOURCE__) = USART_CLOCKSOURCE_PCLK1; \
  357. } \
  358. else \
  359. { \
  360. (__CLOCKSOURCE__) = USART_CLOCKSOURCE_UNDEFINED; \
  361. } \
  362. } while(0)
  363. #endif /* defined(STM32F030x6) || defined(STM32F031x6) || defined(STM32F038xx) */
  364. /** @brief Compute the USART mask to apply to retrieve the received data
  365. * according to the word length and to the parity bits activation.
  366. * @note If PCE = 1, the parity bit is not included in the data extracted
  367. * by the reception API().
  368. * This masking operation is not carried out in the case of
  369. * DMA transfers.
  370. * @param __HANDLE__ specifies the USART Handle.
  371. * @retval None, the mask to apply to USART RDR register is stored in (__HANDLE__)->Mask field.
  372. */
  373. #if defined(USART_CR1_M0)&& defined(USART_CR1_M1)
  374. #define USART_MASK_COMPUTATION(__HANDLE__) \
  375. do { \
  376. if ((__HANDLE__)->Init.WordLength == USART_WORDLENGTH_9B) \
  377. { \
  378. if ((__HANDLE__)->Init.Parity == USART_PARITY_NONE) \
  379. { \
  380. (__HANDLE__)->Mask = 0x01FFU; \
  381. } \
  382. else \
  383. { \
  384. (__HANDLE__)->Mask = 0x00FFU; \
  385. } \
  386. } \
  387. else if ((__HANDLE__)->Init.WordLength == USART_WORDLENGTH_8B) \
  388. { \
  389. if ((__HANDLE__)->Init.Parity == USART_PARITY_NONE) \
  390. { \
  391. (__HANDLE__)->Mask = 0x00FFU; \
  392. } \
  393. else \
  394. { \
  395. (__HANDLE__)->Mask = 0x007FU; \
  396. } \
  397. } \
  398. else if ((__HANDLE__)->Init.WordLength == USART_WORDLENGTH_7B) \
  399. { \
  400. if ((__HANDLE__)->Init.Parity == USART_PARITY_NONE) \
  401. { \
  402. (__HANDLE__)->Mask = 0x007FU; \
  403. } \
  404. else \
  405. { \
  406. (__HANDLE__)->Mask = 0x003FU; \
  407. } \
  408. } \
  409. else \
  410. { \
  411. (__HANDLE__)->Mask = 0x0000U; \
  412. } \
  413. } while(0U)
  414. #elif defined(USART_CR1_M)
  415. #define USART_MASK_COMPUTATION(__HANDLE__) \
  416. do { \
  417. if ((__HANDLE__)->Init.WordLength == USART_WORDLENGTH_9B) \
  418. { \
  419. if ((__HANDLE__)->Init.Parity == USART_PARITY_NONE) \
  420. { \
  421. (__HANDLE__)->Mask = 0x01FFU; \
  422. } \
  423. else \
  424. { \
  425. (__HANDLE__)->Mask = 0x00FFU; \
  426. } \
  427. } \
  428. else if ((__HANDLE__)->Init.WordLength == USART_WORDLENGTH_8B) \
  429. { \
  430. if ((__HANDLE__)->Init.Parity == USART_PARITY_NONE) \
  431. { \
  432. (__HANDLE__)->Mask = 0x00FFU; \
  433. } \
  434. else \
  435. { \
  436. (__HANDLE__)->Mask = 0x007FU; \
  437. } \
  438. } \
  439. else \
  440. { \
  441. (__HANDLE__)->Mask = 0x0000U; \
  442. } \
  443. } while(0U)
  444. #endif /* USART_CR1_M0 && USART_CR1_M */
  445. /**
  446. * @brief Ensure that USART frame length is valid.
  447. * @param __LENGTH__ USART frame length.
  448. * @retval SET (__LENGTH__ is valid) or RESET (__LENGTH__ is invalid)
  449. */
  450. #if defined(USART_CR1_M0)&& defined(USART_CR1_M1)
  451. #define IS_USART_WORD_LENGTH(__LENGTH__) (((__LENGTH__) == USART_WORDLENGTH_7B) || \
  452. ((__LENGTH__) == USART_WORDLENGTH_8B) || \
  453. ((__LENGTH__) == USART_WORDLENGTH_9B))
  454. #elif defined(USART_CR1_M)
  455. #define IS_USART_WORD_LENGTH(__LENGTH__) (((__LENGTH__) == USART_WORDLENGTH_8B) || \
  456. ((__LENGTH__) == USART_WORDLENGTH_9B))
  457. #endif /* USART_CR1_M0 && USART_CR1_M */
  458. /**
  459. * @}
  460. */
  461. /* Exported functions --------------------------------------------------------*/
  462. /** @addtogroup USARTEx_Exported_Functions
  463. * @{
  464. */
  465. /** @addtogroup USARTEx_Exported_Functions_Group1
  466. * @{
  467. */
  468. /* IO operation functions *****************************************************/
  469. /**
  470. * @}
  471. */
  472. /** @addtogroup USARTEx_Exported_Functions_Group2
  473. * @{
  474. */
  475. /* Peripheral Control functions ***********************************************/
  476. /**
  477. * @}
  478. */
  479. /**
  480. * @}
  481. */
  482. /**
  483. * @}
  484. */
  485. /**
  486. * @}
  487. */
  488. #ifdef __cplusplus
  489. }
  490. #endif
  491. #endif /* STM32F0xx_HAL_USART_EX_H */