STM32L4xx_HAL_Driver  1.14.0
UART Private Functions

Functions

void UART_InitCallbacksToDefault (UART_HandleTypeDef *huart)
 Initialize the callbacks to their default values. More...
 
HAL_StatusTypeDef UART_SetConfig (UART_HandleTypeDef *huart)
 Configure the UART peripheral. More...
 
HAL_StatusTypeDef UART_CheckIdleState (UART_HandleTypeDef *huart)
 Check the UART Idle State. More...
 
HAL_StatusTypeDef UART_WaitOnFlagUntilTimeout (UART_HandleTypeDef *huart, uint32_t Flag, FlagStatus Status, uint32_t Tickstart, uint32_t Timeout)
 Handle UART Communication Timeout. More...
 
void UART_AdvFeatureConfig (UART_HandleTypeDef *huart)
 Configure the UART peripheral advanced features. More...
 
static void UART_EndTxTransfer (UART_HandleTypeDef *huart)
 End ongoing Tx transfer on UART peripheral (following error detection or Transmit completion). More...
 
static void UART_EndRxTransfer (UART_HandleTypeDef *huart)
 End ongoing Rx transfer on UART peripheral (following error detection or Reception completion). More...
 
static void UART_DMATransmitCplt (DMA_HandleTypeDef *hdma)
 DMA UART transmit process complete callback. More...
 
static void UART_DMAReceiveCplt (DMA_HandleTypeDef *hdma)
 DMA UART receive process complete callback. More...
 
static void UART_DMARxHalfCplt (DMA_HandleTypeDef *hdma)
 DMA UART receive process half complete callback. More...
 
static void UART_DMATxHalfCplt (DMA_HandleTypeDef *hdma)
 DMA UART transmit process half complete callback. More...
 
static void UART_DMAError (DMA_HandleTypeDef *hdma)
 DMA UART communication error callback. More...
 
static void UART_DMAAbortOnError (DMA_HandleTypeDef *hdma)
 DMA UART 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 UART_DMATxAbortCallback (DMA_HandleTypeDef *hdma)
 DMA UART 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 UART_DMARxAbortCallback (DMA_HandleTypeDef *hdma)
 DMA UART Rx communication abort callback, when initiated by user (To be called at end of DMA Rx Abort procedure following user abort request). More...
 
static void UART_DMATxOnlyAbortCallback (DMA_HandleTypeDef *hdma)
 DMA UART Tx communication abort callback, when initiated by user by a call to HAL_UART_AbortTransmit_IT API (Abort only Tx transfer) (This callback is executed at end of DMA Tx Abort procedure following user abort request, and leads to user Tx Abort Complete callback execution). More...
 
static void UART_DMARxOnlyAbortCallback (DMA_HandleTypeDef *hdma)
 DMA UART Rx communication abort callback, when initiated by user by a call to HAL_UART_AbortReceive_IT API (Abort only Rx transfer) (This callback is executed at end of DMA Rx Abort procedure following user abort request, and leads to user Rx Abort Complete callback execution). More...
 
static void UART_TxISR_8BIT (UART_HandleTypeDef *huart)
 TX interrrupt handler for 7 or 8 bits data word length . More...
 
static void UART_TxISR_16BIT (UART_HandleTypeDef *huart)
 TX interrrupt handler for 9 bits data word length. More...
 
static void UART_TxISR_8BIT_FIFOEN (UART_HandleTypeDef *huart)
 TX interrrupt handler for 7 or 8 bits data word length and FIFO mode is enabled. More...
 
static void UART_TxISR_16BIT_FIFOEN (UART_HandleTypeDef *huart)
 TX interrrupt handler for 9 bits data word length and FIFO mode is enabled. More...
 
static void UART_EndTransmit_IT (UART_HandleTypeDef *huart)
 Wrap up transmission in non-blocking mode. More...
 
static void UART_RxISR_8BIT (UART_HandleTypeDef *huart)
 RX interrrupt handler for 7 or 8 bits data word length . More...
 
static void UART_RxISR_16BIT (UART_HandleTypeDef *huart)
 RX interrrupt handler for 9 bits data word length . More...
 
static void UART_RxISR_8BIT_FIFOEN (UART_HandleTypeDef *huart)
 RX interrrupt handler for 7 or 8 bits data word length and FIFO mode is enabled. More...
 
static void UART_RxISR_16BIT_FIFOEN (UART_HandleTypeDef *huart)
 RX interrrupt handler for 9 bits data word length and FIFO mode is enabled. More...
 

Detailed Description

Function Documentation

◆ UART_AdvFeatureConfig()

void UART_AdvFeatureConfig ( UART_HandleTypeDef huart)

Configure the UART peripheral advanced features.

Parameters
huartUART handle.
Return values
None

Definition at line 3154 of file stm32l4xx_hal_uart.c.

3155 {
3156  /* Check whether the set of advanced features to configure is properly set */
3157  assert_param(IS_UART_ADVFEATURE_INIT(huart->AdvancedInit.AdvFeatureInit));
3158 
3159  /* if required, configure TX pin active level inversion */
3160  if (HAL_IS_BIT_SET(huart->AdvancedInit.AdvFeatureInit, UART_ADVFEATURE_TXINVERT_INIT))
3161  {
3162  assert_param(IS_UART_ADVFEATURE_TXINV(huart->AdvancedInit.TxPinLevelInvert));
3163  MODIFY_REG(huart->Instance->CR2, USART_CR2_TXINV, huart->AdvancedInit.TxPinLevelInvert);
3164  }
3165 
3166  /* if required, configure RX pin active level inversion */
3167  if (HAL_IS_BIT_SET(huart->AdvancedInit.AdvFeatureInit, UART_ADVFEATURE_RXINVERT_INIT))
3168  {
3169  assert_param(IS_UART_ADVFEATURE_RXINV(huart->AdvancedInit.RxPinLevelInvert));
3170  MODIFY_REG(huart->Instance->CR2, USART_CR2_RXINV, huart->AdvancedInit.RxPinLevelInvert);
3171  }
3172 
3173  /* if required, configure data inversion */
3174  if (HAL_IS_BIT_SET(huart->AdvancedInit.AdvFeatureInit, UART_ADVFEATURE_DATAINVERT_INIT))
3175  {
3176  assert_param(IS_UART_ADVFEATURE_DATAINV(huart->AdvancedInit.DataInvert));
3177  MODIFY_REG(huart->Instance->CR2, USART_CR2_DATAINV, huart->AdvancedInit.DataInvert);
3178  }
3179 
3180  /* if required, configure RX/TX pins swap */
3181  if (HAL_IS_BIT_SET(huart->AdvancedInit.AdvFeatureInit, UART_ADVFEATURE_SWAP_INIT))
3182  {
3183  assert_param(IS_UART_ADVFEATURE_SWAP(huart->AdvancedInit.Swap));
3184  MODIFY_REG(huart->Instance->CR2, USART_CR2_SWAP, huart->AdvancedInit.Swap);
3185  }
3186 
3187  /* if required, configure RX overrun detection disabling */
3188  if (HAL_IS_BIT_SET(huart->AdvancedInit.AdvFeatureInit, UART_ADVFEATURE_RXOVERRUNDISABLE_INIT))
3189  {
3190  assert_param(IS_UART_OVERRUN(huart->AdvancedInit.OverrunDisable));
3191  MODIFY_REG(huart->Instance->CR3, USART_CR3_OVRDIS, huart->AdvancedInit.OverrunDisable);
3192  }
3193 
3194  /* if required, configure DMA disabling on reception error */
3195  if (HAL_IS_BIT_SET(huart->AdvancedInit.AdvFeatureInit, UART_ADVFEATURE_DMADISABLEONERROR_INIT))
3196  {
3197  assert_param(IS_UART_ADVFEATURE_DMAONRXERROR(huart->AdvancedInit.DMADisableonRxError));
3198  MODIFY_REG(huart->Instance->CR3, USART_CR3_DDRE, huart->AdvancedInit.DMADisableonRxError);
3199  }
3200 
3201  /* if required, configure auto Baud rate detection scheme */
3202  if (HAL_IS_BIT_SET(huart->AdvancedInit.AdvFeatureInit, UART_ADVFEATURE_AUTOBAUDRATE_INIT))
3203  {
3204  assert_param(IS_USART_AUTOBAUDRATE_DETECTION_INSTANCE(huart->Instance));
3205  assert_param(IS_UART_ADVFEATURE_AUTOBAUDRATE(huart->AdvancedInit.AutoBaudRateEnable));
3206  MODIFY_REG(huart->Instance->CR2, USART_CR2_ABREN, huart->AdvancedInit.AutoBaudRateEnable);
3207  /* set auto Baudrate detection parameters if detection is enabled */
3208  if (huart->AdvancedInit.AutoBaudRateEnable == UART_ADVFEATURE_AUTOBAUDRATE_ENABLE)
3209  {
3210  assert_param(IS_UART_ADVFEATURE_AUTOBAUDRATEMODE(huart->AdvancedInit.AutoBaudRateMode));
3211  MODIFY_REG(huart->Instance->CR2, USART_CR2_ABRMODE, huart->AdvancedInit.AutoBaudRateMode);
3212  }
3213  }
3214 
3215  /* if required, configure MSB first on communication line */
3216  if (HAL_IS_BIT_SET(huart->AdvancedInit.AdvFeatureInit, UART_ADVFEATURE_MSBFIRST_INIT))
3217  {
3218  assert_param(IS_UART_ADVFEATURE_MSBFIRST(huart->AdvancedInit.MSBFirst));
3219  MODIFY_REG(huart->Instance->CR2, USART_CR2_MSBFIRST, huart->AdvancedInit.MSBFirst);
3220  }
3221 }
USART_TypeDef * Instance
UART_AdvFeatureInitTypeDef AdvancedInit
MODIFY_REG(hrtc->Instance->CR, RTC_CR_WUCKSEL,(uint32_t) WakeUpClock)
assert_param(IS_RTC_WAKEUP_CLOCK(WakeUpClock))

