STM32L4xx_HAL_Driver  1.14.0

UART Transmit/Receive functions. More...

Functions

HAL_StatusTypeDef HAL_UART_Transmit (UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
 Send an amount of data in blocking mode. More...
 
HAL_StatusTypeDef HAL_UART_Receive (UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
 Receive an amount of data in blocking mode. More...
 
HAL_StatusTypeDef HAL_UART_Transmit_IT (UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
 Send an amount of data in interrupt mode. More...
 
HAL_StatusTypeDef HAL_UART_Receive_IT (UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
 Receive an amount of data in interrupt mode. More...
 
HAL_StatusTypeDef HAL_UART_Transmit_DMA (UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
 Send an amount of data in DMA mode. More...
 
HAL_StatusTypeDef HAL_UART_Receive_DMA (UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
 Receive an amount of data in DMA mode. More...
 
HAL_StatusTypeDef HAL_UART_DMAPause (UART_HandleTypeDef *huart)
 Pause the DMA Transfer. More...
 
HAL_StatusTypeDef HAL_UART_DMAResume (UART_HandleTypeDef *huart)
 Resume the DMA Transfer. More...
 
HAL_StatusTypeDef HAL_UART_DMAStop (UART_HandleTypeDef *huart)
 Stop the DMA Transfer. More...
 
HAL_StatusTypeDef HAL_UART_Abort (UART_HandleTypeDef *huart)
 Abort ongoing transfers (blocking mode). More...
 
HAL_StatusTypeDef HAL_UART_AbortTransmit (UART_HandleTypeDef *huart)
 Abort ongoing Transmit transfer (blocking mode). More...
 
HAL_StatusTypeDef HAL_UART_AbortReceive (UART_HandleTypeDef *huart)
 Abort ongoing Receive transfer (blocking mode). More...
 
HAL_StatusTypeDef HAL_UART_Abort_IT (UART_HandleTypeDef *huart)
 Abort ongoing transfers (Interrupt mode). More...
 
HAL_StatusTypeDef HAL_UART_AbortTransmit_IT (UART_HandleTypeDef *huart)
 Abort ongoing Transmit transfer (Interrupt mode). More...
 
HAL_StatusTypeDef HAL_UART_AbortReceive_IT (UART_HandleTypeDef *huart)
 Abort ongoing Receive transfer (Interrupt mode). More...
 
void HAL_UART_IRQHandler (UART_HandleTypeDef *huart)
 Handle UART interrupt request. More...
 
void HAL_UART_TxHalfCpltCallback (UART_HandleTypeDef *huart)
 Tx Half Transfer completed callback. More...
 
void HAL_UART_TxCpltCallback (UART_HandleTypeDef *huart)
 Tx Transfer completed callback. More...
 
void HAL_UART_RxHalfCpltCallback (UART_HandleTypeDef *huart)
 Rx Half Transfer completed callback. More...
 
void HAL_UART_RxCpltCallback (UART_HandleTypeDef *huart)
 Rx Transfer completed callback. More...
 
void HAL_UART_ErrorCallback (UART_HandleTypeDef *huart)
 UART error callback. More...
 
void HAL_UART_AbortCpltCallback (UART_HandleTypeDef *huart)
 UART Abort Complete callback. More...
 
void HAL_UART_AbortTransmitCpltCallback (UART_HandleTypeDef *huart)
 UART Abort Complete callback. More...
 
void HAL_UART_AbortReceiveCpltCallback (UART_HandleTypeDef *huart)
 UART Abort Receive Complete callback. More...
 

Detailed Description

UART Transmit/Receive functions.

 ===============================================================================
                      ##### IO operation functions #####
 ===============================================================================
    This subsection provides a set of functions allowing to manage the UART asynchronous
    and Half duplex data transfers.

    (#) There are two mode of transfer:
       (+) Blocking mode: The communication is performed in polling mode.
           The HAL status of all data processing is returned by the same function
           after finishing transfer.
       (+) Non-Blocking mode: The communication is performed using Interrupts
           or DMA, These API's return the HAL status.
           The end of the data processing will be indicated through the
           dedicated UART IRQ when using Interrupt mode or the DMA IRQ when
           using DMA mode.
           The HAL_UART_TxCpltCallback(), HAL_UART_RxCpltCallback() user callbacks
           will be executed respectively at the end of the transmit or Receive process
           The HAL_UART_ErrorCallback()user callback will be executed when a communication error is detected

    (#) Blocking mode API's are :
        (+) HAL_UART_Transmit()
        (+) HAL_UART_Receive()

    (#) Non-Blocking mode API's with Interrupt are :
        (+) HAL_UART_Transmit_IT()
        (+) HAL_UART_Receive_IT()
        (+) HAL_UART_IRQHandler()

    (#) Non-Blocking mode API's with DMA are :
        (+) HAL_UART_Transmit_DMA()
        (+) HAL_UART_Receive_DMA()
        (+) HAL_UART_DMAPause()
        (+) HAL_UART_DMAResume()
        (+) HAL_UART_DMAStop()

    (#) A set of Transfer Complete Callbacks are provided in Non_Blocking mode:
        (+) HAL_UART_TxHalfCpltCallback()
        (+) HAL_UART_TxCpltCallback()
        (+) HAL_UART_RxHalfCpltCallback()
        (+) HAL_UART_RxCpltCallback()
        (+) HAL_UART_ErrorCallback()

    (#) Non-Blocking mode transfers could be aborted using Abort API's :
        (+) HAL_UART_Abort()
        (+) HAL_UART_AbortTransmit()
        (+) HAL_UART_AbortReceive()
        (+) HAL_UART_Abort_IT()
        (+) HAL_UART_AbortTransmit_IT()
        (+) HAL_UART_AbortReceive_IT()

    (#) For Abort services based on interrupts (HAL_UART_Abortxxx_IT), a set of Abort Complete Callbacks are provided:
        (+) HAL_UART_AbortCpltCallback()
        (+) HAL_UART_AbortTransmitCpltCallback()
        (+) HAL_UART_AbortReceiveCpltCallback()

    (#) In Non-Blocking mode transfers, possible errors are split into 2 categories.
        Errors are handled as follows :
       (+) Error is considered as Recoverable and non blocking : Transfer could go till end, but error severity is
           to be evaluated by user : this concerns Frame Error, Parity Error or Noise Error in Interrupt mode reception .
           Received character is then retrieved and stored in Rx buffer, Error code is set to allow user to identify error type,
           and HAL_UART_ErrorCallback() user callback is executed. Transfer is kept ongoing on UART side.
           If user wants to abort it, Abort services should be called by user.
       (+) Error is considered as Blocking : Transfer could not be completed properly and is aborted.
           This concerns Overrun Error In Interrupt mode reception and all errors in DMA mode.
           Error code is set to allow user to identify error type, and HAL_UART_ErrorCallback() user callback is executed.

    -@- In the Half duplex communication, it is forbidden to run the transmit
        and receive process in parallel, the UART state HAL_UART_STATE_BUSY_TX_RX can't be useful.

Function Documentation

◆ HAL_UART_Abort()

HAL_StatusTypeDef HAL_UART_Abort ( UART_HandleTypeDef huart)

Abort ongoing transfers (blocking mode).

Parameters
huartUART handle.
Note
This procedure could be used for aborting any ongoing transfer started in Interrupt or DMA mode. This procedure performs following operations :
  • Disable UART Interrupts (Tx and Rx)
  • Disable the DMA transfer in the peripheral register (if enabled)
  • Abort DMA transfer by calling HAL_DMA_Abort (in case of transfer in DMA mode)
  • Set handle State to READY
This procedure is executed in blocking mode : when exiting function, Abort is considered as completed.
Return values
HALstatus

Definition at line 1681 of file stm32l4xx_hal_uart.c.

1682 {
1683 #if defined(USART_CR1_FIFOEN)
1684  /* Disable TXE, TC, RXNE, PE, RXFT, TXFT and ERR (Frame error, noise error, overrun error) interrupts */
1685  CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE_RXFNEIE | USART_CR1_PEIE | USART_CR1_TXEIE_TXFNFIE | USART_CR1_TCIE));
1686  CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE | USART_CR3_RXFTIE | USART_CR3_TXFTIE);
1687 #else
1688  /* Disable TXEIE, TCIE, RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts */
1689  CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE | USART_CR1_TXEIE | USART_CR1_TCIE));
1690  CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE);
1691 #endif /* USART_CR1_FIFOEN */
1692 
1693  /* Disable the UART DMA Tx request if enabled */
1694  if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAT))
1695  {
1696  CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAT);
1697 
1698  /* Abort the UART DMA Tx channel : use blocking DMA Abort API (no callback) */
1699  if (huart->hdmatx != NULL)
1700  {
1701  /* Set the UART DMA Abort callback to Null.
1702  No call back execution at end of DMA abort procedure */
1703  huart->hdmatx->XferAbortCallback = NULL;
1704 
1705  if (HAL_DMA_Abort(huart->hdmatx) != HAL_OK)
1706  {
1707  if (HAL_DMA_GetError(huart->hdmatx) == HAL_DMA_ERROR_TIMEOUT)
1708  {
1709  /* Set error code to DMA */
1710  huart->ErrorCode = HAL_UART_ERROR_DMA;
1711 
1712  return HAL_TIMEOUT;
1713  }
1714  }
1715  }
1716  }
1717 
1718  /* Disable the UART DMA Rx request if enabled */
1719  if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR))
1720  {
1721  CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAR);
1722 
1723  /* Abort the UART DMA Rx channel : use blocking DMA Abort API (no callback) */
1724  if (huart->hdmarx != NULL)
1725  {
1726  /* Set the UART DMA Abort callback to Null.
1727  No call back execution at end of DMA abort procedure */
1728  huart->hdmarx->XferAbortCallback = NULL;
1729 
1730  if (HAL_DMA_Abort(huart->hdmarx) != HAL_OK)
1731  {
1732  if (HAL_DMA_GetError(huart->hdmarx) == HAL_DMA_ERROR_TIMEOUT)
1733  {
1734  /* Set error code to DMA */
1735  huart->ErrorCode = HAL_UART_ERROR_DMA;
1736 
1737  return HAL_TIMEOUT;
1738  }
1739  }
1740  }
1741  }
1742 
1743  /* Reset Tx and Rx transfer counters */
1744  huart->TxXferCount = 0U;
1745  huart->RxXferCount = 0U;
1746 
1747  /* Clear the Error flags in the ICR register */
1748  __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_OREF | UART_CLEAR_NEF | UART_CLEAR_PEF | UART_CLEAR_FEF);
1749 
1750 #if defined(USART_CR1_FIFOEN)
1751  /* Flush the whole TX FIFO (if needed) */
1752  if (huart->FifoMode == UART_FIFOMODE_ENABLE)
1753  {
1754  __HAL_UART_SEND_REQ(huart, UART_TXDATA_FLUSH_REQUEST);
1755  }
1756 #endif /* USART_CR1_FIFOEN */
1757 
1758  /* Discard the received data */
1759  __HAL_UART_SEND_REQ(huart, UART_RXDATA_FLUSH_REQUEST);
1760 
1761  /* Restore huart->gState and huart->RxState to Ready */
1762  huart->gState = HAL_UART_STATE_READY;
1763  huart->RxState = HAL_UART_STATE_READY;
1764 
1765  huart->ErrorCode = HAL_UART_ERROR_NONE;
1766 
1767  return HAL_OK;
1768 }
void(* XferAbortCallback)(struct __DMA_HandleTypeDef *hdma)
__IO HAL_UART_StateTypeDef RxState
DMA_HandleTypeDef * hdmarx
CLEAR_BIT(hrtc->Instance->CR, RTC_CR_WUTE)
return HAL_OK
USART_TypeDef * Instance
HAL_StatusTypeDef HAL_DMA_Abort(DMA_HandleTypeDef *hdma)
Abort the DMA Transfer.
DMA_HandleTypeDef * hdmatx
__IO HAL_UART_StateTypeDef gState
uint32_t HAL_DMA_GetError(DMA_HandleTypeDef *hdma)
Return the DMA error code.

◆ HAL_UART_Abort_IT()

HAL_StatusTypeDef HAL_UART_Abort_IT ( UART_HandleTypeDef huart)

Abort ongoing transfers (Interrupt mode).

Parameters
huartUART handle.
Note
This procedure could be used for aborting any ongoing transfer started in Interrupt or DMA mode. This procedure performs following operations :
  • Disable UART Interrupts (Tx and Rx)
  • Disable the DMA transfer in the peripheral register (if enabled)
  • Abort DMA transfer by calling HAL_DMA_Abort_IT (in case of transfer in DMA mode)
  • Set handle State to READY
  • At abort completion, call user abort complete callback
This procedure is executed in Interrupt mode, meaning that abort procedure could be considered as completed only when user abort complete callback is executed (not when exiting function).
Return values
HALstatus

Definition at line 1913 of file stm32l4xx_hal_uart.c.

1914 {
1915  uint32_t abortcplt = 1U;
1916 
1917  /* Disable interrupts */
1918 #if defined(USART_CR1_FIFOEN)
1919  CLEAR_BIT(huart->Instance->CR1, (USART_CR1_PEIE | USART_CR1_TCIE | USART_CR1_RXNEIE_RXFNEIE | USART_CR1_TXEIE_TXFNFIE));
1920  CLEAR_BIT(huart->Instance->CR3, (USART_CR3_EIE | USART_CR3_RXFTIE | USART_CR3_TXFTIE));
1921 #else
1922  CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE | USART_CR1_TXEIE | USART_CR1_TCIE));
1923  CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE);
1924 #endif /* USART_CR1_FIFOEN */
1925 
1926  /* If DMA Tx and/or DMA Rx Handles are associated to UART Handle, DMA Abort complete callbacks should be initialised
1927  before any call to DMA Abort functions */
1928  /* DMA Tx Handle is valid */
1929  if (huart->hdmatx != NULL)
1930  {
1931  /* Set DMA Abort Complete callback if UART DMA Tx request if enabled.
1932  Otherwise, set it to NULL */
1933  if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAT))
1934  {
1936  }
1937  else
1938  {
1939  huart->hdmatx->XferAbortCallback = NULL;
1940  }
1941  }
1942  /* DMA Rx Handle is valid */
1943  if (huart->hdmarx != NULL)
1944  {
1945  /* Set DMA Abort Complete callback if UART DMA Rx request if enabled.
1946  Otherwise, set it to NULL */
1947  if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR))
1948  {
1950  }
1951  else
1952  {
1953  huart->hdmarx->XferAbortCallback = NULL;
1954  }
1955  }
1956 
1957  /* Disable the UART DMA Tx request if enabled */
1958  if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAT))
1959  {
1960  /* Disable DMA Tx at UART level */
1961  CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAT);
1962 
1963  /* Abort the UART DMA Tx channel : use non blocking DMA Abort API (callback) */
1964  if (huart->hdmatx != NULL)
1965  {
1966  /* UART Tx DMA Abort callback has already been initialised :
1967  will lead to call HAL_UART_AbortCpltCallback() at end of DMA abort procedure */
1968 
1969  /* Abort DMA TX */
1970  if (HAL_DMA_Abort_IT(huart->hdmatx) != HAL_OK)
1971  {
1972  huart->hdmatx->XferAbortCallback = NULL;
1973  }
1974  else
1975  {
1976  abortcplt = 0U;
1977  }
1978  }
1979  }
1980 
1981  /* Disable the UART DMA Rx request if enabled */
1982  if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR))
1983  {
1984  CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAR);
1985 
1986  /* Abort the UART DMA Rx channel : use non blocking DMA Abort API (callback) */
1987  if (huart->hdmarx != NULL)
1988  {
1989  /* UART Rx DMA Abort callback has already been initialised :
1990  will lead to call HAL_UART_AbortCpltCallback() at end of DMA abort procedure */
1991 
1992  /* Abort DMA RX */
1993  if (HAL_DMA_Abort_IT(huart->hdmarx) != HAL_OK)
1994  {
1995  huart->hdmarx->XferAbortCallback = NULL;
1996  abortcplt = 1U;
1997  }
1998  else
1999  {
2000  abortcplt = 0U;
2001  }
2002  }
2003  }
2004 
2005  /* if no DMA abort complete callback execution is required => call user Abort Complete callback */
2006  if (abortcplt == 1U)
2007  {
2008  /* Reset Tx and Rx transfer counters */
2009  huart->TxXferCount = 0U;
2010  huart->RxXferCount = 0U;
2011 
2012  /* Clear ISR function pointers */
2013  huart->RxISR = NULL;
2014  huart->TxISR = NULL;
2015 
2016  /* Reset errorCode */
2017  huart->ErrorCode = HAL_UART_ERROR_NONE;
2018 
2019  /* Clear the Error flags in the ICR register */
2020  __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_OREF | UART_CLEAR_NEF | UART_CLEAR_PEF | UART_CLEAR_FEF);
2021 
2022 #if defined(USART_CR1_FIFOEN)
2023  /* Flush the whole TX FIFO (if needed) */
2024  if (huart->FifoMode == UART_FIFOMODE_ENABLE)
2025  {
2026  __HAL_UART_SEND_REQ(huart, UART_TXDATA_FLUSH_REQUEST);
2027  }
2028 #endif /* USART_CR1_FIFOEN */
2029 
2030  /* Discard the received data */
2031  __HAL_UART_SEND_REQ(huart, UART_RXDATA_FLUSH_REQUEST);
2032 
2033  /* Restore huart->gState and huart->RxState to Ready */
2034  huart->gState = HAL_UART_STATE_READY;
2035  huart->RxState = HAL_UART_STATE_READY;
2036 
2037  /* As no DMA to be aborted, call directly user Abort complete callback */
2038 #if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
2039  /* Call registered Abort complete callback */
2040  huart->AbortCpltCallback(huart);
2041 #else
2042  /* Call legacy weak Abort complete callback */
2044 #endif /* USE_HAL_UART_REGISTER_CALLBACKS */
2045  }
2046 
2047  return HAL_OK;
2048 }
void(* TxISR)(struct __UART_HandleTypeDef *huart)
void(* XferAbortCallback)(struct __DMA_HandleTypeDef *hdma)
__IO HAL_UART_StateTypeDef RxState
DMA_HandleTypeDef * hdmarx
void HAL_UART_AbortCpltCallback(UART_HandleTypeDef *huart)
UART Abort Complete callback.
HAL_StatusTypeDef HAL_DMA_Abort_IT(DMA_HandleTypeDef *hdma)
Aborts the DMA Transfer in Interrupt mode.
CLEAR_BIT(hrtc->Instance->CR, RTC_CR_WUTE)
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...
return HAL_OK
USART_TypeDef * Instance
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...
void(* RxISR)(struct __UART_HandleTypeDef *huart)
DMA_HandleTypeDef * hdmatx
void(* AbortCpltCallback)(struct __UART_HandleTypeDef *huart)
__IO HAL_UART_StateTypeDef gState

