STM32L4xx_HAL_Driver  1.14.0
USART Private Functions

Functions

void USART_InitCallbacksToDefault (USART_HandleTypeDef *husart)
 Initialize the callbacks to their default values. More...
 
static void USART_EndTransfer (USART_HandleTypeDef *husart)
 End ongoing transfer on USART peripheral (following error detection or Transfer completion). More...
 
static void USART_DMATransmitCplt (DMA_HandleTypeDef *hdma)
 DMA USART transmit process complete callback. More...
 
static void USART_DMAReceiveCplt (DMA_HandleTypeDef *hdma)
 DMA USART receive process complete callback. More...
 
static void USART_DMATxHalfCplt (DMA_HandleTypeDef *hdma)
 DMA USART transmit process half complete callback. More...
 
static void USART_DMARxHalfCplt (DMA_HandleTypeDef *hdma)
 DMA USART receive process half complete callback. More...
 
static void USART_DMAError (DMA_HandleTypeDef *hdma)
 DMA USART communication error callback. More...
 
static void USART_DMAAbortOnError (DMA_HandleTypeDef *hdma)
 DMA USART communication abort callback, when initiated by HAL services on Error (To be called at end of DMA Abort procedure following error occurrence). More...
 
static void USART_DMATxAbortCallback (DMA_HandleTypeDef *hdma)
 DMA USART Tx communication abort callback, when initiated by user (To be called at end of DMA Tx Abort procedure following user abort request). More...
 
static void USART_DMARxAbortCallback (DMA_HandleTypeDef *hdma)
 DMA USART Rx communication abort callback, when initiated by user (To be called at end of DMA Rx Abort procedure following user abort request). More...
 
static HAL_StatusTypeDef USART_WaitOnFlagUntilTimeout (USART_HandleTypeDef *husart, uint32_t Flag, FlagStatus Status, uint32_t Tickstart, uint32_t Timeout)
 Handle USART Communication Timeout. More...
 
static HAL_StatusTypeDef USART_SetConfig (USART_HandleTypeDef *husart)
 Configure the USART peripheral. More...
 
static HAL_StatusTypeDef USART_CheckIdleState (USART_HandleTypeDef *husart)
 Check the USART Idle State. More...
 
static void USART_TxISR_8BIT (USART_HandleTypeDef *husart)
 Simplex send an amount of data in non-blocking mode. More...
 
static void USART_TxISR_16BIT (USART_HandleTypeDef *husart)
 Simplex send an amount of data in non-blocking mode. More...
 
static void USART_TxISR_8BIT_FIFOEN (USART_HandleTypeDef *husart)
 Simplex send an amount of data in non-blocking mode. More...
 
static void USART_TxISR_16BIT_FIFOEN (USART_HandleTypeDef *husart)
 Simplex send an amount of data in non-blocking mode. More...
 
static void USART_EndTransmit_IT (USART_HandleTypeDef *husart)
 Wraps up transmission in non-blocking mode. More...
 
static void USART_RxISR_8BIT (USART_HandleTypeDef *husart)
 Simplex receive an amount of data in non-blocking mode. More...
 
static void USART_RxISR_16BIT (USART_HandleTypeDef *husart)
 Simplex receive an amount of data in non-blocking mode. More...
 
static void USART_RxISR_8BIT_FIFOEN (USART_HandleTypeDef *husart)
 Simplex receive an amount of data in non-blocking mode. More...
 
static void USART_RxISR_16BIT_FIFOEN (USART_HandleTypeDef *husart)
 Simplex receive an amount of data in non-blocking mode. More...
 

Detailed Description

Function Documentation

◆ USART_CheckIdleState()

static HAL_StatusTypeDef USART_CheckIdleState ( USART_HandleTypeDef husart)
static

Check the USART Idle State.

Parameters
husartUSART handle.
Return values
HALstatus

Definition at line 3040 of file stm32l4xx_hal_usart.c.

3041 {
3042  uint32_t tickstart;
3043 
3044  /* Initialize the USART ErrorCode */
3045  husart->ErrorCode = HAL_USART_ERROR_NONE;
3046 
3047  /* Init tickstart for timeout managment*/
3048  tickstart = HAL_GetTick();
3049 
3050  /* Check if the Transmitter is enabled */
3051  if ((husart->Instance->CR1 & USART_CR1_TE) == USART_CR1_TE)
3052  {
3053  /* Wait until TEACK flag is set */
3054  if (USART_WaitOnFlagUntilTimeout(husart, USART_ISR_TEACK, RESET, tickstart, USART_TEACK_REACK_TIMEOUT) != HAL_OK)
3055  {
3056  /* Timeout occurred */
3057  return HAL_TIMEOUT;
3058  }
3059  }
3060  /* Check if the Receiver is enabled */
3061  if ((husart->Instance->CR1 & USART_CR1_RE) == USART_CR1_RE)
3062  {
3063  /* Wait until REACK flag is set */
3064  if (USART_WaitOnFlagUntilTimeout(husart, USART_ISR_REACK, RESET, tickstart, USART_TEACK_REACK_TIMEOUT) != HAL_OK)
3065  {
3066  /* Timeout occurred */
3067  return HAL_TIMEOUT;
3068  }
3069  }
3070 
3071  /* Initialize the USART state*/
3072  husart->State = HAL_USART_STATE_READY;
3073 
3074  /* Process Unlocked */
3075  __HAL_UNLOCK(husart);
3076 
3077  return HAL_OK;
3078 }
__IO HAL_USART_StateTypeDef State
uint32_t HAL_GetTick(void)
Provide a tick value in millisecond.
__HAL_UNLOCK(hrtc)
return HAL_OK
static HAL_StatusTypeDef USART_WaitOnFlagUntilTimeout(USART_HandleTypeDef *husart, uint32_t Flag, FlagStatus Status, uint32_t Tickstart, uint32_t Timeout)
Handle USART Communication Timeout.

◆ USART_DMAAbortOnError()

static void USART_DMAAbortOnError ( DMA_HandleTypeDef hdma)
static

DMA USART communication abort callback, when initiated by HAL services on Error (To be called at end of DMA Abort procedure following error occurrence).

Parameters
hdmaDMA handle.
Return values
None

Definition at line 2767 of file stm32l4xx_hal_usart.c.

2768 {
2769  USART_HandleTypeDef *husart = (USART_HandleTypeDef *)(hdma->Parent);
2770  husart->RxXferCount = 0U;
2771  husart->TxXferCount = 0U;
2772 
2773 #if (USE_HAL_USART_REGISTER_CALLBACKS == 1)
2774  /* Call registered Error Callback */
2775  husart->ErrorCallback(husart);
2776 #else
2777  /* Call legacy weak Error Callback */
2778  HAL_USART_ErrorCallback(husart);
2779 #endif /* USE_HAL_USART_REGISTER_CALLBACKS */
2780 }
void(* ErrorCallback)(struct __USART_HandleTypeDef *husart)
USART handle Structure definition.
void HAL_USART_ErrorCallback(USART_HandleTypeDef *husart)
USART error callback.

◆ USART_DMAError()

static void USART_DMAError ( DMA_HandleTypeDef hdma)
static

DMA USART communication error callback.

Parameters
hdmaDMA handle.
Return values
None

Definition at line 2741 of file stm32l4xx_hal_usart.c.

2742 {
2743  USART_HandleTypeDef *husart = (USART_HandleTypeDef *)(hdma->Parent);
2744 
2745  husart->RxXferCount = 0U;
2746  husart->TxXferCount = 0U;
2747  USART_EndTransfer(husart);
2748 
2749  husart->ErrorCode |= HAL_USART_ERROR_DMA;
2750  husart->State = HAL_USART_STATE_READY;
2751 
2752 #if (USE_HAL_USART_REGISTER_CALLBACKS == 1)
2753  /* Call registered Error Callback */
2754  husart->ErrorCallback(husart);
2755 #else
2756  /* Call legacy weak Error Callback */
2757  HAL_USART_ErrorCallback(husart);
2758 #endif /* USE_HAL_USART_REGISTER_CALLBACKS */
2759 }
__IO HAL_USART_StateTypeDef State
void(* ErrorCallback)(struct __USART_HandleTypeDef *husart)
static void USART_EndTransfer(USART_HandleTypeDef *husart)
End ongoing transfer on USART peripheral (following error detection or Transfer completion).
USART handle Structure definition.
void HAL_USART_ErrorCallback(USART_HandleTypeDef *husart)
USART error callback.

◆ USART_DMAReceiveCplt()

static void USART_DMAReceiveCplt ( DMA_HandleTypeDef hdma)
static

DMA USART receive process complete callback.

Parameters
hdmaDMA handle.
Return values
None

Definition at line 2648 of file stm32l4xx_hal_usart.c.