◆ UART_CheckIdleState()

HAL_StatusTypeDef UART_CheckIdleState ( UART_HandleTypeDef huart)

Check the UART Idle State.

Parameters
huartUART handle.
Return values
HALstatus

Definition at line 3228 of file stm32l4xx_hal_uart.c.

3229 {
3230  uint32_t tickstart;
3231 
3232  /* Initialize the UART ErrorCode */
3233  huart->ErrorCode = HAL_UART_ERROR_NONE;
3234 
3235  /* Init tickstart for timeout managment*/
3236  tickstart = HAL_GetTick();
3237 
3238  /* Check if the Transmitter is enabled */
3239  if ((huart->Instance->CR1 & USART_CR1_TE) == USART_CR1_TE)
3240  {
3241  /* Wait until TEACK flag is set */
3242  if (UART_WaitOnFlagUntilTimeout(huart, USART_ISR_TEACK, RESET, tickstart, HAL_UART_TIMEOUT_VALUE) != HAL_OK)
3243  {
3244  /* Timeout occurred */
3245  return HAL_TIMEOUT;
3246  }
3247  }
3248 
3249  /* Check if the Receiver is enabled */
3250  if ((huart->Instance->CR1 & USART_CR1_RE) == USART_CR1_RE)
3251  {
3252  /* Wait until REACK flag is set */
3253  if (UART_WaitOnFlagUntilTimeout(huart, USART_ISR_REACK, RESET, tickstart, HAL_UART_TIMEOUT_VALUE) != HAL_OK)
3254  {
3255  /* Timeout occurred */
3256  return HAL_TIMEOUT;
3257  }
3258  }
3259 
3260  /* Initialize the UART State */
3261  huart->gState = HAL_UART_STATE_READY;
3262  huart->RxState = HAL_UART_STATE_READY;
3263 
3264  __HAL_UNLOCK(huart);
3265 
3266  return HAL_OK;
3267 }
__IO HAL_UART_StateTypeDef RxState
uint32_t HAL_GetTick(void)
Provide a tick value in millisecond.
__HAL_UNLOCK(hrtc)
return HAL_OK
USART_TypeDef * Instance
HAL_StatusTypeDef UART_WaitOnFlagUntilTimeout(UART_HandleTypeDef *huart, uint32_t Flag, FlagStatus Status, uint32_t Tickstart, uint32_t Timeout)
Handle UART Communication Timeout.
__IO HAL_UART_StateTypeDef gState

◆ UART_DMAAbortOnError()

static void UART_DMAAbortOnError ( DMA_HandleTypeDef hdma)
static

DMA UART 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 3505 of file stm32l4xx_hal_uart.c.

3506 {
3507  UART_HandleTypeDef *huart = (UART_HandleTypeDef *)(hdma->Parent);
3508  huart->RxXferCount = 0U;
3509  huart->TxXferCount = 0U;
3510 
3511 #if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
3512  /*Call registered error callback*/
3513  huart->ErrorCallback(huart);
3514 #else
3515  /*Call legacy weak error callback*/
3516  HAL_UART_ErrorCallback(huart);
3517 #endif /* USE_HAL_UART_REGISTER_CALLBACKS */
3518 }
UART handle Structure definition.
void(* ErrorCallback)(struct __UART_HandleTypeDef *huart)
void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
UART error callback.

◆ UART_DMAError()

static void UART_DMAError ( DMA_HandleTypeDef hdma)
static

DMA UART communication error callback.

Parameters
hdmaDMA handle.
Return values
None

Definition at line 3465 of file stm32l4xx_hal_uart.c.

3466 {
3467  UART_HandleTypeDef *huart = (UART_HandleTypeDef *)(hdma->Parent);
3468 
3469  const HAL_UART_StateTypeDef gstate = huart->gState;
3470  const HAL_UART_StateTypeDef rxstate = huart->RxState;
3471 
3472  /* Stop UART DMA Tx request if ongoing */
3473  if ((HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAT)) &&
3474  (gstate == HAL_UART_STATE_BUSY_TX))
3475  {
3476  huart->TxXferCount = 0U;
3477  UART_EndTxTransfer(huart);
3478  }
3479 
3480  /* Stop UART DMA Rx request if ongoing */
3481  if ((HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR)) &&
3482  (rxstate == HAL_UART_STATE_BUSY_RX))
3483  {
3484  huart->RxXferCount = 0U;
3485  UART_EndRxTransfer(huart);
3486  }
3487 
3488  huart->ErrorCode |= HAL_UART_ERROR_DMA;
3489 
3490 #if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
3491  /*Call registered error callback*/
3492  huart->ErrorCallback(huart);
3493 #else
3494  /*Call legacy weak error callback*/
3495  HAL_UART_ErrorCallback(huart);
3496 #endif /* USE_HAL_UART_REGISTER_CALLBACKS */
3497 }
UART handle Structure definition.
__IO HAL_UART_StateTypeDef RxState
uint32_t HAL_UART_StateTypeDef
HAL UART State definition.
static void UART_EndRxTransfer(UART_HandleTypeDef *huart)
End ongoing Rx transfer on UART peripheral (following error detection or Reception completion)...
USART_TypeDef * Instance
void(* ErrorCallback)(struct __UART_HandleTypeDef *huart)
static void UART_EndTxTransfer(UART_HandleTypeDef *huart)
End ongoing Tx transfer on UART peripheral (following error detection or Transmit completion)...
__IO HAL_UART_StateTypeDef gState
void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
UART error callback.

◆ UART_DMAReceiveCplt()

static void UART_DMAReceiveCplt ( DMA_HandleTypeDef hdma)
static

DMA UART receive process complete callback.

Parameters
hdmaDMA handle.
Return values
None

Definition at line 3412 of file stm32l4xx_hal_uart.c.

3413 {
3414  UART_HandleTypeDef *huart = (UART_HandleTypeDef *)(hdma->Parent);
3415 
3416  /* DMA Normal mode */
3417  if (HAL_IS_BIT_CLR(hdma->Instance->CCR, DMA_CCR_CIRC))
3418  {
3419  huart->RxXferCount = 0U;
3420 
3421  /* Disable PE and ERR (Frame error, noise error, overrun error) interrupts */
3422  CLEAR_BIT(huart->Instance->CR1, USART_CR1_PEIE);
3423  CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE);
3424 
3425  /* Disable the DMA transfer for the receiver request by resetting the DMAR bit
3426  in the UART CR3 register */
3427  CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAR);
3428 
3429  /* At end of Rx process, restore huart->RxState to Ready */
3430  huart->RxState = HAL_UART_STATE_READY;
3431  }
3432 
3433 #if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
3434  /*Call registered Rx complete callback*/
3435  huart->RxCpltCallback(huart);
3436 #else
3437  /*Call legacy weak Rx complete callback*/
3438  HAL_UART_RxCpltCallback(huart);
3439 #endif /* USE_HAL_UART_REGISTER_CALLBACKS */
3440 }
UART handle Structure definition.
__IO HAL_UART_StateTypeDef RxState
void(* RxCpltCallback)(struct __UART_HandleTypeDef *huart)
DMA_Channel_TypeDef * Instance
CLEAR_BIT(hrtc->Instance->CR, RTC_CR_WUTE)
USART_TypeDef * Instance
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
Rx Transfer completed callback.

◆ UART_DMARxAbortCallback()

static void UART_DMARxAbortCallback ( DMA_HandleTypeDef hdma)
static

DMA UART 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 3584 of file stm32l4xx_hal_uart.c.

3585 {
3586  UART_HandleTypeDef *huart = (UART_HandleTypeDef *)(hdma->Parent);
3587 
3588  huart->hdmarx->XferAbortCallback = NULL;
3589 
3590  /* Check if an Abort process is still ongoing */
3591  if (huart->hdmatx != NULL)
3592  {
3593  if (huart->hdmatx->XferAbortCallback != NULL)
3594  {
3595  return;
3596  }
3597  }
3598 
3599  /* No Abort process still ongoing : All DMA channels are aborted, call user Abort Complete callback */
3600  huart->TxXferCount = 0U;
3601  huart->RxXferCount = 0U;
3602 
3603  /* Reset errorCode */
3604  huart->ErrorCode = HAL_UART_ERROR_NONE;
3605 
3606  /* Clear the Error flags in the ICR register */
3607  __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_OREF | UART_CLEAR_NEF | UART_CLEAR_PEF | UART_CLEAR_FEF);
3608 
3609  /* Discard the received data */
3610  __HAL_UART_SEND_REQ(huart, UART_RXDATA_FLUSH_REQUEST);
3611 
3612  /* Restore huart->gState and huart->RxState to Ready */
3613  huart->gState = HAL_UART_STATE_READY;
3614  huart->RxState = HAL_UART_STATE_READY;
3615 
3616  /* Call user Abort complete callback */
3617 #if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
3618  /* Call registered Abort complete callback */
3619  huart->AbortCpltCallback(huart);
3620 #else
3621  /* Call legacy weak Abort complete callback */
3623 #endif /* USE_HAL_UART_REGISTER_CALLBACKS */
3624 }
void(* XferAbortCallback)(struct __DMA_HandleTypeDef *hdma)
UART handle Structure definition.
__IO HAL_UART_StateTypeDef RxState
DMA_HandleTypeDef * hdmarx
void HAL_UART_AbortCpltCallback(UART_HandleTypeDef *huart)
UART Abort Complete callback.
DMA_HandleTypeDef * hdmatx
void(* AbortCpltCallback)(struct __UART_HandleTypeDef *huart)
__IO HAL_UART_StateTypeDef gState