◆ HAL_UART_AbortCpltCallback()

__weak void HAL_UART_AbortCpltCallback ( UART_HandleTypeDef huart)

UART Abort Complete callback.

Parameters
huartUART handle.
Return values
None

Definition at line 2574 of file stm32l4xx_hal_uart.c.

2575 {
2576  /* Prevent unused argument(s) compilation warning */
2577  UNUSED(huart);
2578 
2579  /* NOTE : This function should not be modified, when the callback is needed,
2580  the HAL_UART_AbortCpltCallback can be implemented in the user file.
2581  */
2582 }

◆ HAL_UART_AbortReceive()

HAL_StatusTypeDef HAL_UART_AbortReceive ( UART_HandleTypeDef huart)

Abort ongoing Receive transfer (blocking mode).

Parameters
huartUART handle.
Note
This procedure could be used for aborting any ongoing Rx transfer started in Interrupt or DMA mode. This procedure performs following operations :
  • Disable UART Interrupts (Rx)
  • Disable the DMA transfer in the peripheral register (if enabled)
  • Abort DMA transfer by calling HAL_DMA_Abort (in case of transfer in DMA mode)
  • Set handle State to READY
This procedure is executed in blocking mode : when exiting function, Abort is considered as completed.
Return values
HALstatus

Definition at line 1847 of file stm32l4xx_hal_uart.c.

