stm32f3xx_hal_uart_ex.h 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513
  1. /**
  2. ******************************************************************************
  3. * @file stm32f3xx_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) 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 STM32F3xx_HAL_UART_EX_H
  20. #define STM32F3xx_HAL_UART_EX_H
  21. #ifdef __cplusplus
  22. extern "C" {
  23. #endif
  24. /* Includes ------------------------------------------------------------------*/
  25. #include "stm32f3xx_hal_def.h"
  26. /** @addtogroup STM32F3xx_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. #if defined(USART_CR1_M1)
  60. #define UART_WORDLENGTH_7B USART_CR1_M1 /*!< 7-bit long UART frame */
  61. #endif /* USART_CR1_M1 */
  62. #define UART_WORDLENGTH_8B 0x00000000U /*!< 8-bit long UART frame */
  63. #if defined (USART_CR1_M0)
  64. #define UART_WORDLENGTH_9B USART_CR1_M0 /*!< 9-bit long UART frame */
  65. #else
  66. #define UART_WORDLENGTH_9B USART_CR1_M /*!< 9-bit long UART frame */
  67. #endif /* USART_CR1_M0 */
  68. /**
  69. * @}
  70. */
  71. /** @defgroup UARTEx_WakeUp_Address_Length UARTEx WakeUp Address Length
  72. * @{
  73. */
  74. #define UART_ADDRESS_DETECT_4B 0x00000000U /*!< 4-bit long wake-up address */
  75. #define UART_ADDRESS_DETECT_7B USART_CR2_ADDM7 /*!< 7-bit long wake-up address */
  76. /**
  77. * @}
  78. */
  79. /**
  80. * @}
  81. */
  82. /* Exported macros -----------------------------------------------------------*/
  83. /* Exported functions --------------------------------------------------------*/
  84. /** @addtogroup UARTEx_Exported_Functions
  85. * @{
  86. */
  87. /** @addtogroup UARTEx_Exported_Functions_Group1
  88. * @{
  89. */
  90. /* Initialization and de-initialization functions ****************************/
  91. HAL_StatusTypeDef HAL_RS485Ex_Init(UART_HandleTypeDef *huart, uint32_t Polarity, uint32_t AssertionTime,
  92. uint32_t DeassertionTime);
  93. /**
  94. * @}
  95. */
  96. /** @addtogroup UARTEx_Exported_Functions_Group2
  97. * @{
  98. */
  99. void HAL_UARTEx_WakeupCallback(UART_HandleTypeDef *huart);
  100. /**
  101. * @}
  102. */
  103. /** @addtogroup UARTEx_Exported_Functions_Group3
  104. * @{
  105. */
  106. /* Peripheral Control functions **********************************************/
  107. HAL_StatusTypeDef HAL_UARTEx_StopModeWakeUpSourceConfig(UART_HandleTypeDef *huart, UART_WakeUpTypeDef WakeUpSelection);
  108. HAL_StatusTypeDef HAL_UARTEx_EnableStopMode(UART_HandleTypeDef *huart);
  109. HAL_StatusTypeDef HAL_UARTEx_DisableStopMode(UART_HandleTypeDef *huart);
  110. HAL_StatusTypeDef HAL_MultiProcessorEx_AddressLength_Set(UART_HandleTypeDef *huart, uint32_t AddressLength);
  111. HAL_StatusTypeDef HAL_UARTEx_ReceiveToIdle(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint16_t *RxLen,
  112. uint32_t Timeout);
  113. HAL_StatusTypeDef HAL_UARTEx_ReceiveToIdle_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
  114. HAL_StatusTypeDef HAL_UARTEx_ReceiveToIdle_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
  115. HAL_UART_RxEventTypeTypeDef HAL_UARTEx_GetRxEventType(const UART_HandleTypeDef *huart);
  116. /**
  117. * @}
  118. */
  119. /**
  120. * @}
  121. */
  122. /* Private macros ------------------------------------------------------------*/
  123. /** @defgroup UARTEx_Private_Macros UARTEx Private Macros
  124. * @{
  125. */
  126. /** @brief Report the UART clock source.
  127. * @param __HANDLE__ specifies the UART Handle.
  128. * @param __CLOCKSOURCE__ output variable.
  129. * @retval UART clocking source, written in __CLOCKSOURCE__.
  130. */
  131. #if defined(STM32F302xE) || defined(STM32F303xE) || defined(STM32F398xx) || defined(STM32F302xC) \
  132. || defined(STM32F303xC) || defined(STM32F358xx)
  133. #define UART_GETCLOCKSOURCE(__HANDLE__,__CLOCKSOURCE__) \
  134. do { \
  135. if((__HANDLE__)->Instance == USART1) \
  136. { \
  137. switch(__HAL_RCC_GET_USART1_SOURCE()) \
  138. { \
  139. case RCC_USART1CLKSOURCE_PCLK2: \
  140. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK2; \
  141. break; \
  142. case RCC_USART1CLKSOURCE_HSI: \
  143. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI; \
  144. break; \
  145. case RCC_USART1CLKSOURCE_SYSCLK: \
  146. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK; \
  147. break; \
  148. case RCC_USART1CLKSOURCE_LSE: \
  149. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE; \
  150. break; \
  151. default: \
  152. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \
  153. break; \
  154. } \
  155. } \
  156. else if((__HANDLE__)->Instance == USART2) \
  157. { \
  158. switch(__HAL_RCC_GET_USART2_SOURCE()) \
  159. { \
  160. case RCC_USART2CLKSOURCE_PCLK1: \
  161. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \
  162. break; \
  163. case RCC_USART2CLKSOURCE_HSI: \
  164. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI; \
  165. break; \
  166. case RCC_USART2CLKSOURCE_SYSCLK: \
  167. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK; \
  168. break; \
  169. case RCC_USART2CLKSOURCE_LSE: \
  170. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE; \
  171. break; \
  172. default: \
  173. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \
  174. break; \
  175. } \
  176. } \
  177. else if((__HANDLE__)->Instance == USART3) \
  178. { \
  179. switch(__HAL_RCC_GET_USART3_SOURCE()) \
  180. { \
  181. case RCC_USART3CLKSOURCE_PCLK1: \
  182. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \
  183. break; \
  184. case RCC_USART3CLKSOURCE_HSI: \
  185. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI; \
  186. break; \
  187. case RCC_USART3CLKSOURCE_SYSCLK: \
  188. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK; \
  189. break; \
  190. case RCC_USART3CLKSOURCE_LSE: \
  191. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE; \
  192. break; \
  193. default: \
  194. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \
  195. break; \
  196. } \
  197. } \
  198. else if((__HANDLE__)->Instance == UART4) \
  199. { \
  200. switch(__HAL_RCC_GET_UART4_SOURCE()) \
  201. { \
  202. case RCC_UART4CLKSOURCE_PCLK1: \
  203. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \
  204. break; \
  205. case RCC_UART4CLKSOURCE_HSI: \
  206. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI; \
  207. break; \
  208. case RCC_UART4CLKSOURCE_SYSCLK: \
  209. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK; \
  210. break; \
  211. case RCC_UART4CLKSOURCE_LSE: \
  212. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE; \
  213. break; \
  214. default: \
  215. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \
  216. break; \
  217. } \
  218. } \
  219. else if ((__HANDLE__)->Instance == UART5) \
  220. { \
  221. switch(__HAL_RCC_GET_UART5_SOURCE()) \
  222. { \
  223. case RCC_UART5CLKSOURCE_PCLK1: \
  224. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \
  225. break; \
  226. case RCC_UART5CLKSOURCE_HSI: \
  227. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI; \
  228. break; \
  229. case RCC_UART5CLKSOURCE_SYSCLK: \
  230. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK; \
  231. break; \
  232. case RCC_UART5CLKSOURCE_LSE: \
  233. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE; \
  234. break; \
  235. default: \
  236. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \
  237. break; \
  238. } \
  239. } \
  240. else \
  241. { \
  242. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \
  243. } \
  244. } while(0U)
  245. #elif defined(STM32F303x8) || defined(STM32F334x8) || defined(STM32F328xx) || defined(STM32F301x8) \
  246. || defined(STM32F302x8) || defined(STM32F318xx)
  247. #define UART_GETCLOCKSOURCE(__HANDLE__,__CLOCKSOURCE__) \
  248. do { \
  249. if((__HANDLE__)->Instance == USART1) \
  250. { \
  251. switch(__HAL_RCC_GET_USART1_SOURCE()) \
  252. { \
  253. case RCC_USART1CLKSOURCE_PCLK1: \
  254. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \
  255. break; \
  256. case RCC_USART1CLKSOURCE_HSI: \
  257. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI; \
  258. break; \
  259. case RCC_USART1CLKSOURCE_SYSCLK: \
  260. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK; \
  261. break; \
  262. case RCC_USART1CLKSOURCE_LSE: \
  263. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE; \
  264. break; \
  265. default: \
  266. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \
  267. break; \
  268. } \
  269. } \
  270. else if((__HANDLE__)->Instance == USART2) \
  271. { \
  272. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \
  273. } \
  274. else if((__HANDLE__)->Instance == USART3) \
  275. { \
  276. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \
  277. } \
  278. else \
  279. { \
  280. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \
  281. } \
  282. } while(0U)
  283. #else
  284. #define UART_GETCLOCKSOURCE(__HANDLE__,__CLOCKSOURCE__) \
  285. do { \
  286. if((__HANDLE__)->Instance == USART1) \
  287. { \
  288. switch(__HAL_RCC_GET_USART1_SOURCE()) \
  289. { \
  290. case RCC_USART1CLKSOURCE_PCLK2: \
  291. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK2; \
  292. break; \
  293. case RCC_USART1CLKSOURCE_HSI: \
  294. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI; \
  295. break; \
  296. case RCC_USART1CLKSOURCE_SYSCLK: \
  297. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK; \
  298. break; \
  299. case RCC_USART1CLKSOURCE_LSE: \
  300. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE; \
  301. break; \
  302. default: \
  303. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \
  304. break; \
  305. } \
  306. } \
  307. else if((__HANDLE__)->Instance == USART2) \
  308. { \
  309. switch(__HAL_RCC_GET_USART2_SOURCE()) \
  310. { \
  311. case RCC_USART2CLKSOURCE_PCLK1: \
  312. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \
  313. break; \
  314. case RCC_USART2CLKSOURCE_HSI: \
  315. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI; \
  316. break; \
  317. case RCC_USART2CLKSOURCE_SYSCLK: \
  318. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK; \
  319. break; \
  320. case RCC_USART2CLKSOURCE_LSE: \
  321. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE; \
  322. break; \
  323. default: \
  324. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \
  325. break; \
  326. } \
  327. } \
  328. else if((__HANDLE__)->Instance == USART3) \
  329. { \
  330. switch(__HAL_RCC_GET_USART3_SOURCE()) \
  331. { \
  332. case RCC_USART3CLKSOURCE_PCLK1: \
  333. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \
  334. break; \
  335. case RCC_USART3CLKSOURCE_HSI: \
  336. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI; \
  337. break; \
  338. case RCC_USART3CLKSOURCE_SYSCLK: \
  339. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK; \
  340. break; \
  341. case RCC_USART3CLKSOURCE_LSE: \
  342. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE; \
  343. break; \
  344. default: \
  345. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \
  346. break; \
  347. } \
  348. } \
  349. else \
  350. { \
  351. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \
  352. } \
  353. } while(0U)
  354. #endif /* STM32F302xE || STM32F303xE || STM32F398xx || STM32F302xC || STM32F303xC || STM32F358xx */
  355. /** @brief Report the UART mask to apply to retrieve the received data
  356. * according to the word length and to the parity bits activation.
  357. * @note If PCE = 1, the parity bit is not included in the data extracted
  358. * by the reception API().
  359. * This masking operation is not carried out in the case of
  360. * DMA transfers.
  361. * @param __HANDLE__ specifies the UART Handle.
  362. * @retval None, the mask to apply to UART RDR register is stored in (__HANDLE__)->Mask field.
  363. */
  364. #if defined (USART_CR1_M1)
  365. #define UART_MASK_COMPUTATION(__HANDLE__) \
  366. do { \
  367. if ((__HANDLE__)->Init.WordLength == UART_WORDLENGTH_9B) \
  368. { \
  369. if ((__HANDLE__)->Init.Parity == UART_PARITY_NONE) \
  370. { \
  371. (__HANDLE__)->Mask = 0x01FFU ; \
  372. } \
  373. else \
  374. { \
  375. (__HANDLE__)->Mask = 0x00FFU ; \
  376. } \
  377. } \
  378. else if ((__HANDLE__)->Init.WordLength == UART_WORDLENGTH_8B) \
  379. { \
  380. if ((__HANDLE__)->Init.Parity == UART_PARITY_NONE) \
  381. { \
  382. (__HANDLE__)->Mask = 0x00FFU ; \
  383. } \
  384. else \
  385. { \
  386. (__HANDLE__)->Mask = 0x007FU ; \
  387. } \
  388. } \
  389. else if ((__HANDLE__)->Init.WordLength == UART_WORDLENGTH_7B) \
  390. { \
  391. if ((__HANDLE__)->Init.Parity == UART_PARITY_NONE) \
  392. { \
  393. (__HANDLE__)->Mask = 0x007FU ; \
  394. } \
  395. else \
  396. { \
  397. (__HANDLE__)->Mask = 0x003FU ; \
  398. } \
  399. } \
  400. else \
  401. { \
  402. (__HANDLE__)->Mask = 0x0000U; \
  403. } \
  404. } while(0U)
  405. #else
  406. #define UART_MASK_COMPUTATION(__HANDLE__) \
  407. do { \
  408. if ((__HANDLE__)->Init.WordLength == UART_WORDLENGTH_9B) \
  409. { \
  410. if ((__HANDLE__)->Init.Parity == UART_PARITY_NONE) \
  411. { \
  412. (__HANDLE__)->Mask = 0x01FFU ; \
  413. } \
  414. else \
  415. { \
  416. (__HANDLE__)->Mask = 0x00FFU ; \
  417. } \
  418. } \
  419. else if ((__HANDLE__)->Init.WordLength == UART_WORDLENGTH_8B) \
  420. { \
  421. if ((__HANDLE__)->Init.Parity == UART_PARITY_NONE) \
  422. { \
  423. (__HANDLE__)->Mask = 0x00FFU ; \
  424. } \
  425. else \
  426. { \
  427. (__HANDLE__)->Mask = 0x007FU ; \
  428. } \
  429. } \
  430. else \
  431. { \
  432. (__HANDLE__)->Mask = 0x0000U; \
  433. } \
  434. } while(0U)
  435. #endif /* USART_CR1_M1 */
  436. /**
  437. * @brief Ensure that UART frame length is valid.
  438. * @param __LENGTH__ UART frame length.
  439. * @retval SET (__LENGTH__ is valid) or RESET (__LENGTH__ is invalid)
  440. */
  441. #if defined (USART_CR1_M1)
  442. #define IS_UART_WORD_LENGTH(__LENGTH__) (((__LENGTH__) == UART_WORDLENGTH_7B) || \
  443. ((__LENGTH__) == UART_WORDLENGTH_8B) || \
  444. ((__LENGTH__) == UART_WORDLENGTH_9B))
  445. #else
  446. #define IS_UART_WORD_LENGTH(__LENGTH__) (((__LENGTH__) == UART_WORDLENGTH_8B) || \
  447. ((__LENGTH__) == UART_WORDLENGTH_9B))
  448. #endif /* USART_CR1_M1 */
  449. /**
  450. * @brief Ensure that UART wake-up address length is valid.
  451. * @param __ADDRESS__ UART wake-up address length.
  452. * @retval SET (__ADDRESS__ is valid) or RESET (__ADDRESS__ is invalid)
  453. */
  454. #define IS_UART_ADDRESSLENGTH_DETECT(__ADDRESS__) (((__ADDRESS__) == UART_ADDRESS_DETECT_4B) || \
  455. ((__ADDRESS__) == UART_ADDRESS_DETECT_7B))
  456. /**
  457. * @}
  458. */
  459. /* Private functions ---------------------------------------------------------*/
  460. /**
  461. * @}
  462. */
  463. /**
  464. * @}
  465. */
  466. #ifdef __cplusplus
  467. }
  468. #endif
  469. #endif /* STM32F3xx_HAL_UART_EX_H */