◆ UART_DMARxHalfCplt()

static void UART_DMARxHalfCplt ( DMA_HandleTypeDef hdma)
static

DMA UART receive process half complete callback.

Parameters
hdmaDMA handle.
Return values
None

Definition at line 3447 of file stm32l4xx_hal_uart.c.

3448 {
3449  UART_HandleTypeDef *huart = (UART_HandleTypeDef *)(hdma->Parent);
3450 
3451 #if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
3452  /*Call registered Rx Half complete callback*/
3453  huart->RxHalfCpltCallback(huart);
3454 #else
3455  /*Call legacy weak Rx Half complete callback*/
3457 #endif /* USE_HAL_UART_REGISTER_CALLBACKS */
3458 }
UART handle Structure definition.
void(* RxHalfCpltCallback)(struct __UART_HandleTypeDef *huart)
void HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *huart)
Rx Half Transfer completed callback.

◆ UART_DMARxOnlyAbortCallback()

static void UART_DMARxOnlyAbortCallback ( DMA_HandleTypeDef hdma)
static

DMA UART Rx communication abort callback, when initiated by user by a call to HAL_UART_AbortReceive_IT API (Abort only Rx transfer) (This callback is executed at end of DMA Rx Abort procedure following user abort request, and leads to user Rx Abort Complete callback execution).

Parameters
hdmaDMA handle.
Return values
None

Definition at line 3670 of file stm32l4xx_hal_uart.c.

3671 {
3672  UART_HandleTypeDef *huart = (UART_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;
3673 
3674  huart->RxXferCount = 0U;
3675 
3676  /* Clear the Error flags in the ICR register */
3677  __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_OREF | UART_CLEAR_NEF | UART_CLEAR_PEF | UART_CLEAR_FEF);
3678 
3679  /* Discard the received data */
3680  __HAL_UART_SEND_REQ(huart, UART_RXDATA_FLUSH_REQUEST);
3681 
3682  /* Restore huart->RxState to Ready */
3683  huart->RxState = HAL_UART_STATE_READY;
3684 
3685  /* Call user Abort complete callback */
3686 #if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
3687  /* Call registered Abort Receive Complete Callback */
3688  huart->AbortReceiveCpltCallback(huart);
3689 #else
3690  /* Call legacy weak Abort Receive Complete Callback */
3692 #endif /* USE_HAL_UART_REGISTER_CALLBACKS */
3693 }
UART handle Structure definition.
__IO HAL_UART_StateTypeDef RxState
DMA handle Structure definition.
void HAL_UART_AbortReceiveCpltCallback(UART_HandleTypeDef *huart)
UART Abort Receive Complete callback.
void(* AbortReceiveCpltCallback)(struct __UART_HandleTypeDef *huart)

◆ UART_DMATransmitCplt()

static void UART_DMATransmitCplt ( DMA_HandleTypeDef hdma)
static

DMA UART transmit process complete callback.

Parameters
hdmaDMA handle.
Return values
None

Definition at line 3360 of file stm32l4xx_hal_uart.c.

3361 {
3362  UART_HandleTypeDef *huart = (UART_HandleTypeDef *)(hdma->Parent);
3363 
3364  /* DMA Normal mode */
3365  if (HAL_IS_BIT_CLR(hdma->Instance->CCR, DMA_CCR_CIRC))
3366  {
3367  huart->TxXferCount = 0U;
3368 
3369  /* Disable the DMA transfer for transmit request by resetting the DMAT bit
3370  in the UART CR3 register */
3371  CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAT);
3372 
3373  /* Enable the UART Transmit Complete Interrupt */
3374  SET_BIT(huart->Instance->CR1, USART_CR1_TCIE);
3375  }
3376  /* DMA Circular mode */
3377  else
3378  {
3379 #if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
3380  /*Call registered Tx complete callback*/
3381  huart->TxCpltCallback(huart);
3382 #else
3383  /*Call legacy weak Tx complete callback*/
3384  HAL_UART_TxCpltCallback(huart);
3385 #endif /* USE_HAL_UART_REGISTER_CALLBACKS */
3386  }
3387 }
UART handle Structure definition.
DMA_Channel_TypeDef * Instance
CLEAR_BIT(hrtc->Instance->CR, RTC_CR_WUTE)
USART_TypeDef * Instance
void(* TxCpltCallback)(struct __UART_HandleTypeDef *huart)
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
Tx Transfer completed callback.

◆ UART_DMATxAbortCallback()

static void UART_DMATxAbortCallback ( DMA_HandleTypeDef hdma)
static

DMA UART 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 3528 of file stm32l4xx_hal_uart.c.

3529 {
3530  UART_HandleTypeDef *huart = (UART_HandleTypeDef *)(hdma->Parent);
3531 
3532  huart->hdmatx->XferAbortCallback = NULL;
3533 
3534  /* Check if an Abort process is still ongoing */
3535  if (huart->hdmarx != NULL)
3536  {
3537  if (huart->hdmarx->XferAbortCallback != NULL)
3538  {
3539  return;
3540  }
3541  }
3542 
3543  /* No Abort process still ongoing : All DMA channels are aborted, call user Abort Complete callback */
3544  huart->TxXferCount = 0U;
3545  huart->RxXferCount = 0U;
3546 
3547  /* Reset errorCode */
3548  huart->ErrorCode = HAL_UART_ERROR_NONE;
3549 
3550  /* Clear the Error flags in the ICR register */
3551  __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_OREF | UART_CLEAR_NEF | UART_CLEAR_PEF | UART_CLEAR_FEF);
3552 
3553 #if defined(USART_CR1_FIFOEN)
3554  /* Flush the whole TX FIFO (if needed) */
3555  if (huart->FifoMode == UART_FIFOMODE_ENABLE)
3556  {
3557  __HAL_UART_SEND_REQ(huart, UART_TXDATA_FLUSH_REQUEST);
3558  }
3559 #endif /* USART_CR1_FIFOEN */
3560 
3561  /* Restore huart->gState and huart->RxState to Ready */
3562  huart->gState = HAL_UART_STATE_READY;
3563  huart->RxState = HAL_UART_STATE_READY;
3564 
3565  /* Call user Abort complete callback */
3566 #if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
3567  /* Call registered Abort complete callback */
3568  huart->AbortCpltCallback(huart);
3569 #else
3570  /* Call legacy weak Abort complete callback */
3572 #endif /* USE_HAL_UART_REGISTER_CALLBACKS */
3573 }
void(* XferAbortCallback)(struct __DMA_HandleTypeDef *hdma)
UART handle Structure definition.
__IO HAL_UART_StateTypeDef RxState
DMA_HandleTypeDef * hdmarx
void HAL_UART_AbortCpltCallback(UART_HandleTypeDef *huart)
UART Abort Complete callback.
DMA_HandleTypeDef * hdmatx
void(* AbortCpltCallback)(struct __UART_HandleTypeDef *huart)
__IO HAL_UART_StateTypeDef gState

◆ UART_DMATxHalfCplt()

static void UART_DMATxHalfCplt ( DMA_HandleTypeDef hdma)
static

DMA UART transmit process half complete callback.

Parameters
hdmaDMA handle.
Return values
None

Definition at line 3394 of file stm32l4xx_hal_uart.c.

3395 {
3396  UART_HandleTypeDef *huart = (UART_HandleTypeDef *)(hdma->Parent);
3397 
3398 #if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
3399  /*Call registered Tx Half complete callback*/
3400  huart->TxHalfCpltCallback(huart);
3401 #else
3402  /*Call legacy weak Tx Half complete callback*/
3404 #endif /* USE_HAL_UART_REGISTER_CALLBACKS */
3405 }
UART handle Structure definition.
void HAL_UART_TxHalfCpltCallback(UART_HandleTypeDef *huart)
Tx Half Transfer completed callback.
void(* TxHalfCpltCallback)(struct __UART_HandleTypeDef *huart)

◆ UART_DMATxOnlyAbortCallback()

static void UART_DMATxOnlyAbortCallback ( DMA_HandleTypeDef hdma)
static

DMA UART Tx communication abort callback, when initiated by user by a call to HAL_UART_AbortTransmit_IT API (Abort only Tx transfer) (This callback is executed at end of DMA Tx Abort procedure following user abort request, and leads to user Tx Abort Complete callback execution).

Parameters
hdmaDMA handle.
Return values
None

Definition at line 3635 of file stm32l4xx_hal_uart.c.