1848 {
1849 #if defined(USART_CR1_FIFOEN)
1850  /* Disable PEIE, EIE, RXNEIE and RXFTIE interrupts */
1851  CLEAR_BIT(huart->Instance->CR1, (USART_CR1_PEIE | USART_CR1_RXNEIE_RXFNEIE));
1852  CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE | USART_CR3_RXFTIE);
1853 #else
1854  /* Disable RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts */
1855  CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE));
1856  CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE);
1857 #endif /* USART_CR1_FIFOEN */
1858 
1859  /* Disable the UART DMA Rx request if enabled */
1860  if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR))
1861  {
1862  CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAR);
1863 
1864  /* Abort the UART DMA Rx channel : use blocking DMA Abort API (no callback) */
1865  if (huart->hdmarx != NULL)
1866  {
1867  /* Set the UART DMA Abort callback to Null.
1868  No call back execution at end of DMA abort procedure */
1869  huart->hdmarx->XferAbortCallback = NULL;
1870 
1871  if (HAL_DMA_Abort(huart->hdmarx) != HAL_OK)
1872  {
1873  if (HAL_DMA_GetError(huart->hdmarx) == HAL_DMA_ERROR_TIMEOUT)
1874  {
1875  /* Set error code to DMA */
1876  huart->ErrorCode = HAL_UART_ERROR_DMA;
1877 
1878  return HAL_TIMEOUT;
1879  }
1880  }
1881  }
1882  }
1883 
1884  /* Reset Rx transfer counter */
1885  huart->RxXferCount = 0U;
1886 
1887  /* Clear the Error flags in the ICR register */
1888  __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_OREF | UART_CLEAR_NEF | UART_CLEAR_PEF | UART_CLEAR_FEF);
1889 
1890  /* Discard the received data */
1891  __HAL_UART_SEND_REQ(huart, UART_RXDATA_FLUSH_REQUEST);
1892 
1893  /* Restore huart->RxState to Ready */
1894  huart->RxState = HAL_UART_STATE_READY;
1895 
1896  return HAL_OK;
1897 }
void(* XferAbortCallback)(struct __DMA_HandleTypeDef *hdma)
__IO HAL_UART_StateTypeDef RxState
DMA_HandleTypeDef * hdmarx
CLEAR_BIT(hrtc->Instance->CR, RTC_CR_WUTE)
return HAL_OK
USART_TypeDef * Instance
HAL_StatusTypeDef HAL_DMA_Abort(DMA_HandleTypeDef *hdma)
Abort the DMA Transfer.
uint32_t HAL_DMA_GetError(DMA_HandleTypeDef *hdma)
Return the DMA error code.

◆ HAL_UART_AbortReceive_IT()

HAL_StatusTypeDef HAL_UART_AbortReceive_IT ( UART_HandleTypeDef huart)

Abort ongoing Receive transfer (Interrupt mode).

Parameters
huartUART handle.
Note
This procedure could be used for aborting any ongoing Rx transfer started in Interrupt or DMA mode. This procedure performs following operations :
  • Disable UART Interrupts (Rx)
  • Disable the DMA transfer in the peripheral register (if enabled)
  • Abort DMA transfer by calling HAL_DMA_Abort_IT (in case of transfer in DMA mode)
  • Set handle State to READY
  • At abort completion, call user abort complete callback
This procedure is executed in Interrupt mode, meaning that abort procedure could be considered as completed only when user abort complete callback is executed (not when exiting function).
Return values
HALstatus

Definition at line 2160 of file stm32l4xx_hal_uart.c.

2161 {
2162  /* Disable RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts */
2163 #if defined(USART_CR1_FIFOEN)
2164  CLEAR_BIT(huart->Instance->CR1, (USART_CR1_PEIE | USART_CR1_RXNEIE_RXFNEIE));
2165  CLEAR_BIT(huart->Instance->CR3, (USART_CR3_EIE | USART_CR3_RXFTIE));
2166 #else
2167  CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE));
2168  CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE);
2169 #endif /* USART_CR1_FIFOEN */
2170 
2171  /* Disable the UART DMA Rx request if enabled */
2172  if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR))
2173  {
2174  CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAR);
2175 
2176  /* Abort the UART DMA Rx channel : use non blocking DMA Abort API (callback) */
2177  if (huart->hdmarx != NULL)
2178  {
2179  /* Set the UART DMA Abort callback :
2180  will lead to call HAL_UART_AbortCpltCallback() at end of DMA abort procedure */
2182 
2183  /* Abort DMA RX */
2184  if (HAL_DMA_Abort_IT(huart->hdmarx) != HAL_OK)
2185  {
2186  /* Call Directly huart->hdmarx->XferAbortCallback function in case of error */
2187  huart->hdmarx->XferAbortCallback(huart->hdmarx);
2188  }
2189  }
2190  else
2191  {
2192  /* Reset Rx transfer counter */
2193  huart->RxXferCount = 0U;
2194 
2195  /* Clear RxISR function pointer */
2196  huart->pRxBuffPtr = NULL;
2197 
2198  /* Clear the Error flags in the ICR register */
2199  __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_OREF | UART_CLEAR_NEF | UART_CLEAR_PEF | UART_CLEAR_FEF);
2200 
2201  /* Discard the received data */
2202  __HAL_UART_SEND_REQ(huart, UART_RXDATA_FLUSH_REQUEST);
2203 
2204  /* Restore huart->RxState to Ready */
2205  huart->RxState = HAL_UART_STATE_READY;
2206 
2207  /* As no DMA to be aborted, call directly user Abort complete callback */
2208 #if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
2209  /* Call registered Abort Receive Complete Callback */
2210  huart->AbortReceiveCpltCallback(huart);
2211 #else
2212  /* Call legacy weak Abort Receive Complete Callback */
2214 #endif /* USE_HAL_UART_REGISTER_CALLBACKS */
2215  }
2216  }
2217  else
2218  {
2219  /* Reset Rx transfer counter */
2220  huart->RxXferCount = 0U;
2221 
2222  /* Clear RxISR function pointer */
2223  huart->pRxBuffPtr = NULL;
2224 
2225  /* Clear the Error flags in the ICR register */
2226  __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_OREF | UART_CLEAR_NEF | UART_CLEAR_PEF | UART_CLEAR_FEF);
2227 
2228  /* Restore huart->RxState to Ready */
2229  huart->RxState = HAL_UART_STATE_READY;
2230 
2231  /* As no DMA to be aborted, call directly user Abort complete callback */
2232 #if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
2233  /* Call registered Abort Receive Complete Callback */
2234  huart->AbortReceiveCpltCallback(huart);
2235 #else
2236  /* Call legacy weak Abort Receive Complete Callback */
2238 #endif /* USE_HAL_UART_REGISTER_CALLBACKS */
2239  }
2240 
2241  return HAL_OK;
2242 }
void(* XferAbortCallback)(struct __DMA_HandleTypeDef *hdma)
__IO HAL_UART_StateTypeDef RxState
DMA_HandleTypeDef * hdmarx
HAL_StatusTypeDef HAL_DMA_Abort_IT(DMA_HandleTypeDef *hdma)
Aborts the DMA Transfer in Interrupt mode.
CLEAR_BIT(hrtc->Instance->CR, RTC_CR_WUTE)
void HAL_UART_AbortReceiveCpltCallback(UART_HandleTypeDef *huart)
UART Abort Receive Complete callback.
return HAL_OK
USART_TypeDef * Instance
static void UART_DMARxOnlyAbortCallback(DMA_HandleTypeDef *hdma)
DMA UART Rx communication abort callback, when initiated by user by a call to HAL_UART_AbortReceive_I...
void(* AbortReceiveCpltCallback)(struct __UART_HandleTypeDef *huart)

◆ HAL_UART_AbortReceiveCpltCallback()

__weak void HAL_UART_AbortReceiveCpltCallback ( UART_HandleTypeDef huart)

UART Abort Receive Complete callback.

Parameters
huartUART handle.
Return values
None

Definition at line 2604 of file stm32l4xx_hal_uart.c.

2605 {
2606  /* Prevent unused argument(s) compilation warning */
2607  UNUSED(huart);
2608 
2609  /* NOTE : This function should not be modified, when the callback is needed,
2610  the HAL_UART_AbortReceiveCpltCallback can be implemented in the user file.
2611  */
2612 }

◆ HAL_UART_AbortTransmit()

HAL_StatusTypeDef HAL_UART_AbortTransmit ( UART_HandleTypeDef huart)

Abort ongoing Transmit transfer (blocking mode).

Parameters
huartUART handle.
Note
This procedure could be used for aborting any ongoing Tx transfer started in Interrupt or DMA mode. This procedure performs following operations :
  • Disable UART Interrupts (Tx)
  • Disable the DMA transfer in the peripheral register (if enabled)
  • Abort DMA transfer by calling HAL_DMA_Abort (in case of transfer in DMA mode)
  • Set handle State to READY
This procedure is executed in blocking mode : when exiting function, Abort is considered as completed.
Return values
HALstatus

Definition at line 1782 of file stm32l4xx_hal_uart.c.

