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.
 
 
 

366 lines
18 KiB

  1. /**
  2. ******************************************************************************
  3. * @file stm32f7xx_hal_uart_ex.h
  4. * @author MCD Application Team
  5. * @version V1.2.2
  6. * @date 14-April-2017
  7. * @brief Header file of UART HAL Extension module.
  8. ******************************************************************************
  9. * @attention
  10. *
  11. * <h2><center>&copy; COPYRIGHT(c) 2017 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 __STM32F7xx_HAL_UART_EX_H
  39. #define __STM32F7xx_HAL_UART_EX_H
  40. #ifdef __cplusplus
  41. extern "C" {
  42. #endif
  43. /* Includes ------------------------------------------------------------------*/
  44. #include "stm32f7xx_hal_def.h"
  45. /** @addtogroup STM32F7xx_HAL_Driver
  46. * @{
  47. */
  48. /** @addtogroup UARTEx
  49. * @{
  50. */
  51. /* Exported types ------------------------------------------------------------*/
  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 ((uint32_t)USART_CR1_M_1)
  60. #define UART_WORDLENGTH_8B ((uint32_t)0x0000U)
  61. #define UART_WORDLENGTH_9B ((uint32_t)USART_CR1_M_0)
  62. #define IS_UART_WORD_LENGTH(__LENGTH__) (((__LENGTH__) == UART_WORDLENGTH_7B) || \
  63. ((__LENGTH__) == UART_WORDLENGTH_8B) || \
  64. ((__LENGTH__) == UART_WORDLENGTH_9B))
  65. #define IS_LIN_WORD_LENGTH(LENGTH) (((LENGTH) == UART_WORDLENGTH_8B))
  66. /**
  67. * @}
  68. */
  69. /** @defgroup UARTEx_WakeUp_Address_Length UARTEx WakeUp Address Length
  70. * @{
  71. */
  72. #define UART_ADDRESS_DETECT_4B ((uint32_t)0x00000000U)
  73. #define UART_ADDRESS_DETECT_7B ((uint32_t)USART_CR2_ADDM7)
  74. #define IS_UART_ADDRESSLENGTH_DETECT(__ADDRESS__) (((__ADDRESS__) == UART_ADDRESS_DETECT_4B) || \
  75. ((__ADDRESS__) == UART_ADDRESS_DETECT_7B))
  76. /**
  77. * @}
  78. */
  79. /**
  80. * @}
  81. */
  82. /* Exported macro ------------------------------------------------------------*/
  83. /** @defgroup UARTEx_Exported_Macros UARTEx Exported Macros
  84. * @{
  85. */
  86. /** @brief Reports the UART clock source.
  87. * @param __HANDLE__: specifies the UART Handle
  88. * @param __CLOCKSOURCE__: output variable
  89. * @retval UART clocking source, written in __CLOCKSOURCE__.
  90. */
  91. #define UART_GETCLOCKSOURCE(__HANDLE__,__CLOCKSOURCE__) \
  92. do { \
  93. if((__HANDLE__)->Instance == USART1) \
  94. { \
  95. switch(__HAL_RCC_GET_USART1_SOURCE()) \
  96. { \
  97. case RCC_USART1CLKSOURCE_PCLK2: \
  98. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK2; \
  99. break; \
  100. case RCC_USART1CLKSOURCE_HSI: \
  101. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI; \
  102. break; \
  103. case RCC_USART1CLKSOURCE_SYSCLK: \
  104. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK; \
  105. break; \
  106. case RCC_USART1CLKSOURCE_LSE: \
  107. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE; \
  108. break; \
  109. default: \
  110. break; \
  111. } \
  112. } \
  113. else if((__HANDLE__)->Instance == USART2) \
  114. { \
  115. switch(__HAL_RCC_GET_USART2_SOURCE()) \
  116. { \
  117. case RCC_USART2CLKSOURCE_PCLK1: \
  118. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \
  119. break; \
  120. case RCC_USART2CLKSOURCE_HSI: \
  121. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI; \
  122. break; \
  123. case RCC_USART2CLKSOURCE_SYSCLK: \
  124. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK; \
  125. break; \
  126. case RCC_USART2CLKSOURCE_LSE: \
  127. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE; \
  128. break; \
  129. default: \
  130. break; \
  131. } \
  132. } \
  133. else if((__HANDLE__)->Instance == USART3) \
  134. { \
  135. switch(__HAL_RCC_GET_USART3_SOURCE()) \
  136. { \
  137. case RCC_USART3CLKSOURCE_PCLK1: \
  138. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \
  139. break; \
  140. case RCC_USART3CLKSOURCE_HSI: \
  141. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI; \
  142. break; \
  143. case RCC_USART3CLKSOURCE_SYSCLK: \
  144. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK; \
  145. break; \
  146. case RCC_USART3CLKSOURCE_LSE: \
  147. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE; \
  148. break; \
  149. default: \
  150. break; \
  151. } \
  152. } \
  153. else if((__HANDLE__)->Instance == UART4) \
  154. { \
  155. switch(__HAL_RCC_GET_UART4_SOURCE()) \
  156. { \
  157. case RCC_UART4CLKSOURCE_PCLK1: \
  158. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \
  159. break; \
  160. case RCC_UART4CLKSOURCE_HSI: \
  161. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI; \
  162. break; \
  163. case RCC_UART4CLKSOURCE_SYSCLK: \
  164. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK; \
  165. break; \
  166. case RCC_UART4CLKSOURCE_LSE: \
  167. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE; \
  168. break; \
  169. default: \
  170. break; \
  171. } \
  172. } \
  173. else if ((__HANDLE__)->Instance == UART5) \
  174. { \
  175. switch(__HAL_RCC_GET_UART5_SOURCE()) \
  176. { \
  177. case RCC_UART5CLKSOURCE_PCLK1: \
  178. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \
  179. break; \
  180. case RCC_UART5CLKSOURCE_HSI: \
  181. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI; \
  182. break; \
  183. case RCC_UART5CLKSOURCE_SYSCLK: \
  184. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK; \
  185. break; \
  186. case RCC_UART5CLKSOURCE_LSE: \
  187. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE; \
  188. break; \
  189. default: \
  190. break; \
  191. } \
  192. } \
  193. else if((__HANDLE__)->Instance == USART6) \
  194. { \
  195. switch(__HAL_RCC_GET_USART6_SOURCE()) \
  196. { \
  197. case RCC_USART6CLKSOURCE_PCLK2: \
  198. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK2; \
  199. break; \
  200. case RCC_USART6CLKSOURCE_HSI: \
  201. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI; \
  202. break; \
  203. case RCC_USART6CLKSOURCE_SYSCLK: \
  204. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK; \
  205. break; \
  206. case RCC_USART6CLKSOURCE_LSE: \
  207. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE; \
  208. break; \
  209. default: \
  210. break; \
  211. } \
  212. } \
  213. else if ((__HANDLE__)->Instance == UART7) \
  214. { \
  215. switch(__HAL_RCC_GET_UART7_SOURCE()) \
  216. { \
  217. case RCC_UART7CLKSOURCE_PCLK1: \
  218. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \
  219. break; \
  220. case RCC_UART7CLKSOURCE_HSI: \
  221. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI; \
  222. break; \
  223. case RCC_UART7CLKSOURCE_SYSCLK: \
  224. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK; \
  225. break; \
  226. case RCC_UART7CLKSOURCE_LSE: \
  227. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE; \
  228. break; \
  229. default: \
  230. break; \
  231. } \
  232. } \
  233. else if ((__HANDLE__)->Instance == UART8) \
  234. { \
  235. switch(__HAL_RCC_GET_UART8_SOURCE()) \
  236. { \
  237. case RCC_UART8CLKSOURCE_PCLK1: \
  238. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \
  239. break; \
  240. case RCC_UART8CLKSOURCE_HSI: \
  241. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI; \
  242. break; \
  243. case RCC_UART8CLKSOURCE_SYSCLK: \
  244. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK; \
  245. break; \
  246. case RCC_UART8CLKSOURCE_LSE: \
  247. (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE; \
  248. break; \
  249. default: \
  250. break; \
  251. } \
  252. } \
  253. } while(0)
  254. /** @brief Reports the UART mask to apply to retrieve the received data
  255. * according to the word length and to the parity bits activation.
  256. * If PCE = 1, the parity bit is not included in the data extracted
  257. * by the reception API().
  258. * This masking operation is not carried out in the case of
  259. * DMA transfers.
  260. * @param __HANDLE__: specifies the UART Handle
  261. * @retval mask to apply to UART RDR register value.
  262. */
  263. #define UART_MASK_COMPUTATION(__HANDLE__) \
  264. do { \
  265. if ((__HANDLE__)->Init.WordLength == UART_WORDLENGTH_9B) \
  266. { \
  267. if ((__HANDLE__)->Init.Parity == UART_PARITY_NONE) \
  268. { \
  269. (__HANDLE__)->Mask = 0x01FF ; \
  270. } \
  271. else \
  272. { \
  273. (__HANDLE__)->Mask = 0x00FF ; \
  274. } \
  275. } \
  276. else if ((__HANDLE__)->Init.WordLength == UART_WORDLENGTH_8B) \
  277. { \
  278. if ((__HANDLE__)->Init.Parity == UART_PARITY_NONE) \
  279. { \
  280. (__HANDLE__)->Mask = 0x00FF ; \
  281. } \
  282. else \
  283. { \
  284. (__HANDLE__)->Mask = 0x007F ; \
  285. } \
  286. } \
  287. else if ((__HANDLE__)->Init.WordLength == UART_WORDLENGTH_7B) \
  288. { \
  289. if ((__HANDLE__)->Init.Parity == UART_PARITY_NONE) \
  290. { \
  291. (__HANDLE__)->Mask = 0x007F ; \
  292. } \
  293. else \
  294. { \
  295. (__HANDLE__)->Mask = 0x003F ; \
  296. } \
  297. } \
  298. } while(0)
  299. /**
  300. * @}
  301. */
  302. /* Exported functions --------------------------------------------------------*/
  303. /** @addtogroup UARTEx_Exported_Functions
  304. * @{
  305. */
  306. /** @addtogroup UARTEx_Exported_Functions_Group1
  307. * @{
  308. */
  309. /* Initialization and de-initialization functions ****************************/
  310. HAL_StatusTypeDef HAL_RS485Ex_Init(UART_HandleTypeDef *huart, uint32_t Polarity, uint32_t AssertionTime, uint32_t DeassertionTime);
  311. /**
  312. * @}
  313. */
  314. /**
  315. * @}
  316. */
  317. /** @addtogroup UARTEx_Exported_Functions_Group3
  318. * @{
  319. */
  320. /* Peripheral Control functions **********************************************/
  321. HAL_StatusTypeDef HAL_MultiProcessorEx_AddressLength_Set(UART_HandleTypeDef *huart, uint32_t AddressLength);
  322. /**
  323. * @}
  324. */
  325. /**
  326. * @}
  327. */
  328. /**
  329. * @}
  330. */
  331. #ifdef __cplusplus
  332. }
  333. #endif
  334. #endif /* __STM32F7xx_HAL_UART_EX_H */
  335. /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/