2649 {
2650  USART_HandleTypeDef *husart = (USART_HandleTypeDef *)(hdma->Parent);
2651 
2652  /* DMA Normal mode */
2653  if (HAL_IS_BIT_CLR(hdma->Instance->CCR, DMA_CCR_CIRC))
2654  {
2655  husart->RxXferCount = 0U;
2656 
2657  /* Disable PE and ERR (Frame error, noise error, overrun error) interrupts */
2658  CLEAR_BIT(husart->Instance->CR1, USART_CR1_PEIE);
2659  CLEAR_BIT(husart->Instance->CR3, USART_CR3_EIE);
2660 
2661  /* Disable the DMA RX transfer for the receiver request by resetting the DMAR bit
2662  in USART CR3 register */
2663  CLEAR_BIT(husart->Instance->CR3, USART_CR3_DMAR);
2664  /* similarly, disable the DMA TX transfer that was started to provide the
2665  clock to the slave device */
2666  CLEAR_BIT(husart->Instance->CR3, USART_CR3_DMAT);
2667 
2668  if (husart->State == HAL_USART_STATE_BUSY_RX)
2669  {
2670 #if (USE_HAL_USART_REGISTER_CALLBACKS == 1)
2671  /* Call registered Rx Complete Callback */
2672  husart->RxCpltCallback(husart);
2673 #else
2674  /* Call legacy weak Rx Complete Callback */
2675  HAL_USART_RxCpltCallback(husart);
2676 #endif /* USE_HAL_USART_REGISTER_CALLBACKS */
2677  }
2678  /* The USART state is HAL_USART_STATE_BUSY_TX_RX */
2679  else
2680  {
2681 #if (USE_HAL_USART_REGISTER_CALLBACKS == 1)
2682  /* Call registered Tx Rx Complete Callback */
2683  husart->TxRxCpltCallback(husart);
2684 #else
2685  /* Call legacy weak Tx Rx Complete Callback */
2687 #endif /* USE_HAL_USART_REGISTER_CALLBACKS */
2688  }
2689  husart->State = HAL_USART_STATE_READY;
2690  }
2691  /* DMA circular mode */
2692  else
2693  {
2694  if (husart->State == HAL_USART_STATE_BUSY_RX)
2695  {
2696 #if (USE_HAL_USART_REGISTER_CALLBACKS == 1)
2697  /* Call registered Rx Complete Callback */
2698  husart->RxCpltCallback(husart);
2699 #else
2700  /* Call legacy weak Rx Complete Callback */
2701  HAL_USART_RxCpltCallback(husart);
2702 #endif /* USE_HAL_USART_REGISTER_CALLBACKS */
2703  }
2704  /* The USART state is HAL_USART_STATE_BUSY_TX_RX */
2705  else
2706  {
2707 #if (USE_HAL_USART_REGISTER_CALLBACKS == 1)
2708  /* Call registered Tx Rx Complete Callback */
2709  husart->TxRxCpltCallback(husart);
2710 #else
2711  /* Call legacy weak Tx Rx Complete Callback */
2713 #endif /* USE_HAL_USART_REGISTER_CALLBACKS */
2714  }
2715  }
2716 }
__IO HAL_USART_StateTypeDef State
DMA_Channel_TypeDef * Instance
void HAL_USART_RxCpltCallback(USART_HandleTypeDef *husart)
Rx Transfer completed callback.
CLEAR_BIT(hrtc->Instance->CR, RTC_CR_WUTE)
USART handle Structure definition.
void(* RxCpltCallback)(struct __USART_HandleTypeDef *husart)
void HAL_USART_TxRxCpltCallback(USART_HandleTypeDef *husart)
Tx/Rx Transfers completed callback for the non-blocking process.
void(* TxRxCpltCallback)(struct __USART_HandleTypeDef *husart)

◆ USART_DMARxAbortCallback()

static void USART_DMARxAbortCallback ( DMA_HandleTypeDef hdma)
static

DMA USART Rx communication abort callback, when initiated by user (To be called at end of DMA Rx Abort procedure following user abort request).

Note
When this callback is executed, User Abort complete call back is called only if no Abort still ongoing for Tx DMA Handle.
Parameters
hdmaDMA handle.
Return values
None

Definition at line 2838 of file stm32l4xx_hal_usart.c.

2839 {
2840  USART_HandleTypeDef *husart = (USART_HandleTypeDef *)(hdma->Parent);
2841 
2842  husart->hdmarx->XferAbortCallback = NULL;
2843 
2844  /* Check if an Abort process is still ongoing */
2845  if (husart->hdmatx != NULL)
2846  {
2847  if (husart->hdmatx->XferAbortCallback != NULL)
2848  {
2849  return;
2850  }
2851  }
2852 
2853  /* No Abort process still ongoing : All DMA channels are aborted, call user Abort Complete callback */
2854  husart->TxXferCount = 0U;
2855  husart->RxXferCount = 0U;
2856 
2857  /* Reset errorCode */
2858  husart->ErrorCode = HAL_USART_ERROR_NONE;
2859 
2860  /* Clear the Error flags in the ICR register */
2861  __HAL_USART_CLEAR_FLAG(husart, USART_CLEAR_OREF | USART_CLEAR_NEF | USART_CLEAR_PEF | USART_CLEAR_FEF);
2862 
2863  /* Restore husart->State to Ready */
2864  husart->State = HAL_USART_STATE_READY;
2865 
2866  /* Call user Abort complete callback */
2867 #if (USE_HAL_USART_REGISTER_CALLBACKS == 1)
2868  /* Call registered Abort Complete Callback */
2869  husart->AbortCpltCallback(husart);
2870 #else
2871  /* Call legacy weak Abort Complete Callback */
2873 #endif /* USE_HAL_USART_REGISTER_CALLBACKS */
2874 }
__IO HAL_USART_StateTypeDef State
void(* XferAbortCallback)(struct __DMA_HandleTypeDef *hdma)
DMA_HandleTypeDef * hdmatx
USART handle Structure definition.
void HAL_USART_AbortCpltCallback(USART_HandleTypeDef *husart)
USART Abort Complete callback.
DMA_HandleTypeDef * hdmarx
void(* AbortCpltCallback)(struct __USART_HandleTypeDef *husart)

◆ USART_DMARxHalfCplt()

static void USART_DMARxHalfCplt ( DMA_HandleTypeDef hdma)
static

DMA USART receive process half complete callback.

Parameters
hdmaDMA handle.
Return values
None

Definition at line 2723 of file stm32l4xx_hal_usart.c.

2724 {
2725  USART_HandleTypeDef *husart = (USART_HandleTypeDef *)(hdma->Parent);
2726 
2727 #if (USE_HAL_USART_REGISTER_CALLBACKS == 1)
2728  /* Call registered Rx Half Complete Callback */
2729  husart->RxHalfCpltCallback(husart);
2730 #else
2731  /* Call legacy weak Rx Half Complete Callback */
2733 #endif /* USE_HAL_USART_REGISTER_CALLBACKS */
2734 }
void(* RxHalfCpltCallback)(struct __USART_HandleTypeDef *husart)
USART handle Structure definition.
void HAL_USART_RxHalfCpltCallback(USART_HandleTypeDef *husart)
Rx Half Transfer completed callback.

◆ USART_DMATransmitCplt()

static void USART_DMATransmitCplt ( DMA_HandleTypeDef hdma)
static

DMA USART transmit process complete callback.

Parameters
hdmaDMA handle.
Return values
None

Definition at line 2590 of file stm32l4xx_hal_usart.c.

2591 {
2592  USART_HandleTypeDef *husart = (USART_HandleTypeDef *)(hdma->Parent);
2593 
2594  /* DMA Normal mode */
2595  if (HAL_IS_BIT_CLR(hdma->Instance->CCR, DMA_CCR_CIRC))
2596  {
2597  husart->TxXferCount = 0U;
2598 
2599  if (husart->State == HAL_USART_STATE_BUSY_TX)
2600  {
2601  /* Disable the DMA transfer for transmit request by resetting the DMAT bit
2602  in the USART CR3 register */
2603  CLEAR_BIT(husart->Instance->CR3, USART_CR3_DMAT);
2604 
2605  /* Enable the USART Transmit Complete Interrupt */
2606  __HAL_USART_ENABLE_IT(husart, USART_IT_TC);
2607  }
2608  }
2609  /* DMA Circular mode */
2610  else
2611  {
2612  if (husart->State == HAL_USART_STATE_BUSY_TX)
2613  {
2614 #if (USE_HAL_USART_REGISTER_CALLBACKS == 1)
2615  /* Call registered Tx Complete Callback */
2616  husart->TxCpltCallback(husart);
2617 #else
2618  /* Call legacy weak Tx Complete Callback */
2619  HAL_USART_TxCpltCallback(husart);
2620 #endif /* USE_HAL_USART_REGISTER_CALLBACKS */
2621  }
2622  }
2623 }
__IO HAL_USART_StateTypeDef State
DMA_Channel_TypeDef * Instance
CLEAR_BIT(hrtc->Instance->CR, RTC_CR_WUTE)
void HAL_USART_TxCpltCallback(USART_HandleTypeDef *husart)
Tx Transfer completed callback.
USART handle Structure definition.
void(* TxCpltCallback)(struct __USART_HandleTypeDef *husart)

◆ USART_DMATxAbortCallback()

static void USART_DMATxAbortCallback ( DMA_HandleTypeDef hdma)
static

DMA USART Tx communication abort callback, when initiated by user (To be called at end of DMA Tx Abort procedure following user abort request).

Note
When this callback is executed, User Abort complete call back is called only if no Abort still ongoing for Rx DMA Handle.
Parameters
hdmaDMA handle.
Return values
None