1783 {
1784 #if defined(USART_CR1_FIFOEN)
1785  /* Disable TCIE, TXEIE and TXFTIE interrupts */
1786  CLEAR_BIT(huart->Instance->CR1, (USART_CR1_TCIE | USART_CR1_TXEIE_TXFNFIE));
1787  CLEAR_BIT(huart->Instance->CR3, USART_CR3_TXFTIE);
1788 #else
1789  /* Disable TXEIE and TCIE interrupts */
1790  CLEAR_BIT(huart->Instance->CR1, (USART_CR1_TXEIE | USART_CR1_TCIE));
1791 #endif /* USART_CR1_FIFOEN */
1792 
1793  /* Disable the UART DMA Tx request if enabled */
1794  if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAT))
1795  {
1796  CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAT);
1797 
1798  /* Abort the UART DMA Tx channel : use blocking DMA Abort API (no callback) */
1799  if (huart->hdmatx != NULL)
1800  {
1801  /* Set the UART DMA Abort callback to Null.
1802  No call back execution at end of DMA abort procedure */
1803  huart->hdmatx->XferAbortCallback = NULL;
1804 
1805  if (HAL_DMA_Abort(huart->hdmatx) != HAL_OK)
1806  {
1807  if (HAL_DMA_GetError(huart->hdmatx) == HAL_DMA_ERROR_TIMEOUT)
1808  {
1809  /* Set error code to DMA */
1810  huart->ErrorCode = HAL_UART_ERROR_DMA;
1811 
1812  return HAL_TIMEOUT;
1813  }
1814  }
1815  }
1816  }
1817 
1818  /* Reset Tx transfer counter */
1819  huart->TxXferCount = 0U;
1820 
1821 #if defined(USART_CR1_FIFOEN)
1822  /* Flush the whole TX FIFO (if needed) */
1823  if (huart->FifoMode == UART_FIFOMODE_ENABLE)
1824  {
1825  __HAL_UART_SEND_REQ(huart, UART_TXDATA_FLUSH_REQUEST);
1826  }
1827 #endif /* USART_CR1_FIFOEN */
1828 
1829  /* Restore huart->gState to Ready */
1830  huart->gState = HAL_UART_STATE_READY;
1831 
1832  return HAL_OK;
1833 }
void(* XferAbortCallback)(struct __DMA_HandleTypeDef *hdma)
CLEAR_BIT(hrtc->Instance->CR, RTC_CR_WUTE)
return HAL_OK
USART_TypeDef * Instance
HAL_StatusTypeDef HAL_DMA_Abort(DMA_HandleTypeDef *hdma)
Abort the DMA Transfer.
DMA_HandleTypeDef * hdmatx
__IO HAL_UART_StateTypeDef gState
uint32_t HAL_DMA_GetError(DMA_HandleTypeDef *hdma)
Return the DMA error code.

◆ HAL_UART_AbortTransmit_IT()

HAL_StatusTypeDef HAL_UART_AbortTransmit_IT ( UART_HandleTypeDef huart)

Abort ongoing Transmit transfer (Interrupt mode).

Parameters
huartUART handle.
Note
This procedure could be used for aborting any ongoing Tx transfer started in Interrupt or DMA mode. This procedure performs following operations :
  • Disable UART Interrupts (Tx)
  • Disable the DMA transfer in the peripheral register (if enabled)
  • Abort DMA transfer by calling HAL_DMA_Abort_IT (in case of transfer in DMA mode)
  • Set handle State to READY
  • At abort completion, call user abort complete callback
This procedure is executed in Interrupt mode, meaning that abort procedure could be considered as completed only when user abort complete callback is executed (not when exiting function).
Return values
HALstatus

Definition at line 2064 of file stm32l4xx_hal_uart.c.

2065 {
2066  /* Disable interrupts */
2067 #if defined(USART_CR1_FIFOEN)
2068  CLEAR_BIT(huart->Instance->CR1, (USART_CR1_TCIE | USART_CR1_TXEIE_TXFNFIE));
2069  CLEAR_BIT(huart->Instance->CR3, USART_CR3_TXFTIE);
2070 #else
2071  CLEAR_BIT(huart->Instance->CR1, (USART_CR1_TXEIE | USART_CR1_TCIE));
2072 #endif /* USART_CR1_FIFOEN */
2073 
2074  /* Disable the UART DMA Tx request if enabled */
2075  if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAT))
2076  {
2077  CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAT);
2078 
2079  /* Abort the UART DMA Tx channel : use non blocking DMA Abort API (callback) */
2080  if (huart->hdmatx != NULL)
2081  {
2082  /* Set the UART DMA Abort callback :
2083  will lead to call HAL_UART_AbortCpltCallback() at end of DMA abort procedure */
2085 
2086  /* Abort DMA TX */
2087  if (HAL_DMA_Abort_IT(huart->hdmatx) != HAL_OK)
2088  {
2089  /* Call Directly huart->hdmatx->XferAbortCallback function in case of error */
2090  huart->hdmatx->XferAbortCallback(huart->hdmatx);
2091  }
2092  }
2093  else
2094  {
2095  /* Reset Tx transfer counter */
2096  huart->TxXferCount = 0U;
2097 
2098  /* Clear TxISR function pointers */
2099  huart->TxISR = NULL;
2100 
2101  /* Restore huart->gState to Ready */
2102  huart->gState = HAL_UART_STATE_READY;
2103 
2104  /* As no DMA to be aborted, call directly user Abort complete callback */
2105 #if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
2106  /* Call registered Abort Transmit Complete Callback */
2107  huart->AbortTransmitCpltCallback(huart);
2108 #else
2109  /* Call legacy weak Abort Transmit Complete Callback */
2111 #endif /* USE_HAL_UART_REGISTER_CALLBACKS */
2112  }
2113  }
2114  else
2115  {
2116  /* Reset Tx transfer counter */
2117  huart->TxXferCount = 0U;
2118 
2119  /* Clear TxISR function pointers */
2120  huart->TxISR = NULL;
2121 
2122 #if defined(USART_CR1_FIFOEN)
2123  /* Flush the whole TX FIFO (if needed) */
2124  if (huart->FifoMode == UART_FIFOMODE_ENABLE)
2125  {
2126  __HAL_UART_SEND_REQ(huart, UART_TXDATA_FLUSH_REQUEST);
2127  }
2128 #endif /* USART_CR1_FIFOEN */
2129 
2130  /* Restore huart->gState to Ready */
2131  huart->gState = HAL_UART_STATE_READY;
2132 
2133  /* As no DMA to be aborted, call directly user Abort complete callback */
2134 #if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
2135  /* Call registered Abort Transmit Complete Callback */
2136  huart->AbortTransmitCpltCallback(huart);
2137 #else
2138  /* Call legacy weak Abort Transmit Complete Callback */
2140 #endif /* USE_HAL_UART_REGISTER_CALLBACKS */
2141  }
2142 
2143  return HAL_OK;
2144 }
static void UART_DMATxOnlyAbortCallback(DMA_HandleTypeDef *hdma)
DMA UART Tx communication abort callback, when initiated by user by a call to HAL_UART_AbortTransmit_...
void(* TxISR)(struct __UART_HandleTypeDef *huart)
void(* XferAbortCallback)(struct __DMA_HandleTypeDef *hdma)
HAL_StatusTypeDef HAL_DMA_Abort_IT(DMA_HandleTypeDef *hdma)
Aborts the DMA Transfer in Interrupt mode.
CLEAR_BIT(hrtc->Instance->CR, RTC_CR_WUTE)
return HAL_OK
USART_TypeDef * Instance
DMA_HandleTypeDef * hdmatx
void HAL_UART_AbortTransmitCpltCallback(UART_HandleTypeDef *huart)
UART Abort Complete callback.
void(* AbortTransmitCpltCallback)(struct __UART_HandleTypeDef *huart)
__IO HAL_UART_StateTypeDef gState

◆ HAL_UART_AbortTransmitCpltCallback()

__weak void HAL_UART_AbortTransmitCpltCallback ( UART_HandleTypeDef huart)

UART Abort Complete callback.

Parameters
huartUART handle.
Return values
None

Definition at line 2589 of file stm32l4xx_hal_uart.c.

2590 {
2591  /* Prevent unused argument(s) compilation warning */
2592  UNUSED(huart);
2593 
2594  /* NOTE : This function should not be modified, when the callback is needed,
2595  the HAL_UART_AbortTransmitCpltCallback can be implemented in the user file.
2596  */
2597 }

◆ HAL_UART_DMAPause()

HAL_StatusTypeDef HAL_UART_DMAPause ( UART_HandleTypeDef huart)

Pause the DMA Transfer.

Parameters
huartUART handle.
Return values
HALstatus

Definition at line 1540 of file stm32l4xx_hal_uart.c.

1541 {
1542  const HAL_UART_StateTypeDef gstate = huart->gState;
1543  const HAL_UART_StateTypeDef rxstate = huart->RxState;
1544 
1545  __HAL_LOCK(huart);
1546 
1547  if ((HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAT)) &&
1548  (gstate == HAL_UART_STATE_BUSY_TX))
1549  {
1550  /* Disable the UART DMA Tx request */
1551  CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAT);
1552  }
1553  if ((HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR)) &&
1554  (rxstate == HAL_UART_STATE_BUSY_RX))
1555  {
1556  /* Disable PE and ERR (Frame error, noise error, overrun error) interrupts */
1557  CLEAR_BIT(huart->Instance->CR1, USART_CR1_PEIE);
1558  CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE);
1559 
1560  /* Disable the UART DMA Rx request */
1561  CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAR);
1562  }
1563 
1564  __HAL_UNLOCK(huart);
1565 
1566  return HAL_OK;
1567 }
__IO HAL_UART_StateTypeDef RxState
uint32_t HAL_UART_StateTypeDef
HAL UART State definition.
__HAL_UNLOCK(hrtc)
CLEAR_BIT(hrtc->Instance->CR, RTC_CR_WUTE)
__HAL_LOCK(hrtc)
return HAL_OK
USART_TypeDef * Instance
__IO HAL_UART_StateTypeDef gState

◆ HAL_UART_DMAResume()

HAL_StatusTypeDef HAL_UART_DMAResume ( UART_HandleTypeDef huart)

Resume the DMA Transfer.

Parameters
huartUART handle.
Return values
HALstatus

Definition at line 1574 of file stm32l4xx_hal_uart.c.

1575 {
1576  __HAL_LOCK(huart);
1577 
1578  if (huart->gState == HAL_UART_STATE_BUSY_TX)
1579  {
1580  /* Enable the UART DMA Tx request */
1581  SET_BIT(huart->Instance->CR3, USART_CR3_DMAT);
1582  }
1583  if (huart->RxState == HAL_UART_STATE_BUSY_RX)
1584  {
1585  /* Clear the Overrun flag before resuming the Rx transfer */
1586  __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_OREF);
1587 
1588  /* Reenable PE and ERR (Frame error, noise error, overrun error) interrupts */
1589  SET_BIT(huart->Instance->CR1, USART_CR1_PEIE);
1590  SET_BIT(huart->Instance->CR3, USART_CR3_EIE);
1591 
1592  /* Enable the UART DMA Rx request */
1593  SET_BIT(huart->Instance->CR3, USART_CR3_DMAR);
1594  }
1595 
1596  __HAL_UNLOCK(huart);
1597 
1598  return HAL_OK;
1599 }
__IO HAL_UART_StateTypeDef RxState
__HAL_UNLOCK(hrtc)
__HAL_LOCK(hrtc)
return HAL_OK
USART_TypeDef * Instance
__IO HAL_UART_StateTypeDef gState

