stm32l0xx_hal_uart_ex.h 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456
  1. /**
  2. ******************************************************************************
  3. * @file stm32l0xx_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 STM32L0xx_HAL_UART_EX_H
  20. #define STM32L0xx_HAL_UART_EX_H
  21. #ifdef __cplusplus
  22. extern "C" {
  23. #endif
  24. /* Includes ------------------------------------------------------------------*/
  25. #include "stm32l0xx_hal_def.h"
  26. /** @addtogroup STM32L0xx_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. /**
  74. * @}
  75. */
  76. /* Exported macros -----------------------------------------------------------*/
  77. /* Exported functions --------------------------------------------------------*/
  78. /** @addtogroup UARTEx_Exported_Functions
  79. * @{
  80. */
  81. /** @addtogroup UARTEx_Exported_Functions_Group1
  82. * @{
  83. */
  84. /* Initialization and de-initialization functions ****************************/
  85. HAL_StatusTypeDef HAL_RS485Ex_Init(UART_HandleTypeDef *huart, uint32_t Polarity, uint32_t AssertionTime,
  86. uint32_t DeassertionTime);
  87. /**
  88. * @}
  89. */
  90. /** @addtogroup UARTEx_Exported_Functions_Group2
  91. * @{
  92. */
  93. void HAL_UARTEx_WakeupCallback(UART_HandleTypeDef *huart);
  94. /**
  95. * @}
  96. */
  97. /** @addtogroup UARTEx_Exported_Functions_Group3
  98. * @{
  99. */
  100. /* Peripheral Control functions **********************************************/
  101. HAL_StatusTypeDef HAL_UARTEx_StopModeWakeUpSourceConfig(UART_HandleTypeDef *huart, UART_WakeUpTypeDef WakeUpSelection);
  102. HAL_StatusTypeDef HAL_UARTEx_EnableStopMode(UART_HandleTypeDef *huart);
  103. HAL_StatusTypeDef HAL_UARTEx_DisableStopMode(UART_HandleTypeDef *huart);
  104. HAL_StatusTypeDef HAL_UARTEx_EnableClockStopMode(UART_HandleTypeDef *huart);
  105. HAL_StatusTypeDef HAL_UARTEx_DisableClockStopMode(UART_HandleTypeDef *huart);
  106. HAL_StatusTypeDef HAL_MultiProcessorEx_AddressLength_Set(UART_HandleTypeDef *huart, uint32_t AddressLength);
  107. HAL_StatusTypeDef HAL_UARTEx_ReceiveToIdle(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint16_t *RxLen,
  108. uint32_t Timeout);
  109. HAL_StatusTypeDef HAL_UARTEx_ReceiveToIdle_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
  110. HAL_StatusTypeDef HAL_UARTEx_ReceiveToIdle_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
  111. HAL_UART_RxEventTypeTypeDef HAL_UARTEx_GetRxEventType(UART_HandleTypeDef *huart);
  112. /**
  113. * @}
  114. */
  115. /**
  116. * @}
  117. */
  118. /* Private macros ------------------------------------------------------------*/
  119. /** @defgroup UARTEx_Private_Macros UARTEx Private Macros
  120. * @{
  121. */
  122. /** @brief Report the UART clock source.
  123. * @param __HANDLE__ specifies the UART Handle.
  124. * @param __CLOCKSOURCE__ output variable.
  125. * @retval UART clocking source, written in __CLOCKSOURCE__.
  126. */
  127. #if defined (STM32L031xx) || defined (STM32L041xx) || defined (STM32L011xx) || defined (STM32L021xx) \
  128. || defined (STM32L010xB) || defined (STM32L010x8) || defined (STM32L010x6) || defined (STM32L010x4)
  129. #define UART_GETCLOCKSOURCE(__HANDLE__,__CLOCKSOURCE__) \
  130. do { \
  131. if((__HANDLE__)->Instance == USART2) \
  132. { \
  133. switch(__HAL_RCC_GET_USART2_SOURCE()) \
  134. { \
  135. case RCC_USART2CLKSOURCE_PCLK1: \
  136. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \
  137. break; \
  138. case RCC_USART2CLKSOURCE_HSI: \
  139. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI; \
  140. break; \
  141. case RCC_USART2CLKSOURCE_SYSCLK: \
  142. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK; \
  143. break; \
  144. case RCC_USART2CLKSOURCE_LSE: \
  145. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE; \
  146. break; \
  147. default: \
  148. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \
  149. break; \
  150. } \
  151. } \
  152. else if((__HANDLE__)->Instance == LPUART1) \
  153. { \
  154. switch(__HAL_RCC_GET_LPUART1_SOURCE()) \
  155. { \
  156. case RCC_LPUART1CLKSOURCE_PCLK1: \
  157. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \
  158. break; \
  159. case RCC_LPUART1CLKSOURCE_HSI: \
  160. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI; \
  161. break; \
  162. case RCC_LPUART1CLKSOURCE_SYSCLK: \
  163. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK; \
  164. break; \
  165. case RCC_LPUART1CLKSOURCE_LSE: \
  166. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE; \
  167. break; \
  168. default: \
  169. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \
  170. break; \
  171. } \
  172. } \
  173. else \
  174. { \
  175. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \
  176. } \
  177. } while(0)
  178. #elif defined (STM32L051xx) || defined (STM32L052xx) || defined (STM32L053xx) || defined (STM32L062xx) \
  179. || defined (STM32L063xx)
  180. #define UART_GETCLOCKSOURCE(__HANDLE__,__CLOCKSOURCE__) \
  181. do { \
  182. if((__HANDLE__)->Instance == USART1) \
  183. { \
  184. switch(__HAL_RCC_GET_USART1_SOURCE()) \
  185. { \
  186. case RCC_USART1CLKSOURCE_PCLK2: \
  187. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK2; \
  188. break; \
  189. case RCC_USART1CLKSOURCE_HSI: \
  190. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI; \
  191. break; \
  192. case RCC_USART1CLKSOURCE_SYSCLK: \
  193. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK; \
  194. break; \
  195. case RCC_USART1CLKSOURCE_LSE: \
  196. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE; \
  197. break; \
  198. default: \
  199. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \
  200. break; \
  201. } \
  202. } \
  203. else if((__HANDLE__)->Instance == USART2) \
  204. { \
  205. switch(__HAL_RCC_GET_USART2_SOURCE()) \
  206. { \
  207. case RCC_USART2CLKSOURCE_PCLK1: \
  208. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \
  209. break; \
  210. case RCC_USART2CLKSOURCE_HSI: \
  211. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI; \
  212. break; \
  213. case RCC_USART2CLKSOURCE_SYSCLK: \
  214. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK; \
  215. break; \
  216. case RCC_USART2CLKSOURCE_LSE: \
  217. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE; \
  218. break; \
  219. default: \
  220. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \
  221. break; \
  222. } \
  223. } \
  224. else if((__HANDLE__)->Instance == LPUART1) \
  225. { \
  226. switch(__HAL_RCC_GET_LPUART1_SOURCE()) \
  227. { \
  228. case RCC_LPUART1CLKSOURCE_PCLK1: \
  229. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \
  230. break; \
  231. case RCC_LPUART1CLKSOURCE_HSI: \
  232. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI; \
  233. break; \
  234. case RCC_LPUART1CLKSOURCE_SYSCLK: \
  235. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK; \
  236. break; \
  237. case RCC_LPUART1CLKSOURCE_LSE: \
  238. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE; \
  239. break; \
  240. default: \
  241. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \
  242. break; \
  243. } \
  244. } \
  245. else \
  246. { \
  247. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \
  248. } \
  249. } while(0)
  250. #else
  251. #define UART_GETCLOCKSOURCE(__HANDLE__,__CLOCKSOURCE__) \
  252. do { \
  253. if((__HANDLE__)->Instance == USART1) \
  254. { \
  255. switch(__HAL_RCC_GET_USART1_SOURCE()) \
  256. { \
  257. case RCC_USART1CLKSOURCE_PCLK2: \
  258. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK2; \
  259. break; \
  260. case RCC_USART1CLKSOURCE_HSI: \
  261. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI; \
  262. break; \
  263. case RCC_USART1CLKSOURCE_SYSCLK: \
  264. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK; \
  265. break; \
  266. case RCC_USART1CLKSOURCE_LSE: \
  267. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE; \
  268. break; \
  269. default: \
  270. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \
  271. break; \
  272. } \
  273. } \
  274. else if((__HANDLE__)->Instance == USART2) \
  275. { \
  276. switch(__HAL_RCC_GET_USART2_SOURCE()) \
  277. { \
  278. case RCC_USART2CLKSOURCE_PCLK1: \
  279. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \
  280. break; \
  281. case RCC_USART2CLKSOURCE_HSI: \
  282. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI; \
  283. break; \
  284. case RCC_USART2CLKSOURCE_SYSCLK: \
  285. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK; \
  286. break; \
  287. case RCC_USART2CLKSOURCE_LSE: \
  288. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE; \
  289. break; \
  290. default: \
  291. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \
  292. break; \
  293. } \
  294. } \
  295. else if((__HANDLE__)->Instance == USART4) \
  296. { \
  297. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \
  298. } \
  299. else if((__HANDLE__)->Instance == USART5) \
  300. { \
  301. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \
  302. } \
  303. else if((__HANDLE__)->Instance == LPUART1) \
  304. { \
  305. switch(__HAL_RCC_GET_LPUART1_SOURCE()) \
  306. { \
  307. case RCC_LPUART1CLKSOURCE_PCLK1: \
  308. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \
  309. break; \
  310. case RCC_LPUART1CLKSOURCE_HSI: \
  311. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI; \
  312. break; \
  313. case RCC_LPUART1CLKSOURCE_SYSCLK: \
  314. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK; \
  315. break; \
  316. case RCC_LPUART1CLKSOURCE_LSE: \
  317. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE; \
  318. break; \
  319. default: \
  320. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \
  321. break; \
  322. } \
  323. } \
  324. else \
  325. { \
  326. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \
  327. } \
  328. } while(0)
  329. #endif /* (STM32L031xx) || (STM32L041xx) || (STM32L011xx) || (STM32L021xx) || (STM32L010xB) ||
  330. (STM32L010x8) || (STM32L010x6) || (STM32L010x4)*/
  331. /** @brief Report the UART mask to apply to retrieve the received data
  332. * according to the word length and to the parity bits activation.
  333. * @note If PCE = 1, the parity bit is not included in the data extracted
  334. * by the reception API().
  335. * This masking operation is not carried out in the case of
  336. * DMA transfers.
  337. * @param __HANDLE__ specifies the UART Handle.
  338. * @retval None, the mask to apply to UART RDR register is stored in (__HANDLE__)->Mask field.
  339. */
  340. #define UART_MASK_COMPUTATION(__HANDLE__) \
  341. do { \
  342. if ((__HANDLE__)->Init.WordLength == UART_WORDLENGTH_9B) \
  343. { \
  344. if ((__HANDLE__)->Init.Parity == UART_PARITY_NONE) \
  345. { \
  346. (__HANDLE__)->Mask = 0x01FFU ; \
  347. } \
  348. else \
  349. { \
  350. (__HANDLE__)->Mask = 0x00FFU ; \
  351. } \
  352. } \
  353. else if ((__HANDLE__)->Init.WordLength == UART_WORDLENGTH_8B) \
  354. { \
  355. if ((__HANDLE__)->Init.Parity == UART_PARITY_NONE) \
  356. { \
  357. (__HANDLE__)->Mask = 0x00FFU ; \
  358. } \
  359. else \
  360. { \
  361. (__HANDLE__)->Mask = 0x007FU ; \
  362. } \
  363. } \
  364. else if ((__HANDLE__)->Init.WordLength == UART_WORDLENGTH_7B) \
  365. { \
  366. if ((__HANDLE__)->Init.Parity == UART_PARITY_NONE) \
  367. { \
  368. (__HANDLE__)->Mask = 0x007FU ; \
  369. } \
  370. else \
  371. { \
  372. (__HANDLE__)->Mask = 0x003FU ; \
  373. } \
  374. } \
  375. else \
  376. { \
  377. (__HANDLE__)->Mask = 0x0000U; \
  378. } \
  379. } while(0U)
  380. /**
  381. * @brief Ensure that UART frame length is valid.
  382. * @param __LENGTH__ UART frame length.
  383. * @retval SET (__LENGTH__ is valid) or RESET (__LENGTH__ is invalid)
  384. */
  385. #define IS_UART_WORD_LENGTH(__LENGTH__) (((__LENGTH__) == UART_WORDLENGTH_7B) || \
  386. ((__LENGTH__) == UART_WORDLENGTH_8B) || \
  387. ((__LENGTH__) == UART_WORDLENGTH_9B))
  388. /**
  389. * @brief Ensure that UART wake-up address length is valid.
  390. * @param __ADDRESS__ UART wake-up address length.
  391. * @retval SET (__ADDRESS__ is valid) or RESET (__ADDRESS__ is invalid)
  392. */
  393. #define IS_UART_ADDRESSLENGTH_DETECT(__ADDRESS__) (((__ADDRESS__) == UART_ADDRESS_DETECT_4B) || \
  394. ((__ADDRESS__) == UART_ADDRESS_DETECT_7B))
  395. /**
  396. * @}
  397. */
  398. /* Private functions ---------------------------------------------------------*/
  399. /**
  400. * @}
  401. */
  402. /**
  403. * @}
  404. */
  405. #ifdef __cplusplus
  406. }
  407. #endif
  408. #endif /* STM32L0xx_HAL_UART_EX_H */