3636 {
3637  UART_HandleTypeDef *huart = (UART_HandleTypeDef *)(hdma->Parent);
3638 
3639  huart->TxXferCount = 0U;
3640 
3641 #if defined(USART_CR1_FIFOEN)
3642  /* Flush the whole TX FIFO (if needed) */
3643  if (huart->FifoMode == UART_FIFOMODE_ENABLE)
3644  {
3645  __HAL_UART_SEND_REQ(huart, UART_TXDATA_FLUSH_REQUEST);
3646  }
3647 #endif /* USART_CR1_FIFOEN */
3648 
3649  /* Restore huart->gState to Ready */
3650  huart->gState = HAL_UART_STATE_READY;
3651 
3652  /* Call user Abort complete callback */
3653 #if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
3654  /* Call registered Abort Transmit Complete Callback */
3655  huart->AbortTransmitCpltCallback(huart);
3656 #else
3657  /* Call legacy weak Abort Transmit Complete Callback */
3659 #endif /* USE_HAL_UART_REGISTER_CALLBACKS */
3660 }
UART handle Structure definition.
void HAL_UART_AbortTransmitCpltCallback(UART_HandleTypeDef *huart)
UART Abort Complete callback.
void(* AbortTransmitCpltCallback)(struct __UART_HandleTypeDef *huart)
__IO HAL_UART_StateTypeDef gState

◆ UART_EndRxTransfer()

static void UART_EndRxTransfer ( UART_HandleTypeDef huart)
static

End ongoing Rx transfer on UART peripheral (following error detection or Reception completion).

Parameters
huartUART handle.
Return values
None

Definition at line 3336 of file stm32l4xx_hal_uart.c.

3337 {
3338  /* Disable RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts */
3339 #if defined(USART_CR1_FIFOEN)
3340  CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE_RXFNEIE | USART_CR1_PEIE));
3341  CLEAR_BIT(huart->Instance->CR3, (USART_CR3_EIE | USART_CR3_RXFTIE));
3342 #else
3343  CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE));
3344  CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE);
3345 #endif /* USART_CR1_FIFOEN */
3346 
3347  /* At end of Rx process, restore huart->RxState to Ready */
3348  huart->RxState = HAL_UART_STATE_READY;
3349 
3350  /* Reset RxIsr function pointer */
3351  huart->RxISR = NULL;
3352 }
__IO HAL_UART_StateTypeDef RxState
CLEAR_BIT(hrtc->Instance->CR, RTC_CR_WUTE)
USART_TypeDef * Instance
void(* RxISR)(struct __UART_HandleTypeDef *huart)

◆ UART_EndTransmit_IT()

static void UART_EndTransmit_IT ( UART_HandleTypeDef huart)
static

Wrap up transmission in non-blocking mode.

Parameters
huartpointer to a UART_HandleTypeDef structure that contains the configuration information for the specified UART module.
Return values
None

Definition at line 3854 of file stm32l4xx_hal_uart.c.

3855 {
3856  /* Disable the UART Transmit Complete Interrupt */
3857  CLEAR_BIT(huart->Instance->CR1, USART_CR1_TCIE);
3858 
3859  /* Tx process is ended, restore huart->gState to Ready */
3860  huart->gState = HAL_UART_STATE_READY;
3861 
3862  /* Cleat TxISR function pointer */
3863  huart->TxISR = NULL;
3864 
3865 #if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
3866  /*Call registered Tx complete callback*/
3867  huart->TxCpltCallback(huart);
3868 #else
3869  /*Call legacy weak Tx complete callback*/
3870  HAL_UART_TxCpltCallback(huart);
3871 #endif /* USE_HAL_UART_REGISTER_CALLBACKS */
3872 }
void(* TxISR)(struct __UART_HandleTypeDef *huart)
CLEAR_BIT(hrtc->Instance->CR, RTC_CR_WUTE)
USART_TypeDef * Instance
void(* TxCpltCallback)(struct __UART_HandleTypeDef *huart)
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
Tx Transfer completed callback.
__IO HAL_UART_StateTypeDef gState

◆ UART_EndTxTransfer()

static void UART_EndTxTransfer ( UART_HandleTypeDef huart)
static

End ongoing Tx transfer on UART peripheral (following error detection or Transmit completion).

Parameters
huartUART handle.
Return values
None

Definition at line 3315 of file stm32l4xx_hal_uart.c.

3316 {
3317 #if defined(USART_CR1_FIFOEN)
3318  /* Disable TXEIE, TCIE, TXFT interrupts */
3319  CLEAR_BIT(huart->Instance->CR1, (USART_CR1_TXEIE_TXFNFIE | USART_CR1_TCIE));
3320  CLEAR_BIT(huart->Instance->CR3, (USART_CR3_TXFTIE));
3321 #else
3322  /* Disable TXEIE and TCIE interrupts */
3323  CLEAR_BIT(huart->Instance->CR1, (USART_CR1_TXEIE | USART_CR1_TCIE));
3324 #endif /* USART_CR1_FIFOEN */
3325 
3326  /* At end of Tx process, restore huart->gState to Ready */
3327  huart->gState = HAL_UART_STATE_READY;
3328 }
CLEAR_BIT(hrtc->Instance->CR, RTC_CR_WUTE)
USART_TypeDef * Instance
__IO HAL_UART_StateTypeDef gState

◆ UART_InitCallbacksToDefault()

void UART_InitCallbacksToDefault ( UART_HandleTypeDef huart)

Initialize the callbacks to their default values.

Parameters
huartUART handle.
Return values
none

Definition at line 2826 of file stm32l4xx_hal_uart.c.

2827 {
2828  /* Init the UART Callback settings */
2829  huart->TxHalfCpltCallback = HAL_UART_TxHalfCpltCallback; /* Legacy weak TxHalfCpltCallback */
2830  huart->TxCpltCallback = HAL_UART_TxCpltCallback; /* Legacy weak TxCpltCallback */
2831  huart->RxHalfCpltCallback = HAL_UART_RxHalfCpltCallback; /* Legacy weak RxHalfCpltCallback */
2832  huart->RxCpltCallback = HAL_UART_RxCpltCallback; /* Legacy weak RxCpltCallback */
2833  huart->ErrorCallback = HAL_UART_ErrorCallback; /* Legacy weak ErrorCallback */
2834  huart->AbortCpltCallback = HAL_UART_AbortCpltCallback; /* Legacy weak AbortCpltCallback */
2835  huart->AbortTransmitCpltCallback = HAL_UART_AbortTransmitCpltCallback; /* Legacy weak AbortTransmitCpltCallback */
2836  huart->AbortReceiveCpltCallback = HAL_UART_AbortReceiveCpltCallback; /* Legacy weak AbortReceiveCpltCallback */
2837  huart->WakeupCallback = HAL_UARTEx_WakeupCallback; /* Legacy weak WakeupCallback */
2838 #if defined(USART_CR1_FIFOEN)
2839  huart->RxFifoFullCallback = HAL_UARTEx_RxFifoFullCallback; /* Legacy weak RxFifoFullCallback */
2840  huart->TxFifoEmptyCallback = HAL_UARTEx_TxFifoEmptyCallback; /* Legacy weak TxFifoEmptyCallback */
2841 #endif /* USART_CR1_FIFOEN */
2842 
2843 }
void(* TxFifoEmptyCallback)(struct __UART_HandleTypeDef *huart)
void HAL_UARTEx_TxFifoEmptyCallback(UART_HandleTypeDef *huart)
UART TX Fifo empty callback.
void(* RxCpltCallback)(struct __UART_HandleTypeDef *huart)
void(* RxHalfCpltCallback)(struct __UART_HandleTypeDef *huart)
void HAL_UART_TxHalfCpltCallback(UART_HandleTypeDef *huart)
Tx Half Transfer completed callback.
void HAL_UART_AbortCpltCallback(UART_HandleTypeDef *huart)
UART Abort Complete callback.
void HAL_UARTEx_RxFifoFullCallback(UART_HandleTypeDef *huart)
UART RX Fifo full callback.
void(* WakeupCallback)(struct __UART_HandleTypeDef *huart)
void HAL_UART_AbortReceiveCpltCallback(UART_HandleTypeDef *huart)
UART Abort Receive Complete callback.
void(* TxCpltCallback)(struct __UART_HandleTypeDef *huart)
void HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *huart)
Rx Half Transfer completed callback.
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
Rx Transfer completed callback.
void(* TxHalfCpltCallback)(struct __UART_HandleTypeDef *huart)
void(* ErrorCallback)(struct __UART_HandleTypeDef *huart)
void HAL_UARTEx_WakeupCallback(UART_HandleTypeDef *huart)
UART wakeup from Stop mode callback.
void HAL_UART_AbortTransmitCpltCallback(UART_HandleTypeDef *huart)
UART Abort Complete callback.
void(* RxFifoFullCallback)(struct __UART_HandleTypeDef *huart)
void(* AbortCpltCallback)(struct __UART_HandleTypeDef *huart)
void(* AbortTransmitCpltCallback)(struct __UART_HandleTypeDef *huart)
void(* AbortReceiveCpltCallback)(struct __UART_HandleTypeDef *huart)
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
Tx Transfer completed callback.
void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
UART error callback.

◆ UART_RxISR_16BIT()

static void UART_RxISR_16BIT ( UART_HandleTypeDef huart)
static

RX interrrupt handler for 9 bits data word length .

Note
Function is called under interruption only, once interruptions have been enabled by HAL_UART_Receive_IT()
Parameters
huartUART handle.
Return values
None

Definition at line 3933 of file stm32l4xx_hal_uart.c.