Definition at line 2790 of file stm32l4xx_hal_usart.c.

2791 {
2792  USART_HandleTypeDef *husart = (USART_HandleTypeDef *)(hdma->Parent);
2793 
2794  husart->hdmatx->XferAbortCallback = NULL;
2795 
2796  /* Check if an Abort process is still ongoing */
2797  if (husart->hdmarx != NULL)
2798  {
2799  if (husart->hdmarx->XferAbortCallback != NULL)
2800  {
2801  return;
2802  }
2803  }
2804 
2805  /* No Abort process still ongoing : All DMA channels are aborted, call user Abort Complete callback */
2806  husart->TxXferCount = 0U;
2807  husart->RxXferCount = 0U;
2808 
2809  /* Reset errorCode */
2810  husart->ErrorCode = HAL_USART_ERROR_NONE;
2811 
2812  /* Clear the Error flags in the ICR register */
2813  __HAL_USART_CLEAR_FLAG(husart, USART_CLEAR_OREF | USART_CLEAR_NEF | USART_CLEAR_PEF | USART_CLEAR_FEF);
2814 
2815  /* Restore husart->State to Ready */
2816  husart->State = HAL_USART_STATE_READY;
2817 
2818  /* Call user Abort complete callback */
2819 #if (USE_HAL_USART_REGISTER_CALLBACKS == 1)
2820  /* Call registered Abort Complete Callback */
2821  husart->AbortCpltCallback(husart);
2822 #else
2823  /* Call legacy weak Abort Complete Callback */
2825 #endif /* USE_HAL_USART_REGISTER_CALLBACKS */
2826 
2827 }
__IO HAL_USART_StateTypeDef State
void(* XferAbortCallback)(struct __DMA_HandleTypeDef *hdma)
DMA_HandleTypeDef * hdmatx
USART handle Structure definition.
void HAL_USART_AbortCpltCallback(USART_HandleTypeDef *husart)
USART Abort Complete callback.
DMA_HandleTypeDef * hdmarx
void(* AbortCpltCallback)(struct __USART_HandleTypeDef *husart)

◆ USART_DMATxHalfCplt()

static void USART_DMATxHalfCplt ( DMA_HandleTypeDef hdma)
static

DMA USART transmit process half complete callback.

Parameters
hdmaDMA handle.
Return values
None

Definition at line 2630 of file stm32l4xx_hal_usart.c.

2631 {
2632  USART_HandleTypeDef *husart = (USART_HandleTypeDef *)(hdma->Parent);
2633 
2634 #if (USE_HAL_USART_REGISTER_CALLBACKS == 1)
2635  /* Call registered Tx Half Complete Callback */
2636  husart->TxHalfCpltCallback(husart);
2637 #else
2638  /* Call legacy weak Tx Half Complete Callback */
2640 #endif /* USE_HAL_USART_REGISTER_CALLBACKS */
2641 }
void(* TxHalfCpltCallback)(struct __USART_HandleTypeDef *husart)
void HAL_USART_TxHalfCpltCallback(USART_HandleTypeDef *husart)
Tx Half Transfer completed callback.
USART handle Structure definition.

◆ USART_EndTransfer()

static void USART_EndTransfer ( USART_HandleTypeDef husart)
static

End ongoing transfer on USART peripheral (following error detection or Transfer completion).

Parameters
husartUSART handle.
Return values
None

Definition at line 2568 of file stm32l4xx_hal_usart.c.

2569 {
2570 #if defined(USART_CR1_FIFOEN)
2571  /* Disable TXEIE, TCIE, RXNE, RXFT, TXFT, PE and ERR (Frame error, noise error, overrun error) interrupts */
2572  CLEAR_BIT(husart->Instance->CR1, (USART_CR1_RXNEIE_RXFNEIE | USART_CR1_PEIE | USART_CR1_TXEIE_TXFNFIE |
2573  USART_CR1_TCIE));
2574  CLEAR_BIT(husart->Instance->CR3, (USART_CR3_EIE | USART_CR3_RXFTIE | USART_CR3_TXFTIE));
2575 #else
2576  /* Disable TXEIE, TCIE, RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts */
2577  CLEAR_BIT(husart->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE | USART_CR1_TXEIE | USART_CR1_TCIE));
2578  CLEAR_BIT(husart->Instance->CR3, USART_CR3_EIE);
2579 #endif /* USART_CR1_FIFOEN */
2580 
2581  /* At end of process, restore husart->State to Ready */
2582  husart->State = HAL_USART_STATE_READY;
2583 }
__IO HAL_USART_StateTypeDef State
CLEAR_BIT(hrtc->Instance->CR, RTC_CR_WUTE)

◆ USART_EndTransmit_IT()

static void USART_EndTransmit_IT ( USART_HandleTypeDef husart)
static

Wraps up transmission in non-blocking mode.

Parameters
husartPointer to a USART_HandleTypeDef structure that contains the configuration information for the specified USART module.
Return values
None

Definition at line 3251 of file stm32l4xx_hal_usart.c.

3252 {
3253  /* Disable the USART Transmit Complete Interrupt */
3254  __HAL_USART_DISABLE_IT(husart, USART_IT_TC);
3255 
3256  /* Disable the USART Error Interrupt: (Frame error, noise error, overrun error) */
3257  __HAL_USART_DISABLE_IT(husart, USART_IT_ERR);
3258 
3259  /* Clear TxISR function pointer */
3260  husart->TxISR = NULL;
3261 
3262  if (husart->State == HAL_USART_STATE_BUSY_TX)
3263  {
3264  /* Clear overrun flag and discard the received data */
3265  __HAL_USART_CLEAR_OREFLAG(husart);
3266  __HAL_USART_SEND_REQ(husart, USART_RXDATA_FLUSH_REQUEST);
3267 
3268  /* Tx process is completed, restore husart->State to Ready */
3269  husart->State = HAL_USART_STATE_READY;
3270 
3271 #if (USE_HAL_USART_REGISTER_CALLBACKS == 1)
3272  /* Call registered Tx Complete Callback */
3273  husart->TxCpltCallback(husart);
3274 #else
3275  /* Call legacy weak Tx Complete Callback */
3276  HAL_USART_TxCpltCallback(husart);
3277 #endif /* USE_HAL_USART_REGISTER_CALLBACKS */
3278  }
3279  else if (husart->RxXferCount == 0U)
3280  {
3281  /* TxRx process is completed, restore husart->State to Ready */
3282  husart->State = HAL_USART_STATE_READY;
3283 
3284 #if (USE_HAL_USART_REGISTER_CALLBACKS == 1)
3285  /* Call registered Tx Rx Complete Callback */
3286  husart->TxRxCpltCallback(husart);
3287 #else
3288  /* Call legacy weak Tx Rx Complete Callback */
3290 #endif /* USE_HAL_USART_REGISTER_CALLBACKS */
3291  }
3292  else
3293  {
3294  /* Nothing to do */
3295  }
3296 }
__IO HAL_USART_StateTypeDef State
void(* TxISR)(struct __USART_HandleTypeDef *husart)
void HAL_USART_TxCpltCallback(USART_HandleTypeDef *husart)
Tx Transfer completed callback.
void HAL_USART_TxRxCpltCallback(USART_HandleTypeDef *husart)
Tx/Rx Transfers completed callback for the non-blocking process.
void(* TxRxCpltCallback)(struct __USART_HandleTypeDef *husart)
void(* TxCpltCallback)(struct __USART_HandleTypeDef *husart)

◆ USART_InitCallbacksToDefault()

void USART_InitCallbacksToDefault ( USART_HandleTypeDef husart)

Initialize the callbacks to their default values.

Parameters
husartUSART handle.
Return values
none

Definition at line 2546 of file stm32l4xx_hal_usart.c.

