You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

373 lines
18 KiB

  1. /**
  2. ******************************************************************************
  3. * @file stm32l4xx_hal_uart_ex.h
  4. * @author MCD Application Team
  5. * @version V1.3.0
  6. * @date 29-January-2016
  7. * @brief Header file of UART HAL Extended module.
  8. ******************************************************************************
  9. * @attention
  10. *
  11. * <h2><center>&copy; COPYRIGHT(c) 2016 STMicroelectronics</center></h2>
  12. *
  13. * Redistribution and use in source and binary forms, with or without modification,
  14. * are permitted provided that the following conditions are met:
  15. * 1. Redistributions of source code must retain the above copyright notice,
  16. * this list of conditions and the following disclaimer.
  17. * 2. Redistributions in binary form must reproduce the above copyright notice,
  18. * this list of conditions and the following disclaimer in the documentation
  19. * and/or other materials provided with the distribution.
  20. * 3. Neither the name of STMicroelectronics nor the names of its contributors
  21. * may be used to endorse or promote products derived from this software
  22. * without specific prior written permission.
  23. *
  24. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  25. * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  26. * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  27. * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
  28. * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  29. * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
  30. * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  31. * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  32. * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  33. * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  34. *
  35. ******************************************************************************
  36. */
  37. /* Define to prevent recursive inclusion -------------------------------------*/
  38. #ifndef __STM32L4xx_HAL_UART_EX_H
  39. #define __STM32L4xx_HAL_UART_EX_H
  40. #ifdef __cplusplus
  41. extern "C" {
  42. #endif
  43. /* Includes ------------------------------------------------------------------*/
  44. #include "stm32l4xx_hal_def.h"
  45. /** @addtogroup STM32L4xx_HAL_Driver
  46. * @{
  47. */
  48. /** @addtogroup UARTEx
  49. * @{
  50. */
  51. /* Exported types ------------------------------------------------------------*/
  52. /** @defgroup UARTEx_Exported_Types UARTEx Exported Types
  53. * @{
  54. */
  55. /**
  56. * @brief UART wake up from stop mode parameters
  57. */
  58. typedef struct
  59. {
  60. uint32_t WakeUpEvent; /*!< Specifies which event will activat the Wakeup from Stop mode flag (WUF).
  61. This parameter can be a value of @ref UART_WakeUp_from_Stop_Selection.
  62. If set to UART_WAKEUP_ON_ADDRESS, the two other fields below must
  63. be filled up. */
  64. uint16_t AddressLength; /*!< Specifies whether the address is 4 or 7-bit long.
  65. This parameter can be a value of @ref UARTEx_WakeUp_Address_Length. */
  66. uint8_t Address; /*!< UART/USART node address (7-bit long max). */
  67. } UART_WakeUpTypeDef;
  68. /**
  69. * @}
  70. */
  71. /* Exported constants --------------------------------------------------------*/
  72. /** @defgroup UARTEx_Exported_Constants UARTEx Exported Constants
  73. * @{
  74. */
  75. /** @defgroup UARTEx_Word_Length UART Word Length
  76. * @{
  77. */
  78. #define UART_WORDLENGTH_7B ((uint32_t)USART_CR1_M1) /*!< 7-bit long UART frame */
  79. #define UART_WORDLENGTH_8B ((uint32_t)0x00000000) /*!< 8-bit long UART frame */
  80. #define UART_WORDLENGTH_9B ((uint32_t)USART_CR1_M0) /*!< 9-bit long UART frame */
  81. /**
  82. * @}
  83. */
  84. /** @defgroup UARTEx_WakeUp_Address_Length UART Extended WakeUp Address Length
  85. * @{
  86. */
  87. #define UART_ADDRESS_DETECT_4B ((uint32_t)0x00000000) /*!< 4-bit long wake-up address */
  88. #define UART_ADDRESS_DETECT_7B ((uint32_t)USART_CR2_ADDM7) /*!< 7-bit long wake-up address */
  89. /**
  90. * @}
  91. */
  92. /**
  93. * @}
  94. */
  95. /* Exported macros -----------------------------------------------------------*/
  96. /* Exported functions --------------------------------------------------------*/
  97. /** @addtogroup UARTEx_Exported_Functions
  98. * @{
  99. */
  100. /** @addtogroup UARTEx_Exported_Functions_Group1
  101. * @{
  102. */
  103. /* Initialization and de-initialization functions ****************************/
  104. HAL_StatusTypeDef HAL_RS485Ex_Init(UART_HandleTypeDef *huart, uint32_t Polarity, uint32_t AssertionTime, uint32_t DeassertionTime);
  105. /**
  106. * @}
  107. */
  108. /* IO operation functions *****************************************************/
  109. /** @addtogroup UARTEx_Exported_Functions_Group3
  110. * @{
  111. */
  112. /* Peripheral Control functions **********************************************/
  113. HAL_StatusTypeDef HAL_UARTEx_StopModeWakeUpSourceConfig(UART_HandleTypeDef *huart, UART_WakeUpTypeDef WakeUpSelection);
  114. HAL_StatusTypeDef HAL_UARTEx_EnableStopMode(UART_HandleTypeDef *huart);
  115. HAL_StatusTypeDef HAL_UARTEx_DisableStopMode(UART_HandleTypeDef *huart);
  116. HAL_StatusTypeDef HAL_MultiProcessorEx_AddressLength_Set(UART_HandleTypeDef *huart, uint32_t AddressLength);
  117. void HAL_UARTEx_WakeupCallback(UART_HandleTypeDef *huart);
  118. /**
  119. * @}
  120. */
  121. /**
  122. * @}
  123. */
  124. /* Private macros ------------------------------------------------------------*/
  125. /** @defgroup UARTEx_Private_Macros UARTEx Private Macros
  126. * @{
  127. */
  128. /** @brief Report the UART clock source.
  129. * @param __HANDLE__: specifies the UART Handle.
  130. * @param __CLOCKSOURCE__: output variable.
  131. * @retval UART clocking source, written in __CLOCKSOURCE__.
  132. */
  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 if((__HANDLE__)->Instance == LPUART1) \
  241. { \
  242. switch(__HAL_RCC_GET_LPUART1_SOURCE()) \
  243. { \
  244. case RCC_LPUART1CLKSOURCE_PCLK1: \
  245. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \
  246. break; \
  247. case RCC_LPUART1CLKSOURCE_HSI: \
  248. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI; \
  249. break; \
  250. case RCC_LPUART1CLKSOURCE_SYSCLK: \
  251. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK; \
  252. break; \
  253. case RCC_LPUART1CLKSOURCE_LSE: \
  254. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE; \
  255. break; \
  256. default: \
  257. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \
  258. break; \
  259. } \
  260. } \
  261. } while(0)
  262. /** @brief Report the UART mask to apply to retrieve the received data
  263. * according to the word length and to the parity bits activation.
  264. * @note If PCE = 1, the parity bit is not included in the data extracted
  265. * by the reception API().
  266. * This masking operation is not carried out in the case of
  267. * DMA transfers.
  268. * @param __HANDLE__: specifies the UART Handle.
  269. * @retval None, the mask to apply to UART RDR register is stored in (__HANDLE__)->Mask field.
  270. */
  271. #define UART_MASK_COMPUTATION(__HANDLE__) \
  272. do { \
  273. if ((__HANDLE__)->Init.WordLength == UART_WORDLENGTH_9B) \
  274. { \
  275. if ((__HANDLE__)->Init.Parity == UART_PARITY_NONE) \
  276. { \
  277. (__HANDLE__)->Mask = 0x01FF ; \
  278. } \
  279. else \
  280. { \
  281. (__HANDLE__)->Mask = 0x00FF ; \
  282. } \
  283. } \
  284. else if ((__HANDLE__)->Init.WordLength == UART_WORDLENGTH_8B) \
  285. { \
  286. if ((__HANDLE__)->Init.Parity == UART_PARITY_NONE) \
  287. { \
  288. (__HANDLE__)->Mask = 0x00FF ; \
  289. } \
  290. else \
  291. { \
  292. (__HANDLE__)->Mask = 0x007F ; \
  293. } \
  294. } \
  295. else if ((__HANDLE__)->Init.WordLength == UART_WORDLENGTH_7B) \
  296. { \
  297. if ((__HANDLE__)->Init.Parity == UART_PARITY_NONE) \
  298. { \
  299. (__HANDLE__)->Mask = 0x007F ; \
  300. } \
  301. else \
  302. { \
  303. (__HANDLE__)->Mask = 0x003F ; \
  304. } \
  305. } \
  306. } while(0)
  307. /**
  308. * @brief Ensure that UART frame length is valid.
  309. * @param __LENGTH__: UART frame length.
  310. * @retval SET (__LENGTH__ is valid) or RESET (__LENGTH__ is invalid)
  311. */
  312. #define IS_UART_WORD_LENGTH(__LENGTH__) (((__LENGTH__) == UART_WORDLENGTH_7B) || \
  313. ((__LENGTH__) == UART_WORDLENGTH_8B) || \
  314. ((__LENGTH__) == UART_WORDLENGTH_9B))
  315. /**
  316. * @brief Ensure that UART wake-up address length is valid.
  317. * @param __ADDRESS__: UART wake-up address length.
  318. * @retval SET (__ADDRESS__ is valid) or RESET (__ADDRESS__ is invalid)
  319. */
  320. #define IS_UART_ADDRESSLENGTH_DETECT(__ADDRESS__) (((__ADDRESS__) == UART_ADDRESS_DETECT_4B) || \
  321. ((__ADDRESS__) == UART_ADDRESS_DETECT_7B))
  322. /**
  323. * @}
  324. */
  325. /* Private functions ---------------------------------------------------------*/
  326. /**
  327. * @}
  328. */
  329. /**
  330. * @}
  331. */
  332. #ifdef __cplusplus
  333. }
  334. #endif
  335. #endif /* __STM32L4xx_HAL_UART_EX_H */
  336. /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/