stm32f7xx_hal_uart_ex.h 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430
  1. /**
  2. ******************************************************************************
  3. * @file stm32f7xx_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) 2017 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 STM32F7xx_HAL_UART_EX_H
  20. #define STM32F7xx_HAL_UART_EX_H
  21. #ifdef __cplusplus
  22. extern "C" {
  23. #endif
  24. /* Includes ------------------------------------------------------------------*/
  25. #include "stm32f7xx_hal_def.h"
  26. /** @addtogroup STM32F7xx_HAL_Driver
  27. * @{
  28. */
  29. /** @addtogroup UARTEx
  30. * @{
  31. */
  32. /* Exported types ------------------------------------------------------------*/
  33. /** @defgroup UARTEx_Exported_Types UARTEx Exported Types
  34. * @{
  35. */
  36. #if defined(USART_CR1_UESM)
  37. /**
  38. * @brief UART wake up from stop mode parameters
  39. */
  40. typedef struct
  41. {
  42. uint32_t WakeUpEvent; /*!< Specifies which event will activate the Wakeup from Stop mode flag (WUF).
  43. This parameter can be a value of @ref UART_WakeUp_from_Stop_Selection.
  44. If set to UART_WAKEUP_ON_ADDRESS, the two other fields below must
  45. be filled up. */
  46. uint16_t AddressLength; /*!< Specifies whether the address is 4 or 7-bit long.
  47. This parameter can be a value of @ref UARTEx_WakeUp_Address_Length. */
  48. uint8_t Address; /*!< UART/USART node address (7-bit long max). */
  49. } UART_WakeUpTypeDef;
  50. #endif /* USART_CR1_UESM */
  51. /**
  52. * @}
  53. */
  54. /* Exported constants --------------------------------------------------------*/
  55. /** @defgroup UARTEx_Exported_Constants UARTEx Exported Constants
  56. * @{
  57. */
  58. /** @defgroup UARTEx_Word_Length UARTEx Word Length
  59. * @{
  60. */
  61. #define UART_WORDLENGTH_7B USART_CR1_M1 /*!< 7-bit long UART frame */
  62. #define UART_WORDLENGTH_8B 0x00000000U /*!< 8-bit long UART frame */
  63. #define UART_WORDLENGTH_9B USART_CR1_M0 /*!< 9-bit long UART frame */
  64. /**
  65. * @}
  66. */
  67. /** @defgroup UARTEx_WakeUp_Address_Length UARTEx WakeUp Address Length
  68. * @{
  69. */
  70. #define UART_ADDRESS_DETECT_4B 0x00000000U /*!< 4-bit long wake-up address */
  71. #define UART_ADDRESS_DETECT_7B USART_CR2_ADDM7 /*!< 7-bit long wake-up address */
  72. /**
  73. * @}
  74. */
  75. /**
  76. * @}
  77. */
  78. /* Exported macros -----------------------------------------------------------*/
  79. /* Exported functions --------------------------------------------------------*/
  80. /** @addtogroup UARTEx_Exported_Functions
  81. * @{
  82. */
  83. /** @addtogroup UARTEx_Exported_Functions_Group1
  84. * @{
  85. */
  86. /* Initialization and de-initialization functions ****************************/
  87. HAL_StatusTypeDef HAL_RS485Ex_Init(UART_HandleTypeDef *huart, uint32_t Polarity, uint32_t AssertionTime,
  88. uint32_t DeassertionTime);
  89. /**
  90. * @}
  91. */
  92. /** @addtogroup UARTEx_Exported_Functions_Group2
  93. * @{
  94. */
  95. #if defined(USART_CR1_UESM)
  96. void HAL_UARTEx_WakeupCallback(UART_HandleTypeDef *huart);
  97. #endif /* USART_CR1_UESM */
  98. /**
  99. * @}
  100. */
  101. /** @addtogroup UARTEx_Exported_Functions_Group3
  102. * @{
  103. */
  104. /* Peripheral Control functions **********************************************/
  105. #if defined(USART_CR1_UESM)
  106. HAL_StatusTypeDef HAL_UARTEx_StopModeWakeUpSourceConfig(UART_HandleTypeDef *huart, UART_WakeUpTypeDef WakeUpSelection);
  107. HAL_StatusTypeDef HAL_UARTEx_EnableStopMode(UART_HandleTypeDef *huart);
  108. HAL_StatusTypeDef HAL_UARTEx_DisableStopMode(UART_HandleTypeDef *huart);
  109. #endif /* USART_CR1_UESM */
  110. #if defined(USART_CR3_UCESM)
  111. HAL_StatusTypeDef HAL_UARTEx_EnableClockStopMode(UART_HandleTypeDef *huart);
  112. HAL_StatusTypeDef HAL_UARTEx_DisableClockStopMode(UART_HandleTypeDef *huart);
  113. #endif /* USART_CR3_UCESM */
  114. HAL_StatusTypeDef HAL_MultiProcessorEx_AddressLength_Set(UART_HandleTypeDef *huart, uint32_t AddressLength);
  115. HAL_StatusTypeDef HAL_UARTEx_ReceiveToIdle(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint16_t *RxLen,
  116. uint32_t Timeout);
  117. HAL_StatusTypeDef HAL_UARTEx_ReceiveToIdle_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
  118. HAL_StatusTypeDef HAL_UARTEx_ReceiveToIdle_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
  119. HAL_UART_RxEventTypeTypeDef HAL_UARTEx_GetRxEventType(UART_HandleTypeDef *huart);
  120. /**
  121. * @}
  122. */
  123. /**
  124. * @}
  125. */
  126. /* Private macros ------------------------------------------------------------*/
  127. /** @defgroup UARTEx_Private_Macros UARTEx Private Macros
  128. * @{
  129. */
  130. /** @brief Report the UART clock source.
  131. * @param __HANDLE__ specifies the UART Handle.
  132. * @param __CLOCKSOURCE__ output variable.
  133. * @retval UART clocking source, written in __CLOCKSOURCE__.
  134. */
  135. #define UART_GETCLOCKSOURCE(__HANDLE__,__CLOCKSOURCE__) \
  136. do { \
  137. if((__HANDLE__)->Instance == USART1) \
  138. { \
  139. switch(__HAL_RCC_GET_USART1_SOURCE()) \
  140. { \
  141. case RCC_USART1CLKSOURCE_PCLK2: \
  142. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK2; \
  143. break; \
  144. case RCC_USART1CLKSOURCE_HSI: \
  145. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI; \
  146. break; \
  147. case RCC_USART1CLKSOURCE_SYSCLK: \
  148. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK; \
  149. break; \
  150. case RCC_USART1CLKSOURCE_LSE: \
  151. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE; \
  152. break; \
  153. default: \
  154. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \
  155. break; \
  156. } \
  157. } \
  158. else if((__HANDLE__)->Instance == USART2) \
  159. { \
  160. switch(__HAL_RCC_GET_USART2_SOURCE()) \
  161. { \
  162. case RCC_USART2CLKSOURCE_PCLK1: \
  163. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \
  164. break; \
  165. case RCC_USART2CLKSOURCE_HSI: \
  166. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI; \
  167. break; \
  168. case RCC_USART2CLKSOURCE_SYSCLK: \
  169. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK; \
  170. break; \
  171. case RCC_USART2CLKSOURCE_LSE: \
  172. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE; \
  173. break; \
  174. default: \
  175. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \
  176. break; \
  177. } \
  178. } \
  179. else if((__HANDLE__)->Instance == USART3) \
  180. { \
  181. switch(__HAL_RCC_GET_USART3_SOURCE()) \
  182. { \
  183. case RCC_USART3CLKSOURCE_PCLK1: \
  184. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \
  185. break; \
  186. case RCC_USART3CLKSOURCE_HSI: \
  187. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI; \
  188. break; \
  189. case RCC_USART3CLKSOURCE_SYSCLK: \
  190. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK; \
  191. break; \
  192. case RCC_USART3CLKSOURCE_LSE: \
  193. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE; \
  194. break; \
  195. default: \
  196. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \
  197. break; \
  198. } \
  199. } \
  200. else if((__HANDLE__)->Instance == UART4) \
  201. { \
  202. switch(__HAL_RCC_GET_UART4_SOURCE()) \
  203. { \
  204. case RCC_UART4CLKSOURCE_PCLK1: \
  205. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \
  206. break; \
  207. case RCC_UART4CLKSOURCE_HSI: \
  208. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI; \
  209. break; \
  210. case RCC_UART4CLKSOURCE_SYSCLK: \
  211. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK; \
  212. break; \
  213. case RCC_UART4CLKSOURCE_LSE: \
  214. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE; \
  215. break; \
  216. default: \
  217. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \
  218. break; \
  219. } \
  220. } \
  221. else if ((__HANDLE__)->Instance == UART5) \
  222. { \
  223. switch(__HAL_RCC_GET_UART5_SOURCE()) \
  224. { \
  225. case RCC_UART5CLKSOURCE_PCLK1: \
  226. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \
  227. break; \
  228. case RCC_UART5CLKSOURCE_HSI: \
  229. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI; \
  230. break; \
  231. case RCC_UART5CLKSOURCE_SYSCLK: \
  232. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK; \
  233. break; \
  234. case RCC_UART5CLKSOURCE_LSE: \
  235. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE; \
  236. break; \
  237. default: \
  238. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \
  239. break; \
  240. } \
  241. } \
  242. else if((__HANDLE__)->Instance == USART6) \
  243. { \
  244. switch(__HAL_RCC_GET_USART6_SOURCE()) \
  245. { \
  246. case RCC_USART6CLKSOURCE_PCLK2: \
  247. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK2; \
  248. break; \
  249. case RCC_USART6CLKSOURCE_HSI: \
  250. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI; \
  251. break; \
  252. case RCC_USART6CLKSOURCE_SYSCLK: \
  253. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK; \
  254. break; \
  255. case RCC_USART6CLKSOURCE_LSE: \
  256. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE; \
  257. break; \
  258. default: \
  259. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \
  260. break; \
  261. } \
  262. } \
  263. else if ((__HANDLE__)->Instance == UART7) \
  264. { \
  265. switch(__HAL_RCC_GET_UART7_SOURCE()) \
  266. { \
  267. case RCC_UART7CLKSOURCE_PCLK1: \
  268. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \
  269. break; \
  270. case RCC_UART7CLKSOURCE_HSI: \
  271. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI; \
  272. break; \
  273. case RCC_UART7CLKSOURCE_SYSCLK: \
  274. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK; \
  275. break; \
  276. case RCC_UART7CLKSOURCE_LSE: \
  277. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE; \
  278. break; \
  279. default: \
  280. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \
  281. break; \
  282. } \
  283. } \
  284. else if ((__HANDLE__)->Instance == UART8) \
  285. { \
  286. switch(__HAL_RCC_GET_UART8_SOURCE()) \
  287. { \
  288. case RCC_UART8CLKSOURCE_PCLK1: \
  289. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \
  290. break; \
  291. case RCC_UART8CLKSOURCE_HSI: \
  292. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI; \
  293. break; \
  294. case RCC_UART8CLKSOURCE_SYSCLK: \
  295. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK; \
  296. break; \
  297. case RCC_UART8CLKSOURCE_LSE: \
  298. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE; \
  299. break; \
  300. default: \
  301. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \
  302. break; \
  303. } \
  304. } \
  305. else \
  306. { \
  307. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \
  308. } \
  309. } while(0U)
  310. /** @brief Report the UART mask to apply to retrieve the received data
  311. * according to the word length and to the parity bits activation.
  312. * @note If PCE = 1, the parity bit is not included in the data extracted
  313. * by the reception API().
  314. * This masking operation is not carried out in the case of
  315. * DMA transfers.
  316. * @param __HANDLE__ specifies the UART Handle.
  317. * @retval None, the mask to apply to UART RDR register is stored in (__HANDLE__)->Mask field.
  318. */
  319. #define UART_MASK_COMPUTATION(__HANDLE__) \
  320. do { \
  321. if ((__HANDLE__)->Init.WordLength == UART_WORDLENGTH_9B) \
  322. { \
  323. if ((__HANDLE__)->Init.Parity == UART_PARITY_NONE) \
  324. { \
  325. (__HANDLE__)->Mask = 0x01FFU ; \
  326. } \
  327. else \
  328. { \
  329. (__HANDLE__)->Mask = 0x00FFU ; \
  330. } \
  331. } \
  332. else if ((__HANDLE__)->Init.WordLength == UART_WORDLENGTH_8B) \
  333. { \
  334. if ((__HANDLE__)->Init.Parity == UART_PARITY_NONE) \
  335. { \
  336. (__HANDLE__)->Mask = 0x00FFU ; \
  337. } \
  338. else \
  339. { \
  340. (__HANDLE__)->Mask = 0x007FU ; \
  341. } \
  342. } \
  343. else if ((__HANDLE__)->Init.WordLength == UART_WORDLENGTH_7B) \
  344. { \
  345. if ((__HANDLE__)->Init.Parity == UART_PARITY_NONE) \
  346. { \
  347. (__HANDLE__)->Mask = 0x007FU ; \
  348. } \
  349. else \
  350. { \
  351. (__HANDLE__)->Mask = 0x003FU ; \
  352. } \
  353. } \
  354. else \
  355. { \
  356. (__HANDLE__)->Mask = 0x0000U; \
  357. } \
  358. } while(0U)
  359. /**
  360. * @brief Ensure that UART frame length is valid.
  361. * @param __LENGTH__ UART frame length.
  362. * @retval SET (__LENGTH__ is valid) or RESET (__LENGTH__ is invalid)
  363. */
  364. #define IS_UART_WORD_LENGTH(__LENGTH__) (((__LENGTH__) == UART_WORDLENGTH_7B) || \
  365. ((__LENGTH__) == UART_WORDLENGTH_8B) || \
  366. ((__LENGTH__) == UART_WORDLENGTH_9B))
  367. /**
  368. * @brief Ensure that UART wake-up address length is valid.
  369. * @param __ADDRESS__ UART wake-up address length.
  370. * @retval SET (__ADDRESS__ is valid) or RESET (__ADDRESS__ is invalid)
  371. */
  372. #define IS_UART_ADDRESSLENGTH_DETECT(__ADDRESS__) (((__ADDRESS__) == UART_ADDRESS_DETECT_4B) || \
  373. ((__ADDRESS__) == UART_ADDRESS_DETECT_7B))
  374. /**
  375. * @}
  376. */
  377. /* Private functions ---------------------------------------------------------*/
  378. /**
  379. * @}
  380. */
  381. /**
  382. * @}
  383. */
  384. #ifdef __cplusplus
  385. }
  386. #endif
  387. #endif /* STM32F7xx_HAL_UART_EX_H */