2547 {
2548  /* Init the USART Callback settings */
2549  husart->TxHalfCpltCallback = HAL_USART_TxHalfCpltCallback; /* Legacy weak TxHalfCpltCallback */
2550  husart->TxCpltCallback = HAL_USART_TxCpltCallback; /* Legacy weak TxCpltCallback */
2551  husart->RxHalfCpltCallback = HAL_USART_RxHalfCpltCallback; /* Legacy weak RxHalfCpltCallback */
2552  husart->RxCpltCallback = HAL_USART_RxCpltCallback; /* Legacy weak RxCpltCallback */
2553  husart->TxRxCpltCallback = HAL_USART_TxRxCpltCallback; /* Legacy weak TxRxCpltCallback */
2554  husart->ErrorCallback = HAL_USART_ErrorCallback; /* Legacy weak ErrorCallback */
2555  husart->AbortCpltCallback = HAL_USART_AbortCpltCallback; /* Legacy weak AbortCpltCallback */
2556 #if defined(USART_CR1_FIFOEN)
2557  husart->RxFifoFullCallback = HAL_USARTEx_RxFifoFullCallback; /* Legacy weak RxFifoFullCallback */
2558  husart->TxFifoEmptyCallback = HAL_USARTEx_TxFifoEmptyCallback; /* Legacy weak TxFifoEmptyCallback */
2559 #endif /* USART_CR1_FIFOEN */
2560 }
void(* TxFifoEmptyCallback)(struct __USART_HandleTypeDef *husart)
void(* TxHalfCpltCallback)(struct __USART_HandleTypeDef *husart)
void HAL_USART_TxHalfCpltCallback(USART_HandleTypeDef *husart)
Tx Half Transfer completed callback.
void HAL_USARTEx_TxFifoEmptyCallback(USART_HandleTypeDef *husart)
USART TX Fifo empty callback.
void HAL_USART_RxCpltCallback(USART_HandleTypeDef *husart)
Rx Transfer completed callback.
void HAL_USART_TxCpltCallback(USART_HandleTypeDef *husart)
Tx Transfer completed callback.
void(* ErrorCallback)(struct __USART_HandleTypeDef *husart)
void(* RxHalfCpltCallback)(struct __USART_HandleTypeDef *husart)
void HAL_USART_RxHalfCpltCallback(USART_HandleTypeDef *husart)
Rx Half Transfer completed callback.
void(* RxCpltCallback)(struct __USART_HandleTypeDef *husart)
void(* RxFifoFullCallback)(struct __USART_HandleTypeDef *husart)
void HAL_USART_AbortCpltCallback(USART_HandleTypeDef *husart)
USART Abort Complete callback.
void HAL_USART_ErrorCallback(USART_HandleTypeDef *husart)
USART error callback.
void HAL_USART_TxRxCpltCallback(USART_HandleTypeDef *husart)
Tx/Rx Transfers completed callback for the non-blocking process.
void(* TxRxCpltCallback)(struct __USART_HandleTypeDef *husart)
void(* AbortCpltCallback)(struct __USART_HandleTypeDef *husart)
void HAL_USARTEx_RxFifoFullCallback(USART_HandleTypeDef *husart)
USART RX Fifo full callback.
void(* TxCpltCallback)(struct __USART_HandleTypeDef *husart)

◆ USART_RxISR_16BIT()

static void USART_RxISR_16BIT ( USART_HandleTypeDef husart)
static

Simplex receive an amount of data in non-blocking mode.

Note
Function called under interruption only, once interruptions have been enabled by HAL_USART_Receive_IT().
ISR function executed when FIFO mode is disabled and when the data word length is 9 bits long.
Parameters
husartUSART handle
Return values
None

Definition at line 3420 of file stm32l4xx_hal_usart.c.

3421 {
3422  const HAL_USART_StateTypeDef state = husart->State;
3423  uint16_t txdatacount;
3424  uint16_t *tmp;
3425  uint16_t uhMask = husart->Mask;
3426 #if defined(USART_CR1_FIFOEN)
3427  uint32_t txftie;
3428 #endif /* USART_CR1_FIFOEN */
3429 
3430  if ((state == HAL_USART_STATE_BUSY_RX) ||
3431  (state == HAL_USART_STATE_BUSY_TX_RX))
3432  {
3433  tmp = (uint16_t *) husart->pRxBuffPtr;
3434  *tmp = (uint16_t)(husart->Instance->RDR & uhMask);
3435  husart->pRxBuffPtr += 2U;
3436  husart->RxXferCount--;
3437 
3438  if (husart->RxXferCount == 0U)
3439  {
3440  /* Disable the USART Parity Error Interrupt and RXNE interrupt*/
3441 #if defined(USART_CR1_FIFOEN)
3442  CLEAR_BIT(husart->Instance->CR1, (USART_CR1_RXNEIE_RXFNEIE | USART_CR1_PEIE));
3443 #else
3444  CLEAR_BIT(husart->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE));
3445 #endif /* USART_CR1_FIFOEN */
3446 
3447  /* Disable the USART Error Interrupt: (Frame error, noise error, overrun error) */
3448  CLEAR_BIT(husart->Instance->CR3, USART_CR3_EIE);
3449 
3450  /* Clear RxISR function pointer */
3451  husart->RxISR = NULL;
3452 
3453 #if defined(USART_CR1_FIFOEN)
3454  /* txftie and txdatacount are temporary variables for MISRAC2012-Rule-13.5 */
3455  txftie = READ_BIT(husart->Instance->CR3, USART_CR3_TXFTIE);
3456 #else
3457  /* txdatacount is a temporary variable for MISRAC2012-Rule-13.5 */
3458 #endif /* USART_CR1_FIFOEN */
3459  txdatacount = husart->TxXferCount;
3460 
3461  if (state == HAL_USART_STATE_BUSY_RX)
3462  {
3463 #if defined(USART_CR2_SLVEN)
3464  /* Clear SPI slave underrun flag and discard transmit data */
3465  if (husart->SlaveMode == USART_SLAVEMODE_ENABLE)
3466  {
3467  __HAL_USART_CLEAR_UDRFLAG(husart);
3468  __HAL_USART_SEND_REQ(husart, USART_TXDATA_FLUSH_REQUEST);
3469  }
3470 #endif /* USART_CR2_SLVEN */
3471 
3472  /* Rx process is completed, restore husart->State to Ready */
3473  husart->State = HAL_USART_STATE_READY;
3474 
3475 #if (USE_HAL_USART_REGISTER_CALLBACKS == 1)
3476  /* Call registered Rx Complete Callback */
3477  husart->RxCpltCallback(husart);
3478 #else
3479  /* Call legacy weak Rx Complete Callback */
3480  HAL_USART_RxCpltCallback(husart);
3481 #endif /* USE_HAL_USART_REGISTER_CALLBACKS */
3482  }
3483 #if defined(USART_CR1_FIFOEN)
3484  else if ((READ_BIT(husart->Instance->CR1, USART_CR1_TCIE) != USART_CR1_TCIE) &&
3485  (txftie != USART_CR3_TXFTIE) &&
3486  (txdatacount == 0U))
3487 #else
3488  else if ((READ_BIT(husart->Instance->CR1, USART_CR1_TCIE) != USART_CR1_TCIE) &&
3489  (txdatacount == 0U))
3490 #endif /* USART_CR1_FIFOEN */
3491  {
3492  /* TxRx process is completed, restore husart->State to Ready */
3493  husart->State = HAL_USART_STATE_READY;
3494 
3495 #if (USE_HAL_USART_REGISTER_CALLBACKS == 1)
3496  /* Call registered Tx Rx Complete Callback */
3497  husart->TxRxCpltCallback(husart);
3498 #else
3499  /* Call legacy weak Tx Rx Complete Callback */
3501 #endif /* USE_HAL_USART_REGISTER_CALLBACKS */
3502  }
3503  else
3504  {
3505  /* Nothing to do */
3506  }
3507  }
3508 #if defined(USART_CR2_SLVEN)
3509  else if ((state == HAL_USART_STATE_BUSY_RX) &&
3510  (husart->SlaveMode == USART_SLAVEMODE_DISABLE))
3511 #else
3512  else if (state == HAL_USART_STATE_BUSY_RX)
3513 #endif /* USART_CR2_SLVEN */
3514  {
3515  /* Send dummy byte in order to generate the clock for the Slave to Send the next data */
3516  husart->Instance->TDR = (USART_DUMMY_DATA & (uint16_t)0x00FF);
3517  }
3518  else
3519  {
3520  /* Nothing to do */
3521  }
3522  }
3523 }
__IO HAL_USART_StateTypeDef State
HAL_USART_StateTypeDef
HAL USART State structures definition.
void HAL_USART_RxCpltCallback(USART_HandleTypeDef *husart)
Rx Transfer completed callback.
CLEAR_BIT(hrtc->Instance->CR, RTC_CR_WUTE)
void(* RxCpltCallback)(struct __USART_HandleTypeDef *husart)
void(* RxISR)(struct __USART_HandleTypeDef *husart)
void HAL_USART_TxRxCpltCallback(USART_HandleTypeDef *husart)
Tx/Rx Transfers completed callback for the non-blocking process.
void(* TxRxCpltCallback)(struct __USART_HandleTypeDef *husart)

◆ USART_RxISR_16BIT_FIFOEN()

static void USART_RxISR_16BIT_FIFOEN ( USART_HandleTypeDef husart)
static

Simplex receive an amount of data in non-blocking mode.

Note
Function called under interruption only, once interruptions have been enabled by HAL_USART_Receive_IT().
ISR function executed when FIFO mode is enabled and when the data word length is 9 bits long.
Parameters
husartUSART handle
Return values
None

Definition at line 3678 of file stm32l4xx_hal_usart.c.