3934 {
3935  uint16_t *tmp;
3936  uint16_t uhMask = huart->Mask;
3937  uint16_t uhdata;
3938 
3939  /* Check that a Rx process is ongoing */
3940  if (huart->RxState == HAL_UART_STATE_BUSY_RX)
3941  {
3942  uhdata = (uint16_t) READ_REG(huart->Instance->RDR);
3943  tmp = (uint16_t *) huart->pRxBuffPtr ;
3944  *tmp = (uint16_t)(uhdata & uhMask);
3945  huart->pRxBuffPtr += 2U;
3946  huart->RxXferCount--;
3947 
3948  if (huart->RxXferCount == 0U)
3949  {
3950  /* Disable the UART Parity Error Interrupt and RXNE interrupt*/
3951 #if defined(USART_CR1_FIFOEN)
3952  CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE_RXFNEIE | USART_CR1_PEIE));
3953 #else
3954  CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE));
3955 #endif /* USART_CR1_FIFOEN */
3956 
3957  /* Disable the UART Error Interrupt: (Frame error, noise error, overrun error) */
3958  CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE);
3959 
3960  /* Rx process is completed, restore huart->RxState to Ready */
3961  huart->RxState = HAL_UART_STATE_READY;
3962 
3963  /* Clear RxISR function pointer */
3964  huart->RxISR = NULL;
3965 
3966 #if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
3967  /*Call registered Rx complete callback*/
3968  huart->RxCpltCallback(huart);
3969 #else
3970  /*Call legacy weak Rx complete callback*/
3971  HAL_UART_RxCpltCallback(huart);
3972 #endif /* USE_HAL_UART_REGISTER_CALLBACKS */
3973  }
3974  }
3975  else
3976  {
3977  /* Clear RXNE interrupt flag */
3978  __HAL_UART_SEND_REQ(huart, UART_RXDATA_FLUSH_REQUEST);
3979  }
3980 }
__IO HAL_UART_StateTypeDef RxState
void(* RxCpltCallback)(struct __UART_HandleTypeDef *huart)
CLEAR_BIT(hrtc->Instance->CR, RTC_CR_WUTE)
USART_TypeDef * Instance
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
Rx Transfer completed callback.
void(* RxISR)(struct __UART_HandleTypeDef *huart)

◆ UART_RxISR_16BIT_FIFOEN()

static void UART_RxISR_16BIT_FIFOEN ( UART_HandleTypeDef huart)
static

RX interrrupt handler for 9 bits data word length and FIFO mode is enabled.

Note
Function is called under interruption only, once interruptions have been enabled by HAL_UART_Receive_IT()
Parameters
huartUART handle.
Return values
None

Definition at line 4062 of file stm32l4xx_hal_uart.c.

4063 {
4064  uint16_t *tmp;
4065  uint16_t uhMask = huart->Mask;
4066  uint16_t uhdata;
4067  uint16_t nb_rx_data;
4068  uint16_t rxdatacount;
4069 
4070  /* Check that a Rx process is ongoing */
4071  if (huart->RxState == HAL_UART_STATE_BUSY_RX)
4072  {
4073  for (nb_rx_data = huart->NbRxDataToProcess ; nb_rx_data > 0U ; nb_rx_data--)
4074  {
4075  uhdata = (uint16_t) READ_REG(huart->Instance->RDR);
4076  tmp = (uint16_t *) huart->pRxBuffPtr ;
4077  *tmp = (uint16_t)(uhdata & uhMask);
4078  huart->pRxBuffPtr += 2U;
4079  huart->RxXferCount--;
4080 
4081  if (huart->RxXferCount == 0U)
4082  {
4083  /* Disable the UART Parity Error Interrupt and RXFT interrupt*/
4084  CLEAR_BIT(huart->Instance->CR1, USART_CR1_PEIE);
4085 
4086  /* Disable the UART Error Interrupt: (Frame error, noise error, overrun error) and RX FIFO Threshold interrupt */
4087  CLEAR_BIT(huart->Instance->CR3, (USART_CR3_EIE | USART_CR3_RXFTIE));
4088 
4089  /* Rx process is completed, restore huart->RxState to Ready */
4090  huart->RxState = HAL_UART_STATE_READY;
4091 
4092  /* Clear RxISR function pointer */
4093  huart->RxISR = NULL;
4094 
4095 #if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
4096  /*Call registered Rx complete callback*/
4097  huart->RxCpltCallback(huart);
4098 #else
4099  /*Call legacy weak Rx complete callback*/
4100  HAL_UART_RxCpltCallback(huart);
4101 #endif /* USE_HAL_UART_REGISTER_CALLBACKS */
4102  }
4103  }
4104 
4105  /* When remaining number of bytes to receive is less than the RX FIFO
4106  threshold, next incoming frames are processed as if FIFO mode was
4107  disabled (i.e. one interrupt per received frame).
4108  */
4109  rxdatacount = huart->RxXferCount;
4110  if ((rxdatacount != 0U) && (rxdatacount < huart->NbRxDataToProcess))
4111  {
4112  /* Disable the UART RXFT interrupt*/
4113  CLEAR_BIT(huart->Instance->CR3, USART_CR3_RXFTIE);
4114 
4115  /* Update the RxISR function pointer */
4116  huart->RxISR = UART_RxISR_16BIT;
4117 
4118  /* Enable the UART Data Register Not Empty interrupt */
4119  SET_BIT(huart->Instance->CR1, USART_CR1_RXNEIE_RXFNEIE);
4120  }
4121  }
4122  else
4123  {
4124  /* Clear RXNE interrupt flag */
4125  __HAL_UART_SEND_REQ(huart, UART_RXDATA_FLUSH_REQUEST);
4126  }
4127 }
__IO HAL_UART_StateTypeDef RxState
void(* RxCpltCallback)(struct __UART_HandleTypeDef *huart)
CLEAR_BIT(hrtc->Instance->CR, RTC_CR_WUTE)
USART_TypeDef * Instance
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
Rx Transfer completed callback.
void(* RxISR)(struct __UART_HandleTypeDef *huart)
static void UART_RxISR_16BIT(UART_HandleTypeDef *huart)
RX interrrupt handler for 9 bits data word length .

◆ UART_RxISR_8BIT()

static void UART_RxISR_8BIT ( UART_HandleTypeDef huart)
static

RX interrrupt handler for 7 or 8 bits data word length .

Parameters
huartUART handle.
Return values
None

Definition at line 3879 of file stm32l4xx_hal_uart.c.

3880 {
3881  uint16_t uhMask = huart->Mask;
3882  uint16_t uhdata;
3883 
3884  /* Check that a Rx process is ongoing */
3885  if (huart->RxState == HAL_UART_STATE_BUSY_RX)
3886  {
3887  uhdata = (uint16_t) READ_REG(huart->Instance->RDR);
3888  *huart->pRxBuffPtr = (uint8_t)(uhdata & (uint8_t)uhMask);
3889  huart->pRxBuffPtr++;
3890  huart->RxXferCount--;
3891 
3892  if (huart->RxXferCount == 0U)
3893  {
3894  /* Disable the UART Parity Error Interrupt and RXNE interrupts */
3895 #if defined(USART_CR1_FIFOEN)
3896  CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE_RXFNEIE | USART_CR1_PEIE));
3897 #else
3898  CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE));
3899 #endif /* USART_CR1_FIFOEN */
3900 
3901  /* Disable the UART Error Interrupt: (Frame error, noise error, overrun error) */
3902  CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE);
3903 
3904  /* Rx process is completed, restore huart->RxState to Ready */
3905  huart->RxState = HAL_UART_STATE_READY;
3906 
3907  /* Clear RxISR function pointer */
3908  huart->RxISR = NULL;
3909 
3910 #if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
3911  /*Call registered Rx complete callback*/
3912  huart->RxCpltCallback(huart);
3913 #else
3914  /*Call legacy weak Rx complete callback*/
3915  HAL_UART_RxCpltCallback(huart);
3916 #endif /* USE_HAL_UART_REGISTER_CALLBACKS */
3917  }
3918  }
3919  else
3920  {
3921  /* Clear RXNE interrupt flag */
3922  __HAL_UART_SEND_REQ(huart, UART_RXDATA_FLUSH_REQUEST);
3923  }
3924 }
__IO HAL_UART_StateTypeDef RxState
void(* RxCpltCallback)(struct __UART_HandleTypeDef *huart)
CLEAR_BIT(hrtc->Instance->CR, RTC_CR_WUTE)
USART_TypeDef * Instance
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
Rx Transfer completed callback.
void(* RxISR)(struct __UART_HandleTypeDef *huart)

◆ UART_RxISR_8BIT_FIFOEN()

static void UART_RxISR_8BIT_FIFOEN ( UART_HandleTypeDef huart)
static

RX interrrupt handler for 7 or 8 bits data word length and FIFO mode is enabled.

Note
Function is called under interruption only, once interruptions have been enabled by HAL_UART_Receive_IT()
Parameters
huartUART handle.
Return values
None

Definition at line 3990 of file stm32l4xx_hal_uart.c.