◆ HAL_UART_DMAStop()

HAL_StatusTypeDef HAL_UART_DMAStop ( UART_HandleTypeDef huart)

Stop the DMA Transfer.

Parameters
huartUART handle.
Return values
HALstatus

Definition at line 1606 of file stm32l4xx_hal_uart.c.

1607 {
1608  /* The Lock is not implemented on this API to allow the user application
1609  to call the HAL UART API under callbacks HAL_UART_TxCpltCallback() / HAL_UART_RxCpltCallback() /
1610  HAL_UART_TxHalfCpltCallback / HAL_UART_RxHalfCpltCallback:
1611  indeed, when HAL_DMA_Abort() API is called, the DMA TX/RX Transfer or Half Transfer complete
1612  interrupt is generated if the DMA transfer interruption occurs at the middle or at the end of
1613  the stream and the corresponding call back is executed. */
1614 
1615  const HAL_UART_StateTypeDef gstate = huart->gState;
1616  const HAL_UART_StateTypeDef rxstate = huart->RxState;
1617 
1618  /* Stop UART DMA Tx request if ongoing */
1619  if ((HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAT)) &&
1620  (gstate == HAL_UART_STATE_BUSY_TX))
1621  {
1622  CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAT);
1623 
1624  /* Abort the UART DMA Tx channel */
1625  if (huart->hdmatx != NULL)
1626  {
1627  if (HAL_DMA_Abort(huart->hdmatx) != HAL_OK)
1628  {
1629  if (HAL_DMA_GetError(huart->hdmatx) == HAL_DMA_ERROR_TIMEOUT)
1630  {
1631  /* Set error code to DMA */
1632  huart->ErrorCode = HAL_UART_ERROR_DMA;
1633 
1634  return HAL_TIMEOUT;
1635  }
1636  }
1637  }
1638 
1639  UART_EndTxTransfer(huart);
1640  }
1641 
1642  /* Stop UART DMA Rx request if ongoing */
1643  if ((HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR)) &&
1644  (rxstate == HAL_UART_STATE_BUSY_RX))
1645  {
1646  CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAR);
1647 
1648  /* Abort the UART DMA Rx channel */
1649  if (huart->hdmarx != NULL)
1650  {
1651  if (HAL_DMA_Abort(huart->hdmarx) != HAL_OK)
1652  {
1653  if (HAL_DMA_GetError(huart->hdmarx) == HAL_DMA_ERROR_TIMEOUT)
1654  {
1655  /* Set error code to DMA */
1656  huart->ErrorCode = HAL_UART_ERROR_DMA;
1657 
1658  return HAL_TIMEOUT;
1659  }
1660  }
1661  }
1662 
1663  UART_EndRxTransfer(huart);
1664  }
1665 
1666  return HAL_OK;
1667 }
__IO HAL_UART_StateTypeDef RxState
DMA_HandleTypeDef * hdmarx
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)...
CLEAR_BIT(hrtc->Instance->CR, RTC_CR_WUTE)
return HAL_OK
USART_TypeDef * Instance
HAL_StatusTypeDef HAL_DMA_Abort(DMA_HandleTypeDef *hdma)
Abort the DMA Transfer.
DMA_HandleTypeDef * hdmatx
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
uint32_t HAL_DMA_GetError(DMA_HandleTypeDef *hdma)
Return the DMA error code.

◆ HAL_UART_ErrorCallback()

__weak void HAL_UART_ErrorCallback ( UART_HandleTypeDef huart)

UART error callback.

Parameters
huartUART handle.
Return values
None

Definition at line 2559 of file stm32l4xx_hal_uart.c.

2560 {
2561  /* Prevent unused argument(s) compilation warning */
2562  UNUSED(huart);
2563 
2564  /* NOTE : This function should not be modified, when the callback is needed,
2565  the HAL_UART_ErrorCallback can be implemented in the user file.
2566  */
2567 }

◆ HAL_UART_IRQHandler()

void HAL_UART_IRQHandler ( UART_HandleTypeDef huart)

Handle UART interrupt request.

Parameters
huartUART handle.
Return values
None

Definition at line 2249 of file stm32l4xx_hal_uart.c.