3679 {
3680  HAL_USART_StateTypeDef state = husart->State;
3681  uint16_t txdatacount;
3682  uint16_t rxdatacount;
3683  uint16_t *tmp;
3684  uint16_t uhMask = husart->Mask;
3685  uint16_t nb_rx_data;
3686  uint32_t txftie;
3687 
3688  /* Check that a Tx process is ongoing */
3689  if ((state == HAL_USART_STATE_BUSY_RX) ||
3690  (state == HAL_USART_STATE_BUSY_TX_RX))
3691  {
3692  for (nb_rx_data = husart->NbRxDataToProcess ; nb_rx_data > 0U ; nb_rx_data--)
3693  {
3694  if (__HAL_USART_GET_FLAG(husart, USART_FLAG_RXFNE) == SET)
3695  {
3696  tmp = (uint16_t *) husart->pRxBuffPtr;
3697  *tmp = (uint16_t)(husart->Instance->RDR & uhMask);
3698  husart->pRxBuffPtr += 2U;
3699  husart->RxXferCount--;
3700 
3701  if (husart->RxXferCount == 0U)
3702  {
3703  /* Disable the USART Parity Error Interrupt */
3704  CLEAR_BIT(husart->Instance->CR1, USART_CR1_PEIE);
3705 
3706  /* Disable the USART Error Interrupt: (Frame error, noise error, overrun error) and RX FIFO Threshold interrupt */
3707  CLEAR_BIT(husart->Instance->CR3, (USART_CR3_EIE | USART_CR3_RXFTIE));
3708 
3709  /* Clear RxISR function pointer */
3710  husart->RxISR = NULL;
3711 
3712  /* txftie and txdatacount are temporary variables for MISRAC2012-Rule-13.5 */
3713  txftie = READ_BIT(husart->Instance->CR3, USART_CR3_TXFTIE);
3714  txdatacount = husart->TxXferCount;
3715 
3716  if (state == HAL_USART_STATE_BUSY_RX)
3717  {
3718 #if defined(USART_CR2_SLVEN)
3719  /* Clear SPI slave underrun flag and discard transmit data */
3720  if (husart->SlaveMode == USART_SLAVEMODE_ENABLE)
3721  {
3722  __HAL_USART_CLEAR_UDRFLAG(husart);
3723  __HAL_USART_SEND_REQ(husart, USART_TXDATA_FLUSH_REQUEST);
3724  }
3725 #endif /* USART_CR2_SLVEN */
3726 
3727  /* Rx process is completed, restore husart->State to Ready */
3728  husart->State = HAL_USART_STATE_READY;
3729  state = HAL_USART_STATE_READY;
3730 
3731 #if (USE_HAL_USART_REGISTER_CALLBACKS == 1)
3732  /* Call registered Rx Complete Callback */
3733  husart->RxCpltCallback(husart);
3734 #else
3735  /* Call legacy weak Rx Complete Callback */
3736  HAL_USART_RxCpltCallback(husart);
3737 #endif /* USE_HAL_USART_REGISTER_CALLBACKS */
3738  }
3739  else if ((READ_BIT(husart->Instance->CR1, USART_CR1_TCIE) != USART_CR1_TCIE) &&
3740  (txftie != USART_CR3_TXFTIE) &&
3741  (txdatacount == 0U))
3742  {
3743  /* TxRx process is completed, restore husart->State to Ready */
3744  husart->State = HAL_USART_STATE_READY;
3745  state = HAL_USART_STATE_READY;
3746 
3747 #if (USE_HAL_USART_REGISTER_CALLBACKS == 1)
3748  /* Call registered Tx Rx Complete Callback */
3749  husart->TxRxCpltCallback(husart);
3750 #else
3751  /* Call legacy weak Tx Rx Complete Callback */
3753 #endif /* USE_HAL_USART_REGISTER_CALLBACKS */
3754  }
3755  else
3756  {
3757  /* Nothing to do */
3758  }
3759  }
3760 #if defined(USART_CR2_SLVEN)
3761  else if ((state == HAL_USART_STATE_BUSY_RX) &&
3762  (husart->SlaveMode == USART_SLAVEMODE_DISABLE))
3763 #else
3764  else if (state == HAL_USART_STATE_BUSY_RX)
3765 #endif /* USART_CR2_SLVEN */
3766  {
3767  /* Send dummy byte in order to generate the clock for the Slave to Send the next data */
3768  husart->Instance->TDR = (USART_DUMMY_DATA & (uint16_t)0x00FF);
3769  }
3770  else
3771  {
3772  /* Nothing to do */
3773  }
3774  }
3775  }
3776 
3777  /* When remaining number of bytes to receive is less than the RX FIFO
3778  threshold, next incoming frames are processed as if FIFO mode was
3779  disabled (i.e. one interrupt per received frame).
3780  */
3781  rxdatacount = husart->RxXferCount;
3782  if (((rxdatacount != 0U)) && (rxdatacount < husart->NbRxDataToProcess))
3783  {
3784  /* Disable the USART RXFT interrupt*/
3785  CLEAR_BIT(husart->Instance->CR3, USART_CR3_RXFTIE);
3786 
3787  /* Update the RxISR function pointer */
3788  husart->RxISR = USART_RxISR_16BIT;
3789 
3790  /* Enable the USART Data Register Not Empty interrupt */
3791  SET_BIT(husart->Instance->CR1, USART_CR1_RXNEIE_RXFNEIE);
3792 
3793 #if defined(USART_CR2_SLVEN)
3794  if ((husart->TxXferCount == 0U) &&
3795  (state == HAL_USART_STATE_BUSY_TX_RX) &&
3796  (husart->SlaveMode == USART_SLAVEMODE_DISABLE))
3797 #else
3798  if ((husart->TxXferCount == 0U) &&
3799  (state == HAL_USART_STATE_BUSY_TX_RX))
3800 #endif /* USART_CR2_SLVEN */
3801  {
3802  /* Send dummy byte in order to generate the clock for the Slave to Send the next data */
3803  husart->Instance->TDR = (USART_DUMMY_DATA & (uint16_t)0x00FF);
3804  }
3805  }
3806  }
3807  else
3808  {
3809  /* Clear RXNE interrupt flag */
3810  __HAL_USART_SEND_REQ(husart, USART_RXDATA_FLUSH_REQUEST);
3811  }
3812 }
__IO HAL_USART_StateTypeDef State
static void USART_RxISR_16BIT(USART_HandleTypeDef *husart)
Simplex receive an amount of data in non-blocking mode.
HAL_USART_StateTypeDef
HAL USART State structures definition.
void HAL_USART_RxCpltCallback(USART_HandleTypeDef *husart)
Rx Transfer completed callback.
CLEAR_BIT(hrtc->Instance->CR, RTC_CR_WUTE)
void(* RxCpltCallback)(struct __USART_HandleTypeDef *husart)
void(* RxISR)(struct __USART_HandleTypeDef *husart)
void HAL_USART_TxRxCpltCallback(USART_HandleTypeDef *husart)
Tx/Rx Transfers completed callback for the non-blocking process.
void(* TxRxCpltCallback)(struct __USART_HandleTypeDef *husart)

◆ USART_RxISR_8BIT()

static void USART_RxISR_8BIT ( USART_HandleTypeDef husart)
static

Simplex receive an amount of data in non-blocking mode.

Note
Function called under interruption only, once interruptions have been enabled by HAL_USART_Receive_IT().
ISR function executed when FIFO mode is disabled and when the data word length is less than 9 bits long.
Parameters
husartUSART handle
Return values
None

Definition at line 3308 of file stm32l4xx_hal_usart.c.

