1 /** 2 ****************************************************************************** 3 * @file stm32f3xx_hal_usart_ex.h 4 * @author MCD Application Team 5 * @brief Header file of USART 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 19 /* Define to prevent recursive inclusion -------------------------------------*/ 20 #ifndef STM32F3xx_HAL_USART_EX_H 21 #define STM32F3xx_HAL_USART_EX_H 22 23 #ifdef __cplusplus 24 extern "C" { 25 #endif 26 27 /* Includes ------------------------------------------------------------------*/ 28 #include "stm32f3xx_hal_def.h" 29 30 /** @addtogroup STM32F3xx_HAL_Driver 31 * @{ 32 */ 33 34 /** @addtogroup USARTEx 35 * @{ 36 */ 37 38 /* Exported types ------------------------------------------------------------*/ 39 /* Exported constants --------------------------------------------------------*/ 40 /** @defgroup USARTEx_Exported_Constants USARTEx Exported Constants 41 * @{ 42 */ 43 44 /** @defgroup USARTEx_Word_Length USARTEx Word Length 45 * @{ 46 */ 47 #if defined(USART_CR1_M0)&& defined(USART_CR1_M1) 48 #define USART_WORDLENGTH_7B (USART_CR1_M1) /*!< 7-bit long USART frame */ 49 #define USART_WORDLENGTH_8B (0x00000000U) /*!< 8-bit long USART frame */ 50 #define USART_WORDLENGTH_9B (USART_CR1_M0) /*!< 9-bit long USART frame */ 51 #elif defined(USART_CR1_M) 52 #define USART_WORDLENGTH_8B (0x00000000U) /*!< 8-bit long USART frame */ 53 #define USART_WORDLENGTH_9B (USART_CR1_M) /*!< 9-bit long USART frame */ 54 #endif /* USART_CR1_M0 && USART_CR1_M */ 55 /** 56 * @} 57 */ 58 59 60 /** 61 * @} 62 */ 63 64 /* Private macros ------------------------------------------------------------*/ 65 /** @defgroup USARTEx_Private_Macros USARTEx Private Macros 66 * @{ 67 */ 68 69 /** @brief Report the USART clock source. 70 * @param __HANDLE__ specifies the USART Handle. 71 * @param __CLOCKSOURCE__ output variable. 72 * @retval the USART clocking source, written in __CLOCKSOURCE__. 73 */ 74 /** @brief Report the USART clock source. 75 * @param __HANDLE__ specifies the USART Handle. 76 * @param __CLOCKSOURCE__ output variable. 77 * @retval USART clocking source, written in __CLOCKSOURCE__. 78 */ 79 #if defined(STM32F302xE) || defined(STM32F303xE) || defined(STM32F398xx) || defined(STM32F302xC) \ 80 || defined(STM32F303xC) || defined(STM32F358xx) 81 #define USART_GETCLOCKSOURCE(__HANDLE__,__CLOCKSOURCE__) \ 82 do { \ 83 if((__HANDLE__)->Instance == USART1) \ 84 { \ 85 switch(__HAL_RCC_GET_USART1_SOURCE()) \ 86 { \ 87 case RCC_USART1CLKSOURCE_PCLK2: \ 88 (__CLOCKSOURCE__) = USART_CLOCKSOURCE_PCLK2; \ 89 break; \ 90 case RCC_USART1CLKSOURCE_HSI: \ 91 (__CLOCKSOURCE__) = USART_CLOCKSOURCE_HSI; \ 92 break; \ 93 case RCC_USART1CLKSOURCE_SYSCLK: \ 94 (__CLOCKSOURCE__) = USART_CLOCKSOURCE_SYSCLK; \ 95 break; \ 96 case RCC_USART1CLKSOURCE_LSE: \ 97 (__CLOCKSOURCE__) = USART_CLOCKSOURCE_LSE; \ 98 break; \ 99 default: \ 100 (__CLOCKSOURCE__) = USART_CLOCKSOURCE_UNDEFINED; \ 101 break; \ 102 } \ 103 } \ 104 else if((__HANDLE__)->Instance == USART2) \ 105 { \ 106 switch(__HAL_RCC_GET_USART2_SOURCE()) \ 107 { \ 108 case RCC_USART2CLKSOURCE_PCLK1: \ 109 (__CLOCKSOURCE__) = USART_CLOCKSOURCE_PCLK1; \ 110 break; \ 111 case RCC_USART2CLKSOURCE_HSI: \ 112 (__CLOCKSOURCE__) = USART_CLOCKSOURCE_HSI; \ 113 break; \ 114 case RCC_USART2CLKSOURCE_SYSCLK: \ 115 (__CLOCKSOURCE__) = USART_CLOCKSOURCE_SYSCLK; \ 116 break; \ 117 case RCC_USART2CLKSOURCE_LSE: \ 118 (__CLOCKSOURCE__) = USART_CLOCKSOURCE_LSE; \ 119 break; \ 120 default: \ 121 (__CLOCKSOURCE__) = USART_CLOCKSOURCE_UNDEFINED; \ 122 break; \ 123 } \ 124 } \ 125 else if((__HANDLE__)->Instance == USART3) \ 126 { \ 127 switch(__HAL_RCC_GET_USART3_SOURCE()) \ 128 { \ 129 case RCC_USART3CLKSOURCE_PCLK1: \ 130 (__CLOCKSOURCE__) = USART_CLOCKSOURCE_PCLK1; \ 131 break; \ 132 case RCC_USART3CLKSOURCE_HSI: \ 133 (__CLOCKSOURCE__) = USART_CLOCKSOURCE_HSI; \ 134 break; \ 135 case RCC_USART3CLKSOURCE_SYSCLK: \ 136 (__CLOCKSOURCE__) = USART_CLOCKSOURCE_SYSCLK; \ 137 break; \ 138 case RCC_USART3CLKSOURCE_LSE: \ 139 (__CLOCKSOURCE__) = USART_CLOCKSOURCE_LSE; \ 140 break; \ 141 default: \ 142 (__CLOCKSOURCE__) = USART_CLOCKSOURCE_UNDEFINED; \ 143 break; \ 144 } \ 145 } \ 146 else \ 147 { \ 148 (__CLOCKSOURCE__) = USART_CLOCKSOURCE_UNDEFINED; \ 149 } \ 150 } while(0U) 151 #elif defined(STM32F303x8) || defined(STM32F334x8) || defined(STM32F328xx) || defined(STM32F301x8) \ 152 || defined(STM32F302x8) || defined(STM32F318xx) 153 #define USART_GETCLOCKSOURCE(__HANDLE__,__CLOCKSOURCE__) \ 154 do { \ 155 if((__HANDLE__)->Instance == USART1) \ 156 { \ 157 switch(__HAL_RCC_GET_USART1_SOURCE()) \ 158 { \ 159 case RCC_USART1CLKSOURCE_PCLK1: \ 160 (__CLOCKSOURCE__) = USART_CLOCKSOURCE_PCLK1; \ 161 break; \ 162 case RCC_USART1CLKSOURCE_HSI: \ 163 (__CLOCKSOURCE__) = USART_CLOCKSOURCE_HSI; \ 164 break; \ 165 case RCC_USART1CLKSOURCE_SYSCLK: \ 166 (__CLOCKSOURCE__) = USART_CLOCKSOURCE_SYSCLK; \ 167 break; \ 168 case RCC_USART1CLKSOURCE_LSE: \ 169 (__CLOCKSOURCE__) = USART_CLOCKSOURCE_LSE; \ 170 break; \ 171 default: \ 172 (__CLOCKSOURCE__) = USART_CLOCKSOURCE_UNDEFINED; \ 173 break; \ 174 } \ 175 } \ 176 else if((__HANDLE__)->Instance == USART2) \ 177 { \ 178 (__CLOCKSOURCE__) = USART_CLOCKSOURCE_PCLK1; \ 179 } \ 180 else if((__HANDLE__)->Instance == USART3) \ 181 { \ 182 (__CLOCKSOURCE__) = USART_CLOCKSOURCE_PCLK1; \ 183 } \ 184 else \ 185 { \ 186 (__CLOCKSOURCE__) = USART_CLOCKSOURCE_UNDEFINED; \ 187 } \ 188 } while(0U) 189 #else 190 #define USART_GETCLOCKSOURCE(__HANDLE__,__CLOCKSOURCE__) \ 191 do { \ 192 if((__HANDLE__)->Instance == USART1) \ 193 { \ 194 switch(__HAL_RCC_GET_USART1_SOURCE()) \ 195 { \ 196 case RCC_USART1CLKSOURCE_PCLK2: \ 197 (__CLOCKSOURCE__) = USART_CLOCKSOURCE_PCLK2; \ 198 break; \ 199 case RCC_USART1CLKSOURCE_HSI: \ 200 (__CLOCKSOURCE__) = USART_CLOCKSOURCE_HSI; \ 201 break; \ 202 case RCC_USART1CLKSOURCE_SYSCLK: \ 203 (__CLOCKSOURCE__) = USART_CLOCKSOURCE_SYSCLK; \ 204 break; \ 205 case RCC_USART1CLKSOURCE_LSE: \ 206 (__CLOCKSOURCE__) = USART_CLOCKSOURCE_LSE; \ 207 break; \ 208 default: \ 209 (__CLOCKSOURCE__) = USART_CLOCKSOURCE_UNDEFINED; \ 210 break; \ 211 } \ 212 } \ 213 else if((__HANDLE__)->Instance == USART2) \ 214 { \ 215 switch(__HAL_RCC_GET_USART2_SOURCE()) \ 216 { \ 217 case RCC_USART2CLKSOURCE_PCLK1: \ 218 (__CLOCKSOURCE__) = USART_CLOCKSOURCE_PCLK1; \ 219 break; \ 220 case RCC_USART2CLKSOURCE_HSI: \ 221 (__CLOCKSOURCE__) = USART_CLOCKSOURCE_HSI; \ 222 break; \ 223 case RCC_USART2CLKSOURCE_SYSCLK: \ 224 (__CLOCKSOURCE__) = USART_CLOCKSOURCE_SYSCLK; \ 225 break; \ 226 case RCC_USART2CLKSOURCE_LSE: \ 227 (__CLOCKSOURCE__) = USART_CLOCKSOURCE_LSE; \ 228 break; \ 229 default: \ 230 (__CLOCKSOURCE__) = USART_CLOCKSOURCE_UNDEFINED; \ 231 break; \ 232 } \ 233 } \ 234 else if((__HANDLE__)->Instance == USART3) \ 235 { \ 236 switch(__HAL_RCC_GET_USART3_SOURCE()) \ 237 { \ 238 case RCC_USART3CLKSOURCE_PCLK1: \ 239 (__CLOCKSOURCE__) = USART_CLOCKSOURCE_PCLK1; \ 240 break; \ 241 case RCC_USART3CLKSOURCE_HSI: \ 242 (__CLOCKSOURCE__) = USART_CLOCKSOURCE_HSI; \ 243 break; \ 244 case RCC_USART3CLKSOURCE_SYSCLK: \ 245 (__CLOCKSOURCE__) = USART_CLOCKSOURCE_SYSCLK; \ 246 break; \ 247 case RCC_USART3CLKSOURCE_LSE: \ 248 (__CLOCKSOURCE__) = USART_CLOCKSOURCE_LSE; \ 249 break; \ 250 default: \ 251 (__CLOCKSOURCE__) = USART_CLOCKSOURCE_UNDEFINED; \ 252 break; \ 253 } \ 254 } \ 255 else \ 256 { \ 257 (__CLOCKSOURCE__) = USART_CLOCKSOURCE_UNDEFINED; \ 258 } \ 259 } while(0U) 260 #endif /* STM32F302xE || STM32F303xE || STM32F398xx || STM32F302xC || STM32F303xC || STM32F358xx */ 261 /** @brief Compute the USART mask to apply to retrieve the received data 262 * according to the word length and to the parity bits activation. 263 * @note If PCE = 1, the parity bit is not included in the data extracted 264 * by the reception API(). 265 * This masking operation is not carried out in the case of 266 * DMA transfers. 267 * @param __HANDLE__ specifies the USART Handle. 268 * @retval None, the mask to apply to USART RDR register is stored in (__HANDLE__)->Mask field. 269 */ 270 #if defined(USART_CR1_M0)&& defined(USART_CR1_M1) 271 #define USART_MASK_COMPUTATION(__HANDLE__) \ 272 do { \ 273 if ((__HANDLE__)->Init.WordLength == USART_WORDLENGTH_9B) \ 274 { \ 275 if ((__HANDLE__)->Init.Parity == USART_PARITY_NONE) \ 276 { \ 277 (__HANDLE__)->Mask = 0x01FFU; \ 278 } \ 279 else \ 280 { \ 281 (__HANDLE__)->Mask = 0x00FFU; \ 282 } \ 283 } \ 284 else if ((__HANDLE__)->Init.WordLength == USART_WORDLENGTH_8B) \ 285 { \ 286 if ((__HANDLE__)->Init.Parity == USART_PARITY_NONE) \ 287 { \ 288 (__HANDLE__)->Mask = 0x00FFU; \ 289 } \ 290 else \ 291 { \ 292 (__HANDLE__)->Mask = 0x007FU; \ 293 } \ 294 } \ 295 else if ((__HANDLE__)->Init.WordLength == USART_WORDLENGTH_7B) \ 296 { \ 297 if ((__HANDLE__)->Init.Parity == USART_PARITY_NONE) \ 298 { \ 299 (__HANDLE__)->Mask = 0x007FU; \ 300 } \ 301 else \ 302 { \ 303 (__HANDLE__)->Mask = 0x003FU; \ 304 } \ 305 } \ 306 else \ 307 { \ 308 (__HANDLE__)->Mask = 0x0000U; \ 309 } \ 310 } while(0U) 311 #elif defined(USART_CR1_M) 312 #define USART_MASK_COMPUTATION(__HANDLE__) \ 313 do { \ 314 if ((__HANDLE__)->Init.WordLength == USART_WORDLENGTH_9B) \ 315 { \ 316 if ((__HANDLE__)->Init.Parity == USART_PARITY_NONE) \ 317 { \ 318 (__HANDLE__)->Mask = 0x01FFU; \ 319 } \ 320 else \ 321 { \ 322 (__HANDLE__)->Mask = 0x00FFU; \ 323 } \ 324 } \ 325 else if ((__HANDLE__)->Init.WordLength == USART_WORDLENGTH_8B) \ 326 { \ 327 if ((__HANDLE__)->Init.Parity == USART_PARITY_NONE) \ 328 { \ 329 (__HANDLE__)->Mask = 0x00FFU; \ 330 } \ 331 else \ 332 { \ 333 (__HANDLE__)->Mask = 0x007FU; \ 334 } \ 335 } \ 336 else \ 337 { \ 338 (__HANDLE__)->Mask = 0x0000U; \ 339 } \ 340 } while(0U) 341 #endif /* USART_CR1_M0 && USART_CR1_M */ 342 343 /** 344 * @brief Ensure that USART frame length is valid. 345 * @param __LENGTH__ USART frame length. 346 * @retval SET (__LENGTH__ is valid) or RESET (__LENGTH__ is invalid) 347 */ 348 #if defined(USART_CR1_M0)&& defined(USART_CR1_M1) 349 #define IS_USART_WORD_LENGTH(__LENGTH__) (((__LENGTH__) == USART_WORDLENGTH_7B) || \ 350 ((__LENGTH__) == USART_WORDLENGTH_8B) || \ 351 ((__LENGTH__) == USART_WORDLENGTH_9B)) 352 #elif defined(USART_CR1_M) 353 #define IS_USART_WORD_LENGTH(__LENGTH__) (((__LENGTH__) == USART_WORDLENGTH_8B) || \ 354 ((__LENGTH__) == USART_WORDLENGTH_9B)) 355 #endif /* USART_CR1_M0 && USART_CR1_M */ 356 357 358 /** 359 * @} 360 */ 361 362 /* Exported functions --------------------------------------------------------*/ 363 /** @addtogroup USARTEx_Exported_Functions 364 * @{ 365 */ 366 367 /** @addtogroup USARTEx_Exported_Functions_Group1 368 * @{ 369 */ 370 371 /* IO operation functions *****************************************************/ 372 373 /** 374 * @} 375 */ 376 377 /** @addtogroup USARTEx_Exported_Functions_Group2 378 * @{ 379 */ 380 381 /* Peripheral Control functions ***********************************************/ 382 383 /** 384 * @} 385 */ 386 387 /** 388 * @} 389 */ 390 391 /** 392 * @} 393 */ 394 395 /** 396 * @} 397 */ 398 399 #ifdef __cplusplus 400 } 401 #endif 402 403 #endif /* STM32F3xx_HAL_USART_EX_H */ 404 405