2250 {
2251  uint32_t isrflags = READ_REG(huart->Instance->ISR);
2252  uint32_t cr1its = READ_REG(huart->Instance->CR1);
2253  uint32_t cr3its = READ_REG(huart->Instance->CR3);
2254 
2255  uint32_t errorflags;
2256  uint32_t errorcode;
2257 
2258  /* If no error occurs */
2259  errorflags = (isrflags & (uint32_t)(USART_ISR_PE | USART_ISR_FE | USART_ISR_ORE | USART_ISR_NE));
2260  if (errorflags == 0U)
2261  {
2262  /* UART in mode Receiver ---------------------------------------------------*/
2263 #if defined(USART_CR1_FIFOEN)
2264  if (((isrflags & USART_ISR_RXNE_RXFNE) != 0U)
2265  && (((cr1its & USART_CR1_RXNEIE_RXFNEIE) != 0U)
2266  || ((cr3its & USART_CR3_RXFTIE) != 0U)))
2267 #else
2268  if (((isrflags & USART_ISR_RXNE) != 0U)
2269  && ((cr1its & USART_CR1_RXNEIE) != 0U))
2270 #endif /* USART_CR1_FIFOEN */
2271  {
2272  if (huart->RxISR != NULL)
2273  {
2274  huart->RxISR(huart);
2275  }
2276  return;
2277  }
2278  }
2279 
2280  /* If some errors occur */
2281 #if defined(USART_CR1_FIFOEN)
2282  if ((errorflags != 0U)
2283  && ((((cr3its & (USART_CR3_RXFTIE | USART_CR3_EIE)) != 0U)
2284  || ((cr1its & (USART_CR1_RXNEIE_RXFNEIE | USART_CR1_PEIE)) != 0U))))
2285 #else
2286  if ((errorflags != 0U)
2287  && (((cr3its & USART_CR3_EIE) != 0U)
2288  || ((cr1its & (USART_CR1_RXNEIE | USART_CR1_PEIE)) != 0U)))
2289 #endif /* USART_CR1_FIFOEN */
2290  {
2291  /* UART parity error interrupt occurred -------------------------------------*/
2292  if (((isrflags & USART_ISR_PE) != 0U) && ((cr1its & USART_CR1_PEIE) != 0U))
2293  {
2294  __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_PEF);
2295 
2296  huart->ErrorCode |= HAL_UART_ERROR_PE;
2297  }
2298 
2299  /* UART frame error interrupt occurred --------------------------------------*/
2300  if (((isrflags & USART_ISR_FE) != 0U) && ((cr3its & USART_CR3_EIE) != 0U))
2301  {
2302  __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_FEF);
2303 
2304  huart->ErrorCode |= HAL_UART_ERROR_FE;
2305  }
2306 
2307  /* UART noise error interrupt occurred --------------------------------------*/
2308  if (((isrflags & USART_ISR_NE) != 0U) && ((cr3its & USART_CR3_EIE) != 0U))
2309  {
2310  __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_NEF);
2311 
2312  huart->ErrorCode |= HAL_UART_ERROR_NE;
2313  }
2314 
2315  /* UART Over-Run interrupt occurred -----------------------------------------*/
2316 #if defined(USART_CR1_FIFOEN)
2317  if (((isrflags & USART_ISR_ORE) != 0U)
2318  && (((cr1its & USART_CR1_RXNEIE_RXFNEIE) != 0U) ||
2319  ((cr3its & (USART_CR3_RXFTIE | USART_CR3_EIE)) != 0U)))
2320 #else
2321  if (((isrflags & USART_ISR_ORE) != 0U)
2322  && (((cr1its & USART_CR1_RXNEIE) != 0U) ||
2323  ((cr3its & USART_CR3_EIE) != 0U)))
2324 #endif /* USART_CR1_FIFOEN */
2325  {
2326  __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_OREF);
2327 
2328  huart->ErrorCode |= HAL_UART_ERROR_ORE;
2329  }
2330 
2331  /* Call UART Error Call back function if need be --------------------------*/
2332  if (huart->ErrorCode != HAL_UART_ERROR_NONE)
2333  {
2334  /* UART in mode Receiver ---------------------------------------------------*/
2335 #if defined(USART_CR1_FIFOEN)
2336  if (((isrflags & USART_ISR_RXNE_RXFNE) != 0U)
2337  && (((cr1its & USART_CR1_RXNEIE_RXFNEIE) != 0U)
2338  || ((cr3its & USART_CR3_RXFTIE) != 0U)))
2339 #else
2340  if (((isrflags & USART_ISR_RXNE) != 0U)
2341  && ((cr1its & USART_CR1_RXNEIE) != 0U))
2342 #endif /* USART_CR1_FIFOEN */
2343  {
2344  if (huart->RxISR != NULL)
2345  {
2346  huart->RxISR(huart);
2347  }
2348  }
2349 
2350  /* If Overrun error occurs, or if any error occurs in DMA mode reception,
2351  consider error as blocking */
2352  errorcode = huart->ErrorCode;
2353  if ((HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR)) ||
2354  ((errorcode & HAL_UART_ERROR_ORE) != 0U))
2355  {
2356  /* Blocking error : transfer is aborted
2357  Set the UART state ready to be able to start again the process,
2358  Disable Rx Interrupts, and disable Rx DMA request, if ongoing */
2359  UART_EndRxTransfer(huart);
2360 
2361  /* Disable the UART DMA Rx request if enabled */
2362  if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR))
2363  {
2364  CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAR);
2365 
2366  /* Abort the UART DMA Rx channel */
2367  if (huart->hdmarx != NULL)
2368  {
2369  /* Set the UART DMA Abort callback :
2370  will lead to call HAL_UART_ErrorCallback() at end of DMA abort procedure */
2372 
2373  /* Abort DMA RX */
2374  if (HAL_DMA_Abort_IT(huart->hdmarx) != HAL_OK)
2375  {
2376  /* Call Directly huart->hdmarx->XferAbortCallback function in case of error */
2377  huart->hdmarx->XferAbortCallback(huart->hdmarx);
2378  }
2379  }
2380  else
2381  {
2382  /* Call user error callback */
2383 #if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
2384  /*Call registered error callback*/
2385  huart->ErrorCallback(huart);
2386 #else
2387  /*Call legacy weak error callback*/
2388  HAL_UART_ErrorCallback(huart);
2389 #endif /* USE_HAL_UART_REGISTER_CALLBACKS */
2390 
2391  }
2392  }
2393  else
2394  {
2395  /* Call user error callback */
2396 #if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
2397  /*Call registered error callback*/
2398  huart->ErrorCallback(huart);
2399 #else
2400  /*Call legacy weak error callback*/
2401  HAL_UART_ErrorCallback(huart);
2402 #endif /* USE_HAL_UART_REGISTER_CALLBACKS */
2403  }
2404  }
2405  else
2406  {
2407  /* Non Blocking error : transfer could go on.
2408  Error is notified to user through user error callback */
2409 #if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
2410  /*Call registered error callback*/
2411  huart->ErrorCallback(huart);
2412 #else
2413  /*Call legacy weak error callback*/
2414  HAL_UART_ErrorCallback(huart);
2415 #endif /* USE_HAL_UART_REGISTER_CALLBACKS */
2416  huart->ErrorCode = HAL_UART_ERROR_NONE;
2417  }
2418  }
2419  return;
2420 
2421  } /* End if some error occurs */
2422 
2423  /* UART wakeup from Stop mode interrupt occurred ---------------------------*/
2424  if (((isrflags & USART_ISR_WUF) != 0U) && ((cr3its & USART_CR3_WUFIE) != 0U))
2425  {
2426  __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_WUF);
2427 
2428  /* UART Rx state is not reset as a reception process might be ongoing.
2429  If UART handle state fields need to be reset to READY, this could be done in Wakeup callback */
2430 
2431 #if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
2432  /* Call registered Wakeup Callback */
2433  huart->WakeupCallback(huart);
2434 #else
2435  /* Call legacy weak Wakeup Callback */
2437 #endif /* USE_HAL_UART_REGISTER_CALLBACKS */
2438  return;
2439  }
2440 
2441  /* UART in mode Transmitter ------------------------------------------------*/
2442 #if defined(USART_CR1_FIFOEN)
2443  if (((isrflags & USART_ISR_TXE_TXFNF) != 0U)
2444  && (((cr1its & USART_CR1_TXEIE_TXFNFIE) != 0U)
2445  || ((cr3its & USART_CR3_TXFTIE) != 0U)))
2446 #else
2447  if (((isrflags & USART_ISR_TXE) != 0U)
2448  && ((cr1its & USART_CR1_TXEIE) != 0U))
2449 #endif /* USART_CR1_FIFOEN */
2450  {
2451  if (huart->TxISR != NULL)
2452  {
2453  huart->TxISR(huart);
2454  }
2455  return;
2456  }
2457 
2458  /* UART in mode Transmitter (transmission end) -----------------------------*/
2459  if (((isrflags & USART_ISR_TC) != 0U) && ((cr1its & USART_CR1_TCIE) != 0U))
2460  {
2461  UART_EndTransmit_IT(huart);
2462  return;
2463  }
2464 
2465 #if defined(USART_CR1_FIFOEN)
2466  /* UART TX Fifo Empty occurred ----------------------------------------------*/
2467  if (((isrflags & USART_ISR_TXFE) != 0U) && ((cr1its & USART_CR1_TXFEIE) != 0U))
2468  {
2469 #if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
2470  /* Call registered Tx Fifo Empty Callback */
2471  huart->TxFifoEmptyCallback(huart);
2472 #else
2473  /* Call legacy weak Tx Fifo Empty Callback */
2475 #endif /* USE_HAL_UART_REGISTER_CALLBACKS */
2476  return;
2477  }
2478 
2479  /* UART RX Fifo Full occurred ----------------------------------------------*/
2480  if (((isrflags & USART_ISR_RXFF) != 0U) && ((cr1its & USART_CR1_RXFFIE) != 0U))
2481  {
2482 #if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
2483  /* Call registered Rx Fifo Full Callback */
2484  huart->RxFifoFullCallback(huart);
2485 #else
2486  /* Call legacy weak Rx Fifo Full Callback */
2488 #endif /* USE_HAL_UART_REGISTER_CALLBACKS */
2489  return;
2490  }
2491 #endif /* USART_CR1_FIFOEN */
2492 }
void(* TxFifoEmptyCallback)(struct __UART_HandleTypeDef *huart)
void(* TxISR)(struct __UART_HandleTypeDef *huart)
void(* XferAbortCallback)(struct __DMA_HandleTypeDef *hdma)
void HAL_UARTEx_TxFifoEmptyCallback(UART_HandleTypeDef *huart)
UART TX Fifo empty callback.
DMA_HandleTypeDef * hdmarx
static void UART_DMAAbortOnError(DMA_HandleTypeDef *hdma)
DMA UART communication abort callback, when initiated by HAL services on Error (To be called at end o...
void HAL_UARTEx_RxFifoFullCallback(UART_HandleTypeDef *huart)
UART RX Fifo full callback.
HAL_StatusTypeDef HAL_DMA_Abort_IT(DMA_HandleTypeDef *hdma)
Aborts the DMA Transfer in Interrupt mode.
static void UART_EndRxTransfer(UART_HandleTypeDef *huart)
End ongoing Rx transfer on UART peripheral (following error detection or Reception completion)...
void(* WakeupCallback)(struct __UART_HandleTypeDef *huart)
CLEAR_BIT(hrtc->Instance->CR, RTC_CR_WUTE)
return HAL_OK
USART_TypeDef * Instance
void(* RxISR)(struct __UART_HandleTypeDef *huart)
void(* ErrorCallback)(struct __UART_HandleTypeDef *huart)
static void UART_EndTransmit_IT(UART_HandleTypeDef *huart)
Wrap up transmission in non-blocking mode.
void HAL_UARTEx_WakeupCallback(UART_HandleTypeDef *huart)
UART wakeup from Stop mode callback.
void(* RxFifoFullCallback)(struct __UART_HandleTypeDef *huart)
void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
UART error callback.

◆ HAL_UART_Receive()

HAL_StatusTypeDef HAL_UART_Receive ( UART_HandleTypeDef huart,
uint8_t *  pData,
uint16_t  Size,
uint32_t  Timeout 
)

Receive an amount of data in blocking mode.

Note
When FIFO mode is enabled, the RXFNE flag is set as long as the RXFIFO is not empty. Read operations from the RDR register are performed when RXFNE flag is set. From hardware perspective, RXFNE flag and RXNE are mapped on the same bit-field.
Parameters
huartUART handle.
pDataPointer to data buffer.
SizeAmount of data to be received.
TimeoutTimeout duration.
Return values
HALstatus

Definition at line 1131 of file stm32l4xx_hal_uart.c.

1132 {
1133  uint8_t *pdata8bits;
1134  uint16_t *pdata16bits;
1135  uint16_t uhMask;
1136  uint32_t tickstart;
1137 
1138  /* Check that a Rx process is not already ongoing */
1139  if (huart->RxState == HAL_UART_STATE_READY)
1140  {
1141  if ((pData == NULL) || (Size == 0U))
1142  {
1143  return HAL_ERROR;
1144  }
1145 
1146  __HAL_LOCK(huart);
1147 
1148  huart->ErrorCode = HAL_UART_ERROR_NONE;
1149  huart->RxState = HAL_UART_STATE_BUSY_RX;
1150 
1151  /* Init tickstart for timeout managment*/
1152  tickstart = HAL_GetTick();
1153 
1154  huart->RxXferSize = Size;
1155  huart->RxXferCount = Size;
1156 
1157  /* Computation of UART mask to apply to RDR register */
1158  UART_MASK_COMPUTATION(huart);
1159  uhMask = huart->Mask;
1160 
1161  /* In case of 9bits/No Parity transfer, pRxData needs to be handled as a uint16_t pointer */
1162  if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE))
1163  {
1164  pdata8bits = NULL;
1165  pdata16bits = (uint16_t *) pData;
1166  }
1167  else
1168  {
1169  pdata8bits = pData;
1170  pdata16bits = NULL;
1171  }
1172 
1173  /* as long as data have to be received */
1174  while (huart->RxXferCount > 0U)
1175  {
1176  if (UART_WaitOnFlagUntilTimeout(huart, UART_FLAG_RXNE, RESET, tickstart, Timeout) != HAL_OK)
1177  {
1178  return HAL_TIMEOUT;
1179  }
1180  if (pdata8bits == NULL)
1181  {
1182  *pdata16bits = (uint16_t)(huart->Instance->RDR & uhMask);
1183  pdata16bits++;
1184  }
1185  else
1186  {
1187  *pdata8bits = (uint8_t)(huart->Instance->RDR & (uint8_t)uhMask);
1188  pdata8bits++;
1189  }
1190  huart->RxXferCount--;
1191  }
1192 
1193  /* At end of Rx process, restore huart->RxState to Ready */
1194  huart->RxState = HAL_UART_STATE_READY;
1195 
1196  __HAL_UNLOCK(huart);
1197 
1198  return HAL_OK;
1199  }
1200  else
1201  {
1202  return HAL_BUSY;
1203  }
1204 }
__IO HAL_UART_StateTypeDef RxState
uint32_t HAL_GetTick(void)
Provide a tick value in millisecond.
__HAL_UNLOCK(hrtc)
__HAL_LOCK(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.

◆ HAL_UART_Receive_DMA()

HAL_StatusTypeDef HAL_UART_Receive_DMA ( UART_HandleTypeDef huart,
uint8_t *  pData,
uint16_t  Size 
)

Receive an amount of data in DMA mode.

Note
When the UART parity is enabled (PCE = 1), the received data contain the parity bit (MSB position).
Parameters
huartUART handle.
pDataPointer to data buffer.
SizeAmount of data to be received.
Return values
HALstatus

Definition at line 1469 of file stm32l4xx_hal_uart.c.

1470 {
1471  /* Check that a Rx process is not already ongoing */
1472  if (huart->RxState == HAL_UART_STATE_READY)
1473  {
1474  if ((pData == NULL) || (Size == 0U))
1475  {
1476  return HAL_ERROR;
1477  }
1478 
1479  __HAL_LOCK(huart);
1480 
1481  huart->pRxBuffPtr = pData;
1482  huart->RxXferSize = Size;
1483 
1484  huart->ErrorCode = HAL_UART_ERROR_NONE;
1485  huart->RxState = HAL_UART_STATE_BUSY_RX;
1486 
1487  if (huart->hdmarx != NULL)
1488  {
1489  /* Set the UART DMA transfer complete callback */
1491 
1492  /* Set the UART DMA Half transfer complete callback */
1494 
1495  /* Set the DMA error callback */
1497 
1498  /* Set the DMA abort callback */
1499  huart->hdmarx->XferAbortCallback = NULL;
1500 
1501  /* Enable the DMA channel */
1502  if (HAL_DMA_Start_IT(huart->hdmarx, (uint32_t)&huart->Instance->RDR, (uint32_t)huart->pRxBuffPtr, Size) != HAL_OK)
1503  {
1504  /* Set error code to DMA */
1505  huart->ErrorCode = HAL_UART_ERROR_DMA;
1506 
1507  __HAL_UNLOCK(huart);
1508 
1509  /* Restore huart->gState to ready */
1510  huart->gState = HAL_UART_STATE_READY;
1511 
1512  return HAL_ERROR;
1513  }
1514  }
1515  __HAL_UNLOCK(huart);
1516 
1517  /* Enable the UART Parity Error Interrupt */
1518  SET_BIT(huart->Instance->CR1, USART_CR1_PEIE);
1519 
1520  /* Enable the UART Error Interrupt: (Frame error, noise error, overrun error) */
1521  SET_BIT(huart->Instance->CR3, USART_CR3_EIE);
1522 
1523  /* Enable the DMA transfer for the receiver request by setting the DMAR bit
1524  in the UART CR3 register */
1525  SET_BIT(huart->Instance->CR3, USART_CR3_DMAR);
1526 
1527  return HAL_OK;
1528  }
1529  else
1530  {
1531  return HAL_BUSY;
1532  }
1533 }
void(* XferAbortCallback)(struct __DMA_HandleTypeDef *hdma)
__IO HAL_UART_StateTypeDef RxState
void(* XferCpltCallback)(struct __DMA_HandleTypeDef *hdma)
DMA_HandleTypeDef * hdmarx
static void UART_DMAError(DMA_HandleTypeDef *hdma)
DMA UART communication error callback.
void(* XferErrorCallback)(struct __DMA_HandleTypeDef *hdma)
__HAL_UNLOCK(hrtc)
void(* XferHalfCpltCallback)(struct __DMA_HandleTypeDef *hdma)
HAL_StatusTypeDef HAL_DMA_Start_IT(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength)
Start the DMA Transfer with interrupt enabled.
static void UART_DMAReceiveCplt(DMA_HandleTypeDef *hdma)
DMA UART receive process complete callback.
__HAL_LOCK(hrtc)
return HAL_OK
USART_TypeDef * Instance
static void UART_DMARxHalfCplt(DMA_HandleTypeDef *hdma)
DMA UART receive process half complete callback.
__IO HAL_UART_StateTypeDef gState

◆ HAL_UART_Receive_IT()

HAL_StatusTypeDef HAL_UART_Receive_IT ( UART_HandleTypeDef huart,
uint8_t *  pData,
uint16_t  Size 
)

Receive an amount of data in interrupt mode.

Parameters
huartUART handle.
pDataPointer to data buffer.
SizeAmount of data to be received.
Return values
HALstatus

Definition at line 1301 of file stm32l4xx_hal_uart.c.

1302 {
1303  /* Check that a Rx process is not already ongoing */
1304  if (huart->RxState == HAL_UART_STATE_READY)
1305  {
1306  if ((pData == NULL) || (Size == 0U))
1307  {
1308  return HAL_ERROR;
1309  }
1310 
1311  __HAL_LOCK(huart);
1312 
1313  huart->pRxBuffPtr = pData;
1314  huart->RxXferSize = Size;
1315  huart->RxXferCount = Size;
1316  huart->RxISR = NULL;
1317 
1318  /* Computation of UART mask to apply to RDR register */
1319  UART_MASK_COMPUTATION(huart);
1320 
1321  huart->ErrorCode = HAL_UART_ERROR_NONE;
1322  huart->RxState = HAL_UART_STATE_BUSY_RX;
1323 
1324  /* Enable the UART Error Interrupt: (Frame error, noise error, overrun error) */
1325  SET_BIT(huart->Instance->CR3, USART_CR3_EIE);
1326 
1327 #if defined(USART_CR1_FIFOEN)
1328  /* Configure Rx interrupt processing*/
1329  if ((huart->FifoMode == UART_FIFOMODE_ENABLE) && (Size >= huart->NbRxDataToProcess))
1330  {
1331  /* Set the Rx ISR function pointer according to the data word length */
1332  if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE))
1333  {
1334  huart->RxISR = UART_RxISR_16BIT_FIFOEN;
1335  }
1336  else
1337  {
1338  huart->RxISR = UART_RxISR_8BIT_FIFOEN;
1339  }
1340 
1341  __HAL_UNLOCK(huart);
1342 
1343  /* Enable the UART Parity Error interrupt and RX FIFO Threshold interrupt */
1344  SET_BIT(huart->Instance->CR1, USART_CR1_PEIE);
1345  SET_BIT(huart->Instance->CR3, USART_CR3_RXFTIE);
1346  }
1347  else
1348  {
1349  /* Set the Rx ISR function pointer according to the data word length */
1350  if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE))
1351  {
1352  huart->RxISR = UART_RxISR_16BIT;
1353  }
1354  else
1355  {
1356  huart->RxISR = UART_RxISR_8BIT;
1357  }
1358 
1359  __HAL_UNLOCK(huart);
1360 
1361  /* Enable the UART Parity Error interrupt and Data Register Not Empty interrupt */
1362  SET_BIT(huart->Instance->CR1, USART_CR1_PEIE | USART_CR1_RXNEIE_RXFNEIE);
1363  }
1364 #else
1365  /* Set the Rx ISR function pointer according to the data word length */
1366  if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE))
1367  {
1368  huart->RxISR = UART_RxISR_16BIT;
1369  }
1370  else
1371  {
1372  huart->RxISR = UART_RxISR_8BIT;
1373  }
1374 
1375  __HAL_UNLOCK(huart);
1376 
1377  /* Enable the UART Parity Error interrupt and Data Register Not Empty interrupt */
1378  SET_BIT(huart->Instance->CR1, USART_CR1_PEIE | USART_CR1_RXNEIE);
1379 #endif /* USART_CR1_FIFOEN */
1380 
1381  return HAL_OK;
1382  }
1383  else
1384  {
1385  return HAL_BUSY;
1386  }
1387 }
static void UART_RxISR_16BIT_FIFOEN(UART_HandleTypeDef *huart)
RX interrrupt handler for 9 bits data word length and FIFO mode is enabled.
__IO HAL_UART_StateTypeDef RxState
__HAL_UNLOCK(hrtc)
__HAL_LOCK(hrtc)
return HAL_OK
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.
USART_TypeDef * Instance
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 .
static void UART_RxISR_16BIT(UART_HandleTypeDef *huart)
RX interrrupt handler for 9 bits data word length .

