STM32H735xx HAL User Manual
stm32h7xx_hal_usart.h
Go to the documentation of this file.
00001 /**
00002   ******************************************************************************
00003   * @file    stm32h7xx_hal_usart.h
00004   * @author  MCD Application Team
00005   * @brief   Header file of USART HAL module.
00006   ******************************************************************************
00007   * @attention
00008   *
00009   * Copyright (c) 2017 STMicroelectronics.
00010   * All rights reserved.
00011   *
00012   * This software is licensed under terms that can be found in the LICENSE file
00013   * in the root directory of this software component.
00014   * If no LICENSE file comes with this software, it is provided AS-IS.
00015   *
00016   ******************************************************************************
00017   */
00018 
00019 /* Define to prevent recursive inclusion -------------------------------------*/
00020 #ifndef STM32H7xx_HAL_USART_H
00021 #define STM32H7xx_HAL_USART_H
00022 
00023 #ifdef __cplusplus
00024 extern "C" {
00025 #endif
00026 
00027 /* Includes ------------------------------------------------------------------*/
00028 #include "stm32h7xx_hal_def.h"
00029 
00030 /** @addtogroup STM32H7xx_HAL_Driver
00031   * @{
00032   */
00033 
00034 /** @addtogroup USART
00035   * @{
00036   */
00037 
00038 /* Exported types ------------------------------------------------------------*/
00039 /** @defgroup USART_Exported_Types USART Exported Types
00040   * @{
00041   */
00042 
00043 /**
00044   * @brief USART Init Structure definition
00045   */
00046 typedef struct
00047 {
00048   uint32_t BaudRate;                  /*!< This member configures the Usart communication baud rate.
00049                                            The baud rate is computed using the following formula:
00050                                               Baud Rate Register[15:4] = ((2 * fclk_pres) /
00051                                               ((huart->Init.BaudRate)))[15:4]
00052                                               Baud Rate Register[3]    = 0
00053                                               Baud Rate Register[2:0]  =  (((2 * fclk_pres) /
00054                                               ((huart->Init.BaudRate)))[3:0]) >> 1
00055                                               where fclk_pres is the USART input clock frequency (fclk)
00056                                               divided by a prescaler.
00057                                            @note  Oversampling by 8 is systematically applied to
00058                                                   achieve high baud rates. */
00059 
00060   uint32_t WordLength;                /*!< Specifies the number of data bits transmitted or received in a frame.
00061                                            This parameter can be a value of @ref USARTEx_Word_Length. */
00062 
00063   uint32_t StopBits;                  /*!< Specifies the number of stop bits transmitted.
00064                                            This parameter can be a value of @ref USART_Stop_Bits. */
00065 
00066   uint32_t Parity;                   /*!< Specifies the parity mode.
00067                                            This parameter can be a value of @ref USART_Parity
00068                                            @note When parity is enabled, the computed parity is inserted
00069                                                  at the MSB position of the transmitted data (9th bit when
00070                                                  the word length is set to 9 data bits; 8th bit when the
00071                                                  word length is set to 8 data bits). */
00072 
00073   uint32_t Mode;                      /*!< Specifies whether the Receive or Transmit mode is enabled or disabled.
00074                                            This parameter can be a value of @ref USART_Mode. */
00075 
00076   uint32_t CLKPolarity;               /*!< Specifies the steady state of the serial clock.
00077                                            This parameter can be a value of @ref USART_Clock_Polarity. */
00078 
00079   uint32_t CLKPhase;                  /*!< Specifies the clock transition on which the bit capture is made.
00080                                            This parameter can be a value of @ref USART_Clock_Phase. */
00081 
00082   uint32_t CLKLastBit;                /*!< Specifies whether the clock pulse corresponding to the last transmitted
00083                                            data bit (MSB) has to be output on the SCLK pin in synchronous mode.
00084                                            This parameter can be a value of @ref USART_Last_Bit. */
00085 
00086   uint32_t ClockPrescaler;            /*!< Specifies the prescaler value used to divide the USART clock source.
00087                                            This parameter can be a value of @ref USART_ClockPrescaler. */
00088 } USART_InitTypeDef;
00089 
00090 /**
00091   * @brief HAL USART State structures definition
00092   */
00093 typedef enum
00094 {
00095   HAL_USART_STATE_RESET             = 0x00U,    /*!< Peripheral is not initialized                  */
00096   HAL_USART_STATE_READY             = 0x01U,    /*!< Peripheral Initialized and ready for use       */
00097   HAL_USART_STATE_BUSY              = 0x02U,    /*!< an internal process is ongoing                 */
00098   HAL_USART_STATE_BUSY_TX           = 0x12U,    /*!< Data Transmission process is ongoing           */
00099   HAL_USART_STATE_BUSY_RX           = 0x22U,    /*!< Data Reception process is ongoing              */
00100   HAL_USART_STATE_BUSY_TX_RX        = 0x32U,    /*!< Data Transmission Reception process is ongoing */
00101   HAL_USART_STATE_TIMEOUT           = 0x03U,    /*!< Timeout state                                  */
00102   HAL_USART_STATE_ERROR             = 0x04U     /*!< Error                                          */
00103 } HAL_USART_StateTypeDef;
00104 
00105 /**
00106   * @brief  USART clock sources definitions
00107   */
00108 typedef enum
00109 {
00110   USART_CLOCKSOURCE_D2PCLK1    = 0x00U,    /*!< Domain2 PCLK1 clock source */
00111   USART_CLOCKSOURCE_D2PCLK2    = 0x01U,    /*!< Domain2 PCLK2 clock source */
00112   USART_CLOCKSOURCE_PLL2       = 0x02U,    /*!< PLL2Q clock source         */
00113   USART_CLOCKSOURCE_PLL3       = 0x04U,    /*!< PLL3Q clock source         */
00114   USART_CLOCKSOURCE_HSI        = 0x08U,    /*!< HSI clock source           */
00115   USART_CLOCKSOURCE_CSI        = 0x10U,    /*!< CSI clock source           */
00116   USART_CLOCKSOURCE_LSE        = 0x20U,    /*!< LSE clock source           */
00117   USART_CLOCKSOURCE_UNDEFINED  = 0x40U     /*!< Undefined clock source     */
00118 } USART_ClockSourceTypeDef;
00119 
00120 /**
00121   * @brief  USART handle Structure definition
00122   */
00123 typedef struct __USART_HandleTypeDef
00124 {
00125   USART_TypeDef                 *Instance;               /*!< USART registers base address        */
00126 
00127   USART_InitTypeDef             Init;                    /*!< USART communication parameters      */
00128 
00129   const uint8_t                 *pTxBuffPtr;             /*!< Pointer to USART Tx transfer Buffer */
00130 
00131   uint16_t                      TxXferSize;              /*!< USART Tx Transfer size              */
00132 
00133   __IO uint16_t                 TxXferCount;             /*!< USART Tx Transfer Counter           */
00134 
00135   uint8_t                       *pRxBuffPtr;             /*!< Pointer to USART Rx transfer Buffer */
00136 
00137   uint16_t                      RxXferSize;              /*!< USART Rx Transfer size              */
00138 
00139   __IO uint16_t                 RxXferCount;             /*!< USART Rx Transfer Counter           */
00140 
00141   uint16_t                      Mask;                    /*!< USART Rx RDR register mask          */
00142 
00143   uint16_t                      NbRxDataToProcess;       /*!< Number of data to process during RX ISR execution */
00144 
00145   uint16_t                      NbTxDataToProcess;       /*!< Number of data to process during TX ISR execution */
00146 
00147   uint32_t                      SlaveMode;               /*!< Enable/Disable UART SPI Slave Mode. This parameter can be a value
00148                                                               of @ref USARTEx_Slave_Mode */
00149 
00150   uint32_t                      FifoMode;                /*!< Specifies if the FIFO mode will be used. This parameter can be a value
00151                                                               of @ref USARTEx_FIFO_mode. */
00152 
00153   void (*RxISR)(struct __USART_HandleTypeDef *husart);   /*!< Function pointer on Rx IRQ handler  */
00154 
00155   void (*TxISR)(struct __USART_HandleTypeDef *husart);   /*!< Function pointer on Tx IRQ handler  */
00156 
00157   DMA_HandleTypeDef             *hdmatx;                 /*!< USART Tx DMA Handle parameters      */
00158 
00159   DMA_HandleTypeDef             *hdmarx;                 /*!< USART Rx DMA Handle parameters      */
00160 
00161   HAL_LockTypeDef               Lock;                    /*!< Locking object                      */
00162 
00163   __IO HAL_USART_StateTypeDef   State;                   /*!< USART communication state           */
00164 
00165   __IO uint32_t                 ErrorCode;               /*!< USART Error code                    */
00166 
00167 #if (USE_HAL_USART_REGISTER_CALLBACKS == 1)
00168   void (* TxHalfCpltCallback)(struct __USART_HandleTypeDef *husart);        /*!< USART Tx Half Complete Callback        */
00169   void (* TxCpltCallback)(struct __USART_HandleTypeDef *husart);            /*!< USART Tx Complete Callback             */
00170   void (* RxHalfCpltCallback)(struct __USART_HandleTypeDef *husart);        /*!< USART Rx Half Complete Callback        */
00171   void (* RxCpltCallback)(struct __USART_HandleTypeDef *husart);            /*!< USART Rx Complete Callback             */
00172   void (* TxRxCpltCallback)(struct __USART_HandleTypeDef *husart);          /*!< USART Tx Rx Complete Callback          */
00173   void (* ErrorCallback)(struct __USART_HandleTypeDef *husart);             /*!< USART Error Callback                   */
00174   void (* AbortCpltCallback)(struct __USART_HandleTypeDef *husart);         /*!< USART Abort Complete Callback          */
00175   void (* RxFifoFullCallback)(struct __USART_HandleTypeDef *husart);        /*!< USART Rx Fifo Full Callback            */
00176   void (* TxFifoEmptyCallback)(struct __USART_HandleTypeDef *husart);       /*!< USART Tx Fifo Empty Callback           */
00177 
00178   void (* MspInitCallback)(struct __USART_HandleTypeDef *husart);           /*!< USART Msp Init callback                */
00179   void (* MspDeInitCallback)(struct __USART_HandleTypeDef *husart);         /*!< USART Msp DeInit callback              */
00180 #endif  /* USE_HAL_USART_REGISTER_CALLBACKS */
00181 
00182 } USART_HandleTypeDef;
00183 
00184 #if (USE_HAL_USART_REGISTER_CALLBACKS == 1)
00185 /**
00186   * @brief  HAL USART Callback ID enumeration definition
00187   */
00188 typedef enum
00189 {
00190   HAL_USART_TX_HALFCOMPLETE_CB_ID         = 0x00U,    /*!< USART Tx Half Complete Callback ID        */
00191   HAL_USART_TX_COMPLETE_CB_ID             = 0x01U,    /*!< USART Tx Complete Callback ID             */
00192   HAL_USART_RX_HALFCOMPLETE_CB_ID         = 0x02U,    /*!< USART Rx Half Complete Callback ID        */
00193   HAL_USART_RX_COMPLETE_CB_ID             = 0x03U,    /*!< USART Rx Complete Callback ID             */
00194   HAL_USART_TX_RX_COMPLETE_CB_ID          = 0x04U,    /*!< USART Tx Rx Complete Callback ID          */
00195   HAL_USART_ERROR_CB_ID                   = 0x05U,    /*!< USART Error Callback ID                   */
00196   HAL_USART_ABORT_COMPLETE_CB_ID          = 0x06U,    /*!< USART Abort Complete Callback ID          */
00197   HAL_USART_RX_FIFO_FULL_CB_ID            = 0x07U,    /*!< USART Rx Fifo Full Callback ID            */
00198   HAL_USART_TX_FIFO_EMPTY_CB_ID           = 0x08U,    /*!< USART Tx Fifo Empty Callback ID           */
00199 
00200   HAL_USART_MSPINIT_CB_ID                 = 0x09U,    /*!< USART MspInit callback ID                 */
00201   HAL_USART_MSPDEINIT_CB_ID               = 0x0AU     /*!< USART MspDeInit callback ID               */
00202 
00203 } HAL_USART_CallbackIDTypeDef;
00204 
00205 /**
00206   * @brief  HAL USART Callback pointer definition
00207   */
00208 typedef  void (*pUSART_CallbackTypeDef)(USART_HandleTypeDef *husart);  /*!< pointer to an USART callback function */
00209 
00210 #endif /* USE_HAL_USART_REGISTER_CALLBACKS */
00211 
00212 /**
00213   * @}
00214   */
00215 
00216 /* Exported constants --------------------------------------------------------*/
00217 /** @defgroup USART_Exported_Constants USART Exported Constants
00218   * @{
00219   */
00220 
00221 /** @defgroup USART_Error_Definition   USART Error Definition
00222   * @{
00223   */
00224 #define HAL_USART_ERROR_NONE             (0x00000000U)    /*!< No error                  */
00225 #define HAL_USART_ERROR_PE               (0x00000001U)    /*!< Parity error              */
00226 #define HAL_USART_ERROR_NE               (0x00000002U)    /*!< Noise error               */
00227 #define HAL_USART_ERROR_FE               (0x00000004U)    /*!< Frame error               */
00228 #define HAL_USART_ERROR_ORE              (0x00000008U)    /*!< Overrun error             */
00229 #define HAL_USART_ERROR_DMA              (0x00000010U)    /*!< DMA transfer error        */
00230 #define HAL_USART_ERROR_UDR              (0x00000020U)    /*!< SPI slave underrun error  */
00231 #if (USE_HAL_USART_REGISTER_CALLBACKS == 1)
00232 #define HAL_USART_ERROR_INVALID_CALLBACK (0x00000040U)    /*!< Invalid Callback error    */
00233 #endif /* USE_HAL_USART_REGISTER_CALLBACKS */
00234 #define  HAL_USART_ERROR_RTO              (0x00000080U)    /*!< Receiver Timeout error  */
00235 /**
00236   * @}
00237   */
00238 
00239 /** @defgroup USART_Stop_Bits  USART Number of Stop Bits
00240   * @{
00241   */
00242 #define USART_STOPBITS_0_5                   USART_CR2_STOP_0                     /*!< USART frame with 0.5 stop bit  */
00243 #define USART_STOPBITS_1                     0x00000000U                          /*!< USART frame with 1 stop bit    */
00244 #define USART_STOPBITS_1_5                  (USART_CR2_STOP_0 | USART_CR2_STOP_1) /*!< USART frame with 1.5 stop bits */
00245 #define USART_STOPBITS_2                     USART_CR2_STOP_1                     /*!< USART frame with 2 stop bits   */
00246 /**
00247   * @}
00248   */
00249 
00250 /** @defgroup USART_Parity    USART Parity
00251   * @{
00252   */
00253 #define USART_PARITY_NONE                   0x00000000U                      /*!< No parity   */
00254 #define USART_PARITY_EVEN                   USART_CR1_PCE                    /*!< Even parity */
00255 #define USART_PARITY_ODD                    (USART_CR1_PCE | USART_CR1_PS)   /*!< Odd parity  */
00256 /**
00257   * @}
00258   */
00259 
00260 /** @defgroup USART_Mode   USART Mode
00261   * @{
00262   */
00263 #define USART_MODE_RX                       USART_CR1_RE                    /*!< RX mode        */
00264 #define USART_MODE_TX                       USART_CR1_TE                    /*!< TX mode        */
00265 #define USART_MODE_TX_RX                    (USART_CR1_TE |USART_CR1_RE)    /*!< RX and TX mode */
00266 /**
00267   * @}
00268   */
00269 
00270 /** @defgroup USART_Clock  USART Clock
00271   * @{
00272   */
00273 #define USART_CLOCK_DISABLE                 0x00000000U       /*!< USART clock disable */
00274 #define USART_CLOCK_ENABLE                  USART_CR2_CLKEN   /*!< USART clock enable  */
00275 /**
00276   * @}
00277   */
00278 
00279 /** @defgroup USART_Clock_Polarity  USART Clock Polarity
00280   * @{
00281   */
00282 #define USART_POLARITY_LOW                  0x00000000U      /*!< Driver enable signal is active high */
00283 #define USART_POLARITY_HIGH                 USART_CR2_CPOL   /*!< Driver enable signal is active low  */
00284 /**
00285   * @}
00286   */
00287 
00288 /** @defgroup USART_Clock_Phase   USART Clock Phase
00289   * @{
00290   */
00291 #define USART_PHASE_1EDGE                   0x00000000U      /*!< USART frame phase on first clock transition  */
00292 #define USART_PHASE_2EDGE                   USART_CR2_CPHA   /*!< USART frame phase on second clock transition */
00293 /**
00294   * @}
00295   */
00296 
00297 /** @defgroup USART_Last_Bit  USART Last Bit
00298   * @{
00299   */
00300 #define USART_LASTBIT_DISABLE               0x00000000U      /*!< USART frame last data bit clock pulse not output to SCLK pin */
00301 #define USART_LASTBIT_ENABLE                USART_CR2_LBCL   /*!< USART frame last data bit clock pulse output to SCLK pin     */
00302 /**
00303   * @}
00304   */
00305 
00306 /** @defgroup USART_ClockPrescaler  USART Clock Prescaler
00307   * @{
00308   */
00309 #define USART_PRESCALER_DIV1    0x00000000U  /*!< fclk_pres = fclk     */
00310 #define USART_PRESCALER_DIV2    0x00000001U  /*!< fclk_pres = fclk/2   */
00311 #define USART_PRESCALER_DIV4    0x00000002U  /*!< fclk_pres = fclk/4   */
00312 #define USART_PRESCALER_DIV6    0x00000003U  /*!< fclk_pres = fclk/6   */
00313 #define USART_PRESCALER_DIV8    0x00000004U  /*!< fclk_pres = fclk/8   */
00314 #define USART_PRESCALER_DIV10   0x00000005U  /*!< fclk_pres = fclk/10  */
00315 #define USART_PRESCALER_DIV12   0x00000006U  /*!< fclk_pres = fclk/12  */
00316 #define USART_PRESCALER_DIV16   0x00000007U  /*!< fclk_pres = fclk/16  */
00317 #define USART_PRESCALER_DIV32   0x00000008U  /*!< fclk_pres = fclk/32  */
00318 #define USART_PRESCALER_DIV64   0x00000009U  /*!< fclk_pres = fclk/64  */
00319 #define USART_PRESCALER_DIV128  0x0000000AU  /*!< fclk_pres = fclk/128 */
00320 #define USART_PRESCALER_DIV256  0x0000000BU  /*!< fclk_pres = fclk/256 */
00321 
00322 /**
00323   * @}
00324   */
00325 
00326 /** @defgroup USART_Request_Parameters  USART Request Parameters
00327   * @{
00328   */
00329 #define USART_RXDATA_FLUSH_REQUEST        USART_RQR_RXFRQ        /*!< Receive Data flush Request  */
00330 #define USART_TXDATA_FLUSH_REQUEST        USART_RQR_TXFRQ        /*!< Transmit data flush Request */
00331 /**
00332   * @}
00333   */
00334 
00335 /** @defgroup USART_Flags      USART Flags
00336   *        Elements values convention: 0xXXXX
00337   *           - 0xXXXX  : Flag mask in the ISR register
00338   * @{
00339   */
00340 #define USART_FLAG_TXFT                     USART_ISR_TXFT          /*!< USART TXFIFO threshold flag                */
00341 #define USART_FLAG_RXFT                     USART_ISR_RXFT          /*!< USART RXFIFO threshold flag                */
00342 #define USART_FLAG_RXFF                     USART_ISR_RXFF          /*!< USART RXFIFO Full flag                     */
00343 #define USART_FLAG_TXFE                     USART_ISR_TXFE          /*!< USART TXFIFO Empty flag                    */
00344 #define USART_FLAG_REACK                    USART_ISR_REACK         /*!< USART receive enable acknowledge flag      */
00345 #define USART_FLAG_TEACK                    USART_ISR_TEACK         /*!< USART transmit enable acknowledge flag     */
00346 #define USART_FLAG_BUSY                     USART_ISR_BUSY          /*!< USART busy flag                            */
00347 #define USART_FLAG_UDR                      USART_ISR_UDR           /*!< SPI slave underrun error flag              */
00348 #define USART_FLAG_TXE                      USART_ISR_TXE_TXFNF     /*!< USART transmit data register empty         */
00349 #define USART_FLAG_TXFNF                    USART_ISR_TXE_TXFNF     /*!< USART TXFIFO not full                      */
00350 #define USART_FLAG_RTOF                     USART_ISR_RTOF          /*!< USART receiver timeout flag                */
00351 #define USART_FLAG_TC                       USART_ISR_TC            /*!< USART transmission complete                */
00352 #define USART_FLAG_RXNE                     USART_ISR_RXNE_RXFNE    /*!< USART read data register not empty         */
00353 #define USART_FLAG_RXFNE                    USART_ISR_RXNE_RXFNE    /*!< USART RXFIFO not empty                     */
00354 #define USART_FLAG_IDLE                     USART_ISR_IDLE          /*!< USART idle flag                            */
00355 #define USART_FLAG_ORE                      USART_ISR_ORE           /*!< USART overrun error                        */
00356 #define USART_FLAG_NE                       USART_ISR_NE            /*!< USART noise error                          */
00357 #define USART_FLAG_FE                       USART_ISR_FE            /*!< USART frame error                          */
00358 #define USART_FLAG_PE                       USART_ISR_PE            /*!< USART parity error                         */
00359 /**
00360   * @}
00361   */
00362 
00363 /** @defgroup USART_Interrupt_definition USART Interrupts Definition
00364   *        Elements values convention: 0000ZZZZ0XXYYYYYb
00365   *           - YYYYY  : Interrupt source position in the XX register (5bits)
00366   *           - XX  : Interrupt source register (2bits)
00367   *                 - 01: CR1 register
00368   *                 - 10: CR2 register
00369   *                 - 11: CR3 register
00370   *           - ZZZZ  : Flag position in the ISR register(4bits)
00371   * @{
00372   */
00373 
00374 #define USART_IT_PE                          0x0028U     /*!< USART parity error interruption                 */
00375 #define USART_IT_TXE                         0x0727U     /*!< USART transmit data register empty interruption */
00376 #define USART_IT_TXFNF                       0x0727U     /*!< USART TX FIFO not full interruption             */
00377 #define USART_IT_TC                          0x0626U     /*!< USART transmission complete interruption        */
00378 #define USART_IT_RXNE                        0x0525U     /*!< USART read data register not empty interruption */
00379 #define USART_IT_RXFNE                       0x0525U     /*!< USART RXFIFO not empty interruption             */
00380 #define USART_IT_IDLE                        0x0424U     /*!< USART idle interruption                         */
00381 #define USART_IT_ERR                         0x0060U     /*!< USART error interruption                        */
00382 #define USART_IT_ORE                         0x0300U     /*!< USART overrun error interruption                */
00383 #define USART_IT_NE                          0x0200U     /*!< USART noise error interruption                  */
00384 #define USART_IT_FE                          0x0100U     /*!< USART frame error interruption                  */
00385 #define USART_IT_RXFF                        0x183FU     /*!< USART RXFIFO full interruption                  */
00386 #define USART_IT_TXFE                        0x173EU     /*!< USART TXFIFO empty interruption                 */
00387 #define USART_IT_RXFT                        0x1A7CU     /*!< USART RXFIFO threshold reached interruption     */
00388 #define USART_IT_TXFT                        0x1B77U     /*!< USART TXFIFO threshold reached interruption     */
00389 
00390 /**
00391   * @}
00392   */
00393 
00394 /** @defgroup USART_IT_CLEAR_Flags    USART Interruption Clear Flags
00395   * @{
00396   */
00397 #define USART_CLEAR_PEF                       USART_ICR_PECF            /*!< Parity Error Clear Flag             */
00398 #define USART_CLEAR_FEF                       USART_ICR_FECF            /*!< Framing Error Clear Flag            */
00399 #define USART_CLEAR_NEF                       USART_ICR_NECF            /*!< Noise Error detected Clear Flag     */
00400 #define USART_CLEAR_OREF                      USART_ICR_ORECF           /*!< OverRun Error Clear Flag            */
00401 #define USART_CLEAR_IDLEF                     USART_ICR_IDLECF          /*!< IDLE line detected Clear Flag       */
00402 #define USART_CLEAR_TCF                       USART_ICR_TCCF            /*!< Transmission Complete Clear Flag    */
00403 #define USART_CLEAR_UDRF                      USART_ICR_UDRCF           /*!< SPI slave underrun error Clear Flag */
00404 #define USART_CLEAR_TXFECF                    USART_ICR_TXFECF          /*!< TXFIFO Empty Clear Flag             */
00405 #define USART_CLEAR_RTOF                      USART_ICR_RTOCF           /*!< USART receiver timeout clear flag  */
00406 /**
00407   * @}
00408   */
00409 
00410 /** @defgroup USART_Interruption_Mask    USART Interruption Flags Mask
00411   * @{
00412   */
00413 #define USART_IT_MASK                             0x001FU     /*!< USART interruptions flags mask */
00414 #define USART_CR_MASK                             0x00E0U     /*!< USART control register mask */
00415 #define USART_CR_POS                              5U          /*!< USART control register position */
00416 #define USART_ISR_MASK                            0x1F00U     /*!< USART ISR register mask         */
00417 #define USART_ISR_POS                             8U          /*!< USART ISR register position     */
00418 /**
00419   * @}
00420   */
00421 
00422 /**
00423   * @}
00424   */
00425 
00426 /* Exported macros -----------------------------------------------------------*/
00427 /** @defgroup USART_Exported_Macros USART Exported Macros
00428   * @{
00429   */
00430 
00431 /** @brief Reset USART handle state.
00432   * @param  __HANDLE__ USART handle.
00433   * @retval None
00434   */
00435 #if (USE_HAL_USART_REGISTER_CALLBACKS == 1)
00436 #define __HAL_USART_RESET_HANDLE_STATE(__HANDLE__)  do{                                            \
00437                                                         (__HANDLE__)->State = HAL_USART_STATE_RESET; \
00438                                                         (__HANDLE__)->MspInitCallback = NULL;        \
00439                                                         (__HANDLE__)->MspDeInitCallback = NULL;      \
00440                                                       } while(0U)
00441 #else
00442 #define __HAL_USART_RESET_HANDLE_STATE(__HANDLE__)  ((__HANDLE__)->State = HAL_USART_STATE_RESET)
00443 #endif /* USE_HAL_USART_REGISTER_CALLBACKS */
00444 
00445 /** @brief  Check whether the specified USART flag is set or not.
00446   * @param  __HANDLE__ specifies the USART Handle
00447   * @param  __FLAG__ specifies the flag to check.
00448   *        This parameter can be one of the following values:
00449   *            @arg @ref USART_FLAG_TXFT  TXFIFO threshold flag
00450   *            @arg @ref USART_FLAG_RXFT  RXFIFO threshold flag
00451   *            @arg @ref USART_FLAG_RXFF  RXFIFO Full flag
00452   *            @arg @ref USART_FLAG_TXFE  TXFIFO Empty flag
00453   *            @arg @ref USART_FLAG_REACK Receive enable acknowledge flag
00454   *            @arg @ref USART_FLAG_TEACK Transmit enable acknowledge flag
00455   *            @arg @ref USART_FLAG_BUSY  Busy flag
00456   *            @arg @ref USART_FLAG_UDR   SPI slave underrun error flag
00457   *            @arg @ref USART_FLAG_TXE   Transmit data register empty flag
00458   *            @arg @ref USART_FLAG_TXFNF TXFIFO not full flag
00459   *            @arg @ref USART_FLAG_TC    Transmission Complete flag
00460   *            @arg @ref USART_FLAG_RXNE  Receive data register not empty flag
00461   *            @arg @ref USART_FLAG_RXFNE RXFIFO not empty flag
00462   *            @arg @ref USART_FLAG_RTOF  Receiver Timeout flag
00463   *            @arg @ref USART_FLAG_IDLE  Idle Line detection flag
00464   *            @arg @ref USART_FLAG_ORE   OverRun Error flag
00465   *            @arg @ref USART_FLAG_NE    Noise Error flag
00466   *            @arg @ref USART_FLAG_FE    Framing Error flag
00467   *            @arg @ref USART_FLAG_PE    Parity Error flag
00468   * @retval The new state of __FLAG__ (TRUE or FALSE).
00469   */
00470 #define __HAL_USART_GET_FLAG(__HANDLE__, __FLAG__) (((__HANDLE__)->Instance->ISR & (__FLAG__)) == (__FLAG__))
00471 
00472 /** @brief  Clear the specified USART pending flag.
00473   * @param  __HANDLE__ specifies the USART Handle.
00474   * @param  __FLAG__ specifies the flag to check.
00475   *          This parameter can be any combination of the following values:
00476   *            @arg @ref USART_CLEAR_PEF      Parity Error Clear Flag
00477   *            @arg @ref USART_CLEAR_FEF      Framing Error Clear Flag
00478   *            @arg @ref USART_CLEAR_NEF      Noise detected Clear Flag
00479   *            @arg @ref USART_CLEAR_OREF     Overrun Error Clear Flag
00480   *            @arg @ref USART_CLEAR_IDLEF    IDLE line detected Clear Flag
00481   *            @arg @ref USART_CLEAR_TXFECF   TXFIFO empty clear Flag
00482   *            @arg @ref USART_CLEAR_TCF      Transmission Complete Clear Flag
00483   *            @arg @ref USART_CLEAR_RTOF     Receiver Timeout clear flag
00484   *            @arg @ref USART_CLEAR_UDRF     SPI slave underrun error Clear Flag
00485   * @retval None
00486   */
00487 #define __HAL_USART_CLEAR_FLAG(__HANDLE__, __FLAG__) ((__HANDLE__)->Instance->ICR = (__FLAG__))
00488 
00489 /** @brief  Clear the USART PE pending flag.
00490   * @param  __HANDLE__ specifies the USART Handle.
00491   * @retval None
00492   */
00493 #define __HAL_USART_CLEAR_PEFLAG(__HANDLE__)   __HAL_USART_CLEAR_FLAG((__HANDLE__), USART_CLEAR_PEF)
00494 
00495 /** @brief  Clear the USART FE pending flag.
00496   * @param  __HANDLE__ specifies the USART Handle.
00497   * @retval None
00498   */
00499 #define __HAL_USART_CLEAR_FEFLAG(__HANDLE__)   __HAL_USART_CLEAR_FLAG((__HANDLE__), USART_CLEAR_FEF)
00500 
00501 /** @brief  Clear the USART NE pending flag.
00502   * @param  __HANDLE__ specifies the USART Handle.
00503   * @retval None
00504   */
00505 #define __HAL_USART_CLEAR_NEFLAG(__HANDLE__)  __HAL_USART_CLEAR_FLAG((__HANDLE__), USART_CLEAR_NEF)
00506 
00507 /** @brief  Clear the USART ORE pending flag.
00508   * @param  __HANDLE__ specifies the USART Handle.
00509   * @retval None
00510   */
00511 #define __HAL_USART_CLEAR_OREFLAG(__HANDLE__)   __HAL_USART_CLEAR_FLAG((__HANDLE__), USART_CLEAR_OREF)
00512 
00513 /** @brief  Clear the USART IDLE pending flag.
00514   * @param  __HANDLE__ specifies the USART Handle.
00515   * @retval None
00516   */
00517 #define __HAL_USART_CLEAR_IDLEFLAG(__HANDLE__)   __HAL_USART_CLEAR_FLAG((__HANDLE__), USART_CLEAR_IDLEF)
00518 
00519 /** @brief  Clear the USART TX FIFO empty clear flag.
00520   * @param  __HANDLE__ specifies the USART Handle.
00521   * @retval None
00522   */
00523 #define __HAL_USART_CLEAR_TXFECF(__HANDLE__)   __HAL_USART_CLEAR_FLAG((__HANDLE__), USART_CLEAR_TXFECF)
00524 
00525 /** @brief  Clear SPI slave underrun error flag.
00526   * @param  __HANDLE__ specifies the USART Handle.
00527   * @retval None
00528   */
00529 #define __HAL_USART_CLEAR_UDRFLAG(__HANDLE__)   __HAL_USART_CLEAR_FLAG((__HANDLE__), USART_CLEAR_UDRF)
00530 
00531 /** @brief  Enable the specified USART interrupt.
00532   * @param  __HANDLE__ specifies the USART Handle.
00533   * @param  __INTERRUPT__ specifies the USART interrupt source to enable.
00534   *          This parameter can be one of the following values:
00535   *            @arg @ref USART_IT_RXFF  RXFIFO Full interrupt
00536   *            @arg @ref USART_IT_TXFE  TXFIFO Empty interrupt
00537   *            @arg @ref USART_IT_RXFT  RXFIFO threshold interrupt
00538   *            @arg @ref USART_IT_TXFT  TXFIFO threshold interrupt
00539   *            @arg @ref USART_IT_TXE   Transmit Data Register empty interrupt
00540   *            @arg @ref USART_IT_TXFNF TX FIFO not full interrupt
00541   *            @arg @ref USART_IT_TC    Transmission complete interrupt
00542   *            @arg @ref USART_IT_RXNE  Receive Data register not empty interrupt
00543   *            @arg @ref USART_IT_RXFNE RXFIFO not empty interrupt
00544   *            @arg @ref USART_IT_IDLE  Idle line detection interrupt
00545   *            @arg @ref USART_IT_PE    Parity Error interrupt
00546   *            @arg @ref USART_IT_ERR   Error interrupt(Frame error, noise error, overrun error)
00547   * @retval None
00548   */
00549 #define __HAL_USART_ENABLE_IT(__HANDLE__, __INTERRUPT__)\
00550   (((((__INTERRUPT__) & USART_CR_MASK) >> USART_CR_POS) == 1U)?\
00551    ((__HANDLE__)->Instance->CR1 |= (1U << ((__INTERRUPT__) & USART_IT_MASK))): \
00552    ((((__INTERRUPT__) & USART_CR_MASK) >> USART_CR_POS) == 2U)?\
00553    ((__HANDLE__)->Instance->CR2 |= (1U << ((__INTERRUPT__) & USART_IT_MASK))): \
00554    ((__HANDLE__)->Instance->CR3 |= (1U << ((__INTERRUPT__) & USART_IT_MASK))))
00555 
00556 /** @brief  Disable the specified USART interrupt.
00557   * @param  __HANDLE__ specifies the USART Handle.
00558   * @param  __INTERRUPT__ specifies the USART interrupt source to disable.
00559   *          This parameter can be one of the following values:
00560   *            @arg @ref USART_IT_RXFF  RXFIFO Full interrupt
00561   *            @arg @ref USART_IT_TXFE  TXFIFO Empty interrupt
00562   *            @arg @ref USART_IT_RXFT  RXFIFO threshold interrupt
00563   *            @arg @ref USART_IT_TXFT  TXFIFO threshold interrupt
00564   *            @arg @ref USART_IT_TXE   Transmit Data Register empty interrupt
00565   *            @arg @ref USART_IT_TXFNF TX FIFO not full interrupt
00566   *            @arg @ref USART_IT_TC    Transmission complete interrupt
00567   *            @arg @ref USART_IT_RXNE  Receive Data register not empty interrupt
00568   *            @arg @ref USART_IT_RXFNE RXFIFO not empty interrupt
00569   *            @arg @ref USART_IT_IDLE  Idle line detection interrupt
00570   *            @arg @ref USART_IT_PE    Parity Error interrupt
00571   *            @arg @ref USART_IT_ERR   Error interrupt(Frame error, noise error, overrun error)
00572   * @retval None
00573   */
00574 #define __HAL_USART_DISABLE_IT(__HANDLE__, __INTERRUPT__)\
00575   (((((__INTERRUPT__) & USART_CR_MASK) >> USART_CR_POS) == 1U)?\
00576    ((__HANDLE__)->Instance->CR1 &= ~ (1U << ((__INTERRUPT__) & USART_IT_MASK))): \
00577    ((((__INTERRUPT__) & USART_CR_MASK) >> USART_CR_POS) == 2U)?\
00578    ((__HANDLE__)->Instance->CR2 &= ~ (1U << ((__INTERRUPT__) & USART_IT_MASK))): \
00579    ((__HANDLE__)->Instance->CR3 &= ~ (1U << ((__INTERRUPT__) & USART_IT_MASK))))
00580 
00581 /** @brief  Check whether the specified USART interrupt has occurred or not.
00582   * @param  __HANDLE__ specifies the USART Handle.
00583   * @param  __INTERRUPT__ specifies the USART interrupt source to check.
00584   *          This parameter can be one of the following values:
00585   *            @arg @ref USART_IT_RXFF  RXFIFO Full interrupt
00586   *            @arg @ref USART_IT_TXFE  TXFIFO Empty interrupt
00587   *            @arg @ref USART_IT_RXFT  RXFIFO threshold interrupt
00588   *            @arg @ref USART_IT_TXFT  TXFIFO threshold interrupt
00589   *            @arg @ref USART_IT_TXE   Transmit Data Register empty interrupt
00590   *            @arg @ref USART_IT_TXFNF TX FIFO not full interrupt
00591   *            @arg @ref USART_IT_TC    Transmission complete interrupt
00592   *            @arg @ref USART_IT_RXNE  Receive Data register not empty interrupt
00593   *            @arg @ref USART_IT_RXFNE RXFIFO not empty interrupt
00594   *            @arg @ref USART_IT_IDLE  Idle line detection interrupt
00595   *            @arg @ref USART_IT_ORE   OverRun Error interrupt
00596   *            @arg @ref USART_IT_NE    Noise Error interrupt
00597   *            @arg @ref USART_IT_FE    Framing Error interrupt
00598   *            @arg @ref USART_IT_PE    Parity Error interrupt
00599   * @retval The new state of __INTERRUPT__ (SET or RESET).
00600   */
00601 #define __HAL_USART_GET_IT(__HANDLE__, __INTERRUPT__) ((((__HANDLE__)->Instance->ISR\
00602                                                          & (0x01U << (((__INTERRUPT__) & USART_ISR_MASK)>>\
00603                                                                       USART_ISR_POS))) != 0U) ? SET : RESET)
00604 
00605 /** @brief  Check whether the specified USART interrupt source is enabled or not.
00606   * @param  __HANDLE__ specifies the USART Handle.
00607   * @param  __INTERRUPT__ specifies the USART interrupt source to check.
00608   *          This parameter can be one of the following values:
00609   *            @arg @ref USART_IT_RXFF  RXFIFO Full interrupt
00610   *            @arg @ref USART_IT_TXFE  TXFIFO Empty interrupt
00611   *            @arg @ref USART_IT_RXFT  RXFIFO threshold interrupt
00612   *            @arg @ref USART_IT_TXFT  TXFIFO threshold interrupt
00613   *            @arg @ref USART_IT_TXE   Transmit Data Register empty interrupt
00614   *            @arg @ref USART_IT_TXFNF TX FIFO not full interrupt
00615   *            @arg @ref USART_IT_TC    Transmission complete interrupt
00616   *            @arg @ref USART_IT_RXNE  Receive Data register not empty interrupt
00617   *            @arg @ref USART_IT_RXFNE RXFIFO not empty interrupt
00618   *            @arg @ref USART_IT_IDLE  Idle line detection interrupt
00619   *            @arg @ref USART_IT_ORE   OverRun Error interrupt
00620   *            @arg @ref USART_IT_NE    Noise Error interrupt
00621   *            @arg @ref USART_IT_FE    Framing Error interrupt
00622   *            @arg @ref USART_IT_PE    Parity Error interrupt
00623   * @retval The new state of __INTERRUPT__ (SET or RESET).
00624   */
00625 #define __HAL_USART_GET_IT_SOURCE(__HANDLE__, __INTERRUPT__) ((((((((uint8_t)(__INTERRUPT__)) >> 0x05U) == 0x01U) ?\
00626                                                                  (__HANDLE__)->Instance->CR1 : \
00627                                                                  (((((uint8_t)(__INTERRUPT__)) >> 0x05U) == 0x02U) ?\
00628                                                                   (__HANDLE__)->Instance->CR2 : \
00629                                                                   (__HANDLE__)->Instance->CR3)) & (0x01U <<\
00630                                                                       (((uint16_t)(__INTERRUPT__)) &\
00631                                                                        USART_IT_MASK)))  != 0U) ? SET : RESET)
00632 
00633 /** @brief  Clear the specified USART ISR flag, in setting the proper ICR register flag.
00634   * @param  __HANDLE__ specifies the USART Handle.
00635   * @param  __IT_CLEAR__ specifies the interrupt clear register flag that needs to be set
00636   *                       to clear the corresponding interrupt.
00637   *          This parameter can be one of the following values:
00638   *            @arg @ref USART_CLEAR_PEF      Parity Error Clear Flag
00639   *            @arg @ref USART_CLEAR_FEF      Framing Error Clear Flag
00640   *            @arg @ref USART_CLEAR_NEF      Noise detected Clear Flag
00641   *            @arg @ref USART_CLEAR_OREF     Overrun Error Clear Flag
00642   *            @arg @ref USART_CLEAR_IDLEF    IDLE line detected Clear Flag
00643   *            @arg @ref USART_CLEAR_RTOF     Receiver timeout clear flag
00644   *            @arg @ref USART_CLEAR_TXFECF   TXFIFO empty clear Flag
00645   *            @arg @ref USART_CLEAR_TCF      Transmission Complete Clear Flag
00646   * @retval None
00647   */
00648 #define __HAL_USART_CLEAR_IT(__HANDLE__, __IT_CLEAR__) ((__HANDLE__)->Instance->ICR = (uint32_t)(__IT_CLEAR__))
00649 
00650 /** @brief  Set a specific USART request flag.
00651   * @param  __HANDLE__ specifies the USART Handle.
00652   * @param  __REQ__ specifies the request flag to set.
00653   *          This parameter can be one of the following values:
00654   *            @arg @ref USART_RXDATA_FLUSH_REQUEST Receive Data flush Request
00655   *            @arg @ref USART_TXDATA_FLUSH_REQUEST Transmit data flush Request
00656   *
00657   * @retval None
00658   */
00659 #define __HAL_USART_SEND_REQ(__HANDLE__, __REQ__)      ((__HANDLE__)->Instance->RQR |= (uint16_t)(__REQ__))
00660 
00661 /** @brief  Enable the USART one bit sample method.
00662   * @param  __HANDLE__ specifies the USART Handle.
00663   * @retval None
00664   */
00665 #define __HAL_USART_ONE_BIT_SAMPLE_ENABLE(__HANDLE__) ((__HANDLE__)->Instance->CR3|= USART_CR3_ONEBIT)
00666 
00667 /** @brief  Disable the USART one bit sample method.
00668   * @param  __HANDLE__ specifies the USART Handle.
00669   * @retval None
00670   */
00671 #define __HAL_USART_ONE_BIT_SAMPLE_DISABLE(__HANDLE__) ((__HANDLE__)->Instance->CR3 &= ~USART_CR3_ONEBIT)
00672 
00673 /** @brief  Enable USART.
00674   * @param  __HANDLE__ specifies the USART Handle.
00675   * @retval None
00676   */
00677 #define __HAL_USART_ENABLE(__HANDLE__)                 ((__HANDLE__)->Instance->CR1 |= USART_CR1_UE)
00678 
00679 /** @brief  Disable USART.
00680   * @param  __HANDLE__ specifies the USART Handle.
00681   * @retval None
00682   */
00683 #define __HAL_USART_DISABLE(__HANDLE__)                ((__HANDLE__)->Instance->CR1 &= ~USART_CR1_UE)
00684 
00685 /**
00686   * @}
00687   */
00688 
00689 /* Private macros --------------------------------------------------------*/
00690 /** @defgroup USART_Private_Macros   USART Private Macros
00691   * @{
00692   */
00693 
00694 /** @brief  Get USART clock division factor from clock prescaler value.
00695   * @param  __CLOCKPRESCALER__ USART prescaler value.
00696   * @retval USART clock division factor
00697   */
00698 #define USART_GET_DIV_FACTOR(__CLOCKPRESCALER__) \
00699   (((__CLOCKPRESCALER__) == USART_PRESCALER_DIV1)   ? 1U :       \
00700    ((__CLOCKPRESCALER__) == USART_PRESCALER_DIV2)   ? 2U :       \
00701    ((__CLOCKPRESCALER__) == USART_PRESCALER_DIV4)   ? 4U :       \
00702    ((__CLOCKPRESCALER__) == USART_PRESCALER_DIV6)   ? 6U :       \
00703    ((__CLOCKPRESCALER__) == USART_PRESCALER_DIV8)   ? 8U :       \
00704    ((__CLOCKPRESCALER__) == USART_PRESCALER_DIV10)  ? 10U :      \
00705    ((__CLOCKPRESCALER__) == USART_PRESCALER_DIV12)  ? 12U :      \
00706    ((__CLOCKPRESCALER__) == USART_PRESCALER_DIV16)  ? 16U :      \
00707    ((__CLOCKPRESCALER__) == USART_PRESCALER_DIV32)  ? 32U :      \
00708    ((__CLOCKPRESCALER__) == USART_PRESCALER_DIV64)  ? 64U :      \
00709    ((__CLOCKPRESCALER__) == USART_PRESCALER_DIV128) ? 128U :     \
00710    ((__CLOCKPRESCALER__) == USART_PRESCALER_DIV256) ? 256U : 1U)
00711 
00712 /** @brief  BRR division operation to set BRR register in 8-bit oversampling mode.
00713   * @param  __PCLK__ USART clock.
00714   * @param  __BAUD__ Baud rate set by the user.
00715   * @param  __CLOCKPRESCALER__ USART prescaler value.
00716   * @retval Division result
00717   */
00718 #define USART_DIV_SAMPLING8(__PCLK__, __BAUD__, __CLOCKPRESCALER__)\
00719   (((((__PCLK__)/USART_GET_DIV_FACTOR(__CLOCKPRESCALER__))*2U)\
00720     + ((__BAUD__)/2U)) / (__BAUD__))
00721 
00722 /** @brief  Report the USART clock source.
00723   * @param  __HANDLE__ specifies the USART Handle.
00724   * @param  __CLOCKSOURCE__ output variable.
00725   * @retval the USART clocking source, written in __CLOCKSOURCE__.
00726   */
00727 #if defined(UART9) && defined(USART10)
00728 #define USART_GETCLOCKSOURCE(__HANDLE__,__CLOCKSOURCE__)       \
00729   do {                                                         \
00730     if((__HANDLE__)->Instance == USART1)                       \
00731     {                                                          \
00732       switch(__HAL_RCC_GET_USART1_SOURCE())                    \
00733       {                                                        \
00734         case RCC_USART1CLKSOURCE_D2PCLK2:                      \
00735           (__CLOCKSOURCE__) = USART_CLOCKSOURCE_D2PCLK2;       \
00736           break;                                               \
00737         case RCC_USART1CLKSOURCE_PLL2:                         \
00738           (__CLOCKSOURCE__) = USART_CLOCKSOURCE_PLL2;          \
00739           break;                                               \
00740         case RCC_USART1CLKSOURCE_PLL3:                         \
00741           (__CLOCKSOURCE__) = USART_CLOCKSOURCE_PLL3;          \
00742           break;                                               \
00743         case RCC_USART1CLKSOURCE_HSI:                          \
00744           (__CLOCKSOURCE__) = USART_CLOCKSOURCE_HSI;           \
00745           break;                                               \
00746         case RCC_USART1CLKSOURCE_CSI:                          \
00747           (__CLOCKSOURCE__) = USART_CLOCKSOURCE_CSI;           \
00748           break;                                               \
00749         case RCC_USART1CLKSOURCE_LSE:                          \
00750           (__CLOCKSOURCE__) = USART_CLOCKSOURCE_LSE;           \
00751           break;                                               \
00752         default:                                               \
00753           (__CLOCKSOURCE__) = USART_CLOCKSOURCE_UNDEFINED;     \
00754           break;                                               \
00755       }                                                        \
00756     }                                                          \
00757     else if((__HANDLE__)->Instance == USART2)                  \
00758     {                                                          \
00759       switch(__HAL_RCC_GET_USART2_SOURCE())                    \
00760       {                                                        \
00761         case RCC_USART2CLKSOURCE_D2PCLK1:                      \
00762           (__CLOCKSOURCE__) = USART_CLOCKSOURCE_D2PCLK1;       \
00763           break;                                               \
00764         case RCC_USART2CLKSOURCE_PLL2:                         \
00765           (__CLOCKSOURCE__) = USART_CLOCKSOURCE_PLL2;          \
00766           break;                                               \
00767         case RCC_USART2CLKSOURCE_PLL3:                         \
00768           (__CLOCKSOURCE__) = USART_CLOCKSOURCE_PLL3;          \
00769           break;                                               \
00770         case RCC_USART2CLKSOURCE_HSI:                          \
00771           (__CLOCKSOURCE__) = USART_CLOCKSOURCE_HSI;           \
00772           break;                                               \
00773         case RCC_USART2CLKSOURCE_CSI:                          \
00774           (__CLOCKSOURCE__) = USART_CLOCKSOURCE_CSI;           \
00775           break;                                               \
00776         case RCC_USART2CLKSOURCE_LSE:                          \
00777           (__CLOCKSOURCE__) = USART_CLOCKSOURCE_LSE;           \
00778           break;                                               \
00779         default:                                               \
00780           (__CLOCKSOURCE__) = USART_CLOCKSOURCE_UNDEFINED;     \
00781           break;                                               \
00782       }                                                        \
00783     }                                                          \
00784     else if((__HANDLE__)->Instance == USART3)                  \
00785     {                                                          \
00786       switch(__HAL_RCC_GET_USART3_SOURCE())                    \
00787       {                                                        \
00788         case RCC_USART3CLKSOURCE_D2PCLK1:                      \
00789           (__CLOCKSOURCE__) = USART_CLOCKSOURCE_D2PCLK1;       \
00790           break;                                               \
00791         case RCC_USART3CLKSOURCE_PLL2:                         \
00792           (__CLOCKSOURCE__) = USART_CLOCKSOURCE_PLL2;          \
00793           break;                                               \
00794         case RCC_USART3CLKSOURCE_PLL3:                         \
00795           (__CLOCKSOURCE__) = USART_CLOCKSOURCE_PLL3;          \
00796           break;                                               \
00797         case RCC_USART3CLKSOURCE_HSI:                          \
00798           (__CLOCKSOURCE__) = USART_CLOCKSOURCE_HSI;           \
00799           break;                                               \
00800         case RCC_USART3CLKSOURCE_CSI:                          \
00801           (__CLOCKSOURCE__) = USART_CLOCKSOURCE_CSI;           \
00802           break;                                               \
00803         case RCC_USART3CLKSOURCE_LSE:                          \
00804           (__CLOCKSOURCE__) = USART_CLOCKSOURCE_LSE;           \
00805           break;                                               \
00806         default:                                               \
00807           (__CLOCKSOURCE__) = USART_CLOCKSOURCE_UNDEFINED;     \
00808           break;                                               \
00809       }                                                        \
00810     }                                                          \
00811     else if((__HANDLE__)->Instance == USART6)                  \
00812     {                                                          \
00813       switch(__HAL_RCC_GET_USART6_SOURCE())                    \
00814       {                                                        \
00815         case RCC_USART6CLKSOURCE_D2PCLK2:                      \
00816           (__CLOCKSOURCE__) = USART_CLOCKSOURCE_D2PCLK2;       \
00817           break;                                               \
00818         case RCC_USART6CLKSOURCE_PLL2:                         \
00819           (__CLOCKSOURCE__) = USART_CLOCKSOURCE_PLL2;          \
00820           break;                                               \
00821         case RCC_USART6CLKSOURCE_PLL3:                         \
00822           (__CLOCKSOURCE__) = USART_CLOCKSOURCE_PLL3;          \
00823           break;                                               \
00824         case RCC_USART6CLKSOURCE_HSI:                          \
00825           (__CLOCKSOURCE__) = USART_CLOCKSOURCE_HSI;           \
00826           break;                                               \
00827         case RCC_USART6CLKSOURCE_CSI:                          \
00828           (__CLOCKSOURCE__) = USART_CLOCKSOURCE_CSI;           \
00829           break;                                               \
00830         case RCC_USART6CLKSOURCE_LSE:                          \
00831           (__CLOCKSOURCE__) = USART_CLOCKSOURCE_LSE;           \
00832           break;                                               \
00833         default:                                               \
00834           (__CLOCKSOURCE__) = USART_CLOCKSOURCE_UNDEFINED;     \
00835           break;                                               \
00836       }                                                        \
00837     }                                                          \
00838     else if((__HANDLE__)->Instance == USART10)                 \
00839     {                                                          \
00840       switch(__HAL_RCC_GET_USART10_SOURCE())                   \
00841       {                                                        \
00842         case RCC_USART10CLKSOURCE_D2PCLK2:                     \
00843           (__CLOCKSOURCE__) = USART_CLOCKSOURCE_D2PCLK2;       \
00844           break;                                               \
00845         case RCC_USART10CLKSOURCE_PLL2:                        \
00846           (__CLOCKSOURCE__) = USART_CLOCKSOURCE_PLL2;          \
00847           break;                                               \
00848         case RCC_USART10CLKSOURCE_PLL3:                        \
00849           (__CLOCKSOURCE__) = USART_CLOCKSOURCE_PLL3;          \
00850           break;                                               \
00851         case RCC_USART10CLKSOURCE_HSI:                         \
00852           (__CLOCKSOURCE__) = USART_CLOCKSOURCE_HSI;           \
00853           break;                                               \
00854         case RCC_USART10CLKSOURCE_CSI:                         \
00855           (__CLOCKSOURCE__) = USART_CLOCKSOURCE_CSI;           \
00856           break;                                               \
00857         case RCC_USART10CLKSOURCE_LSE:                         \
00858           (__CLOCKSOURCE__) = USART_CLOCKSOURCE_LSE;           \
00859           break;                                               \
00860         default:                                               \
00861           (__CLOCKSOURCE__) = USART_CLOCKSOURCE_UNDEFINED;     \
00862           break;                                               \
00863       }                                                        \
00864     }                                                          \
00865     else                                                       \
00866     {                                                          \
00867       (__CLOCKSOURCE__) = USART_CLOCKSOURCE_UNDEFINED;         \
00868     }                                                          \
00869   } while(0U)
00870 #else
00871 #define USART_GETCLOCKSOURCE(__HANDLE__,__CLOCKSOURCE__)       \
00872   do {                                                         \
00873     if((__HANDLE__)->Instance == USART1)                       \
00874     {                                                          \
00875       switch(__HAL_RCC_GET_USART1_SOURCE())                    \
00876       {                                                        \
00877         case RCC_USART1CLKSOURCE_D2PCLK2:                      \
00878           (__CLOCKSOURCE__) = USART_CLOCKSOURCE_D2PCLK2;       \
00879           break;                                               \
00880         case RCC_USART1CLKSOURCE_PLL2:                         \
00881           (__CLOCKSOURCE__) = USART_CLOCKSOURCE_PLL2;          \
00882           break;                                               \
00883         case RCC_USART1CLKSOURCE_PLL3:                         \
00884           (__CLOCKSOURCE__) = USART_CLOCKSOURCE_PLL3;          \
00885           break;                                               \
00886         case RCC_USART1CLKSOURCE_HSI:                          \
00887           (__CLOCKSOURCE__) = USART_CLOCKSOURCE_HSI;           \
00888           break;                                               \
00889         case RCC_USART1CLKSOURCE_CSI:                          \
00890           (__CLOCKSOURCE__) = USART_CLOCKSOURCE_CSI;           \
00891           break;                                               \
00892         case RCC_USART1CLKSOURCE_LSE:                          \
00893           (__CLOCKSOURCE__) = USART_CLOCKSOURCE_LSE;           \
00894           break;                                               \
00895         default:                                               \
00896           (__CLOCKSOURCE__) = USART_CLOCKSOURCE_UNDEFINED;     \
00897           break;                                               \
00898       }                                                        \
00899     }                                                          \
00900     else if((__HANDLE__)->Instance == USART2)                  \
00901     {                                                          \
00902       switch(__HAL_RCC_GET_USART2_SOURCE())                    \
00903       {                                                        \
00904         case RCC_USART2CLKSOURCE_D2PCLK1:                      \
00905           (__CLOCKSOURCE__) = USART_CLOCKSOURCE_D2PCLK1;       \
00906           break;                                               \
00907         case RCC_USART2CLKSOURCE_PLL2:                         \
00908           (__CLOCKSOURCE__) = USART_CLOCKSOURCE_PLL2;          \
00909           break;                                               \
00910         case RCC_USART2CLKSOURCE_PLL3:                         \
00911           (__CLOCKSOURCE__) = USART_CLOCKSOURCE_PLL3;          \
00912           break;                                               \
00913         case RCC_USART2CLKSOURCE_HSI:                          \
00914           (__CLOCKSOURCE__) = USART_CLOCKSOURCE_HSI;           \
00915           break;                                               \
00916         case RCC_USART2CLKSOURCE_CSI:                          \
00917           (__CLOCKSOURCE__) = USART_CLOCKSOURCE_CSI;           \
00918           break;                                               \
00919         case RCC_USART2CLKSOURCE_LSE:                          \
00920           (__CLOCKSOURCE__) = USART_CLOCKSOURCE_LSE;           \
00921           break;                                               \
00922         default:                                               \
00923           (__CLOCKSOURCE__) = USART_CLOCKSOURCE_UNDEFINED;     \
00924           break;                                               \
00925       }                                                        \
00926     }                                                          \
00927     else if((__HANDLE__)->Instance == USART3)                  \
00928     {                                                          \
00929       switch(__HAL_RCC_GET_USART3_SOURCE())                    \
00930       {                                                        \
00931         case RCC_USART3CLKSOURCE_D2PCLK1:                      \
00932           (__CLOCKSOURCE__) = USART_CLOCKSOURCE_D2PCLK1;       \
00933           break;                                               \
00934         case RCC_USART3CLKSOURCE_PLL2:                         \
00935           (__CLOCKSOURCE__) = USART_CLOCKSOURCE_PLL2;          \
00936           break;                                               \
00937         case RCC_USART3CLKSOURCE_PLL3:                         \
00938           (__CLOCKSOURCE__) = USART_CLOCKSOURCE_PLL3;          \
00939           break;                                               \
00940         case RCC_USART3CLKSOURCE_HSI:                          \
00941           (__CLOCKSOURCE__) = USART_CLOCKSOURCE_HSI;           \
00942           break;                                               \
00943         case RCC_USART3CLKSOURCE_CSI:                          \
00944           (__CLOCKSOURCE__) = USART_CLOCKSOURCE_CSI;           \
00945           break;                                               \
00946         case RCC_USART3CLKSOURCE_LSE:                          \
00947           (__CLOCKSOURCE__) = USART_CLOCKSOURCE_LSE;           \
00948           break;                                               \
00949         default:                                               \
00950           (__CLOCKSOURCE__) = USART_CLOCKSOURCE_UNDEFINED;     \
00951           break;                                               \
00952       }                                                        \
00953     }                                                          \
00954     else if((__HANDLE__)->Instance == USART6)                  \
00955     {                                                          \
00956       switch(__HAL_RCC_GET_USART6_SOURCE())                    \
00957       {                                                        \
00958         case RCC_USART6CLKSOURCE_D2PCLK2:                      \
00959           (__CLOCKSOURCE__) = USART_CLOCKSOURCE_D2PCLK2;       \
00960           break;                                               \
00961         case RCC_USART6CLKSOURCE_PLL2:                         \
00962           (__CLOCKSOURCE__) = USART_CLOCKSOURCE_PLL2;          \
00963           break;                                               \
00964         case RCC_USART6CLKSOURCE_PLL3:                         \
00965           (__CLOCKSOURCE__) = USART_CLOCKSOURCE_PLL3;          \
00966           break;                                               \
00967         case RCC_USART6CLKSOURCE_HSI:                          \
00968           (__CLOCKSOURCE__) = USART_CLOCKSOURCE_HSI;           \
00969           break;                                               \
00970         case RCC_USART6CLKSOURCE_CSI:                          \
00971           (__CLOCKSOURCE__) = USART_CLOCKSOURCE_CSI;           \
00972           break;                                               \
00973         case RCC_USART6CLKSOURCE_LSE:                          \
00974           (__CLOCKSOURCE__) = USART_CLOCKSOURCE_LSE;           \
00975           break;                                               \
00976         default:                                               \
00977           (__CLOCKSOURCE__) = USART_CLOCKSOURCE_UNDEFINED;     \
00978           break;                                               \
00979       }                                                        \
00980     }                                                          \
00981     else                                                       \
00982     {                                                          \
00983       (__CLOCKSOURCE__) = USART_CLOCKSOURCE_UNDEFINED;         \
00984     }                                                          \
00985   } while(0U)
00986 #endif  /* UART9 && USART10 */
00987 
00988 /** @brief  Check USART Baud rate.
00989   * @param  __BAUDRATE__ Baudrate specified by the user.
00990   *         The maximum Baud Rate is derived from the maximum clock on H7 (i.e. 100 MHz)
00991   *         divided by the smallest oversampling used on the USART (i.e. 8)
00992   * @retval SET (__BAUDRATE__ is valid) or RESET (__BAUDRATE__ is invalid)  */
00993 #define IS_USART_BAUDRATE(__BAUDRATE__) ((__BAUDRATE__) <= 12500000U)
00994 
00995 /**
00996   * @brief Ensure that USART frame number of stop bits is valid.
00997   * @param __STOPBITS__ USART frame number of stop bits.
00998   * @retval SET (__STOPBITS__ is valid) or RESET (__STOPBITS__ is invalid)
00999   */
01000 #define IS_USART_STOPBITS(__STOPBITS__) (((__STOPBITS__) == USART_STOPBITS_0_5) || \
01001                                          ((__STOPBITS__) == USART_STOPBITS_1)   || \
01002                                          ((__STOPBITS__) == USART_STOPBITS_1_5) || \
01003                                          ((__STOPBITS__) == USART_STOPBITS_2))
01004 
01005 /**
01006   * @brief Ensure that USART frame parity is valid.
01007   * @param __PARITY__ USART frame parity.
01008   * @retval SET (__PARITY__ is valid) or RESET (__PARITY__ is invalid)
01009   */
01010 #define IS_USART_PARITY(__PARITY__) (((__PARITY__) == USART_PARITY_NONE) || \
01011                                      ((__PARITY__) == USART_PARITY_EVEN) || \
01012                                      ((__PARITY__) == USART_PARITY_ODD))
01013 
01014 /**
01015   * @brief Ensure that USART communication mode is valid.
01016   * @param __MODE__ USART communication mode.
01017   * @retval SET (__MODE__ is valid) or RESET (__MODE__ is invalid)
01018   */
01019 #define IS_USART_MODE(__MODE__) ((((__MODE__) & 0xFFFFFFF3U) == 0x00U) && ((__MODE__) != 0x00U))
01020 
01021 /**
01022   * @brief Ensure that USART clock state is valid.
01023   * @param __CLOCK__ USART clock state.
01024   * @retval SET (__CLOCK__ is valid) or RESET (__CLOCK__ is invalid)
01025   */
01026 #define IS_USART_CLOCK(__CLOCK__) (((__CLOCK__) == USART_CLOCK_DISABLE) || \
01027                                    ((__CLOCK__) == USART_CLOCK_ENABLE))
01028 
01029 /**
01030   * @brief Ensure that USART frame polarity is valid.
01031   * @param __CPOL__ USART frame polarity.
01032   * @retval SET (__CPOL__ is valid) or RESET (__CPOL__ is invalid)
01033   */
01034 #define IS_USART_POLARITY(__CPOL__) (((__CPOL__) == USART_POLARITY_LOW) || ((__CPOL__) == USART_POLARITY_HIGH))
01035 
01036 /**
01037   * @brief Ensure that USART frame phase is valid.
01038   * @param __CPHA__ USART frame phase.
01039   * @retval SET (__CPHA__ is valid) or RESET (__CPHA__ is invalid)
01040   */
01041 #define IS_USART_PHASE(__CPHA__) (((__CPHA__) == USART_PHASE_1EDGE) || ((__CPHA__) == USART_PHASE_2EDGE))
01042 
01043 /**
01044   * @brief Ensure that USART frame last bit clock pulse setting is valid.
01045   * @param __LASTBIT__ USART frame last bit clock pulse setting.
01046   * @retval SET (__LASTBIT__ is valid) or RESET (__LASTBIT__ is invalid)
01047   */
01048 #define IS_USART_LASTBIT(__LASTBIT__) (((__LASTBIT__) == USART_LASTBIT_DISABLE) || \
01049                                        ((__LASTBIT__) == USART_LASTBIT_ENABLE))
01050 
01051 /**
01052   * @brief Ensure that USART request parameter is valid.
01053   * @param __PARAM__ USART request parameter.
01054   * @retval SET (__PARAM__ is valid) or RESET (__PARAM__ is invalid)
01055   */
01056 #define IS_USART_REQUEST_PARAMETER(__PARAM__) (((__PARAM__) == USART_RXDATA_FLUSH_REQUEST) || \
01057                                                ((__PARAM__) == USART_TXDATA_FLUSH_REQUEST))
01058 
01059 /**
01060   * @brief Ensure that USART Prescaler is valid.
01061   * @param __CLOCKPRESCALER__ USART Prescaler value.
01062   * @retval SET (__CLOCKPRESCALER__ is valid) or RESET (__CLOCKPRESCALER__ is invalid)
01063   */
01064 #define IS_USART_PRESCALER(__CLOCKPRESCALER__) (((__CLOCKPRESCALER__) == USART_PRESCALER_DIV1) || \
01065                                                 ((__CLOCKPRESCALER__) == USART_PRESCALER_DIV2) || \
01066                                                 ((__CLOCKPRESCALER__) == USART_PRESCALER_DIV4) || \
01067                                                 ((__CLOCKPRESCALER__) == USART_PRESCALER_DIV6) || \
01068                                                 ((__CLOCKPRESCALER__) == USART_PRESCALER_DIV8) || \
01069                                                 ((__CLOCKPRESCALER__) == USART_PRESCALER_DIV10) || \
01070                                                 ((__CLOCKPRESCALER__) == USART_PRESCALER_DIV12) || \
01071                                                 ((__CLOCKPRESCALER__) == USART_PRESCALER_DIV16) || \
01072                                                 ((__CLOCKPRESCALER__) == USART_PRESCALER_DIV32) || \
01073                                                 ((__CLOCKPRESCALER__) == USART_PRESCALER_DIV64) || \
01074                                                 ((__CLOCKPRESCALER__) == USART_PRESCALER_DIV128) || \
01075                                                 ((__CLOCKPRESCALER__) == USART_PRESCALER_DIV256))
01076 
01077 /**
01078   * @}
01079   */
01080 
01081 /* Include USART HAL Extended module */
01082 #include "stm32h7xx_hal_usart_ex.h"
01083 
01084 /* Exported functions --------------------------------------------------------*/
01085 /** @addtogroup USART_Exported_Functions USART Exported Functions
01086   * @{
01087   */
01088 
01089 /** @addtogroup USART_Exported_Functions_Group1 Initialization and de-initialization functions
01090   * @{
01091   */
01092 
01093 /* Initialization and de-initialization functions  ****************************/
01094 HAL_StatusTypeDef HAL_USART_Init(USART_HandleTypeDef *husart);
01095 HAL_StatusTypeDef HAL_USART_DeInit(USART_HandleTypeDef *husart);
01096 void HAL_USART_MspInit(USART_HandleTypeDef *husart);
01097 void HAL_USART_MspDeInit(USART_HandleTypeDef *husart);
01098 
01099 /* Callbacks Register/UnRegister functions  ***********************************/
01100 #if (USE_HAL_USART_REGISTER_CALLBACKS == 1)
01101 HAL_StatusTypeDef HAL_USART_RegisterCallback(USART_HandleTypeDef *husart, HAL_USART_CallbackIDTypeDef CallbackID,
01102                                              pUSART_CallbackTypeDef pCallback);
01103 HAL_StatusTypeDef HAL_USART_UnRegisterCallback(USART_HandleTypeDef *husart, HAL_USART_CallbackIDTypeDef CallbackID);
01104 #endif /* USE_HAL_USART_REGISTER_CALLBACKS */
01105 
01106 /**
01107   * @}
01108   */
01109 
01110 /** @addtogroup USART_Exported_Functions_Group2 IO operation functions
01111   * @{
01112   */
01113 
01114 /* IO operation functions *****************************************************/
01115 HAL_StatusTypeDef HAL_USART_Transmit(USART_HandleTypeDef *husart, const uint8_t *pTxData, uint16_t Size, uint32_t Timeout);
01116 HAL_StatusTypeDef HAL_USART_Receive(USART_HandleTypeDef *husart, uint8_t *pRxData, uint16_t Size, uint32_t Timeout);
01117 HAL_StatusTypeDef HAL_USART_TransmitReceive(USART_HandleTypeDef *husart, const uint8_t *pTxData, uint8_t *pRxData,
01118                                             uint16_t Size, uint32_t Timeout);
01119 HAL_StatusTypeDef HAL_USART_Transmit_IT(USART_HandleTypeDef *husart, const uint8_t *pTxData, uint16_t Size);
01120 HAL_StatusTypeDef HAL_USART_Receive_IT(USART_HandleTypeDef *husart, uint8_t *pRxData, uint16_t Size);
01121 HAL_StatusTypeDef HAL_USART_TransmitReceive_IT(USART_HandleTypeDef *husart, const uint8_t *pTxData, uint8_t *pRxData,
01122                                                uint16_t Size);
01123 HAL_StatusTypeDef HAL_USART_Transmit_DMA(USART_HandleTypeDef *husart, const uint8_t *pTxData, uint16_t Size);
01124 HAL_StatusTypeDef HAL_USART_Receive_DMA(USART_HandleTypeDef *husart, uint8_t *pRxData, uint16_t Size);
01125 HAL_StatusTypeDef HAL_USART_TransmitReceive_DMA(USART_HandleTypeDef *husart, const uint8_t *pTxData, uint8_t *pRxData,
01126                                                 uint16_t Size);
01127 HAL_StatusTypeDef HAL_USART_DMAPause(USART_HandleTypeDef *husart);
01128 HAL_StatusTypeDef HAL_USART_DMAResume(USART_HandleTypeDef *husart);
01129 HAL_StatusTypeDef HAL_USART_DMAStop(USART_HandleTypeDef *husart);
01130 /* Transfer Abort functions */
01131 HAL_StatusTypeDef HAL_USART_Abort(USART_HandleTypeDef *husart);
01132 HAL_StatusTypeDef HAL_USART_Abort_IT(USART_HandleTypeDef *husart);
01133 
01134 void HAL_USART_IRQHandler(USART_HandleTypeDef *husart);
01135 void HAL_USART_TxHalfCpltCallback(USART_HandleTypeDef *husart);
01136 void HAL_USART_TxCpltCallback(USART_HandleTypeDef *husart);
01137 void HAL_USART_RxCpltCallback(USART_HandleTypeDef *husart);
01138 void HAL_USART_RxHalfCpltCallback(USART_HandleTypeDef *husart);
01139 void HAL_USART_TxRxCpltCallback(USART_HandleTypeDef *husart);
01140 void HAL_USART_ErrorCallback(USART_HandleTypeDef *husart);
01141 void HAL_USART_AbortCpltCallback(USART_HandleTypeDef *husart);
01142 
01143 /**
01144   * @}
01145   */
01146 
01147 /** @addtogroup USART_Exported_Functions_Group4 Peripheral State and Error functions
01148   * @{
01149   */
01150 
01151 /* Peripheral State and Error functions ***************************************/
01152 HAL_USART_StateTypeDef HAL_USART_GetState(USART_HandleTypeDef *husart);
01153 uint32_t               HAL_USART_GetError(USART_HandleTypeDef *husart);
01154 
01155 /**
01156   * @}
01157   */
01158 
01159 /**
01160   * @}
01161   */
01162 
01163 /**
01164   * @}
01165   */
01166 
01167 /**
01168   * @}
01169   */
01170 
01171 #ifdef __cplusplus
01172 }
01173 #endif
01174 
01175 #endif /* STM32H7xx_HAL_USART_H */
01176