3991 {
3992  uint16_t uhMask = huart->Mask;
3993  uint16_t uhdata;
3994  uint16_t nb_rx_data;
3995  uint16_t rxdatacount;
3996 
3997  /* Check that a Rx process is ongoing */
3998  if (huart->RxState == HAL_UART_STATE_BUSY_RX)
3999  {
4000  for (nb_rx_data = huart->NbRxDataToProcess ; nb_rx_data > 0U ; nb_rx_data--)
4001  {
4002  uhdata = (uint16_t) READ_REG(huart->Instance->RDR);
4003  *huart->pRxBuffPtr = (uint8_t)(uhdata & (uint8_t)uhMask);
4004  huart->pRxBuffPtr++;
4005  huart->RxXferCount--;
4006 
4007  if (huart->RxXferCount == 0U)
4008  {
4009  /* Disable the UART Parity Error Interrupt and RXFT interrupt*/
4010  CLEAR_BIT(huart->Instance->CR1, USART_CR1_PEIE);
4011 
4012  /* Disable the UART Error Interrupt: (Frame error, noise error, overrun error) and RX FIFO Threshold interrupt */
4013  CLEAR_BIT(huart->Instance->CR3, (USART_CR3_EIE | USART_CR3_RXFTIE));
4014 
4015  /* Rx process is completed, restore huart->RxState to Ready */
4016  huart->RxState = HAL_UART_STATE_READY;
4017 
4018  /* Clear RxISR function pointer */
4019  huart->RxISR = NULL;
4020 
4021 #if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
4022  /*Call registered Rx complete callback*/
4023  huart->RxCpltCallback(huart);
4024 #else
4025  /*Call legacy weak Rx complete callback*/
4026  HAL_UART_RxCpltCallback(huart);
4027 #endif /* USE_HAL_UART_REGISTER_CALLBACKS */
4028  }
4029  }
4030 
4031  /* When remaining number of bytes to receive is less than the RX FIFO
4032  threshold, next incoming frames are processed as if FIFO mode was
4033  disabled (i.e. one interrupt per received frame).
4034  */
4035  rxdatacount = huart->RxXferCount;
4036  if ((rxdatacount != 0U) && (rxdatacount < huart->NbRxDataToProcess))
4037  {
4038  /* Disable the UART RXFT interrupt*/
4039  CLEAR_BIT(huart->Instance->CR3, USART_CR3_RXFTIE);
4040 
4041  /* Update the RxISR function pointer */
4042  huart->RxISR = UART_RxISR_8BIT;
4043 
4044  /* Enable the UART Data Register Not Empty interrupt */
4045  SET_BIT(huart->Instance->CR1, USART_CR1_RXNEIE_RXFNEIE);
4046  }
4047  }
4048  else
4049  {
4050  /* Clear RXNE interrupt flag */
4051  __HAL_UART_SEND_REQ(huart, UART_RXDATA_FLUSH_REQUEST);
4052  }
4053 }
__IO HAL_UART_StateTypeDef RxState
void(* RxCpltCallback)(struct __UART_HandleTypeDef *huart)
CLEAR_BIT(hrtc->Instance->CR, RTC_CR_WUTE)
USART_TypeDef * Instance
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
Rx Transfer completed callback.
void(* RxISR)(struct __UART_HandleTypeDef *huart)
static void UART_RxISR_8BIT(UART_HandleTypeDef *huart)
RX interrrupt handler for 7 or 8 bits data word length .

◆ UART_SetConfig()

HAL_StatusTypeDef UART_SetConfig ( UART_HandleTypeDef huart)

Configure the UART peripheral.

Parameters
huartUART handle.
Return values
HALstatus

Definition at line 2851 of file stm32l4xx_hal_uart.c.