3309 {
3310  const HAL_USART_StateTypeDef state = husart->State;
3311  uint16_t txdatacount;
3312  uint16_t uhMask = husart->Mask;
3313 #if defined(USART_CR1_FIFOEN)
3314  uint32_t txftie;
3315 #endif /* USART_CR1_FIFOEN */
3316 
3317  if ((state == HAL_USART_STATE_BUSY_RX) ||
3318  (state == HAL_USART_STATE_BUSY_TX_RX))
3319  {
3320  *husart->pRxBuffPtr = (uint8_t)(husart->Instance->RDR & (uint8_t)uhMask);
3321  husart->pRxBuffPtr++;
3322  husart->RxXferCount--;
3323 
3324  if (husart->RxXferCount == 0U)
3325  {
3326  /* Disable the USART Parity Error Interrupt and RXNE interrupt*/
3327 #if defined(USART_CR1_FIFOEN)
3328  CLEAR_BIT(husart->Instance->CR1, (USART_CR1_RXNEIE_RXFNEIE | USART_CR1_PEIE));
3329 #else
3330  CLEAR_BIT(husart->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE));
3331 #endif /* USART_CR1_FIFOEN */
3332 
3333  /* Disable the USART Error Interrupt: (Frame error, noise error, overrun error) */
3334  CLEAR_BIT(husart->Instance->CR3, USART_CR3_EIE);
3335 
3336  /* Clear RxISR function pointer */
3337  husart->RxISR = NULL;
3338 
3339 #if defined(USART_CR1_FIFOEN)
3340  /* txftie and txdatacount are temporary variables for MISRAC2012-Rule-13.5 */
3341  txftie = READ_BIT(husart->Instance->CR3, USART_CR3_TXFTIE);
3342 #else
3343  /* txdatacount is a temporary variable for MISRAC2012-Rule-13.5 */
3344 #endif /* USART_CR1_FIFOEN */
3345  txdatacount = husart->TxXferCount;
3346 
3347  if (state == HAL_USART_STATE_BUSY_RX)
3348  {
3349 #if defined(USART_CR2_SLVEN)
3350  /* Clear SPI slave underrun flag and discard transmit data */
3351  if (husart->SlaveMode == USART_SLAVEMODE_ENABLE)
3352  {
3353  __HAL_USART_CLEAR_UDRFLAG(husart);
3354  __HAL_USART_SEND_REQ(husart, USART_TXDATA_FLUSH_REQUEST);
3355  }
3356 #endif /* USART_CR2_SLVEN */
3357 
3358  /* Rx process is completed, restore husart->State to Ready */
3359  husart->State = HAL_USART_STATE_READY;
3360 
3361 #if (USE_HAL_USART_REGISTER_CALLBACKS == 1)
3362  /* Call registered Rx Complete Callback */
3363  husart->RxCpltCallback(husart);
3364 #else
3365  /* Call legacy weak Rx Complete Callback */
3366  HAL_USART_RxCpltCallback(husart);
3367 #endif /* USE_HAL_USART_REGISTER_CALLBACKS */
3368  }
3369 #if defined(USART_CR1_FIFOEN)
3370  else if ((READ_BIT(husart->Instance->CR1, USART_CR1_TCIE) != USART_CR1_TCIE) &&
3371  (txftie != USART_CR3_TXFTIE) &&
3372  (txdatacount == 0U))
3373 #else
3374  else if ((READ_BIT(husart->Instance->CR1, USART_CR1_TCIE) != USART_CR1_TCIE) &&
3375  (txdatacount == 0U))
3376 #endif /* USART_CR1_FIFOEN */
3377  {
3378  /* TxRx process is completed, restore husart->State to Ready */
3379  husart->State = HAL_USART_STATE_READY;
3380 
3381 #if (USE_HAL_USART_REGISTER_CALLBACKS == 1)
3382  /* Call registered Tx Rx Complete Callback */
3383  husart->TxRxCpltCallback(husart);
3384 #else
3385  /* Call legacy weak Tx Rx Complete Callback */
3387 #endif /* USE_HAL_USART_REGISTER_CALLBACKS */
3388  }
3389  else
3390  {
3391  /* Nothing to do */
3392  }
3393  }
3394 #if defined(USART_CR2_SLVEN)
3395  else if ((state == HAL_USART_STATE_BUSY_RX) &&
3396  (husart->SlaveMode == USART_SLAVEMODE_DISABLE))
3397 #else
3398  else if (state == HAL_USART_STATE_BUSY_RX)
3399 #endif /* USART_CR2_SLVEN */
3400  {
3401  /* Send dummy byte in order to generate the clock for the Slave to Send the next data */
3402  husart->Instance->TDR = (USART_DUMMY_DATA & (uint16_t)0x00FF);
3403  }
3404  else
3405  {
3406  /* Nothing to do */
3407  }
3408  }
3409 }
__IO HAL_USART_StateTypeDef State
HAL_USART_StateTypeDef
HAL USART State structures definition.
void HAL_USART_RxCpltCallback(USART_HandleTypeDef *husart)
Rx Transfer completed callback.
CLEAR_BIT(hrtc->Instance->CR, RTC_CR_WUTE)
void(* RxCpltCallback)(struct __USART_HandleTypeDef *husart)
void(* RxISR)(struct __USART_HandleTypeDef *husart)
void HAL_USART_TxRxCpltCallback(USART_HandleTypeDef *husart)
Tx/Rx Transfers completed callback for the non-blocking process.
void(* TxRxCpltCallback)(struct __USART_HandleTypeDef *husart)

◆ USART_RxISR_8BIT_FIFOEN()

static void USART_RxISR_8BIT_FIFOEN ( USART_HandleTypeDef husart)
static

Simplex receive an amount of data in non-blocking mode.

Note
Function called under interruption only, once interruptions have been enabled by HAL_USART_Receive_IT().
ISR function executed when FIFO mode is enabled and when the data word length is less than 9 bits long.
Parameters
husartUSART handle
Return values
None

Definition at line 3535 of file stm32l4xx_hal_usart.c.

3536 {
3537  HAL_USART_StateTypeDef state = husart->State;
3538  uint16_t txdatacount;
3539  uint16_t rxdatacount;
3540  uint16_t uhMask = husart->Mask;
3541  uint16_t nb_rx_data;
3542  uint32_t txftie;
3543 
3544  /* Check that a Rx process is ongoing */
3545  if ((state == HAL_USART_STATE_BUSY_RX) ||
3546  (state == HAL_USART_STATE_BUSY_TX_RX))
3547  {
3548  for (nb_rx_data = husart->NbRxDataToProcess ; nb_rx_data > 0U ; nb_rx_data--)
3549  {
3550  if (__HAL_USART_GET_FLAG(husart, USART_FLAG_RXFNE) == SET)
3551  {
3552  *husart->pRxBuffPtr = (uint8_t)(husart->Instance->RDR & (uint8_t)(uhMask & 0xFFU));
3553  husart->pRxBuffPtr++;
3554  husart->RxXferCount--;
3555 
3556  if (husart->RxXferCount == 0U)
3557  {
3558  /* Disable the USART Parity Error Interrupt */
3559  CLEAR_BIT(husart->Instance->CR1, USART_CR1_PEIE);
3560 
3561  /* Disable the USART Error Interrupt: (Frame error, noise error, overrun error) and RX FIFO Threshold interrupt */
3562  CLEAR_BIT(husart->Instance->CR3, (USART_CR3_EIE | USART_CR3_RXFTIE));
3563 
3564  /* Clear RxISR function pointer */
3565  husart->RxISR = NULL;
3566 
3567  /* txftie and txdatacount are temporary variables for MISRAC2012-Rule-13.5 */
3568  txftie = READ_BIT(husart->Instance->CR3, USART_CR3_TXFTIE);
3569  txdatacount = husart->TxXferCount;
3570 
3571  if (state == HAL_USART_STATE_BUSY_RX)
3572  {
3573 #if defined(USART_CR2_SLVEN)
3574  /* Clear SPI slave underrun flag and discard transmit data */
3575  if (husart->SlaveMode == USART_SLAVEMODE_ENABLE)
3576  {
3577  __HAL_USART_CLEAR_UDRFLAG(husart);
3578  __HAL_USART_SEND_REQ(husart, USART_TXDATA_FLUSH_REQUEST);
3579  }
3580 #endif /* USART_CR2_SLVEN */
3581 
3582  /* Rx process is completed, restore husart->State to Ready */
3583  husart->State = HAL_USART_STATE_READY;
3584  state = HAL_USART_STATE_READY;
3585 
3586 #if (USE_HAL_USART_REGISTER_CALLBACKS == 1)
3587  /* Call registered Rx Complete Callback */
3588  husart->RxCpltCallback(husart);
3589 #else
3590  /* Call legacy weak Rx Complete Callback */
3591  HAL_USART_RxCpltCallback(husart);
3592 #endif /* USE_HAL_USART_REGISTER_CALLBACKS */
3593  }
3594  else if ((READ_BIT(husart->Instance->CR1, USART_CR1_TCIE) != USART_CR1_TCIE) &&
3595  (txftie != USART_CR3_TXFTIE) &&
3596  (txdatacount == 0U))
3597  {
3598  /* TxRx process is completed, restore husart->State to Ready */
3599  husart->State = HAL_USART_STATE_READY;
3600  state = HAL_USART_STATE_READY;
3601 
3602 #if (USE_HAL_USART_REGISTER_CALLBACKS == 1)
3603  /* Call registered Tx Rx Complete Callback */
3604  husart->TxRxCpltCallback(husart);
3605 #else
3606  /* Call legacy weak Tx Rx Complete Callback */
3608 #endif /* USE_HAL_USART_REGISTER_CALLBACKS */
3609  }
3610  else
3611  {
3612  /* Nothing to do */
3613  }
3614  }
3615 #if defined(USART_CR2_SLVEN)
3616  else if ((state == HAL_USART_STATE_BUSY_RX) &&
3617  (husart->SlaveMode == USART_SLAVEMODE_DISABLE))
3618 #else
3619  else if (state == HAL_USART_STATE_BUSY_RX)
3620 #endif /* USART_CR2_SLVEN */
3621  {
3622  /* Send dummy byte in order to generate the clock for the Slave to Send the next data */
3623  husart->Instance->TDR = (USART_DUMMY_DATA & (uint16_t)0x00FF);
3624  }
3625  else
3626  {
3627  /* Nothing to do */
3628  }
3629  }
3630  }
3631 
3632  /* When remaining number of bytes to receive is less than the RX FIFO
3633  threshold, next incoming frames are processed as if FIFO mode was
3634  disabled (i.e. one interrupt per received frame).
3635  */
3636  rxdatacount = husart->RxXferCount;
3637  if (((rxdatacount != 0U)) && (rxdatacount < husart->NbRxDataToProcess))
3638  {
3639  /* Disable the USART RXFT interrupt*/
3640  CLEAR_BIT(husart->Instance->CR3, USART_CR3_RXFTIE);
3641 
3642  /* Update the RxISR function pointer */
3643  husart->RxISR = USART_RxISR_8BIT;
3644 
3645  /* Enable the USART Data Register Not Empty interrupt */
3646  SET_BIT(husart->Instance->CR1, USART_CR1_RXNEIE_RXFNEIE);
3647 
3648 #if defined(USART_CR2_SLVEN)
3649  if ((husart->TxXferCount == 0U) &&
3650  (state == HAL_USART_STATE_BUSY_TX_RX) &&
3651  (husart->SlaveMode == USART_SLAVEMODE_DISABLE))
3652 #else
3653  if ((husart->TxXferCount == 0U) &&
3654  (state == HAL_USART_STATE_BUSY_TX_RX))
3655 #endif /* USART_CR2_SLVEN */
3656  {
3657  /* Send dummy byte in order to generate the clock for the Slave to Send the next data */
3658  husart->Instance->TDR = (USART_DUMMY_DATA & (uint16_t)0x00FF);
3659  }
3660  }
3661  }
3662  else
3663  {
3664  /* Clear RXNE interrupt flag */
3665  __HAL_USART_SEND_REQ(husart, USART_RXDATA_FLUSH_REQUEST);
3666  }
3667 }
__IO HAL_USART_StateTypeDef State
HAL_USART_StateTypeDef
HAL USART State structures definition.
void HAL_USART_RxCpltCallback(USART_HandleTypeDef *husart)
Rx Transfer completed callback.
CLEAR_BIT(hrtc->Instance->CR, RTC_CR_WUTE)
static void USART_RxISR_8BIT(USART_HandleTypeDef *husart)
Simplex receive an amount of data in non-blocking mode.
void(* RxCpltCallback)(struct __USART_HandleTypeDef *husart)
void(* RxISR)(struct __USART_HandleTypeDef *husart)
void HAL_USART_TxRxCpltCallback(USART_HandleTypeDef *husart)
Tx/Rx Transfers completed callback for the non-blocking process.
void(* TxRxCpltCallback)(struct __USART_HandleTypeDef *husart)