◆ HAL_UART_RxCpltCallback()

__weak void HAL_UART_RxCpltCallback ( UART_HandleTypeDef huart)

Rx Transfer completed callback.

Parameters
huartUART handle.
Return values
None

Definition at line 2529 of file stm32l4xx_hal_uart.c.

2530 {
2531  /* Prevent unused argument(s) compilation warning */
2532  UNUSED(huart);
2533 
2534  /* NOTE : This function should not be modified, when the callback is needed,
2535  the HAL_UART_RxCpltCallback can be implemented in the user file.
2536  */
2537 }

◆ HAL_UART_RxHalfCpltCallback()

__weak void HAL_UART_RxHalfCpltCallback ( UART_HandleTypeDef huart)

Rx Half Transfer completed callback.

Parameters
huartUART handle.
Return values
None

Definition at line 2544 of file stm32l4xx_hal_uart.c.

2545 {
2546  /* Prevent unused argument(s) compilation warning */
2547  UNUSED(huart);
2548 
2549  /* NOTE: This function should not be modified, when the callback is needed,
2550  the HAL_UART_RxHalfCpltCallback can be implemented in the user file.
2551  */
2552 }

◆ HAL_UART_Transmit()

HAL_StatusTypeDef HAL_UART_Transmit ( UART_HandleTypeDef huart,
uint8_t *  pData,
uint16_t  Size,
uint32_t  Timeout 
)

Send an amount of data in blocking mode.

Note
When FIFO mode is enabled, writing a data in the TDR register adds one data to the TXFIFO. Write operations to the TDR register are performed when TXFNF flag is set. From hardware perspective, TXFNF flag and TXE are mapped on the same bit-field.
Parameters
huartUART handle.
pDataPointer to data buffer.
SizeAmount of data to be sent.
TimeoutTimeout duration.
Return values
HALstatus

Definition at line 1045 of file stm32l4xx_hal_uart.c.

