STM32L486xx HAL User Manual
|
00001 /** 00002 ****************************************************************************** 00003 * @file stm32l4xx_hal_usart_ex.h 00004 * @author MCD Application Team 00005 * @brief Header file of USART HAL Extended module. 00006 ****************************************************************************** 00007 * @attention 00008 * 00009 * <h2><center>© COPYRIGHT(c) 2017 STMicroelectronics</center></h2> 00010 * 00011 * Redistribution and use in source and binary forms, with or without modification, 00012 * are permitted provided that the following conditions are met: 00013 * 1. Redistributions of source code must retain the above copyright notice, 00014 * this list of conditions and the following disclaimer. 00015 * 2. Redistributions in binary form must reproduce the above copyright notice, 00016 * this list of conditions and the following disclaimer in the documentation 00017 * and/or other materials provided with the distribution. 00018 * 3. Neither the name of STMicroelectronics nor the names of its contributors 00019 * may be used to endorse or promote products derived from this software 00020 * without specific prior written permission. 00021 * 00022 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 00023 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 00024 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 00025 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 00026 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 00027 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 00028 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 00029 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 00030 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 00031 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 00032 * 00033 ****************************************************************************** 00034 */ 00035 00036 /* Define to prevent recursive inclusion -------------------------------------*/ 00037 #ifndef __STM32L4xx_HAL_USART_EX_H 00038 #define __STM32L4xx_HAL_USART_EX_H 00039 00040 #ifdef __cplusplus 00041 extern "C" { 00042 #endif 00043 00044 /* Includes ------------------------------------------------------------------*/ 00045 #include "stm32l4xx_hal_def.h" 00046 00047 /** @addtogroup STM32L4xx_HAL_Driver 00048 * @{ 00049 */ 00050 00051 /** @addtogroup USARTEx 00052 * @{ 00053 */ 00054 00055 /* Exported types ------------------------------------------------------------*/ 00056 /* Exported constants --------------------------------------------------------*/ 00057 /** @defgroup USARTEx_Exported_Constants USARTEx Exported Constants 00058 * @{ 00059 */ 00060 00061 /** @defgroup USARTEx_Word_Length USARTEx Word Length 00062 * @{ 00063 */ 00064 #define USART_WORDLENGTH_7B ((uint32_t)USART_CR1_M1) /*!< 7-bit long USART frame */ 00065 #define USART_WORDLENGTH_8B 0x00000000U /*!< 8-bit long USART frame */ 00066 #define USART_WORDLENGTH_9B ((uint32_t)USART_CR1_M0) /*!< 9-bit long USART frame */ 00067 /** 00068 * @} 00069 */ 00070 00071 #if defined(USART_CR2_SLVEN) 00072 /** @defgroup USARTEx_Slave_Select_management USARTEx Slave Select Management 00073 * @{ 00074 */ 00075 #define USART_NSS_HARD 0x00000000U /*!< SPI slave selection depends on NSS input pin */ 00076 #define USART_NSS_SOFT USART_CR2_DIS_NSS /*!< SPI slave is always selected and NSS input pin is ignored */ 00077 /** 00078 * @} 00079 */ 00080 00081 00082 /** @defgroup USARTEx_Slave_Mode USARTEx Synchronous Slave mode enable 00083 * @brief USART SLAVE mode 00084 * @{ 00085 */ 00086 #define USART_SLAVEMODE_DISABLE 0x00000000U /*!< USART SPI Slave Mode Enable */ 00087 #define USART_SLAVEMODE_ENABLE USART_CR2_SLVEN /*!< USART SPI Slave Mode Disable */ 00088 /** 00089 * @} 00090 */ 00091 #endif 00092 00093 #if defined(USART_CR1_FIFOEN) 00094 /** @defgroup USARTEx_FIFO_mode USARTEx FIFO mode 00095 * @brief USART FIFO mode 00096 * @{ 00097 */ 00098 #define USART_FIFOMODE_DISABLE 0x00000000U /*!< FIFO mode disable */ 00099 #define USART_FIFOMODE_ENABLE USART_CR1_FIFOEN /*!< FIFO mode enable */ 00100 /** 00101 * @} 00102 */ 00103 00104 /** @defgroup USARTEx_TXFIFO_threshold_level USARTEx TXFIFO threshold level 00105 * @brief USART TXFIFO level 00106 * @{ 00107 */ 00108 #define USART_TXFIFO_THRESHOLD_1_8 0x00000000U /*!< TXFIFO reaches 1/8 of its depth */ 00109 #define USART_TXFIFO_THRESHOLD_1_4 USART_CR3_TXFTCFG_0 /*!< TXFIFO reaches 1/4 of its depth */ 00110 #define USART_TXFIFO_THRESHOLD_1_2 USART_CR3_TXFTCFG_1 /*!< TXFIFO reaches 1/2 of its depth */ 00111 #define USART_TXFIFO_THRESHOLD_3_4 (USART_CR3_TXFTCFG_0|USART_CR3_TXFTCFG_1) /*!< TXFIFO reaches 3/4 of its depth */ 00112 #define USART_TXFIFO_THRESHOLD_7_8 USART_CR3_TXFTCFG_2 /*!< TXFIFO reaches 7/8 of its depth */ 00113 #define USART_TXFIFO_THRESHOLD_8_8 (USART_CR3_TXFTCFG_2|USART_CR3_TXFTCFG_0) /*!< TXFIFO becomes empty */ 00114 /** 00115 * @} 00116 */ 00117 00118 /** @defgroup USARTEx_RXFIFO_threshold_level USARTEx RXFIFO threshold level 00119 * @brief USART RXFIFO level 00120 * @{ 00121 */ 00122 #define USART_RXFIFO_THRESHOLD_1_8 0x00000000U /*!< RXFIFO FIFO reaches 1/8 of its depth */ 00123 #define USART_RXFIFO_THRESHOLD_1_4 USART_CR3_RXFTCFG_0 /*!< RXFIFO FIFO reaches 1/4 of its depth */ 00124 #define USART_RXFIFO_THRESHOLD_1_2 USART_CR3_RXFTCFG_1 /*!< RXFIFO FIFO reaches 1/2 of its depth */ 00125 #define USART_RXFIFO_THRESHOLD_3_4 (USART_CR3_RXFTCFG_0|USART_CR3_RXFTCFG_1) /*!< RXFIFO FIFO reaches 3/4 of its depth */ 00126 #define USART_RXFIFO_THRESHOLD_7_8 USART_CR3_RXFTCFG_2 /*!< RXFIFO FIFO reaches 7/8 of its depth */ 00127 #define USART_RXFIFO_THRESHOLD_8_8 (USART_CR3_RXFTCFG_2|USART_CR3_RXFTCFG_0) /*!< RXFIFO FIFO becomes full */ 00128 /** 00129 * @} 00130 */ 00131 #endif 00132 00133 /** 00134 * @} 00135 */ 00136 00137 /* Private macros ------------------------------------------------------------*/ 00138 /** @defgroup USARTEx_Private_Macros USARTEx Private Macros 00139 * @{ 00140 */ 00141 00142 /** @brief Report the USART clock source. 00143 * @param __HANDLE__ specifies the USART Handle. 00144 * @param __CLOCKSOURCE__ output variable. 00145 * @retval the USART clocking source, written in __CLOCKSOURCE__. 00146 */ 00147 #if defined (STM32L432xx) || defined (STM32L442xx) 00148 #define USART_GETCLOCKSOURCE(__HANDLE__,__CLOCKSOURCE__) \ 00149 do { \ 00150 if((__HANDLE__)->Instance == USART1) \ 00151 { \ 00152 switch(__HAL_RCC_GET_USART1_SOURCE()) \ 00153 { \ 00154 case RCC_USART1CLKSOURCE_PCLK2: \ 00155 (__CLOCKSOURCE__) = USART_CLOCKSOURCE_PCLK2; \ 00156 break; \ 00157 case RCC_USART1CLKSOURCE_HSI: \ 00158 (__CLOCKSOURCE__) = USART_CLOCKSOURCE_HSI; \ 00159 break; \ 00160 case RCC_USART1CLKSOURCE_SYSCLK: \ 00161 (__CLOCKSOURCE__) = USART_CLOCKSOURCE_SYSCLK; \ 00162 break; \ 00163 case RCC_USART1CLKSOURCE_LSE: \ 00164 (__CLOCKSOURCE__) = USART_CLOCKSOURCE_LSE; \ 00165 break; \ 00166 default: \ 00167 (__CLOCKSOURCE__) = USART_CLOCKSOURCE_UNDEFINED; \ 00168 break; \ 00169 } \ 00170 } \ 00171 else if((__HANDLE__)->Instance == USART2) \ 00172 { \ 00173 switch(__HAL_RCC_GET_USART2_SOURCE()) \ 00174 { \ 00175 case RCC_USART2CLKSOURCE_PCLK1: \ 00176 (__CLOCKSOURCE__) = USART_CLOCKSOURCE_PCLK1; \ 00177 break; \ 00178 case RCC_USART2CLKSOURCE_HSI: \ 00179 (__CLOCKSOURCE__) = USART_CLOCKSOURCE_HSI; \ 00180 break; \ 00181 case RCC_USART2CLKSOURCE_SYSCLK: \ 00182 (__CLOCKSOURCE__) = USART_CLOCKSOURCE_SYSCLK; \ 00183 break; \ 00184 case RCC_USART2CLKSOURCE_LSE: \ 00185 (__CLOCKSOURCE__) = USART_CLOCKSOURCE_LSE; \ 00186 break; \ 00187 default: \ 00188 (__CLOCKSOURCE__) = USART_CLOCKSOURCE_UNDEFINED; \ 00189 break; \ 00190 } \ 00191 } \ 00192 } while(0) 00193 #else 00194 #define USART_GETCLOCKSOURCE(__HANDLE__,__CLOCKSOURCE__) \ 00195 do { \ 00196 if((__HANDLE__)->Instance == USART1) \ 00197 { \ 00198 switch(__HAL_RCC_GET_USART1_SOURCE()) \ 00199 { \ 00200 case RCC_USART1CLKSOURCE_PCLK2: \ 00201 (__CLOCKSOURCE__) = USART_CLOCKSOURCE_PCLK2; \ 00202 break; \ 00203 case RCC_USART1CLKSOURCE_HSI: \ 00204 (__CLOCKSOURCE__) = USART_CLOCKSOURCE_HSI; \ 00205 break; \ 00206 case RCC_USART1CLKSOURCE_SYSCLK: \ 00207 (__CLOCKSOURCE__) = USART_CLOCKSOURCE_SYSCLK; \ 00208 break; \ 00209 case RCC_USART1CLKSOURCE_LSE: \ 00210 (__CLOCKSOURCE__) = USART_CLOCKSOURCE_LSE; \ 00211 break; \ 00212 default: \ 00213 (__CLOCKSOURCE__) = USART_CLOCKSOURCE_UNDEFINED; \ 00214 break; \ 00215 } \ 00216 } \ 00217 else if((__HANDLE__)->Instance == USART2) \ 00218 { \ 00219 switch(__HAL_RCC_GET_USART2_SOURCE()) \ 00220 { \ 00221 case RCC_USART2CLKSOURCE_PCLK1: \ 00222 (__CLOCKSOURCE__) = USART_CLOCKSOURCE_PCLK1; \ 00223 break; \ 00224 case RCC_USART2CLKSOURCE_HSI: \ 00225 (__CLOCKSOURCE__) = USART_CLOCKSOURCE_HSI; \ 00226 break; \ 00227 case RCC_USART2CLKSOURCE_SYSCLK: \ 00228 (__CLOCKSOURCE__) = USART_CLOCKSOURCE_SYSCLK; \ 00229 break; \ 00230 case RCC_USART2CLKSOURCE_LSE: \ 00231 (__CLOCKSOURCE__) = USART_CLOCKSOURCE_LSE; \ 00232 break; \ 00233 default: \ 00234 (__CLOCKSOURCE__) = USART_CLOCKSOURCE_UNDEFINED; \ 00235 break; \ 00236 } \ 00237 } \ 00238 else if((__HANDLE__)->Instance == USART3) \ 00239 { \ 00240 switch(__HAL_RCC_GET_USART3_SOURCE()) \ 00241 { \ 00242 case RCC_USART3CLKSOURCE_PCLK1: \ 00243 (__CLOCKSOURCE__) = USART_CLOCKSOURCE_PCLK1; \ 00244 break; \ 00245 case RCC_USART3CLKSOURCE_HSI: \ 00246 (__CLOCKSOURCE__) = USART_CLOCKSOURCE_HSI; \ 00247 break; \ 00248 case RCC_USART3CLKSOURCE_SYSCLK: \ 00249 (__CLOCKSOURCE__) = USART_CLOCKSOURCE_SYSCLK; \ 00250 break; \ 00251 case RCC_USART3CLKSOURCE_LSE: \ 00252 (__CLOCKSOURCE__) = USART_CLOCKSOURCE_LSE; \ 00253 break; \ 00254 default: \ 00255 (__CLOCKSOURCE__) = USART_CLOCKSOURCE_UNDEFINED; \ 00256 break; \ 00257 } \ 00258 } \ 00259 } while(0) 00260 #endif /* STM32L432xx || STM32L442xx */ 00261 00262 /** @brief Compute the USART mask to apply to retrieve the received data 00263 * according to the word length and to the parity bits activation. 00264 * @note If PCE = 1, the parity bit is not included in the data extracted 00265 * by the reception API(). 00266 * This masking operation is not carried out in the case of 00267 * DMA transfers. 00268 * @param __HANDLE__ specifies the USART Handle. 00269 * @retval None, the mask to apply to USART RDR register is stored in (__HANDLE__)->Mask field. 00270 */ 00271 #define USART_MASK_COMPUTATION(__HANDLE__) \ 00272 do { \ 00273 if ((__HANDLE__)->Init.WordLength == USART_WORDLENGTH_9B) \ 00274 { \ 00275 if ((__HANDLE__)->Init.Parity == USART_PARITY_NONE) \ 00276 { \ 00277 (__HANDLE__)->Mask = 0x01FFU; \ 00278 } \ 00279 else \ 00280 { \ 00281 (__HANDLE__)->Mask = 0x00FFU; \ 00282 } \ 00283 } \ 00284 else if ((__HANDLE__)->Init.WordLength == USART_WORDLENGTH_8B) \ 00285 { \ 00286 if ((__HANDLE__)->Init.Parity == USART_PARITY_NONE) \ 00287 { \ 00288 (__HANDLE__)->Mask = 0x00FFU; \ 00289 } \ 00290 else \ 00291 { \ 00292 (__HANDLE__)->Mask = 0x007FU; \ 00293 } \ 00294 } \ 00295 else if ((__HANDLE__)->Init.WordLength == USART_WORDLENGTH_7B) \ 00296 { \ 00297 if ((__HANDLE__)->Init.Parity == USART_PARITY_NONE) \ 00298 { \ 00299 (__HANDLE__)->Mask = 0x007FU; \ 00300 } \ 00301 else \ 00302 { \ 00303 (__HANDLE__)->Mask = 0x003FU; \ 00304 } \ 00305 } \ 00306 } while(0U) 00307 00308 00309 /** 00310 * @brief Ensure that USART frame length is valid. 00311 * @param __LENGTH__ USART frame length. 00312 * @retval SET (__LENGTH__ is valid) or RESET (__LENGTH__ is invalid) 00313 */ 00314 #define IS_USART_WORD_LENGTH(__LENGTH__) (((__LENGTH__) == USART_WORDLENGTH_7B) || \ 00315 ((__LENGTH__) == USART_WORDLENGTH_8B) || \ 00316 ((__LENGTH__) == USART_WORDLENGTH_9B)) 00317 00318 #if defined(USART_CR2_SLVEN) 00319 /** 00320 * @brief Ensure that USART Negative Slave Select (NSS) pin management is valid. 00321 * @param __NSS__ USART Negative Slave Select pin management. 00322 * @retval SET (__NSS__ is valid) or RESET (__NSS__ is invalid) 00323 */ 00324 #define IS_USART_NSS(__NSS__) (((__NSS__) == USART_NSS_HARD) || \ 00325 ((__NSS__) == USART_NSS_SOFT)) 00326 00327 /** 00328 * @brief Ensure that USART Slave Mode is valid. 00329 * @param __STATE__ USART Slave Mode. 00330 * @retval SET (__STATE__ is valid) or RESET (__STATE__ is invalid) 00331 */ 00332 #define IS_USART_SLAVEMODE(__STATE__) (((__STATE__) == USART_SLAVEMODE_DISABLE ) || \ 00333 ((__STATE__) == USART_SLAVEMODE_ENABLE)) 00334 #endif 00335 00336 #if defined(USART_CR1_FIFOEN) 00337 /** 00338 * @brief Ensure that USART FIFO mode is valid. 00339 * @param __STATE__ USART FIFO mode. 00340 * @retval SET (__STATE__ is valid) or RESET (__STATE__ is invalid) 00341 */ 00342 #define IS_USART_FIFO_MODE_STATE(__STATE__) (((__STATE__) == USART_FIFOMODE_DISABLE ) || \ 00343 ((__STATE__) == USART_FIFOMODE_ENABLE)) 00344 00345 /** 00346 * @brief Ensure that USART TXFIFO threshold level is valid. 00347 * @param __THRESHOLD__ USART TXFIFO threshold level. 00348 * @retval SET (__THRESHOLD__ is valid) or RESET (__THRESHOLD__ is invalid) 00349 */ 00350 #define IS_USART_TXFIFO_THRESHOLD(__THRESHOLD__) (((__THRESHOLD__) == USART_TXFIFO_THRESHOLD_1_8) || \ 00351 ((__THRESHOLD__) == USART_TXFIFO_THRESHOLD_1_4) || \ 00352 ((__THRESHOLD__) == USART_TXFIFO_THRESHOLD_1_2) || \ 00353 ((__THRESHOLD__) == USART_TXFIFO_THRESHOLD_3_4) || \ 00354 ((__THRESHOLD__) == USART_TXFIFO_THRESHOLD_7_8) || \ 00355 ((__THRESHOLD__) == USART_TXFIFO_THRESHOLD_8_8)) 00356 00357 /** 00358 * @brief Ensure that USART RXFIFO threshold level is valid. 00359 * @param __THRESHOLD__ USART RXFIFO threshold level. 00360 * @retval SET (__THRESHOLD__ is valid) or RESET (__THRESHOLD__ is invalid) 00361 */ 00362 #define IS_USART_RXFIFO_THRESHOLD(__THRESHOLD__) (((__THRESHOLD__) == USART_RXFIFO_THRESHOLD_1_8) || \ 00363 ((__THRESHOLD__) == USART_RXFIFO_THRESHOLD_1_4) || \ 00364 ((__THRESHOLD__) == USART_RXFIFO_THRESHOLD_1_2) || \ 00365 ((__THRESHOLD__) == USART_RXFIFO_THRESHOLD_3_4) || \ 00366 ((__THRESHOLD__) == USART_RXFIFO_THRESHOLD_7_8) || \ 00367 ((__THRESHOLD__) == USART_RXFIFO_THRESHOLD_8_8)) 00368 #endif 00369 /** 00370 * @} 00371 */ 00372 00373 /* Exported functions --------------------------------------------------------*/ 00374 /** @addtogroup USARTEx_Exported_Functions 00375 * @{ 00376 */ 00377 00378 /** @addtogroup USARTEx_Exported_Functions_Group2 00379 * @{ 00380 */ 00381 00382 /* IO operation functions *****************************************************/ 00383 #if defined(USART_CR1_FIFOEN) 00384 void HAL_USARTEx_RxFifoFullCallback(USART_HandleTypeDef *husart); 00385 void HAL_USARTEx_TxFifoEmptyCallback(USART_HandleTypeDef *husart); 00386 #endif 00387 00388 /** 00389 * @} 00390 */ 00391 00392 /** @addtogroup USARTEx_Exported_Functions_Group3 00393 * @{ 00394 */ 00395 00396 /* Peripheral Control functions ***********************************************/ 00397 #if defined(USART_CR2_SLVEN) 00398 HAL_StatusTypeDef HAL_USARTEx_EnableSlaveMode(USART_HandleTypeDef *husart); 00399 HAL_StatusTypeDef HAL_USARTEx_DisableSlaveMode(USART_HandleTypeDef *husart); 00400 HAL_StatusTypeDef HAL_USARTEx_ConfigNSS(USART_HandleTypeDef *husart, uint32_t NSSConfig); 00401 #endif 00402 #if defined(USART_CR1_FIFOEN) 00403 HAL_StatusTypeDef HAL_USARTEx_EnableFifoMode(USART_HandleTypeDef *husart); 00404 HAL_StatusTypeDef HAL_USARTEx_DisableFifoMode(USART_HandleTypeDef *husart); 00405 HAL_StatusTypeDef HAL_USARTEx_SetTxFifoThreshold(USART_HandleTypeDef *husart, uint32_t Threshold); 00406 HAL_StatusTypeDef HAL_USARTEx_SetRxFifoThreshold(USART_HandleTypeDef *husart, uint32_t Threshold); 00407 #endif 00408 00409 /** 00410 * @} 00411 */ 00412 00413 /** 00414 * @} 00415 */ 00416 00417 /** 00418 * @} 00419 */ 00420 00421 /** 00422 * @} 00423 */ 00424 00425 #ifdef __cplusplus 00426 } 00427 #endif 00428 00429 #endif /* __STM32L4xx_HAL_USART_EX_H */ 00430 00431 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/