STM32L486xx HAL User Manual
stm32l4xx_hal_usart_ex.h
Go to the documentation of this file.
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>&copy; 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****/