2852 {
2853  uint32_t tmpreg;
2854  uint16_t brrtemp;
2855  UART_ClockSourceTypeDef clocksource;
2856  uint32_t usartdiv = 0x00000000U;
2857  HAL_StatusTypeDef ret = HAL_OK;
2858  uint32_t lpuart_ker_ck_pres = 0x00000000U;
2859 
2860  /* Check the parameters */
2861  assert_param(IS_UART_BAUDRATE(huart->Init.BaudRate));
2862  assert_param(IS_UART_WORD_LENGTH(huart->Init.WordLength));
2863  if (UART_INSTANCE_LOWPOWER(huart))
2864  {
2865  assert_param(IS_LPUART_STOPBITS(huart->Init.StopBits));
2866  }
2867  else
2868  {
2869  assert_param(IS_UART_STOPBITS(huart->Init.StopBits));
2870  assert_param(IS_UART_ONE_BIT_SAMPLE(huart->Init.OneBitSampling));
2871  }
2872 
2873  assert_param(IS_UART_PARITY(huart->Init.Parity));
2874  assert_param(IS_UART_MODE(huart->Init.Mode));
2875  assert_param(IS_UART_HARDWARE_FLOW_CONTROL(huart->Init.HwFlowCtl));
2876  assert_param(IS_UART_OVERSAMPLING(huart->Init.OverSampling));
2877 #if defined(USART_PRESC_PRESCALER)
2878  assert_param(IS_UART_PRESCALER(huart->Init.ClockPrescaler));
2879 #endif /* USART_PRESC_PRESCALER */
2880 
2881  /*-------------------------- USART CR1 Configuration -----------------------*/
2882  /* Clear M, PCE, PS, TE, RE and OVER8 bits and configure
2883  * the UART Word Length, Parity, Mode and oversampling:
2884  * set the M bits according to huart->Init.WordLength value
2885  * set PCE and PS bits according to huart->Init.Parity value
2886  * set TE and RE bits according to huart->Init.Mode value
2887  * set OVER8 bit according to huart->Init.OverSampling value */
2888  tmpreg = (uint32_t)huart->Init.WordLength | huart->Init.Parity | huart->Init.Mode | huart->Init.OverSampling ;
2889 #if defined(USART_CR1_FIFOEN)
2890  tmpreg |= (uint32_t)huart->FifoMode;
2891 #endif /* USART_CR1_FIFOEN */
2892  MODIFY_REG(huart->Instance->CR1, USART_CR1_FIELDS, tmpreg);
2893 
2894  /*-------------------------- USART CR2 Configuration -----------------------*/
2895  /* Configure the UART Stop Bits: Set STOP[13:12] bits according
2896  * to huart->Init.StopBits value */
2897  MODIFY_REG(huart->Instance->CR2, USART_CR2_STOP, huart->Init.StopBits);
2898 
2899  /*-------------------------- USART CR3 Configuration -----------------------*/
2900  /* Configure
2901  * - UART HardWare Flow Control: set CTSE and RTSE bits according
2902  * to huart->Init.HwFlowCtl value
2903  * - one-bit sampling method versus three samples' majority rule according
2904  * to huart->Init.OneBitSampling (not applicable to LPUART) */
2905  tmpreg = (uint32_t)huart->Init.HwFlowCtl;
2906 
2907  if (!(UART_INSTANCE_LOWPOWER(huart)))
2908  {
2909  tmpreg |= huart->Init.OneBitSampling;
2910  }
2911  MODIFY_REG(huart->Instance->CR3, USART_CR3_FIELDS, tmpreg);
2912 
2913 #if defined(USART_PRESC_PRESCALER)
2914  /*-------------------------- USART PRESC Configuration -----------------------*/
2915  /* Configure
2916  * - UART Clock Prescaler : set PRESCALER according to huart->Init.ClockPrescaler value */
2917  MODIFY_REG(huart->Instance->PRESC, USART_PRESC_PRESCALER, huart->Init.ClockPrescaler);
2918 #endif /* USART_PRESC_PRESCALER */
2919 
2920  /*-------------------------- USART BRR Configuration -----------------------*/
2921  UART_GETCLOCKSOURCE(huart, clocksource);
2922 
2923  /* Check LPUART instance */
2924  if (UART_INSTANCE_LOWPOWER(huart))
2925  {
2926  /* Retrieve frequency clock */
2927  switch (clocksource)
2928  {
2930 #if defined(USART_PRESC_PRESCALER)
2931  lpuart_ker_ck_pres = (HAL_RCC_GetPCLK1Freq() / UART_GET_DIV_FACTOR(huart->Init.ClockPrescaler));
2932 #else
2933  lpuart_ker_ck_pres = HAL_RCC_GetPCLK1Freq();
2934 #endif /* USART_PRESC_PRESCALER */
2935  break;
2936  case UART_CLOCKSOURCE_HSI:
2937 #if defined(USART_PRESC_PRESCALER)
2938  lpuart_ker_ck_pres = ((uint32_t)HSI_VALUE / UART_GET_DIV_FACTOR(huart->Init.ClockPrescaler));
2939 #else
2940  lpuart_ker_ck_pres = (uint32_t)HSI_VALUE;
2941 #endif /* USART_PRESC_PRESCALER */
2942  break;
2944 #if defined(USART_PRESC_PRESCALER)
2945  lpuart_ker_ck_pres = (HAL_RCC_GetSysClockFreq() / UART_GET_DIV_FACTOR(huart->Init.ClockPrescaler));
2946 #else
2947  lpuart_ker_ck_pres = HAL_RCC_GetSysClockFreq();
2948 #endif /* USART_PRESC_PRESCALER */
2949  break;
2950  case UART_CLOCKSOURCE_LSE:
2951 #if defined(USART_PRESC_PRESCALER)
2952  lpuart_ker_ck_pres = ((uint32_t)LSE_VALUE / UART_GET_DIV_FACTOR(huart->Init.ClockPrescaler));
2953 #else
2954  lpuart_ker_ck_pres = (uint32_t)LSE_VALUE;
2955 #endif /* USART_PRESC_PRESCALER */
2956  break;
2958  default:
2959  ret = HAL_ERROR;
2960  break;
2961  }
2962 
2963  /* if proper clock source reported */
2964  if (lpuart_ker_ck_pres != 0U)
2965  {
2966  /* ensure that Frequency clock is in the range [3 * baudrate, 4096 * baudrate] */
2967  if ((lpuart_ker_ck_pres < (3U * huart->Init.BaudRate)) ||
2968  (lpuart_ker_ck_pres > (4096U * huart->Init.BaudRate)))
2969  {
2970  ret = HAL_ERROR;
2971  }
2972  else
2973  {
2974  switch (clocksource)
2975  {
2977 #if defined(USART_PRESC_PRESCALER)
2978  usartdiv = (uint32_t)(UART_DIV_LPUART(HAL_RCC_GetPCLK1Freq(), huart->Init.BaudRate, huart->Init.ClockPrescaler));
2979 #else
2980  usartdiv = (uint32_t)(UART_DIV_LPUART(HAL_RCC_GetPCLK1Freq(), huart->Init.BaudRate));
2981 #endif /* USART_PRESC_PRESCALER */
2982  break;
2983  case UART_CLOCKSOURCE_HSI:
2984 #if defined(USART_PRESC_PRESCALER)
2985  usartdiv = (uint32_t)(UART_DIV_LPUART(HSI_VALUE, huart->Init.BaudRate, huart->Init.ClockPrescaler));
2986 #else
2987  usartdiv = (uint32_t)(UART_DIV_LPUART(HSI_VALUE, huart->Init.BaudRate));
2988 #endif /* USART_PRESC_PRESCALER */
2989  break;
2991 #if defined(USART_PRESC_PRESCALER)
2992  usartdiv = (uint32_t)(UART_DIV_LPUART(HAL_RCC_GetSysClockFreq(), huart->Init.BaudRate, huart->Init.ClockPrescaler));
2993 #else
2994  usartdiv = (uint32_t)(UART_DIV_LPUART(HAL_RCC_GetSysClockFreq(), huart->Init.BaudRate));
2995 #endif /* USART_PRESC_PRESCALER */
2996  break;
2997  case UART_CLOCKSOURCE_LSE:
2998 #if defined(USART_PRESC_PRESCALER)
2999  usartdiv = (uint32_t)(UART_DIV_LPUART(LSE_VALUE, huart->Init.BaudRate, huart->Init.ClockPrescaler));
3000 #else
3001  usartdiv = (uint32_t)(UART_DIV_LPUART(LSE_VALUE, huart->Init.BaudRate));
3002 #endif /* USART_PRESC_PRESCALER */
3003  break;
3005  default:
3006  ret = HAL_ERROR;
3007  break;
3008  }
3009 
3010  /* It is forbidden to write values lower than 0x300 in the LPUART_BRR register */
3011  if ((usartdiv >= LPUART_BRR_MIN) && (usartdiv <= LPUART_BRR_MAX))
3012  {
3013  huart->Instance->BRR = usartdiv;
3014  }
3015  else
3016  {
3017  ret = HAL_ERROR;
3018  }
3019  } /* if ( (lpuart_ker_ck_pres < (3 * huart->Init.BaudRate) ) || (lpuart_ker_ck_pres > (4096 * huart->Init.BaudRate) )) */
3020  } /* if (lpuart_ker_ck_pres != 0) */
3021  }
3022  /* Check UART Over Sampling to set Baud Rate Register */
3023  else if (huart->Init.OverSampling == UART_OVERSAMPLING_8)
3024  {
3025  switch (clocksource)
3026  {
3028 #if defined(USART_PRESC_PRESCALER)
3029  usartdiv = (uint16_t)(UART_DIV_SAMPLING8(HAL_RCC_GetPCLK1Freq(), huart->Init.BaudRate, huart->Init.ClockPrescaler));
3030 #else
3031  usartdiv = (uint16_t)(UART_DIV_SAMPLING8(HAL_RCC_GetPCLK1Freq(), huart->Init.BaudRate));
3032 #endif /* USART_PRESC_PRESCALER */
3033  break;
3035 #if defined(USART_PRESC_PRESCALER)
3036  usartdiv = (uint16_t)(UART_DIV_SAMPLING8(HAL_RCC_GetPCLK2Freq(), huart->Init.BaudRate, huart->Init.ClockPrescaler));
3037 #else
3038  usartdiv = (uint16_t)(UART_DIV_SAMPLING8(HAL_RCC_GetPCLK2Freq(), huart->Init.BaudRate));
3039 #endif /* USART_PRESC_PRESCALER */
3040  break;
3041  case UART_CLOCKSOURCE_HSI:
3042 #if defined(USART_PRESC_PRESCALER)
3043  usartdiv = (uint16_t)(UART_DIV_SAMPLING8(HSI_VALUE, huart->Init.BaudRate, huart->Init.ClockPrescaler));
3044 #else
3045  usartdiv = (uint16_t)(UART_DIV_SAMPLING8(HSI_VALUE, huart->Init.BaudRate));
3046 #endif /* USART_PRESC_PRESCALER */
3047  break;
3049 #if defined(USART_PRESC_PRESCALER)
3050  usartdiv = (uint16_t)(UART_DIV_SAMPLING8(HAL_RCC_GetSysClockFreq(), huart->Init.BaudRate, huart->Init.ClockPrescaler));
3051 #else
3052  usartdiv = (uint16_t)(UART_DIV_SAMPLING8(HAL_RCC_GetSysClockFreq(), huart->Init.BaudRate));
3053 #endif /* USART_PRESC_PRESCALER */
3054  break;
3055  case UART_CLOCKSOURCE_LSE:
3056 #if defined(USART_PRESC_PRESCALER)
3057  usartdiv = (uint16_t)(UART_DIV_SAMPLING8((uint32_t)LSE_VALUE, huart->Init.BaudRate, huart->Init.ClockPrescaler));
3058 #else
3059  usartdiv = (uint16_t)(UART_DIV_SAMPLING8(LSE_VALUE, huart->Init.BaudRate));
3060 #endif /* USART_PRESC_PRESCALER */
3061  break;
3063  default:
3064  ret = HAL_ERROR;
3065  break;
3066  }
3067 
3068  /* USARTDIV must be greater than or equal to 0d16 */
3069  if ((usartdiv >= UART_BRR_MIN) && (usartdiv <= UART_BRR_MAX))
3070  {
3071  brrtemp = (uint16_t)(usartdiv & 0xFFF0U);
3072  brrtemp |= (uint16_t)((usartdiv & (uint16_t)0x000FU) >> 1U);
3073  huart->Instance->BRR = brrtemp;
3074  }
3075  else
3076  {
3077  ret = HAL_ERROR;
3078  }
3079  }
3080  else
3081  {
3082  switch (clocksource)
3083  {
3085 #if defined(USART_PRESC_PRESCALER)
3086  usartdiv = (uint16_t)(UART_DIV_SAMPLING16(HAL_RCC_GetPCLK1Freq(), huart->Init.BaudRate, huart->Init.ClockPrescaler));
3087 #else
3088  usartdiv = (uint16_t)(UART_DIV_SAMPLING16(HAL_RCC_GetPCLK1Freq(), huart->Init.BaudRate));
3089 #endif /* USART_PRESC_PRESCALER */
3090  break;
3092 #if defined(USART_PRESC_PRESCALER)
3093  usartdiv = (uint16_t)(UART_DIV_SAMPLING16(HAL_RCC_GetPCLK2Freq(), huart->Init.BaudRate, huart->Init.ClockPrescaler));
3094 #else
3095  usartdiv = (uint16_t)(UART_DIV_SAMPLING16(HAL_RCC_GetPCLK2Freq(), huart->Init.BaudRate));
3096 #endif /* USART_PRESC_PRESCALER */
3097  break;
3098  case UART_CLOCKSOURCE_HSI:
3099 #if defined(USART_PRESC_PRESCALER)
3100  usartdiv = (uint16_t)(UART_DIV_SAMPLING16(HSI_VALUE, huart->Init.BaudRate, huart->Init.ClockPrescaler));
3101 #else
3102  usartdiv = (uint16_t)(UART_DIV_SAMPLING16(HSI_VALUE, huart->Init.BaudRate));
3103 #endif /* USART_PRESC_PRESCALER */
3104  break;
3106 #if defined(USART_PRESC_PRESCALER)
3107  usartdiv = (uint16_t)(UART_DIV_SAMPLING16(HAL_RCC_GetSysClockFreq(), huart->Init.BaudRate, huart->Init.ClockPrescaler));
3108 #else
3109  usartdiv = (uint16_t)(UART_DIV_SAMPLING16(HAL_RCC_GetSysClockFreq(), huart->Init.BaudRate));
3110 #endif /* USART_PRESC_PRESCALER */
3111  break;
3112  case UART_CLOCKSOURCE_LSE:
3113 #if defined(USART_PRESC_PRESCALER)
3114  usartdiv = (uint16_t)(UART_DIV_SAMPLING16((uint32_t)LSE_VALUE, huart->Init.BaudRate, huart->Init.ClockPrescaler));
3115 #else
3116  usartdiv = (uint16_t)(UART_DIV_SAMPLING16(LSE_VALUE, huart->Init.BaudRate));
3117 #endif /* USART_PRESC_PRESCALER */
3118  break;
3120  default:
3121  ret = HAL_ERROR;
3122  break;
3123  }
3124 
3125  /* USARTDIV must be greater than or equal to 0d16 */
3126  if ((usartdiv >= UART_BRR_MIN) && (usartdiv <= UART_BRR_MAX))
3127  {
3128  huart->Instance->BRR = usartdiv;
3129  }
3130  else
3131  {
3132  ret = HAL_ERROR;
3133  }
3134  }
3135 
3136 #if defined(USART_CR1_FIFOEN)
3137  /* Initialize the number of data to process during RX/TX ISR execution */
3138  huart->NbTxDataToProcess = 1;
3139  huart->NbRxDataToProcess = 1;
3140 #endif /* USART_CR1_FIFOEN */
3141 
3142  /* Clear ISR function pointers */
3143  huart->RxISR = NULL;
3144  huart->TxISR = NULL;
3145 
3146  return ret;
3147 }
void(* TxISR)(struct __UART_HandleTypeDef *huart)
register uint32_t brrtemp
if(lpuartdiv >=LPUART_BRR_MIN_VALUE)
UART_ClockSourceTypeDef
UART clock sources definition.
uint32_t HAL_RCC_GetPCLK2Freq(void)
Return the PCLK2 frequency.
return HAL_OK
USART_TypeDef * Instance
void(* RxISR)(struct __UART_HandleTypeDef *huart)
ADC handle Structure definition.
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))