◆ USART_SetConfig()

static HAL_StatusTypeDef USART_SetConfig ( USART_HandleTypeDef husart)
static

Configure the USART peripheral.

Parameters
husartUSART handle.
Return values
HALstatus

Definition at line 2914 of file stm32l4xx_hal_usart.c.

2915 {
2916  uint32_t tmpreg;
2917  USART_ClockSourceTypeDef clocksource;
2918  HAL_StatusTypeDef ret = HAL_OK;
2919  uint16_t brrtemp;
2920  uint32_t usartdiv = 0x00000000;
2921 
2922  /* Check the parameters */
2923  assert_param(IS_USART_POLARITY(husart->Init.CLKPolarity));
2924  assert_param(IS_USART_PHASE(husart->Init.CLKPhase));
2925  assert_param(IS_USART_LASTBIT(husart->Init.CLKLastBit));
2926  assert_param(IS_USART_BAUDRATE(husart->Init.BaudRate));
2927  assert_param(IS_USART_WORD_LENGTH(husart->Init.WordLength));
2928  assert_param(IS_USART_STOPBITS(husart->Init.StopBits));
2929  assert_param(IS_USART_PARITY(husart->Init.Parity));
2930  assert_param(IS_USART_MODE(husart->Init.Mode));
2931 #if defined(USART_PRESC_PRESCALER)
2932  assert_param(IS_USART_PRESCALER(husart->Init.ClockPrescaler));
2933 #endif /* USART_PRESC_PRESCALER */
2934 
2935  /*-------------------------- USART CR1 Configuration -----------------------*/
2936  /* Clear M, PCE, PS, TE and RE bits and configure
2937  * the USART Word Length, Parity and Mode:
2938  * set the M bits according to husart->Init.WordLength value
2939  * set PCE and PS bits according to husart->Init.Parity value
2940  * set TE and RE bits according to husart->Init.Mode value
2941  * force OVER8 to 1 to allow to reach the maximum speed (Fclock/8) */
2942  tmpreg = (uint32_t)husart->Init.WordLength | husart->Init.Parity | husart->Init.Mode | USART_CR1_OVER8;
2943  MODIFY_REG(husart->Instance->CR1, USART_CR1_FIELDS, tmpreg);
2944 
2945  /*---------------------------- USART CR2 Configuration ---------------------*/
2946  /* Clear and configure the USART Clock, CPOL, CPHA, LBCL STOP and SLVEN bits:
2947  * set CPOL bit according to husart->Init.CLKPolarity value
2948  * set CPHA bit according to husart->Init.CLKPhase value
2949  * set LBCL bit according to husart->Init.CLKLastBit value (used in SPI master mode only)
2950  * set STOP[13:12] bits according to husart->Init.StopBits value */
2951  tmpreg = (uint32_t)(USART_CLOCK_ENABLE);
2952  tmpreg |= (uint32_t)husart->Init.CLKLastBit;
2953  tmpreg |= ((uint32_t)husart->Init.CLKPolarity | (uint32_t)husart->Init.CLKPhase);
2954  tmpreg |= (uint32_t)husart->Init.StopBits;
2955  MODIFY_REG(husart->Instance->CR2, USART_CR2_FIELDS, tmpreg);
2956 
2957 #if defined(USART_PRESC_PRESCALER)
2958  /*-------------------------- USART PRESC Configuration -----------------------*/
2959  /* Configure
2960  * - USART Clock Prescaler : set PRESCALER according to husart->Init.ClockPrescaler value */
2961  MODIFY_REG(husart->Instance->PRESC, USART_PRESC_PRESCALER, husart->Init.ClockPrescaler);
2962 #endif /* USART_PRESC_PRESCALER */
2963 
2964  /*-------------------------- USART BRR Configuration -----------------------*/
2965  /* BRR is filled-up according to OVER8 bit setting which is forced to 1 */
2966  USART_GETCLOCKSOURCE(husart, clocksource);
2967 
2968  switch (clocksource)
2969  {
2971 #if defined(USART_PRESC_PRESCALER)
2972  usartdiv = (uint32_t)(USART_DIV_SAMPLING8(HAL_RCC_GetPCLK1Freq(), husart->Init.BaudRate, husart->Init.ClockPrescaler));
2973 #else
2974  usartdiv = (uint32_t)(USART_DIV_SAMPLING8(HAL_RCC_GetPCLK1Freq(), husart->Init.BaudRate));
2975 #endif /* USART_PRESC_PRESCALER */
2976  break;
2978 #if defined(USART_PRESC_PRESCALER)
2979  usartdiv = (uint32_t)(USART_DIV_SAMPLING8(HAL_RCC_GetPCLK2Freq(), husart->Init.BaudRate, husart->Init.ClockPrescaler));
2980 #else
2981  usartdiv = (uint32_t)(USART_DIV_SAMPLING8(HAL_RCC_GetPCLK2Freq(), husart->Init.BaudRate));
2982 #endif /* USART_PRESC_PRESCALER */
2983  break;
2984  case USART_CLOCKSOURCE_HSI:
2985 #if defined(USART_PRESC_PRESCALER)
2986  usartdiv = (uint32_t)(USART_DIV_SAMPLING8(HSI_VALUE, husart->Init.BaudRate, husart->Init.ClockPrescaler));
2987 #else
2988  usartdiv = (uint32_t)(USART_DIV_SAMPLING8(HSI_VALUE, husart->Init.BaudRate));
2989 #endif /* USART_PRESC_PRESCALER */
2990  break;
2992 #if defined(USART_PRESC_PRESCALER)
2993  usartdiv = (uint32_t)(USART_DIV_SAMPLING8(HAL_RCC_GetSysClockFreq(), husart->Init.BaudRate, husart->Init.ClockPrescaler));
2994 #else
2995  usartdiv = (uint32_t)(USART_DIV_SAMPLING8(HAL_RCC_GetSysClockFreq(), husart->Init.BaudRate));
2996 #endif /* USART_PRESC_PRESCALER */
2997  break;
2998  case USART_CLOCKSOURCE_LSE:
2999 #if defined(USART_PRESC_PRESCALER)
3000  usartdiv = (uint32_t)(USART_DIV_SAMPLING8(LSE_VALUE, husart->Init.BaudRate, husart->Init.ClockPrescaler));
3001 #else
3002  usartdiv = (uint32_t)(USART_DIV_SAMPLING8(LSE_VALUE, husart->Init.BaudRate));
3003 #endif /* USART_PRESC_PRESCALER */
3004  break;
3005  default:
3006  ret = HAL_ERROR;
3007  break;
3008  }
3009 
3010  /* USARTDIV must be greater than or equal to 0d16 and smaller than or equal to ffff */
3011  if ((usartdiv >= USART_BRR_MIN) && (usartdiv <= USART_BRR_MAX))
3012  {
3013  brrtemp = (uint16_t)(usartdiv & 0xFFF0U);
3014  brrtemp |= (uint16_t)((usartdiv & (uint16_t)0x000FU) >> 1U);
3015  husart->Instance->BRR = brrtemp;
3016  }
3017  else
3018  {
3019  ret = HAL_ERROR;
3020  }
3021 
3022 #if defined(USART_CR1_FIFOEN)
3023  /* Initialize the number of data to process during RX/TX ISR execution */
3024  husart->NbTxDataToProcess = 1U;
3025  husart->NbRxDataToProcess = 1U;
3026 #endif /* USART_CR1_FIFOEN */
3027 
3028  /* Clear ISR function pointers */
3029  husart->RxISR = NULL;
3030  husart->TxISR = NULL;
3031 
3032  return ret;
3033 }
register uint32_t brrtemp
USART_ClockSourceTypeDef
USART clock sources definitions.
uint32_t HAL_RCC_GetPCLK2Freq(void)
Return the PCLK2 frequency.
void(* TxISR)(struct __USART_HandleTypeDef *husart)
return HAL_OK
void(* RxISR)(struct __USART_HandleTypeDef *husart)
uint32_t HAL_RCC_GetSysClockFreq(void)
Return the SYSCLK frequency.
MODIFY_REG(hrtc->Instance->CR, RTC_CR_WUCKSEL,(uint32_t) WakeUpClock)
uint32_t HAL_RCC_GetPCLK1Freq(void)
Return the PCLK1 frequency.
assert_param(IS_RTC_WAKEUP_CLOCK(WakeUpClock))