1046 {
1047  uint8_t *pdata8bits;
1048  uint16_t *pdata16bits;
1049  uint32_t tickstart;
1050 
1051  /* Check that a Tx process is not already ongoing */
1052  if (huart->gState == HAL_UART_STATE_READY)
1053  {
1054  if ((pData == NULL) || (Size == 0U))
1055  {
1056  return HAL_ERROR;
1057  }
1058 
1059  __HAL_LOCK(huart);
1060 
1061  huart->ErrorCode = HAL_UART_ERROR_NONE;
1062  huart->gState = HAL_UART_STATE_BUSY_TX;
1063 
1064  /* Init tickstart for timeout managment*/
1065  tickstart = HAL_GetTick();
1066 
1067  huart->TxXferSize = Size;
1068  huart->TxXferCount = Size;
1069 
1070  /* In case of 9bits/No Parity transfer, pData needs to be handled as a uint16_t pointer */
1071  if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE))
1072  {
1073  pdata8bits = NULL;
1074  pdata16bits = (uint16_t *) pData;
1075  }
1076  else
1077  {
1078  pdata8bits = pData;
1079  pdata16bits = NULL;
1080  }
1081 
1082  while (huart->TxXferCount > 0U)
1083  {
1084  if (UART_WaitOnFlagUntilTimeout(huart, UART_FLAG_TXE, RESET, tickstart, Timeout) != HAL_OK)
1085  {
1086  return HAL_TIMEOUT;
1087  }
1088  if (pdata8bits == NULL)
1089  {
1090  huart->Instance->TDR = (uint16_t)(*pdata16bits & 0x01FFU);
1091  pdata16bits++;
1092  }
1093  else
1094  {
1095  huart->Instance->TDR = (uint8_t)(*pdata8bits & 0xFFU);
1096  pdata8bits++;
1097  }
1098  huart->TxXferCount--;
1099  }
1100 
1101  if (UART_WaitOnFlagUntilTimeout(huart, UART_FLAG_TC, RESET, tickstart, Timeout) != HAL_OK)
1102  {
1103  return HAL_TIMEOUT;
1104  }
1105 
1106  /* At end of Tx process, restore huart->gState to Ready */
1107  huart->gState = HAL_UART_STATE_READY;
1108 
1109  __HAL_UNLOCK(huart);
1110 
1111  return HAL_OK;
1112  }
1113  else
1114  {
1115  return HAL_BUSY;
1116  }
1117 }
uint32_t HAL_GetTick(void)
Provide a tick value in millisecond.
__HAL_UNLOCK(hrtc)
__HAL_LOCK(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

◆ HAL_UART_Transmit_DMA()

HAL_StatusTypeDef HAL_UART_Transmit_DMA ( UART_HandleTypeDef huart,
uint8_t *  pData,
uint16_t  Size 
)

Send an amount of data in DMA mode.

Parameters
huartUART handle.
pDataPointer to data buffer.
SizeAmount of data to be sent.
Return values
HALstatus

Definition at line 1396 of file stm32l4xx_hal_uart.c.

1397 {
1398  /* Check that a Tx process is not already ongoing */
1399  if (huart->gState == HAL_UART_STATE_READY)
1400  {
1401  if ((pData == NULL) || (Size == 0U))
1402  {
1403  return HAL_ERROR;
1404  }
1405 
1406  __HAL_LOCK(huart);
1407 
1408  huart->pTxBuffPtr = pData;
1409  huart->TxXferSize = Size;
1410  huart->TxXferCount = Size;
1411 
1412  huart->ErrorCode = HAL_UART_ERROR_NONE;
1413  huart->gState = HAL_UART_STATE_BUSY_TX;
1414 
1415  if (huart->hdmatx != NULL)
1416  {
1417  /* Set the UART DMA transfer complete callback */
1419 
1420  /* Set the UART DMA Half transfer complete callback */
1422 
1423  /* Set the DMA error callback */
1425 
1426  /* Set the DMA abort callback */
1427  huart->hdmatx->XferAbortCallback = NULL;
1428 
1429  /* Enable the UART transmit DMA channel */
1430  if (HAL_DMA_Start_IT(huart->hdmatx, (uint32_t)huart->pTxBuffPtr, (uint32_t)&huart->Instance->TDR, Size) != HAL_OK)
1431  {
1432  /* Set error code to DMA */
1433  huart->ErrorCode = HAL_UART_ERROR_DMA;
1434 
1435  __HAL_UNLOCK(huart);
1436 
1437  /* Restore huart->gState to ready */
1438  huart->gState = HAL_UART_STATE_READY;
1439 
1440  return HAL_ERROR;
1441  }
1442  }
1443  /* Clear the TC flag in the ICR register */
1444  __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_TCF);
1445 
1446  __HAL_UNLOCK(huart);
1447 
1448  /* Enable the DMA transfer for transmit request by setting the DMAT bit
1449  in the UART CR3 register */
1450  SET_BIT(huart->Instance->CR3, USART_CR3_DMAT);
1451 
1452  return HAL_OK;
1453  }
1454  else
1455  {
1456  return HAL_BUSY;
1457  }
1458 }
void(* XferAbortCallback)(struct __DMA_HandleTypeDef *hdma)
void(* XferCpltCallback)(struct __DMA_HandleTypeDef *hdma)
static void UART_DMAError(DMA_HandleTypeDef *hdma)
DMA UART communication error callback.
void(* XferErrorCallback)(struct __DMA_HandleTypeDef *hdma)
__HAL_UNLOCK(hrtc)
void(* XferHalfCpltCallback)(struct __DMA_HandleTypeDef *hdma)
HAL_StatusTypeDef HAL_DMA_Start_IT(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength)
Start the DMA Transfer with interrupt enabled.
__HAL_LOCK(hrtc)
return HAL_OK
USART_TypeDef * Instance
DMA_HandleTypeDef * hdmatx
static void UART_DMATransmitCplt(DMA_HandleTypeDef *hdma)
DMA UART transmit process complete callback.
static void UART_DMATxHalfCplt(DMA_HandleTypeDef *hdma)
DMA UART transmit process half complete callback.
__IO HAL_UART_StateTypeDef gState

◆ HAL_UART_Transmit_IT()

HAL_StatusTypeDef HAL_UART_Transmit_IT ( UART_HandleTypeDef huart,
uint8_t *  pData,
uint16_t  Size 
)

Send an amount of data in interrupt mode.

Parameters
huartUART handle.
pDataPointer to data buffer.
SizeAmount of data to be sent.
Return values
HALstatus

Definition at line 1213 of file stm32l4xx_hal_uart.c.

1214 {
1215  /* Check that a Tx process is not already ongoing */
1216  if (huart->gState == HAL_UART_STATE_READY)
1217  {
1218  if ((pData == NULL) || (Size == 0U))
1219  {
1220  return HAL_ERROR;
1221  }
1222 
1223  __HAL_LOCK(huart);
1224 
1225  huart->pTxBuffPtr = pData;
1226  huart->TxXferSize = Size;
1227  huart->TxXferCount = Size;
1228  huart->TxISR = NULL;
1229 
1230  huart->ErrorCode = HAL_UART_ERROR_NONE;
1231  huart->gState = HAL_UART_STATE_BUSY_TX;
1232 
1233 #if defined(USART_CR1_FIFOEN)
1234  /* Configure Tx interrupt processing */
1235  if (huart->FifoMode == UART_FIFOMODE_ENABLE)
1236  {
1237  /* Set the Tx ISR function pointer according to the data word length */
1238  if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE))
1239  {
1240  huart->TxISR = UART_TxISR_16BIT_FIFOEN;
1241  }
1242  else
1243  {
1244  huart->TxISR = UART_TxISR_8BIT_FIFOEN;
1245  }
1246 
1247  __HAL_UNLOCK(huart);
1248 
1249  /* Enable the TX FIFO threshold interrupt */
1250  SET_BIT(huart->Instance->CR3, USART_CR3_TXFTIE);
1251  }
1252  else
1253  {
1254  /* Set the Tx ISR function pointer according to the data word length */
1255  if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE))
1256  {
1257  huart->TxISR = UART_TxISR_16BIT;
1258  }
1259  else
1260  {
1261  huart->TxISR = UART_TxISR_8BIT;
1262  }
1263 
1264  __HAL_UNLOCK(huart);
1265 
1266  /* Enable the Transmit Data Register Empty interrupt */
1267  SET_BIT(huart->Instance->CR1, USART_CR1_TXEIE_TXFNFIE);
1268  }
1269 #else
1270  /* Set the Tx ISR function pointer according to the data word length */
1271  if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE))
1272  {
1273  huart->TxISR = UART_TxISR_16BIT;
1274  }
1275  else
1276  {
1277  huart->TxISR = UART_TxISR_8BIT;
1278  }
1279 
1280  __HAL_UNLOCK(huart);
1281 
1282  /* Enable the Transmit Data Register Empty interrupt */
1283  SET_BIT(huart->Instance->CR1, USART_CR1_TXEIE);
1284 #endif /* USART_CR1_FIFOEN */
1285 
1286  return HAL_OK;
1287  }
1288  else
1289  {
1290  return HAL_BUSY;
1291  }
1292 }
void(* TxISR)(struct __UART_HandleTypeDef *huart)
__HAL_UNLOCK(hrtc)
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.
__HAL_LOCK(hrtc)
return HAL_OK
USART_TypeDef * Instance
static void UART_TxISR_16BIT(UART_HandleTypeDef *huart)
TX interrrupt handler for 9 bits data word length.
static void UART_TxISR_16BIT_FIFOEN(UART_HandleTypeDef *huart)
TX interrrupt handler for 9 bits data word length and FIFO mode is enabled.
__IO HAL_UART_StateTypeDef gState
static void UART_TxISR_8BIT(UART_HandleTypeDef *huart)
TX interrrupt handler for 7 or 8 bits data word length .

◆ HAL_UART_TxCpltCallback()

__weak void HAL_UART_TxCpltCallback ( UART_HandleTypeDef huart)

Tx Transfer completed callback.

Parameters
huartUART handle.
Return values
None

Definition at line 2499 of file stm32l4xx_hal_uart.c.

2500 {
2501  /* Prevent unused argument(s) compilation warning */
2502  UNUSED(huart);
2503 
2504  /* NOTE : This function should not be modified, when the callback is needed,
2505  the HAL_UART_TxCpltCallback can be implemented in the user file.
2506  */
2507 }

◆ HAL_UART_TxHalfCpltCallback()

__weak void HAL_UART_TxHalfCpltCallback ( UART_HandleTypeDef huart)

Tx Half Transfer completed callback.

Parameters
huartUART handle.
Return values
None

Definition at line 2514 of file stm32l4xx_hal_uart.c.

2515 {
2516  /* Prevent unused argument(s) compilation warning */
2517  UNUSED(huart);
2518 
2519  /* NOTE: This function should not be modified, when the callback is needed,
2520  the HAL_UART_TxHalfCpltCallback can be implemented in the user file.
2521  */
2522 }