◆ UART_TxISR_16BIT()

static void UART_TxISR_16BIT ( UART_HandleTypeDef huart)
static

TX interrrupt handler for 9 bits data word length.

Note
Function is called under interruption only, once interruptions have been enabled by HAL_UART_Transmit_IT().
Parameters
huartUART handle.
Return values
None

Definition at line 3735 of file stm32l4xx_hal_uart.c.

3736 {
3737  uint16_t *tmp;
3738 
3739  /* Check that a Tx process is ongoing */
3740  if (huart->gState == HAL_UART_STATE_BUSY_TX)
3741  {
3742  if (huart->TxXferCount == 0U)
3743  {
3744  /* Disable the UART Transmit Data Register Empty Interrupt */
3745 #if defined(USART_CR1_FIFOEN)
3746  CLEAR_BIT(huart->Instance->CR1, USART_CR1_TXEIE_TXFNFIE);
3747 #else
3748  CLEAR_BIT(huart->Instance->CR1, USART_CR1_TXEIE);
3749 #endif /* USART_CR1_FIFOEN */
3750 
3751  /* Enable the UART Transmit Complete Interrupt */
3752  SET_BIT(huart->Instance->CR1, USART_CR1_TCIE);
3753  }
3754  else
3755  {
3756  tmp = (uint16_t *) huart->pTxBuffPtr;
3757  huart->Instance->TDR = (((uint32_t)(*tmp)) & 0x01FFUL);
3758  huart->pTxBuffPtr += 2U;
3759  huart->TxXferCount--;
3760  }
3761  }
3762 }
CLEAR_BIT(hrtc->Instance->CR, RTC_CR_WUTE)
USART_TypeDef * Instance
__IO HAL_UART_StateTypeDef gState

◆ UART_TxISR_16BIT_FIFOEN()

static void UART_TxISR_16BIT_FIFOEN ( UART_HandleTypeDef huart)
static

TX interrrupt handler for 9 bits data word length and FIFO mode is enabled.

Note
Function is called under interruption only, once interruptions have been enabled by HAL_UART_Transmit_IT().
Parameters
huartUART handle.
Return values
None

Definition at line 3812 of file stm32l4xx_hal_uart.c.

3813 {
3814  uint16_t *tmp;
3815  uint16_t nb_tx_data;
3816 
3817  /* Check that a Tx process is ongoing */
3818  if (huart->gState == HAL_UART_STATE_BUSY_TX)
3819  {
3820  for (nb_tx_data = huart->NbTxDataToProcess ; nb_tx_data > 0U ; nb_tx_data--)
3821  {
3822  if (huart->TxXferCount == 0U)
3823  {
3824  /* Disable the TX FIFO threshold interrupt */
3825  CLEAR_BIT(huart->Instance->CR3, USART_CR3_TXFTIE);
3826 
3827  /* Enable the UART Transmit Complete Interrupt */
3828  SET_BIT(huart->Instance->CR1, USART_CR1_TCIE);
3829 
3830  break; /* force exit loop */
3831  }
3832  else if (READ_BIT(huart->Instance->ISR, USART_ISR_TXE_TXFNF) != 0U)
3833  {
3834  tmp = (uint16_t *) huart->pTxBuffPtr;
3835  huart->Instance->TDR = (((uint32_t)(*tmp)) & 0x01FFUL);
3836  huart->pTxBuffPtr += 2U;
3837  huart->TxXferCount--;
3838  }
3839  else
3840  {
3841  /* Nothing to do */
3842  }
3843  }
3844  }
3845 }
CLEAR_BIT(hrtc->Instance->CR, RTC_CR_WUTE)
USART_TypeDef * Instance
__IO HAL_UART_StateTypeDef gState

◆ UART_TxISR_8BIT()

static void UART_TxISR_8BIT ( UART_HandleTypeDef huart)
static

TX interrrupt handler for 7 or 8 bits data word length .

Note
Function is called under interruption only, once interruptions have been enabled by HAL_UART_Transmit_IT().
Parameters
huartUART handle.
Return values
None

Definition at line 3702 of file stm32l4xx_hal_uart.c.

3703 {
3704  /* Check that a Tx process is ongoing */
3705  if (huart->gState == HAL_UART_STATE_BUSY_TX)
3706  {
3707  if (huart->TxXferCount == 0U)
3708  {
3709  /* Disable the UART Transmit Data Register Empty Interrupt */
3710 #if defined(USART_CR1_FIFOEN)
3711  CLEAR_BIT(huart->Instance->CR1, USART_CR1_TXEIE_TXFNFIE);
3712 #else
3713  CLEAR_BIT(huart->Instance->CR1, USART_CR1_TXEIE);
3714 #endif /* USART_CR1_FIFOEN */
3715 
3716  /* Enable the UART Transmit Complete Interrupt */
3717  SET_BIT(huart->Instance->CR1, USART_CR1_TCIE);
3718  }
3719  else
3720  {
3721  huart->Instance->TDR = (uint8_t)(*huart->pTxBuffPtr & (uint8_t)0xFF);
3722  huart->pTxBuffPtr++;
3723  huart->TxXferCount--;
3724  }
3725  }
3726 }
CLEAR_BIT(hrtc->Instance->CR, RTC_CR_WUTE)
USART_TypeDef * Instance
__IO HAL_UART_StateTypeDef gState

◆ UART_TxISR_8BIT_FIFOEN()

static void UART_TxISR_8BIT_FIFOEN ( UART_HandleTypeDef huart)
static

TX interrrupt handler for 7 or 8 bits data word length and FIFO mode is enabled.

Note
Function is called under interruption only, once interruptions have been enabled by HAL_UART_Transmit_IT().
Parameters
huartUART handle.
Return values
None

Definition at line 3772 of file stm32l4xx_hal_uart.c.

3773 {
3774  uint16_t nb_tx_data;
3775 
3776  /* Check that a Tx process is ongoing */
3777  if (huart->gState == HAL_UART_STATE_BUSY_TX)
3778  {
3779  for (nb_tx_data = huart->NbTxDataToProcess ; nb_tx_data > 0U ; nb_tx_data--)
3780  {
3781  if (huart->TxXferCount == 0U)
3782  {
3783  /* Disable the TX FIFO threshold interrupt */
3784  CLEAR_BIT(huart->Instance->CR3, USART_CR3_TXFTIE);
3785 
3786  /* Enable the UART Transmit Complete Interrupt */
3787  SET_BIT(huart->Instance->CR1, USART_CR1_TCIE);
3788 
3789  break; /* force exit loop */
3790  }
3791  else if (READ_BIT(huart->Instance->ISR, USART_ISR_TXE_TXFNF) != 0U)
3792  {
3793  huart->Instance->TDR = (uint8_t)(*huart->pTxBuffPtr & (uint8_t)0xFF);
3794  huart->pTxBuffPtr++;
3795  huart->TxXferCount--;
3796  }
3797  else
3798  {
3799  /* Nothing to do */
3800  }
3801  }
3802  }
3803 }
CLEAR_BIT(hrtc->Instance->CR, RTC_CR_WUTE)
USART_TypeDef * Instance
__IO HAL_UART_StateTypeDef gState

◆ UART_WaitOnFlagUntilTimeout()

HAL_StatusTypeDef UART_WaitOnFlagUntilTimeout ( UART_HandleTypeDef huart,
uint32_t  Flag,
FlagStatus  Status,
uint32_t  Tickstart,
uint32_t  Timeout 
)

Handle UART Communication Timeout.

Parameters
huartUART handle.
FlagSpecifies the UART flag to check
StatusFlag status (SET or RESET)
TickstartTick start value
TimeoutTimeout duration
Return values
HALstatus

Definition at line 3278 of file stm32l4xx_hal_uart.c.

3280 {
3281  /* Wait until flag is set */
3282  while ((__HAL_UART_GET_FLAG(huart, Flag) ? SET : RESET) == Status)
3283  {
3284  /* Check for the Timeout */
3285  if (Timeout != HAL_MAX_DELAY)
3286  {
3287  if (((HAL_GetTick() - Tickstart) > Timeout) || (Timeout == 0U))
3288  {
3289  /* Disable TXE, RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts for the interrupt process */
3290 #if defined(USART_CR1_FIFOEN)
3291  CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE_RXFNEIE | USART_CR1_PEIE | USART_CR1_TXEIE_TXFNFIE));
3292 #else
3293  CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE | USART_CR1_TXEIE));
3294 #endif /* USART_CR1_FIFOEN */
3295  CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE);
3296 
3297  huart->gState = HAL_UART_STATE_READY;
3298  huart->RxState = HAL_UART_STATE_READY;
3299 
3300  __HAL_UNLOCK(huart);
3301 
3302  return HAL_TIMEOUT;
3303  }
3304  }
3305  }
3306  return HAL_OK;
3307 }
__IO HAL_UART_StateTypeDef RxState
uint32_t HAL_GetTick(void)
Provide a tick value in millisecond.
__HAL_UNLOCK(hrtc)
CLEAR_BIT(hrtc->Instance->CR, RTC_CR_WUTE)
return HAL_OK
USART_TypeDef * Instance
__IO HAL_UART_StateTypeDef gState