◆ USART_TxISR_16BIT()

static void USART_TxISR_16BIT ( USART_HandleTypeDef husart)
static

Simplex send an amount of data in non-blocking mode.

Note
Function called under interruption only, once interruptions have been enabled by HAL_USART_Transmit_IT().
The USART errors are not managed to avoid the overrun error.
ISR function executed when FIFO mode is disabled and when the data word length is 9 bits long.
Parameters
husartUSART handle.
Return values
None

Definition at line 3125 of file stm32l4xx_hal_usart.c.

3126 {
3127  const HAL_USART_StateTypeDef state = husart->State;
3128  uint16_t *tmp;
3129 
3130  if ((state == HAL_USART_STATE_BUSY_TX) ||
3131  (state == HAL_USART_STATE_BUSY_TX_RX))
3132  {
3133  if (husart->TxXferCount == 0U)
3134  {
3135  /* Disable the USART Transmit data register empty interrupt */
3136  __HAL_USART_DISABLE_IT(husart, USART_IT_TXE);
3137 
3138  /* Enable the USART Transmit Complete Interrupt */
3139  __HAL_USART_ENABLE_IT(husart, USART_IT_TC);
3140  }
3141  else
3142  {
3143  tmp = (uint16_t *) husart->pTxBuffPtr;
3144  husart->Instance->TDR = (uint16_t)(*tmp & 0x01FFU);
3145  husart->pTxBuffPtr += 2U;
3146  husart->TxXferCount--;
3147  }
3148  }
3149 }
__IO HAL_USART_StateTypeDef State
HAL_USART_StateTypeDef
HAL USART State structures definition.

◆ USART_TxISR_16BIT_FIFOEN()

static void USART_TxISR_16BIT_FIFOEN ( USART_HandleTypeDef husart)
static

Simplex send an amount of data in non-blocking mode.

Note
Function called under interruption only, once interruptions have been enabled by HAL_USART_Transmit_IT().
The USART errors are not managed to avoid the overrun error.
ISR function executed when FIFO mode is enabled and when the data word length is 9 bits long.
Parameters
husartUSART handle.
Return values
None

Definition at line 3207 of file stm32l4xx_hal_usart.c.

3208 {
3209  const HAL_USART_StateTypeDef state = husart->State;
3210  uint16_t *tmp;
3211  uint16_t nb_tx_data;
3212 
3213  /* Check that a Tx process is ongoing */
3214  if ((state == HAL_USART_STATE_BUSY_TX) ||
3215  (state == HAL_USART_STATE_BUSY_TX_RX))
3216  {
3217  for (nb_tx_data = husart->NbTxDataToProcess ; nb_tx_data > 0U ; nb_tx_data--)
3218  {
3219  if (husart->TxXferCount == 0U)
3220  {
3221  /* Disable the TX FIFO threshold interrupt */
3222  __HAL_USART_DISABLE_IT(husart, USART_IT_TXFT);
3223 
3224  /* Enable the USART Transmit Complete Interrupt */
3225  __HAL_USART_ENABLE_IT(husart, USART_IT_TC);
3226 
3227  break; /* force exit loop */
3228  }
3229  else if (__HAL_USART_GET_FLAG(husart, USART_FLAG_TXFNF) == SET)
3230  {
3231  tmp = (uint16_t *) husart->pTxBuffPtr;
3232  husart->Instance->TDR = (uint16_t)(*tmp & 0x01FFU);
3233  husart->pTxBuffPtr += 2U;
3234  husart->TxXferCount--;
3235  }
3236  else
3237  {
3238  /* Nothing to do */
3239  }
3240  }
3241  }
3242 }
__IO HAL_USART_StateTypeDef State
HAL_USART_StateTypeDef
HAL USART State structures definition.

◆ USART_TxISR_8BIT()

static void USART_TxISR_8BIT ( USART_HandleTypeDef husart)
static

Simplex send an amount of data in non-blocking mode.

Note
Function called under interruption only, once interruptions have been enabled by HAL_USART_Transmit_IT().
The USART errors are not managed to avoid the overrun error.
ISR function executed when FIFO mode is disabled and when the data word length is less than 9 bits long.
Parameters
husartUSART handle.
Return values
None

Definition at line 3090 of file stm32l4xx_hal_usart.c.

3091 {
3092  const HAL_USART_StateTypeDef state = husart->State;
3093 
3094  /* Check that a Tx process is ongoing */
3095  if ((state == HAL_USART_STATE_BUSY_TX) ||
3096  (state == HAL_USART_STATE_BUSY_TX_RX))
3097  {
3098  if (husart->TxXferCount == 0U)
3099  {
3100  /* Disable the USART Transmit data register empty interrupt */
3101  __HAL_USART_DISABLE_IT(husart, USART_IT_TXE);
3102 
3103  /* Enable the USART Transmit Complete Interrupt */
3104  __HAL_USART_ENABLE_IT(husart, USART_IT_TC);
3105  }
3106  else
3107  {
3108  husart->Instance->TDR = (uint8_t)(*husart->pTxBuffPtr & (uint8_t)0xFF);
3109  husart->pTxBuffPtr++;
3110  husart->TxXferCount--;
3111  }
3112  }
3113 }
__IO HAL_USART_StateTypeDef State
HAL_USART_StateTypeDef
HAL USART State structures definition.

◆ USART_TxISR_8BIT_FIFOEN()

static void USART_TxISR_8BIT_FIFOEN ( USART_HandleTypeDef husart)
static

Simplex send an amount of data in non-blocking mode.

Note
Function called under interruption only, once interruptions have been enabled by HAL_USART_Transmit_IT().
The USART errors are not managed to avoid the overrun error.
ISR function executed when FIFO mode is enabled and when the data word length is less than 9 bits long.
Parameters
husartUSART handle.
Return values
None

Definition at line 3162 of file stm32l4xx_hal_usart.c.

3163 {
3164  const HAL_USART_StateTypeDef state = husart->State;
3165  uint16_t nb_tx_data;
3166 
3167  /* Check that a Tx process is ongoing */
3168  if ((state == HAL_USART_STATE_BUSY_TX) ||
3169  (state == HAL_USART_STATE_BUSY_TX_RX))
3170  {
3171  for (nb_tx_data = husart->NbTxDataToProcess ; nb_tx_data > 0U ; nb_tx_data--)
3172  {
3173  if (husart->TxXferCount == 0U)
3174  {
3175  /* Disable the TX FIFO threshold interrupt */
3176  __HAL_USART_DISABLE_IT(husart, USART_IT_TXFT);
3177 
3178  /* Enable the USART Transmit Complete Interrupt */
3179  __HAL_USART_ENABLE_IT(husart, USART_IT_TC);
3180 
3181  break; /* force exit loop */
3182  }
3183  else if (__HAL_USART_GET_FLAG(husart, USART_FLAG_TXFNF) == SET)
3184  {
3185  husart->Instance->TDR = (uint8_t)(*husart->pTxBuffPtr & (uint8_t)0xFF);
3186  husart->pTxBuffPtr++;
3187  husart->TxXferCount--;
3188  }
3189  else
3190  {
3191  /* Nothing to do */
3192  }
3193  }
3194  }
3195 }
__IO HAL_USART_StateTypeDef State
HAL_USART_StateTypeDef
HAL USART State structures definition.

◆ USART_WaitOnFlagUntilTimeout()

static HAL_StatusTypeDef USART_WaitOnFlagUntilTimeout ( USART_HandleTypeDef husart,
uint32_t  Flag,
FlagStatus  Status,
uint32_t  Tickstart,
uint32_t  Timeout 
)
static

Handle USART Communication Timeout.

Parameters
husartUSART handle.
FlagSpecifies the USART flag to check.
Statusthe Flag status (SET or RESET).
TickstartTick start value
Timeouttimeout duration.
Return values
HALstatus

Definition at line 2886 of file stm32l4xx_hal_usart.c.

2888 {
2889  /* Wait until flag is set */
2890  while ((__HAL_USART_GET_FLAG(husart, Flag) ? SET : RESET) == Status)
2891  {
2892  /* Check for the Timeout */
2893  if (Timeout != HAL_MAX_DELAY)
2894  {
2895  if (((HAL_GetTick() - Tickstart) > Timeout) || (Timeout == 0U))
2896  {
2897  husart->State = HAL_USART_STATE_READY;
2898 
2899  /* Process Unlocked */
2900  __HAL_UNLOCK(husart);
2901 
2902  return HAL_TIMEOUT;
2903  }
2904  }
2905  }
2906  return HAL_OK;
2907 }
__IO HAL_USART_StateTypeDef State
uint32_t HAL_GetTick(void)
Provide a tick value in millisecond.
__HAL_UNLOCK(hrtc)
return HAL_OK