STM32L4xx_HAL_Driver  1.14.0

USART Transmit and Receive functions. More...

Functions

HAL_StatusTypeDef HAL_USART_Transmit (USART_HandleTypeDef *husart, uint8_t *pTxData, uint16_t Size, uint32_t Timeout)
 Simplex send an amount of data in blocking mode. More...
 
HAL_StatusTypeDef HAL_USART_Receive (USART_HandleTypeDef *husart, uint8_t *pRxData, uint16_t Size, uint32_t Timeout)
 Receive an amount of data in blocking mode. More...
 
HAL_StatusTypeDef HAL_USART_TransmitReceive (USART_HandleTypeDef *husart, uint8_t *pTxData, uint8_t *pRxData, uint16_t Size, uint32_t Timeout)
 Full-Duplex Send and Receive an amount of data in blocking mode. More...
 
HAL_StatusTypeDef HAL_USART_Transmit_IT (USART_HandleTypeDef *husart, uint8_t *pTxData, uint16_t Size)
 Send an amount of data in interrupt mode. More...
 
HAL_StatusTypeDef HAL_USART_Receive_IT (USART_HandleTypeDef *husart, uint8_t *pRxData, uint16_t Size)
 Receive an amount of data in interrupt mode. More...
 
HAL_StatusTypeDef HAL_USART_TransmitReceive_IT (USART_HandleTypeDef *husart, uint8_t *pTxData, uint8_t *pRxData, uint16_t Size)
 Full-Duplex Send and Receive an amount of data in interrupt mode. More...
 
HAL_StatusTypeDef HAL_USART_Transmit_DMA (USART_HandleTypeDef *husart, uint8_t *pTxData, uint16_t Size)
 Send an amount of data in DMA mode. More...
 
HAL_StatusTypeDef HAL_USART_Receive_DMA (USART_HandleTypeDef *husart, uint8_t *pRxData, uint16_t Size)
 Receive an amount of data in DMA mode. More...
 
HAL_StatusTypeDef HAL_USART_TransmitReceive_DMA (USART_HandleTypeDef *husart, uint8_t *pTxData, uint8_t *pRxData, uint16_t Size)
 Full-Duplex Transmit Receive an amount of data in non-blocking mode. More...
 
HAL_StatusTypeDef HAL_USART_DMAPause (USART_HandleTypeDef *husart)
 Pause the DMA Transfer. More...
 
HAL_StatusTypeDef HAL_USART_DMAResume (USART_HandleTypeDef *husart)
 Resume the DMA Transfer. More...
 
HAL_StatusTypeDef HAL_USART_DMAStop (USART_HandleTypeDef *husart)
 Stop the DMA Transfer. More...
 
HAL_StatusTypeDef HAL_USART_Abort (USART_HandleTypeDef *husart)
 Abort ongoing transfers (blocking mode). More...
 
HAL_StatusTypeDef HAL_USART_Abort_IT (USART_HandleTypeDef *husart)
 Abort ongoing transfers (Interrupt mode). More...
 
void HAL_USART_IRQHandler (USART_HandleTypeDef *husart)
 Handle USART interrupt request. More...
 
void HAL_USART_TxHalfCpltCallback (USART_HandleTypeDef *husart)
 Tx Half Transfer completed callback. More...
 
void HAL_USART_TxCpltCallback (USART_HandleTypeDef *husart)
 Tx Transfer completed callback. More...
 
void HAL_USART_RxCpltCallback (USART_HandleTypeDef *husart)
 Rx Transfer completed callback. More...
 
void HAL_USART_RxHalfCpltCallback (USART_HandleTypeDef *husart)
 Rx Half Transfer completed callback. More...
 
void HAL_USART_TxRxCpltCallback (USART_HandleTypeDef *husart)
 Tx/Rx Transfers completed callback for the non-blocking process. More...
 
void HAL_USART_ErrorCallback (USART_HandleTypeDef *husart)
 USART error callback. More...
 
void HAL_USART_AbortCpltCallback (USART_HandleTypeDef *husart)
 USART Abort Complete callback. More...
 

Detailed Description

USART Transmit and Receive functions.

 ===============================================================================
                      ##### IO operation functions #####
 ===============================================================================
    [..] This subsection provides a set of functions allowing to manage the USART synchronous
    data transfers.

    [..] The USART supports master mode only: it cannot receive or send data related to an input
         clock (SCLK is always an output).

    [..]

    (#) There are two modes 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.
        (++) No-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 USART IRQ when using Interrupt mode or the DMA IRQ when
             using DMA mode.
             The HAL_USART_TxCpltCallback(), HAL_USART_RxCpltCallback() and HAL_USART_TxRxCpltCallback() user callbacks
             will be executed respectively at the end of the transmit or Receive process
             The HAL_USART_ErrorCallback()user callback will be executed when a communication error is detected

    (#) Blocking mode API's are :
        (++) HAL_USART_Transmit() in simplex mode
        (++) HAL_USART_Receive() in full duplex receive only
        (++) HAL_USART_TransmitReceive() in full duplex mode

    (#) Non-Blocking mode API's with Interrupt are :
        (++) HAL_USART_Transmit_IT() in simplex mode
        (++) HAL_USART_Receive_IT() in full duplex receive only
        (++) HAL_USART_TransmitReceive_IT() in full duplex mode
        (++) HAL_USART_IRQHandler()

    (#) No-Blocking mode API's  with DMA are :
        (++) HAL_USART_Transmit_DMA() in simplex mode
        (++) HAL_USART_Receive_DMA() in full duplex receive only
        (++) HAL_USART_TransmitReceive_DMA() in full duplex mode
        (++) HAL_USART_DMAPause()
        (++) HAL_USART_DMAResume()
        (++) HAL_USART_DMAStop()

    (#) A set of Transfer Complete Callbacks are provided in Non_Blocking mode:
        (++) HAL_USART_TxCpltCallback()
        (++) HAL_USART_RxCpltCallback()
        (++) HAL_USART_TxHalfCpltCallback()
        (++) HAL_USART_RxHalfCpltCallback()
        (++) HAL_USART_ErrorCallback()
        (++) HAL_USART_TxRxCpltCallback()

    (#) Non-Blocking mode transfers could be aborted using Abort API's :
        (++) HAL_USART_Abort()
        (++) HAL_USART_Abort_IT()

    (#) For Abort services based on interrupts (HAL_USART_Abort_IT), a Abort Complete Callbacks is provided:
        (++) HAL_USART_AbortCpltCallback()

    (#) 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_USART_ErrorCallback() user callback is executed. Transfer is kept ongoing on USART 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_USART_ErrorCallback() user callback is executed.

Function Documentation

◆ HAL_USART_Abort()

HAL_StatusTypeDef HAL_USART_Abort ( USART_HandleTypeDef husart)

Abort ongoing transfers (blocking mode).

Parameters
husartUSART handle.
Note
This procedure could be used for aborting any ongoing transfer started in Interrupt or DMA mode. This procedure performs following operations :
  • Disable USART 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 1879 of file stm32l4xx_hal_usart.c.

1880 {
1881 #if defined(USART_CR1_FIFOEN)
1882  /* Disable TXEIE, TCIE, RXNE, RXFT, TXFT, PE and ERR (Frame error, noise error, overrun error) interrupts */
1883  CLEAR_BIT(husart->Instance->CR1, (USART_CR1_RXNEIE_RXFNEIE | USART_CR1_PEIE | USART_CR1_TXEIE_TXFNFIE |
1884  USART_CR1_TCIE));
1885  CLEAR_BIT(husart->Instance->CR3, (USART_CR3_EIE | USART_CR3_RXFTIE | USART_CR3_TXFTIE));
1886 #else
1887  CLEAR_BIT(husart->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE | USART_CR1_TXEIE | USART_CR1_TCIE));
1888  CLEAR_BIT(husart->Instance->CR3, USART_CR3_EIE);
1889 #endif /* USART_CR1_FIFOEN */
1890 
1891  /* Disable the USART DMA Tx request if enabled */
1892  if (HAL_IS_BIT_SET(husart->Instance->CR3, USART_CR3_DMAT))
1893  {
1894  CLEAR_BIT(husart->Instance->CR3, USART_CR3_DMAT);
1895 
1896  /* Abort the USART DMA Tx channel : use blocking DMA Abort API (no callback) */
1897  if (husart->hdmatx != NULL)
1898  {
1899  /* Set the USART DMA Abort callback to Null.
1900  No call back execution at end of DMA abort procedure */
1901  husart->hdmatx->XferAbortCallback = NULL;
1902 
1903  if (HAL_DMA_Abort(husart->hdmatx) != HAL_OK)
1904  {
1905  if (HAL_DMA_GetError(husart->hdmatx) == HAL_DMA_ERROR_TIMEOUT)
1906  {
1907  /* Set error code to DMA */
1908  husart->ErrorCode = HAL_USART_ERROR_DMA;
1909 
1910  return HAL_TIMEOUT;
1911  }
1912  }
1913  }
1914  }
1915 
1916  /* Disable the USART DMA Rx request if enabled */
1917  if (HAL_IS_BIT_SET(husart->Instance->CR3, USART_CR3_DMAR))
1918  {
1919  CLEAR_BIT(husart->Instance->CR3, USART_CR3_DMAR);
1920 
1921  /* Abort the USART DMA Rx channel : use blocking DMA Abort API (no callback) */
1922  if (husart->hdmarx != NULL)
1923  {
1924  /* Set the USART DMA Abort callback to Null.
1925  No call back execution at end of DMA abort procedure */
1926  husart->hdmarx->XferAbortCallback = NULL;
1927 
1928  if (HAL_DMA_Abort(husart->hdmarx) != HAL_OK)
1929  {
1930  if (HAL_DMA_GetError(husart->hdmarx) == HAL_DMA_ERROR_TIMEOUT)
1931  {
1932  /* Set error code to DMA */
1933  husart->ErrorCode = HAL_USART_ERROR_DMA;
1934 
1935  return HAL_TIMEOUT;
1936  }
1937  }
1938  }
1939  }
1940 
1941  /* Reset Tx and Rx transfer counters */
1942  husart->TxXferCount = 0U;
1943  husart->RxXferCount = 0U;
1944 
1945  /* Clear the Error flags in the ICR register */
1946  __HAL_USART_CLEAR_FLAG(husart, USART_CLEAR_OREF | USART_CLEAR_NEF | USART_CLEAR_PEF | USART_CLEAR_FEF);
1947 
1948 #if defined(USART_CR1_FIFOEN)
1949  /* Flush the whole TX FIFO (if needed) */
1950  if (husart->FifoMode == USART_FIFOMODE_ENABLE)
1951  {
1952  __HAL_USART_SEND_REQ(husart, USART_TXDATA_FLUSH_REQUEST);
1953  }
1954 #endif /* USART_CR1_FIFOEN */
1955 
1956  /* Discard the received data */
1957  __HAL_USART_SEND_REQ(husart, USART_RXDATA_FLUSH_REQUEST);
1958 
1959  /* Restore husart->State to Ready */
1960  husart->State = HAL_USART_STATE_READY;
1961 
1962  /* Reset Handle ErrorCode to No Error */
1963  husart->ErrorCode = HAL_USART_ERROR_NONE;
1964 
1965  return HAL_OK;
1966 }
__IO HAL_USART_StateTypeDef State
void(* XferAbortCallback)(struct __DMA_HandleTypeDef *hdma)
CLEAR_BIT(hrtc->Instance->CR, RTC_CR_WUTE)
return HAL_OK
HAL_StatusTypeDef HAL_DMA_Abort(DMA_HandleTypeDef *hdma)
Abort the DMA Transfer.
DMA_HandleTypeDef * hdmatx
DMA_HandleTypeDef * hdmarx
uint32_t HAL_DMA_GetError(DMA_HandleTypeDef *hdma)
Return the DMA error code.

◆ HAL_USART_Abort_IT()

HAL_StatusTypeDef HAL_USART_Abort_IT ( USART_HandleTypeDef husart)

Abort ongoing transfers (Interrupt mode).

Parameters
husartUSART handle.
Note
This procedure could be used for aborting any ongoing transfer started in Interrupt or DMA mode. This procedure performs following operations :
  • Disable USART 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 1982 of file stm32l4xx_hal_usart.c.

1983 {
1984  uint32_t abortcplt = 1U;
1985 
1986 #if defined(USART_CR1_FIFOEN)
1987  /* Disable TXEIE, TCIE, RXNE, RXFT, TXFT, PE and ERR (Frame error, noise error, overrun error) interrupts */
1988  CLEAR_BIT(husart->Instance->CR1, (USART_CR1_RXNEIE_RXFNEIE | USART_CR1_PEIE | USART_CR1_TXEIE_TXFNFIE |
1989  USART_CR1_TCIE));
1990  CLEAR_BIT(husart->Instance->CR3, (USART_CR3_EIE | USART_CR3_RXFTIE | USART_CR3_TXFTIE));
1991 #else
1992  CLEAR_BIT(husart->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE | USART_CR1_TXEIE | USART_CR1_TCIE));
1993  CLEAR_BIT(husart->Instance->CR3, USART_CR3_EIE);
1994 #endif /* USART_CR1_FIFOEN */
1995 
1996  /* If DMA Tx and/or DMA Rx Handles are associated to USART Handle, DMA Abort complete callbacks should be initialised
1997  before any call to DMA Abort functions */
1998  /* DMA Tx Handle is valid */
1999  if (husart->hdmatx != NULL)
2000  {
2001  /* Set DMA Abort Complete callback if USART DMA Tx request if enabled.
2002  Otherwise, set it to NULL */
2003  if (HAL_IS_BIT_SET(husart->Instance->CR3, USART_CR3_DMAT))
2004  {
2006  }
2007  else
2008  {
2009  husart->hdmatx->XferAbortCallback = NULL;
2010  }
2011  }
2012  /* DMA Rx Handle is valid */
2013  if (husart->hdmarx != NULL)
2014  {
2015  /* Set DMA Abort Complete callback if USART DMA Rx request if enabled.
2016  Otherwise, set it to NULL */
2017  if (HAL_IS_BIT_SET(husart->Instance->CR3, USART_CR3_DMAR))
2018  {
2020  }
2021  else
2022  {
2023  husart->hdmarx->XferAbortCallback = NULL;
2024  }
2025  }
2026 
2027  /* Disable the USART DMA Tx request if enabled */
2028  if (HAL_IS_BIT_SET(husart->Instance->CR3, USART_CR3_DMAT))
2029  {
2030  /* Disable DMA Tx at USART level */
2031  CLEAR_BIT(husart->Instance->CR3, USART_CR3_DMAT);
2032 
2033  /* Abort the USART DMA Tx channel : use non blocking DMA Abort API (callback) */
2034  if (husart->hdmatx != NULL)
2035  {
2036  /* USART Tx DMA Abort callback has already been initialised :
2037  will lead to call HAL_USART_AbortCpltCallback() at end of DMA abort procedure */
2038 
2039  /* Abort DMA TX */
2040  if (HAL_DMA_Abort_IT(husart->hdmatx) != HAL_OK)
2041  {
2042  husart->hdmatx->XferAbortCallback = NULL;
2043  }
2044  else
2045  {
2046  abortcplt = 0U;
2047  }
2048  }
2049  }
2050 
2051  /* Disable the USART DMA Rx request if enabled */
2052  if (HAL_IS_BIT_SET(husart->Instance->CR3, USART_CR3_DMAR))
2053  {
2054  CLEAR_BIT(husart->Instance->CR3, USART_CR3_DMAR);
2055 
2056  /* Abort the USART DMA Rx channel : use non blocking DMA Abort API (callback) */
2057  if (husart->hdmarx != NULL)
2058  {
2059  /* USART Rx DMA Abort callback has already been initialised :
2060  will lead to call HAL_USART_AbortCpltCallback() at end of DMA abort procedure */
2061 
2062  /* Abort DMA RX */
2063  if (HAL_DMA_Abort_IT(husart->hdmarx) != HAL_OK)
2064  {
2065  husart->hdmarx->XferAbortCallback = NULL;
2066  abortcplt = 1U;
2067  }
2068  else
2069  {
2070  abortcplt = 0U;
2071  }
2072  }
2073  }
2074 
2075  /* if no DMA abort complete callback execution is required => call user Abort Complete callback */
2076  if (abortcplt == 1U)
2077  {
2078  /* Reset Tx and Rx transfer counters */
2079  husart->TxXferCount = 0U;
2080  husart->RxXferCount = 0U;
2081 
2082  /* Reset errorCode */
2083  husart->ErrorCode = HAL_USART_ERROR_NONE;
2084 
2085  /* Clear the Error flags in the ICR register */
2086  __HAL_USART_CLEAR_FLAG(husart, USART_CLEAR_OREF | USART_CLEAR_NEF | USART_CLEAR_PEF | USART_CLEAR_FEF);
2087 
2088 #if defined(USART_CR1_FIFOEN)
2089  /* Flush the whole TX FIFO (if needed) */
2090  if (husart->FifoMode == USART_FIFOMODE_ENABLE)
2091  {
2092  __HAL_USART_SEND_REQ(husart, USART_TXDATA_FLUSH_REQUEST);
2093  }
2094 #endif /* USART_CR1_FIFOEN */
2095 
2096  /* Discard the received data */
2097  __HAL_USART_SEND_REQ(husart, USART_RXDATA_FLUSH_REQUEST);
2098 
2099  /* Restore husart->State to Ready */
2100  husart->State = HAL_USART_STATE_READY;
2101 
2102  /* As no DMA to be aborted, call directly user Abort complete callback */
2103 #if (USE_HAL_USART_REGISTER_CALLBACKS == 1)
2104  /* Call registered Abort Complete Callback */
2105  husart->AbortCpltCallback(husart);
2106 #else
2107  /* Call legacy weak Abort Complete Callback */
2109 #endif /* USE_HAL_USART_REGISTER_CALLBACKS */
2110  }
2111 
2112  return HAL_OK;
2113 }
__IO HAL_USART_StateTypeDef State
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)
static void USART_DMATxAbortCallback(DMA_HandleTypeDef *hdma)
DMA USART Tx communication abort callback, when initiated by user (To be called at end of DMA Tx Abor...
return HAL_OK
DMA_HandleTypeDef * hdmatx
void HAL_USART_AbortCpltCallback(USART_HandleTypeDef *husart)
USART Abort Complete callback.
DMA_HandleTypeDef * hdmarx
void(* AbortCpltCallback)(struct __USART_HandleTypeDef *husart)
static void USART_DMARxAbortCallback(DMA_HandleTypeDef *hdma)
DMA USART Rx communication abort callback, when initiated by user (To be called at end of DMA Rx Abor...

◆ HAL_USART_AbortCpltCallback()

__weak void HAL_USART_AbortCpltCallback ( USART_HandleTypeDef husart)

USART Abort Complete callback.

Parameters
husartUSART handle.
Return values
None

Definition at line 2475 of file stm32l4xx_hal_usart.c.

2476 {
2477  /* Prevent unused argument(s) compilation warning */
2478  UNUSED(husart);
2479 
2480  /* NOTE : This function should not be modified, when the callback is needed,
2481  the HAL_USART_AbortCpltCallback can be implemented in the user file.
2482  */
2483 }

◆ HAL_USART_DMAPause()

HAL_StatusTypeDef HAL_USART_DMAPause ( USART_HandleTypeDef husart)

Pause the DMA Transfer.

Parameters
husartUSART handle.
Return values
HALstatus

Definition at line 1728 of file stm32l4xx_hal_usart.c.

1729 {
1730  const HAL_USART_StateTypeDef state = husart->State;
1731 
1732  /* Process Locked */
1733  __HAL_LOCK(husart);
1734 
1735  if ((HAL_IS_BIT_SET(husart->Instance->CR3, USART_CR3_DMAT)) &&
1736  (state == HAL_USART_STATE_BUSY_TX))
1737  {
1738  /* Disable the USART DMA Tx request */
1739  CLEAR_BIT(husart->Instance->CR3, USART_CR3_DMAT);
1740  }
1741  else if ((state == HAL_USART_STATE_BUSY_RX) ||
1742  (state == HAL_USART_STATE_BUSY_TX_RX))
1743  {
1744  if (HAL_IS_BIT_SET(husart->Instance->CR3, USART_CR3_DMAT))
1745  {
1746  /* Disable the USART DMA Tx request */
1747  CLEAR_BIT(husart->Instance->CR3, USART_CR3_DMAT);
1748  }
1749  if (HAL_IS_BIT_SET(husart->Instance->CR3, USART_CR3_DMAR))
1750  {
1751  /* Disable PE and ERR (Frame error, noise error, overrun error) interrupts */
1752  CLEAR_BIT(husart->Instance->CR1, USART_CR1_PEIE);
1753  CLEAR_BIT(husart->Instance->CR3, USART_CR3_EIE);
1754 
1755  /* Disable the USART DMA Rx request */
1756  CLEAR_BIT(husart->Instance->CR3, USART_CR3_DMAR);
1757  }
1758  }
1759  else
1760  {
1761  /* Nothing to do */
1762  }
1763 
1764  /* Process Unlocked */
1765  __HAL_UNLOCK(husart);
1766 
1767  return HAL_OK;
1768 }
__IO HAL_USART_StateTypeDef State
__HAL_UNLOCK(hrtc)
HAL_USART_StateTypeDef
HAL USART State structures definition.
CLEAR_BIT(hrtc->Instance->CR, RTC_CR_WUTE)
__HAL_LOCK(hrtc)
return HAL_OK

◆ HAL_USART_DMAResume()

HAL_StatusTypeDef HAL_USART_DMAResume ( USART_HandleTypeDef husart)

Resume the DMA Transfer.

Parameters
husartUSART handle.
Return values
HALstatus

Definition at line 1775 of file stm32l4xx_hal_usart.c.

1776 {
1777  const HAL_USART_StateTypeDef state = husart->State;
1778 
1779  /* Process Locked */
1780  __HAL_LOCK(husart);
1781 
1782  if (state == HAL_USART_STATE_BUSY_TX)
1783  {
1784  /* Enable the USART DMA Tx request */
1785  SET_BIT(husart->Instance->CR3, USART_CR3_DMAT);
1786  }
1787  else if ((state == HAL_USART_STATE_BUSY_RX) ||
1788  (state == HAL_USART_STATE_BUSY_TX_RX))
1789  {
1790  /* Clear the Overrun flag before resuming the Rx transfer*/
1791  __HAL_USART_CLEAR_FLAG(husart, USART_CLEAR_OREF);
1792 
1793  /* Reenable PE and ERR (Frame error, noise error, overrun error) interrupts */
1794  SET_BIT(husart->Instance->CR1, USART_CR1_PEIE);
1795  SET_BIT(husart->Instance->CR3, USART_CR3_EIE);
1796 
1797  /* Enable the USART DMA Rx request before the DMA Tx request */
1798  SET_BIT(husart->Instance->CR3, USART_CR3_DMAR);
1799 
1800  /* Enable the USART DMA Tx request */
1801  SET_BIT(husart->Instance->CR3, USART_CR3_DMAT);
1802  }
1803  else
1804  {
1805  /* Nothing to do */
1806  }
1807 
1808  /* Process Unlocked */
1809  __HAL_UNLOCK(husart);
1810 
1811  return HAL_OK;
1812 }
__IO HAL_USART_StateTypeDef State
__HAL_UNLOCK(hrtc)
HAL_USART_StateTypeDef
HAL USART State structures definition.
__HAL_LOCK(hrtc)
return HAL_OK

◆ HAL_USART_DMAStop()

HAL_StatusTypeDef HAL_USART_DMAStop ( USART_HandleTypeDef husart)

Stop the DMA Transfer.

Parameters
husartUSART handle.
Return values
HALstatus

Definition at line 1819 of file stm32l4xx_hal_usart.c.

1820 {
1821  /* The Lock is not implemented on this API to allow the user application
1822  to call the HAL USART API under callbacks HAL_USART_TxCpltCallback() / HAL_USART_RxCpltCallback() /
1823  HAL_USART_TxHalfCpltCallback / HAL_USART_RxHalfCpltCallback:
1824  indeed, when HAL_DMA_Abort() API is called, the DMA TX/RX Transfer or Half Transfer complete
1825  interrupt is generated if the DMA transfer interruption occurs at the middle or at the end of
1826  the stream and the corresponding call back is executed. */
1827 
1828  /* Disable the USART Tx/Rx DMA requests */
1829  CLEAR_BIT(husart->Instance->CR3, USART_CR3_DMAT);
1830  CLEAR_BIT(husart->Instance->CR3, USART_CR3_DMAR);
1831 
1832  /* Abort the USART DMA tx channel */
1833  if (husart->hdmatx != NULL)
1834  {
1835  if (HAL_DMA_Abort(husart->hdmatx) != HAL_OK)
1836  {
1837  if (HAL_DMA_GetError(husart->hdmatx) == HAL_DMA_ERROR_TIMEOUT)
1838  {
1839  /* Set error code to DMA */
1840  husart->ErrorCode = HAL_USART_ERROR_DMA;
1841 
1842  return HAL_TIMEOUT;
1843  }
1844  }
1845  }
1846  /* Abort the USART DMA rx channel */
1847  if (husart->hdmarx != NULL)
1848  {
1849  if (HAL_DMA_Abort(husart->hdmarx) != HAL_OK)
1850  {
1851  if (HAL_DMA_GetError(husart->hdmarx) == HAL_DMA_ERROR_TIMEOUT)
1852  {
1853  /* Set error code to DMA */
1854  husart->ErrorCode = HAL_USART_ERROR_DMA;
1855 
1856  return HAL_TIMEOUT;
1857  }
1858  }
1859  }
1860 
1861  USART_EndTransfer(husart);
1862  husart->State = HAL_USART_STATE_READY;
1863 
1864  return HAL_OK;
1865 }
__IO HAL_USART_StateTypeDef State
CLEAR_BIT(hrtc->Instance->CR, RTC_CR_WUTE)
return HAL_OK
HAL_StatusTypeDef HAL_DMA_Abort(DMA_HandleTypeDef *hdma)
Abort the DMA Transfer.
static void USART_EndTransfer(USART_HandleTypeDef *husart)
End ongoing transfer on USART peripheral (following error detection or Transfer completion).
DMA_HandleTypeDef * hdmatx
DMA_HandleTypeDef * hdmarx
uint32_t HAL_DMA_GetError(DMA_HandleTypeDef *hdma)
Return the DMA error code.

◆ HAL_USART_ErrorCallback()

__weak void HAL_USART_ErrorCallback ( USART_HandleTypeDef husart)

USART error callback.

Parameters
husartUSART handle.
Return values
None

Definition at line 2460 of file stm32l4xx_hal_usart.c.

2461 {
2462  /* Prevent unused argument(s) compilation warning */
2463  UNUSED(husart);
2464 
2465  /* NOTE : This function should not be modified, when the callback is needed,
2466  the HAL_USART_ErrorCallback can be implemented in the user file.
2467  */
2468 }

◆ HAL_USART_IRQHandler()

void HAL_USART_IRQHandler ( USART_HandleTypeDef husart)

Handle USART interrupt request.

Parameters
husartUSART handle.
Return values
None

Definition at line 2120 of file stm32l4xx_hal_usart.c.

2121 {
2122  uint32_t isrflags = READ_REG(husart->Instance->ISR);
2123  uint32_t cr1its = READ_REG(husart->Instance->CR1);
2124  uint32_t cr3its = READ_REG(husart->Instance->CR3);
2125 
2126  uint32_t errorflags;
2127  uint32_t errorcode;
2128 
2129  /* If no error occurs */
2130 #if defined(USART_CR2_SLVEN)
2131  errorflags = (isrflags & (uint32_t)(USART_ISR_PE | USART_ISR_FE | USART_ISR_ORE | USART_ISR_NE | USART_ISR_UDR));
2132 #else
2133  errorflags = (isrflags & (uint32_t)(USART_ISR_PE | USART_ISR_FE | USART_ISR_ORE | USART_ISR_NE));
2134 #endif /* USART_CR2_SLVEN */
2135  if (errorflags == 0U)
2136  {
2137  /* USART in mode Receiver ---------------------------------------------------*/
2138 #if defined(USART_CR1_FIFOEN)
2139  if (((isrflags & USART_ISR_RXNE_RXFNE) != 0U)
2140  && (((cr1its & USART_CR1_RXNEIE_RXFNEIE) != 0U)
2141  || ((cr3its & USART_CR3_RXFTIE) != 0U)))
2142 #else
2143  if (((isrflags & USART_ISR_RXNE) != 0U)
2144  && ((cr1its & USART_CR1_RXNEIE) != 0U))
2145 #endif /* USART_CR1_FIFOEN */
2146  {
2147  if (husart->RxISR != NULL)
2148  {
2149  husart->RxISR(husart);
2150  }
2151  return;
2152  }
2153  }
2154 
2155  /* If some errors occur */
2156 #if defined(USART_CR1_FIFOEN)
2157  if ((errorflags != 0U)
2158  && (((cr3its & (USART_CR3_RXFTIE | USART_CR3_EIE)) != 0U)
2159  || ((cr1its & (USART_CR1_RXNEIE_RXFNEIE | USART_CR1_PEIE)) != 0U)))
2160 #else
2161  if ((errorflags != 0U)
2162  && (((cr3its & USART_CR3_EIE) != 0U)
2163  || ((cr1its & (USART_CR1_RXNEIE | USART_CR1_PEIE)) != 0U)))
2164 #endif /* USART_CR1_FIFOEN */
2165  {
2166  /* USART parity error interrupt occurred -------------------------------------*/
2167  if (((isrflags & USART_ISR_PE) != 0U) && ((cr1its & USART_CR1_PEIE) != 0U))
2168  {
2169  __HAL_USART_CLEAR_IT(husart, USART_CLEAR_PEF);
2170 
2171  husart->ErrorCode |= HAL_USART_ERROR_PE;
2172  }
2173 
2174  /* USART frame error interrupt occurred --------------------------------------*/
2175  if (((isrflags & USART_ISR_FE) != 0U) && ((cr3its & USART_CR3_EIE) != 0U))
2176  {
2177  __HAL_USART_CLEAR_IT(husart, USART_CLEAR_FEF);
2178 
2179  husart->ErrorCode |= HAL_USART_ERROR_FE;
2180  }
2181 
2182  /* USART noise error interrupt occurred --------------------------------------*/
2183  if (((isrflags & USART_ISR_NE) != 0U) && ((cr3its & USART_CR3_EIE) != 0U))
2184  {
2185  __HAL_USART_CLEAR_IT(husart, USART_CLEAR_NEF);
2186 
2187  husart->ErrorCode |= HAL_USART_ERROR_NE;
2188  }
2189 
2190  /* USART Over-Run interrupt occurred -----------------------------------------*/
2191 #if defined(USART_CR1_FIFOEN)
2192  if (((isrflags & USART_ISR_ORE) != 0U)
2193  && (((cr1its & USART_CR1_RXNEIE_RXFNEIE) != 0U) ||
2194  ((cr3its & (USART_CR3_RXFTIE | USART_CR3_EIE)) != 0U)))
2195 #else
2196  if (((isrflags & USART_ISR_ORE) != 0U)
2197  && (((cr1its & USART_CR1_RXNEIE) != 0U) ||
2198  ((cr3its & USART_CR3_EIE) != 0U)))
2199 #endif /* USART_CR1_FIFOEN */
2200  {
2201  __HAL_USART_CLEAR_IT(husart, USART_CLEAR_OREF);
2202 
2203  husart->ErrorCode |= HAL_USART_ERROR_ORE;
2204  }
2205 
2206 #if defined(USART_CR2_SLVEN)
2207  /* USART SPI slave underrun error interrupt occurred -------------------------*/
2208  if (((isrflags & USART_ISR_UDR) != 0U) && ((cr3its & USART_CR3_EIE) != 0U))
2209  {
2210  /* Ignore SPI slave underrun errors when reception is going on */
2211  if (husart->State == HAL_USART_STATE_BUSY_RX)
2212  {
2213  __HAL_USART_CLEAR_UDRFLAG(husart);
2214  return;
2215  }
2216  else
2217  {
2218  __HAL_USART_CLEAR_UDRFLAG(husart);
2219  husart->ErrorCode |= HAL_USART_ERROR_UDR;
2220  }
2221  }
2222 #endif /* USART_CR2_SLVEN */
2223 
2224  /* Call USART Error Call back function if need be --------------------------*/
2225  if (husart->ErrorCode != HAL_USART_ERROR_NONE)
2226  {
2227  /* USART in mode Receiver ---------------------------------------------------*/
2228 #if defined(USART_CR1_FIFOEN)
2229  if (((isrflags & USART_ISR_RXNE_RXFNE) != 0U)
2230  && (((cr1its & USART_CR1_RXNEIE_RXFNEIE) != 0U)
2231  || ((cr3its & USART_CR3_RXFTIE) != 0U)))
2232 #else
2233  if (((isrflags & USART_ISR_RXNE) != 0U)
2234  && ((cr1its & USART_CR1_RXNEIE) != 0U))
2235 #endif /* USART_CR1_FIFOEN */
2236  {
2237  if (husart->RxISR != NULL)
2238  {
2239  husart->RxISR(husart);
2240  }
2241  }
2242 
2243  /* If Overrun error occurs, or if any error occurs in DMA mode reception,
2244  consider error as blocking */
2245  errorcode = husart->ErrorCode & HAL_USART_ERROR_ORE;
2246  if ((HAL_IS_BIT_SET(husart->Instance->CR3, USART_CR3_DMAR)) ||
2247  (errorcode != 0U))
2248  {
2249  /* Blocking error : transfer is aborted
2250  Set the USART state ready to be able to start again the process,
2251  Disable Interrupts, and disable DMA requests, if ongoing */
2252  USART_EndTransfer(husart);
2253 
2254  /* Disable the USART DMA Rx request if enabled */
2255  if (HAL_IS_BIT_SET(husart->Instance->CR3, USART_CR3_DMAR))
2256  {
2257  CLEAR_BIT(husart->Instance->CR3, USART_CR3_DMAR | USART_CR3_DMAR);
2258 
2259  /* Abort the USART DMA Tx channel */
2260  if (husart->hdmatx != NULL)
2261  {
2262  /* Set the USART Tx DMA Abort callback to NULL : no callback
2263  executed at end of DMA abort procedure */
2264  husart->hdmatx->XferAbortCallback = NULL;
2265 
2266  /* Abort DMA TX */
2267  (void)HAL_DMA_Abort_IT(husart->hdmatx);
2268  }
2269 
2270  /* Abort the USART DMA Rx channel */
2271  if (husart->hdmarx != NULL)
2272  {
2273  /* Set the USART Rx DMA Abort callback :
2274  will lead to call HAL_USART_ErrorCallback() at end of DMA abort procedure */
2276 
2277  /* Abort DMA RX */
2278  if (HAL_DMA_Abort_IT(husart->hdmarx) != HAL_OK)
2279  {
2280  /* Call Directly husart->hdmarx->XferAbortCallback function in case of error */
2281  husart->hdmarx->XferAbortCallback(husart->hdmarx);
2282  }
2283  }
2284  else
2285  {
2286  /* Call user error callback */
2287 #if (USE_HAL_USART_REGISTER_CALLBACKS == 1)
2288  /* Call registered Error Callback */
2289  husart->ErrorCallback(husart);
2290 #else
2291  /* Call legacy weak Error Callback */
2292  HAL_USART_ErrorCallback(husart);
2293 #endif /* USE_HAL_USART_REGISTER_CALLBACKS */
2294  }
2295  }
2296  else
2297  {
2298  /* Call user error callback */
2299 #if (USE_HAL_USART_REGISTER_CALLBACKS == 1)
2300  /* Call registered Error Callback */
2301  husart->ErrorCallback(husart);
2302 #else
2303  /* Call legacy weak Error Callback */
2304  HAL_USART_ErrorCallback(husart);
2305 #endif /* USE_HAL_USART_REGISTER_CALLBACKS */
2306  }
2307  }
2308  else
2309  {
2310  /* Non Blocking error : transfer could go on.
2311  Error is notified to user through user error callback */
2312 #if (USE_HAL_USART_REGISTER_CALLBACKS == 1)
2313  /* Call registered Error Callback */
2314  husart->ErrorCallback(husart);
2315 #else
2316  /* Call legacy weak Error Callback */
2317  HAL_USART_ErrorCallback(husart);
2318 #endif /* USE_HAL_USART_REGISTER_CALLBACKS */
2319  husart->ErrorCode = HAL_USART_ERROR_NONE;
2320  }
2321  }
2322  return;
2323 
2324  } /* End if some error occurs */
2325 
2326 
2327  /* USART in mode Transmitter ------------------------------------------------*/
2328 #if defined(USART_CR1_FIFOEN)
2329  if (((isrflags & USART_ISR_TXE_TXFNF) != 0U)
2330  && (((cr1its & USART_CR1_TXEIE_TXFNFIE) != 0U)
2331  || ((cr3its & USART_CR3_TXFTIE) != 0U)))
2332 #else
2333  if (((isrflags & USART_ISR_TXE) != 0U)
2334  && ((cr1its & USART_CR1_TXEIE) != 0U))
2335 #endif /* USART_CR1_FIFOEN */
2336  {
2337  if (husart->TxISR != NULL)
2338  {
2339  husart->TxISR(husart);
2340  }
2341  return;
2342  }
2343 
2344  /* USART in mode Transmitter (transmission end) -----------------------------*/
2345  if (((isrflags & USART_ISR_TC) != 0U) && ((cr1its & USART_CR1_TCIE) != 0U))
2346  {
2347  USART_EndTransmit_IT(husart);
2348  return;
2349  }
2350 
2351 #if defined(USART_CR1_FIFOEN)
2352  /* USART TX Fifo Empty occurred ----------------------------------------------*/
2353  if (((isrflags & USART_ISR_TXFE) != 0U) && ((cr1its & USART_CR1_TXFEIE) != 0U))
2354  {
2355 #if (USE_HAL_USART_REGISTER_CALLBACKS == 1)
2356  /* Call registered Tx Fifo Empty Callback */
2357  husart->TxFifoEmptyCallback(husart);
2358 #else
2359  /* Call legacy weak Tx Fifo Empty Callback */
2361 #endif /* USE_HAL_USART_REGISTER_CALLBACKS */
2362  return;
2363  }
2364 
2365  /* USART RX Fifo Full occurred ----------------------------------------------*/
2366  if (((isrflags & USART_ISR_RXFF) != 0U) && ((cr1its & USART_CR1_RXFFIE) != 0U))
2367  {
2368 #if (USE_HAL_USART_REGISTER_CALLBACKS == 1)
2369  /* Call registered Rx Fifo Full Callback */
2370  husart->RxFifoFullCallback(husart);
2371 #else
2372  /* Call legacy weak Rx Fifo Full Callback */
2374 #endif /* USE_HAL_USART_REGISTER_CALLBACKS */
2375  return;
2376  }
2377 #endif /* USART_CR1_FIFOEN */
2378 }
__IO HAL_USART_StateTypeDef State
void(* XferAbortCallback)(struct __DMA_HandleTypeDef *hdma)
void(* TxFifoEmptyCallback)(struct __USART_HandleTypeDef *husart)
void HAL_USARTEx_TxFifoEmptyCallback(USART_HandleTypeDef *husart)
USART TX Fifo empty callback.
HAL_StatusTypeDef HAL_DMA_Abort_IT(DMA_HandleTypeDef *hdma)
Aborts the DMA Transfer in Interrupt mode.
void(* TxISR)(struct __USART_HandleTypeDef *husart)
static void USART_DMAAbortOnError(DMA_HandleTypeDef *hdma)
DMA USART communication abort callback, when initiated by HAL services on Error (To be called at end ...
CLEAR_BIT(hrtc->Instance->CR, RTC_CR_WUTE)
void(* ErrorCallback)(struct __USART_HandleTypeDef *husart)
return HAL_OK
static void USART_EndTransfer(USART_HandleTypeDef *husart)
End ongoing transfer on USART peripheral (following error detection or Transfer completion).
DMA_HandleTypeDef * hdmatx
void(* RxISR)(struct __USART_HandleTypeDef *husart)
void(* RxFifoFullCallback)(struct __USART_HandleTypeDef *husart)
void HAL_USART_ErrorCallback(USART_HandleTypeDef *husart)
USART error callback.
static void USART_EndTransmit_IT(USART_HandleTypeDef *husart)
Wraps up transmission in non-blocking mode.
DMA_HandleTypeDef * hdmarx
void HAL_USARTEx_RxFifoFullCallback(USART_HandleTypeDef *husart)
USART RX Fifo full callback.

◆ HAL_USART_Receive()

HAL_StatusTypeDef HAL_USART_Receive ( USART_HandleTypeDef husart,
uint8_t *  pRxData,
uint16_t  Size,
uint32_t  Timeout 
)

Receive an amount of data in blocking mode.

Note
To receive synchronous data, dummy data are simultaneously transmitted.
Parameters
husartUSART handle.
pRxDataPointer to data buffer.
SizeAmount of data to be received.
TimeoutTimeout duration.
Return values
HALstatus

Definition at line 852 of file stm32l4xx_hal_usart.c.

853 {
854  uint8_t *prxdata8bits;
855  uint16_t *prxdata16bits;
856  uint16_t uhMask;
857  uint32_t tickstart;
858 
859  if (husart->State == HAL_USART_STATE_READY)
860  {
861  if ((pRxData == NULL) || (Size == 0U))
862  {
863  return HAL_ERROR;
864  }
865 
866  /* Process Locked */
867  __HAL_LOCK(husart);
868 
869  husart->ErrorCode = HAL_USART_ERROR_NONE;
870  husart->State = HAL_USART_STATE_BUSY_RX;
871 
872  /* Init tickstart for timeout managment*/
873  tickstart = HAL_GetTick();
874 
875  husart->RxXferSize = Size;
876  husart->RxXferCount = Size;
877 
878  /* Computation of USART mask to apply to RDR register */
879  USART_MASK_COMPUTATION(husart);
880  uhMask = husart->Mask;
881 
882  /* In case of 9bits/No Parity transfer, pRxData needs to be handled as a uint16_t pointer */
883  if ((husart->Init.WordLength == USART_WORDLENGTH_9B) && (husart->Init.Parity == USART_PARITY_NONE))
884  {
885  prxdata8bits = NULL;
886  prxdata16bits = (uint16_t *) pRxData;
887  }
888  else
889  {
890  prxdata8bits = pRxData;
891  prxdata16bits = NULL;
892  }
893 
894  /* as long as data have to be received */
895  while (husart->RxXferCount > 0U)
896  {
897 #if defined(USART_CR2_SLVEN)
898  if (husart->SlaveMode == USART_SLAVEMODE_DISABLE)
899 #endif /* USART_CR2_SLVEN */
900  {
901  /* Wait until TXE flag is set to send dummy byte in order to generate the
902  * clock for the slave to send data.
903  * Whatever the frame length (7, 8 or 9-bit long), the same dummy value
904  * can be written for all the cases. */
905  if (USART_WaitOnFlagUntilTimeout(husart, USART_FLAG_TXE, RESET, tickstart, Timeout) != HAL_OK)
906  {
907  return HAL_TIMEOUT;
908  }
909  husart->Instance->TDR = (USART_DUMMY_DATA & (uint16_t)0x0FF);
910  }
911 
912  /* Wait for RXNE Flag */
913  if (USART_WaitOnFlagUntilTimeout(husart, USART_FLAG_RXNE, RESET, tickstart, Timeout) != HAL_OK)
914  {
915  return HAL_TIMEOUT;
916  }
917 
918  if (prxdata8bits == NULL)
919  {
920  *prxdata16bits = (uint16_t)(husart->Instance->RDR & uhMask);
921  prxdata16bits++;
922  }
923  else
924  {
925  *prxdata8bits = (uint8_t)(husart->Instance->RDR & (uint8_t)(uhMask & 0xFFU));
926  prxdata8bits++;
927  }
928 
929  husart->RxXferCount--;
930 
931  }
932 
933 #if defined(USART_CR2_SLVEN)
934  /* Clear SPI slave underrun flag and discard transmit data */
935  if (husart->SlaveMode == USART_SLAVEMODE_ENABLE)
936  {
937  __HAL_USART_CLEAR_UDRFLAG(husart);
938  __HAL_USART_SEND_REQ(husart, USART_TXDATA_FLUSH_REQUEST);
939  }
940 #endif /* USART_CR2_SLVEN */
941 
942  /* At end of Rx process, restore husart->State to Ready */
943  husart->State = HAL_USART_STATE_READY;
944 
945  /* Process Unlocked */
946  __HAL_UNLOCK(husart);
947 
948  return HAL_OK;
949  }
950  else
951  {
952  return HAL_BUSY;
953  }
954 }
__IO HAL_USART_StateTypeDef State
uint32_t HAL_GetTick(void)
Provide a tick value in millisecond.
__HAL_UNLOCK(hrtc)
__HAL_LOCK(hrtc)
return HAL_OK
static HAL_StatusTypeDef USART_WaitOnFlagUntilTimeout(USART_HandleTypeDef *husart, uint32_t Flag, FlagStatus Status, uint32_t Tickstart, uint32_t Timeout)
Handle USART Communication Timeout.

◆ HAL_USART_Receive_DMA()

HAL_StatusTypeDef HAL_USART_Receive_DMA ( USART_HandleTypeDef husart,
uint8_t *  pRxData,
uint16_t  Size 
)

Receive an amount of data in DMA mode.

Note
When the USART parity is enabled (PCE = 1), the received data contain the parity bit (MSB position).
The USART DMA transmit channel must be configured in order to generate the clock for the slave.
Parameters
husartUSART handle.
pRxDatapointer to data buffer.
Sizeamount of data to be received.
Return values
HALstatus

Definition at line 1495 of file stm32l4xx_hal_usart.c.

1496 {
1497  HAL_StatusTypeDef status = HAL_OK;
1498  uint32_t *tmp = (uint32_t *)&pRxData;
1499 
1500  /* Check that a Rx process is not already ongoing */
1501  if (husart->State == HAL_USART_STATE_READY)
1502  {
1503  if ((pRxData == NULL) || (Size == 0U))
1504  {
1505  return HAL_ERROR;
1506  }
1507 
1508  /* Process Locked */
1509  __HAL_LOCK(husart);
1510 
1511  husart->pRxBuffPtr = pRxData;
1512  husart->RxXferSize = Size;
1513  husart->pTxBuffPtr = pRxData;
1514  husart->TxXferSize = Size;
1515 
1516  husart->ErrorCode = HAL_USART_ERROR_NONE;
1517  husart->State = HAL_USART_STATE_BUSY_RX;
1518 
1519  if (husart->hdmarx != NULL)
1520  {
1521  /* Set the USART DMA Rx transfer complete callback */
1523 
1524  /* Set the USART DMA Half transfer complete callback */
1526 
1527  /* Set the USART DMA Rx transfer error callback */
1529 
1530  /* Enable the USART receive DMA channel */
1531  status = HAL_DMA_Start_IT(husart->hdmarx, (uint32_t)&husart->Instance->RDR, *(uint32_t *)tmp, Size);
1532  }
1533 
1534 #if defined(USART_CR2_SLVEN)
1535  if ((status == HAL_OK) &&
1536  (husart->SlaveMode == USART_SLAVEMODE_DISABLE))
1537 #endif /* USART_CR2_SLVEN */
1538  {
1539  /* Enable the USART transmit DMA channel: the transmit channel is used in order
1540  to generate in the non-blocking mode the clock to the slave device,
1541  this mode isn't a simplex receive mode but a full-duplex receive mode */
1542 
1543  /* Set the USART DMA Tx Complete and Error callback to Null */
1544  if (husart->hdmatx != NULL)
1545  {
1546  husart->hdmatx->XferErrorCallback = NULL;
1547  husart->hdmatx->XferHalfCpltCallback = NULL;
1548  husart->hdmatx->XferCpltCallback = NULL;
1549  status = HAL_DMA_Start_IT(husart->hdmatx, *(uint32_t *)tmp, (uint32_t)&husart->Instance->TDR, Size);
1550  }
1551  }
1552 
1553  if (status == HAL_OK)
1554  {
1555  /* Process Unlocked */
1556  __HAL_UNLOCK(husart);
1557 
1558  /* Enable the USART Parity Error Interrupt */
1559  SET_BIT(husart->Instance->CR1, USART_CR1_PEIE);
1560 
1561  /* Enable the USART Error Interrupt: (Frame error, noise error, overrun error) */
1562  SET_BIT(husart->Instance->CR3, USART_CR3_EIE);
1563 
1564  /* Enable the DMA transfer for the receiver request by setting the DMAR bit
1565  in the USART CR3 register */
1566  SET_BIT(husart->Instance->CR3, USART_CR3_DMAR);
1567 
1568  /* Enable the DMA transfer for transmit request by setting the DMAT bit
1569  in the USART CR3 register */
1570  SET_BIT(husart->Instance->CR3, USART_CR3_DMAT);
1571 
1572  return HAL_OK;
1573  }
1574  else
1575  {
1576  if (husart->hdmarx != NULL)
1577  {
1578  status = HAL_DMA_Abort(husart->hdmarx);
1579  }
1580 
1581  /* No need to check on error code */
1582  UNUSED(status);
1583 
1584  /* Set error code to DMA */
1585  husart->ErrorCode = HAL_USART_ERROR_DMA;
1586 
1587  /* Process Unlocked */
1588  __HAL_UNLOCK(husart);
1589 
1590  /* Restore husart->State to ready */
1591  husart->State = HAL_USART_STATE_READY;
1592 
1593  return HAL_ERROR;
1594  }
1595  }
1596  else
1597  {
1598  return HAL_BUSY;
1599  }
1600 }
static void USART_DMARxHalfCplt(DMA_HandleTypeDef *hdma)
DMA USART receive process half complete callback.
__IO HAL_USART_StateTypeDef State
static void USART_DMAReceiveCplt(DMA_HandleTypeDef *hdma)
DMA USART receive process complete callback.
void(* XferCpltCallback)(struct __DMA_HandleTypeDef *hdma)
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
static void USART_DMAError(DMA_HandleTypeDef *hdma)
DMA USART communication error callback.
HAL_StatusTypeDef HAL_DMA_Abort(DMA_HandleTypeDef *hdma)
Abort the DMA Transfer.
DMA_HandleTypeDef * hdmatx
DMA_HandleTypeDef * hdmarx

◆ HAL_USART_Receive_IT()

HAL_StatusTypeDef HAL_USART_Receive_IT ( USART_HandleTypeDef husart,
uint8_t *  pRxData,
uint16_t  Size 
)

Receive an amount of data in interrupt mode.

Note
To receive synchronous data, dummy data are simultaneously transmitted.
Parameters
husartUSART handle.
pRxDatapointer to data buffer.
Sizeamount of data to be received.
Return values
HALstatus

Definition at line 1195 of file stm32l4xx_hal_usart.c.

1196 {
1197 #if defined(USART_CR1_FIFOEN)
1198  uint16_t nb_dummy_data;
1199 #endif /* USART_CR1_FIFOEN */
1200 
1201  if (husart->State == HAL_USART_STATE_READY)
1202  {
1203  if ((pRxData == NULL) || (Size == 0U))
1204  {
1205  return HAL_ERROR;
1206  }
1207 
1208  /* Process Locked */
1209  __HAL_LOCK(husart);
1210 
1211  husart->pRxBuffPtr = pRxData;
1212  husart->RxXferSize = Size;
1213  husart->RxXferCount = Size;
1214  husart->RxISR = NULL;
1215 
1216  USART_MASK_COMPUTATION(husart);
1217 
1218  husart->ErrorCode = HAL_USART_ERROR_NONE;
1219  husart->State = HAL_USART_STATE_BUSY_RX;
1220 
1221  /* Enable the USART Error Interrupt: (Frame error, noise error, overrun error) */
1222  SET_BIT(husart->Instance->CR3, USART_CR3_EIE);
1223 
1224 #if defined(USART_CR1_FIFOEN)
1225  /* Configure Rx interrupt processing */
1226  if ((husart->FifoMode == USART_FIFOMODE_ENABLE) && (Size >= husart->NbRxDataToProcess))
1227  {
1228  /* Set the Rx ISR function pointer according to the data word length */
1229  if ((husart->Init.WordLength == USART_WORDLENGTH_9B) && (husart->Init.Parity == USART_PARITY_NONE))
1230  {
1231  husart->RxISR = USART_RxISR_16BIT_FIFOEN;
1232  }
1233  else
1234  {
1235  husart->RxISR = USART_RxISR_8BIT_FIFOEN;
1236  }
1237 
1238  /* Process Unlocked */
1239  __HAL_UNLOCK(husart);
1240 
1241  /* Enable the USART Parity Error interrupt and RX FIFO Threshold interrupt */
1242  SET_BIT(husart->Instance->CR1, USART_CR1_PEIE);
1243  SET_BIT(husart->Instance->CR3, USART_CR3_RXFTIE);
1244  }
1245  else
1246 #endif /* USART_CR1_FIFOEN */
1247  {
1248  /* Set the Rx ISR function pointer according to the data word length */
1249  if ((husart->Init.WordLength == USART_WORDLENGTH_9B) && (husart->Init.Parity == USART_PARITY_NONE))
1250  {
1251  husart->RxISR = USART_RxISR_16BIT;
1252  }
1253  else
1254  {
1255  husart->RxISR = USART_RxISR_8BIT;
1256  }
1257 
1258  /* Process Unlocked */
1259  __HAL_UNLOCK(husart);
1260 
1261  /* Enable the USART Parity Error and Data Register not empty Interrupts */
1262 #if defined(USART_CR1_FIFOEN)
1263  SET_BIT(husart->Instance->CR1, USART_CR1_PEIE | USART_CR1_RXNEIE_RXFNEIE);
1264 #else
1265  SET_BIT(husart->Instance->CR1, USART_CR1_PEIE | USART_CR1_RXNEIE);
1266 #endif /* USART_CR1_FIFOEN */
1267  }
1268 
1269 #if defined(USART_CR2_SLVEN)
1270  if (husart->SlaveMode == USART_SLAVEMODE_DISABLE)
1271 #endif /* USART_CR2_SLVEN */
1272  {
1273  /* Send dummy data in order to generate the clock for the Slave to send the next data.
1274  When FIFO mode is disabled only one data must be transferred.
1275  When FIFO mode is enabled data must be transmitted until the RX FIFO reaches its threshold.
1276  */
1277 #if defined(USART_CR1_FIFOEN)
1278  if ((husart->FifoMode == USART_FIFOMODE_ENABLE) && (Size >= husart->NbRxDataToProcess))
1279  {
1280  for (nb_dummy_data = husart->NbRxDataToProcess ; nb_dummy_data > 0U ; nb_dummy_data--)
1281  {
1282  husart->Instance->TDR = (USART_DUMMY_DATA & (uint16_t)0x00FF);
1283  }
1284  }
1285  else
1286 #endif /* USART_CR1_FIFOEN */
1287  {
1288  husart->Instance->TDR = (USART_DUMMY_DATA & (uint16_t)0x00FF);
1289  }
1290  }
1291 
1292  return HAL_OK;
1293  }
1294  else
1295  {
1296  return HAL_BUSY;
1297  }
1298 }
__IO HAL_USART_StateTypeDef State
static void USART_RxISR_16BIT_FIFOEN(USART_HandleTypeDef *husart)
Simplex receive an amount of data in non-blocking mode.
static void USART_RxISR_16BIT(USART_HandleTypeDef *husart)
Simplex receive an amount of data in non-blocking mode.
static void USART_RxISR_8BIT_FIFOEN(USART_HandleTypeDef *husart)
Simplex receive an amount of data in non-blocking mode.
__HAL_UNLOCK(hrtc)
__HAL_LOCK(hrtc)
static void USART_RxISR_8BIT(USART_HandleTypeDef *husart)
Simplex receive an amount of data in non-blocking mode.
return HAL_OK
void(* RxISR)(struct __USART_HandleTypeDef *husart)

◆ HAL_USART_RxCpltCallback()

__weak void HAL_USART_RxCpltCallback ( USART_HandleTypeDef husart)

Rx Transfer completed callback.

Parameters
husartUSART handle.
Return values
None

Definition at line 2415 of file stm32l4xx_hal_usart.c.

2416 {
2417  /* Prevent unused argument(s) compilation warning */
2418  UNUSED(husart);
2419 
2420  /* NOTE: This function should not be modified, when the callback is needed,
2421  the HAL_USART_RxCpltCallback can be implemented in the user file.
2422  */
2423 }

◆ HAL_USART_RxHalfCpltCallback()

__weak void HAL_USART_RxHalfCpltCallback ( USART_HandleTypeDef husart)

Rx Half Transfer completed callback.

Parameters
husartUSART handle.
Return values
None

Definition at line 2430 of file stm32l4xx_hal_usart.c.

2431 {
2432  /* Prevent unused argument(s) compilation warning */
2433  UNUSED(husart);
2434 
2435  /* NOTE : This function should not be modified, when the callback is needed,
2436  the HAL_USART_RxHalfCpltCallback can be implemented in the user file
2437  */
2438 }

◆ HAL_USART_Transmit()

HAL_StatusTypeDef HAL_USART_Transmit ( USART_HandleTypeDef husart,
uint8_t *  pTxData,
uint16_t  Size,
uint32_t  Timeout 
)

Simplex send an amount of data in blocking mode.

Parameters
husartUSART handle.
pTxDataPointer to data buffer.
SizeAmount of data to be sent.
TimeoutTimeout duration.
Return values
HALstatus

Definition at line 758 of file stm32l4xx_hal_usart.c.

759 {
760  uint8_t *ptxdata8bits;
761  uint16_t *ptxdata16bits;
762  uint32_t tickstart;
763 
764  if (husart->State == HAL_USART_STATE_READY)
765  {
766  if ((pTxData == NULL) || (Size == 0U))
767  {
768  return HAL_ERROR;
769  }
770 
771  /* Process Locked */
772  __HAL_LOCK(husart);
773 
774  husart->ErrorCode = HAL_USART_ERROR_NONE;
775  husart->State = HAL_USART_STATE_BUSY_TX;
776 
777  /* Init tickstart for timeout managment*/
778  tickstart = HAL_GetTick();
779 
780  husart->TxXferSize = Size;
781  husart->TxXferCount = Size;
782 
783  /* In case of 9bits/No Parity transfer, pTxData needs to be handled as a uint16_t pointer */
784  if ((husart->Init.WordLength == USART_WORDLENGTH_9B) && (husart->Init.Parity == USART_PARITY_NONE))
785  {
786  ptxdata8bits = NULL;
787  ptxdata16bits = (uint16_t *) pTxData;
788  }
789  else
790  {
791  ptxdata8bits = pTxData;
792  ptxdata16bits = NULL;
793  }
794 
795  /* Check the remaining data to be sent */
796  while (husart->TxXferCount > 0U)
797  {
798  if (USART_WaitOnFlagUntilTimeout(husart, USART_FLAG_TXE, RESET, tickstart, Timeout) != HAL_OK)
799  {
800  return HAL_TIMEOUT;
801  }
802  if (ptxdata8bits == NULL)
803  {
804  husart->Instance->TDR = (uint16_t)(*ptxdata16bits & 0x01FFU);
805  ptxdata16bits++;
806  }
807  else
808  {
809  husart->Instance->TDR = (uint8_t)(*ptxdata8bits & 0xFFU);
810  ptxdata8bits++;
811  }
812 
813  husart->TxXferCount--;
814  }
815 
816  if (USART_WaitOnFlagUntilTimeout(husart, USART_FLAG_TC, RESET, tickstart, Timeout) != HAL_OK)
817  {
818  return HAL_TIMEOUT;
819  }
820 
821  /* Clear Transmission Complete Flag */
822  __HAL_USART_CLEAR_FLAG(husart, USART_CLEAR_TCF);
823 
824  /* Clear overrun flag and discard the received data */
825  __HAL_USART_CLEAR_OREFLAG(husart);
826  __HAL_USART_SEND_REQ(husart, USART_RXDATA_FLUSH_REQUEST);
827  __HAL_USART_SEND_REQ(husart, USART_TXDATA_FLUSH_REQUEST);
828 
829  /* At end of Tx process, restore husart->State to Ready */
830  husart->State = HAL_USART_STATE_READY;
831 
832  /* Process Unlocked */
833  __HAL_UNLOCK(husart);
834 
835  return HAL_OK;
836  }
837  else
838  {
839  return HAL_BUSY;
840  }
841 }
__IO HAL_USART_StateTypeDef State
uint32_t HAL_GetTick(void)
Provide a tick value in millisecond.
__HAL_UNLOCK(hrtc)
__HAL_LOCK(hrtc)
return HAL_OK
static HAL_StatusTypeDef USART_WaitOnFlagUntilTimeout(USART_HandleTypeDef *husart, uint32_t Flag, FlagStatus Status, uint32_t Tickstart, uint32_t Timeout)
Handle USART Communication Timeout.

◆ HAL_USART_Transmit_DMA()

HAL_StatusTypeDef HAL_USART_Transmit_DMA ( USART_HandleTypeDef husart,
uint8_t *  pTxData,
uint16_t  Size 
)

Send an amount of data in DMA mode.

Parameters
husartUSART handle.
pTxDatapointer to data buffer.
Sizeamount of data to be sent.
Return values
HALstatus

Definition at line 1413 of file stm32l4xx_hal_usart.c.

1414 {
1415  HAL_StatusTypeDef status = HAL_OK;
1416  uint32_t *tmp;
1417 
1418  if (husart->State == HAL_USART_STATE_READY)
1419  {
1420  if ((pTxData == NULL) || (Size == 0U))
1421  {
1422  return HAL_ERROR;
1423  }
1424 
1425  /* Process Locked */
1426  __HAL_LOCK(husart);
1427 
1428  husart->pTxBuffPtr = pTxData;
1429  husart->TxXferSize = Size;
1430  husart->TxXferCount = Size;
1431 
1432  husart->ErrorCode = HAL_USART_ERROR_NONE;
1433  husart->State = HAL_USART_STATE_BUSY_TX;
1434 
1435  if (husart->hdmatx != NULL)
1436  {
1437  /* Set the USART DMA transfer complete callback */
1439 
1440  /* Set the USART DMA Half transfer complete callback */
1442 
1443  /* Set the DMA error callback */
1445 
1446  /* Enable the USART transmit DMA channel */
1447  tmp = (uint32_t *)&pTxData;
1448  status = HAL_DMA_Start_IT(husart->hdmatx, *(uint32_t *)tmp, (uint32_t)&husart->Instance->TDR, Size);
1449  }
1450 
1451  if (status == HAL_OK)
1452  {
1453  /* Clear the TC flag in the ICR register */
1454  __HAL_USART_CLEAR_FLAG(husart, USART_CLEAR_TCF);
1455 
1456  /* Process Unlocked */
1457  __HAL_UNLOCK(husart);
1458 
1459  /* Enable the DMA transfer for transmit request by setting the DMAT bit
1460  in the USART CR3 register */
1461  SET_BIT(husart->Instance->CR3, USART_CR3_DMAT);
1462 
1463  return HAL_OK;
1464  }
1465  else
1466  {
1467  /* Set error code to DMA */
1468  husart->ErrorCode = HAL_USART_ERROR_DMA;
1469 
1470  /* Process Unlocked */
1471  __HAL_UNLOCK(husart);
1472 
1473  /* Restore husart->State to ready */
1474  husart->State = HAL_USART_STATE_READY;
1475 
1476  return HAL_ERROR;
1477  }
1478  }
1479  else
1480  {
1481  return HAL_BUSY;
1482  }
1483 }
__IO HAL_USART_StateTypeDef State
void(* XferCpltCallback)(struct __DMA_HandleTypeDef *hdma)
void(* XferErrorCallback)(struct __DMA_HandleTypeDef *hdma)
__HAL_UNLOCK(hrtc)
void(* XferHalfCpltCallback)(struct __DMA_HandleTypeDef *hdma)
static void USART_DMATransmitCplt(DMA_HandleTypeDef *hdma)
DMA USART transmit process complete callback.
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
static void USART_DMAError(DMA_HandleTypeDef *hdma)
DMA USART communication error callback.
DMA_HandleTypeDef * hdmatx
static void USART_DMATxHalfCplt(DMA_HandleTypeDef *hdma)
DMA USART transmit process half complete callback.

◆ HAL_USART_Transmit_IT()

HAL_StatusTypeDef HAL_USART_Transmit_IT ( USART_HandleTypeDef husart,
uint8_t *  pTxData,
uint16_t  Size 
)

Send an amount of data in interrupt mode.

Parameters
husartUSART handle.
pTxDatapointer to data buffer.
Sizeamount of data to be sent.
Return values
HALstatus

Definition at line 1113 of file stm32l4xx_hal_usart.c.

1114 {
1115  if (husart->State == HAL_USART_STATE_READY)
1116  {
1117  if ((pTxData == NULL) || (Size == 0U))
1118  {
1119  return HAL_ERROR;
1120  }
1121 
1122  /* Process Locked */
1123  __HAL_LOCK(husart);
1124 
1125  husart->pTxBuffPtr = pTxData;
1126  husart->TxXferSize = Size;
1127  husart->TxXferCount = Size;
1128  husart->TxISR = NULL;
1129 
1130  husart->ErrorCode = HAL_USART_ERROR_NONE;
1131  husart->State = HAL_USART_STATE_BUSY_TX;
1132 
1133  /* The USART Error Interrupts: (Frame error, noise error, overrun error)
1134  are not managed by the USART Transmit Process to avoid the overrun interrupt
1135  when the usart mode is configured for transmit and receive "USART_MODE_TX_RX"
1136  to benefit for the frame error and noise interrupts the usart mode should be
1137  configured only for transmit "USART_MODE_TX" */
1138 
1139 #if defined(USART_CR1_FIFOEN)
1140  /* Configure Tx interrupt processing */
1141  if (husart->FifoMode == USART_FIFOMODE_ENABLE)
1142  {
1143  /* Set the Tx ISR function pointer according to the data word length */
1144  if ((husart->Init.WordLength == USART_WORDLENGTH_9B) && (husart->Init.Parity == USART_PARITY_NONE))
1145  {
1146  husart->TxISR = USART_TxISR_16BIT_FIFOEN;
1147  }
1148  else
1149  {
1150  husart->TxISR = USART_TxISR_8BIT_FIFOEN;
1151  }
1152 
1153  /* Process Unlocked */
1154  __HAL_UNLOCK(husart);
1155 
1156  /* Enable the TX FIFO threshold interrupt */
1157  __HAL_USART_ENABLE_IT(husart, USART_IT_TXFT);
1158  }
1159  else
1160 #endif /* USART_CR1_FIFOEN */
1161  {
1162  /* Set the Tx ISR function pointer according to the data word length */
1163  if ((husart->Init.WordLength == USART_WORDLENGTH_9B) && (husart->Init.Parity == USART_PARITY_NONE))
1164  {
1165  husart->TxISR = USART_TxISR_16BIT;
1166  }
1167  else
1168  {
1169  husart->TxISR = USART_TxISR_8BIT;
1170  }
1171 
1172  /* Process Unlocked */
1173  __HAL_UNLOCK(husart);
1174 
1175  /* Enable the USART Transmit Data Register Empty Interrupt */
1176  __HAL_USART_ENABLE_IT(husart, USART_IT_TXE);
1177  }
1178 
1179  return HAL_OK;
1180  }
1181  else
1182  {
1183  return HAL_BUSY;
1184  }
1185 }
__IO HAL_USART_StateTypeDef State
static void USART_TxISR_16BIT(USART_HandleTypeDef *husart)
Simplex send an amount of data in non-blocking mode.
__HAL_UNLOCK(hrtc)
static void USART_TxISR_8BIT_FIFOEN(USART_HandleTypeDef *husart)
Simplex send an amount of data in non-blocking mode.
void(* TxISR)(struct __USART_HandleTypeDef *husart)
__HAL_LOCK(hrtc)
static void USART_TxISR_8BIT(USART_HandleTypeDef *husart)
Simplex send an amount of data in non-blocking mode.
return HAL_OK
static void USART_TxISR_16BIT_FIFOEN(USART_HandleTypeDef *husart)
Simplex send an amount of data in non-blocking mode.

◆ HAL_USART_TransmitReceive()

HAL_StatusTypeDef HAL_USART_TransmitReceive ( USART_HandleTypeDef husart,
uint8_t *  pTxData,
uint8_t *  pRxData,
uint16_t  Size,
uint32_t  Timeout 
)

Full-Duplex Send and Receive an amount of data in blocking mode.

Parameters
husartUSART handle.
pTxDatapointer to TX data buffer.
pRxDatapointer to RX data buffer.
Sizeamount of data to be sent (same amount to be received).
TimeoutTimeout duration.
Return values
HALstatus

Definition at line 965 of file stm32l4xx_hal_usart.c.

967 {
968  uint8_t *prxdata8bits;
969  uint16_t *prxdata16bits;
970  uint8_t *ptxdata8bits;
971  uint16_t *ptxdata16bits;
972  uint16_t uhMask;
973  uint16_t rxdatacount;
974  uint32_t tickstart;
975 
976  if (husart->State == HAL_USART_STATE_READY)
977  {
978  if ((pTxData == NULL) || (pRxData == NULL) || (Size == 0U))
979  {
980  return HAL_ERROR;
981  }
982 
983  /* Process Locked */
984  __HAL_LOCK(husart);
985 
986  husart->ErrorCode = HAL_USART_ERROR_NONE;
987  husart->State = HAL_USART_STATE_BUSY_RX;
988 
989  /* Init tickstart for timeout managment*/
990  tickstart = HAL_GetTick();
991 
992  husart->RxXferSize = Size;
993  husart->TxXferSize = Size;
994  husart->TxXferCount = Size;
995  husart->RxXferCount = Size;
996 
997  /* Computation of USART mask to apply to RDR register */
998  USART_MASK_COMPUTATION(husart);
999  uhMask = husart->Mask;
1000 
1001  /* In case of 9bits/No Parity transfer, pRxData needs to be handled as a uint16_t pointer */
1002  if ((husart->Init.WordLength == USART_WORDLENGTH_9B) && (husart->Init.Parity == USART_PARITY_NONE))
1003  {
1004  prxdata8bits = NULL;
1005  ptxdata8bits = NULL;
1006  ptxdata16bits = (uint16_t *) pTxData;
1007  prxdata16bits = (uint16_t *) pRxData;
1008  }
1009  else
1010  {
1011  prxdata8bits = pRxData;
1012  ptxdata8bits = pTxData;
1013  ptxdata16bits = NULL;
1014  prxdata16bits = NULL;
1015  }
1016 
1017 #if defined(USART_CR2_SLVEN)
1018  if ((husart->TxXferCount == 0x01U) || (husart->SlaveMode == USART_SLAVEMODE_ENABLE))
1019 #else
1020  if (husart->TxXferCount == 0x01U)
1021 #endif /* USART_CR2_SLVEN */
1022  {
1023  /* Wait until TXE flag is set to send data */
1024  if (USART_WaitOnFlagUntilTimeout(husart, USART_FLAG_TXE, RESET, tickstart, Timeout) != HAL_OK)
1025  {
1026  return HAL_TIMEOUT;
1027  }
1028  if (ptxdata8bits == NULL)
1029  {
1030  husart->Instance->TDR = (uint16_t)(*ptxdata16bits & uhMask);
1031  ptxdata16bits++;
1032  }
1033  else
1034  {
1035  husart->Instance->TDR = (uint8_t)(*ptxdata8bits & (uint8_t)(uhMask & 0xFFU));
1036  ptxdata8bits++;
1037  }
1038 
1039  husart->TxXferCount--;
1040  }
1041 
1042  /* Check the remain data to be sent */
1043  /* rxdatacount is a temporary variable for MISRAC2012-Rule-13.5 */
1044  rxdatacount = husart->RxXferCount;
1045  while ((husart->TxXferCount > 0U) || (rxdatacount > 0U))
1046  {
1047  if (husart->TxXferCount > 0U)
1048  {
1049  /* Wait until TXE flag is set to send data */
1050  if (USART_WaitOnFlagUntilTimeout(husart, USART_FLAG_TXE, RESET, tickstart, Timeout) != HAL_OK)
1051  {
1052  return HAL_TIMEOUT;
1053  }
1054  if (ptxdata8bits == NULL)
1055  {
1056  husart->Instance->TDR = (uint16_t)(*ptxdata16bits & uhMask);
1057  ptxdata16bits++;
1058  }
1059  else
1060  {
1061  husart->Instance->TDR = (uint8_t)(*ptxdata8bits & (uint8_t)(uhMask & 0xFFU));
1062  ptxdata8bits++;
1063  }
1064 
1065  husart->TxXferCount--;
1066  }
1067 
1068  if (husart->RxXferCount > 0U)
1069  {
1070  /* Wait for RXNE Flag */
1071  if (USART_WaitOnFlagUntilTimeout(husart, USART_FLAG_RXNE, RESET, tickstart, Timeout) != HAL_OK)
1072  {
1073  return HAL_TIMEOUT;
1074  }
1075 
1076  if (prxdata8bits == NULL)
1077  {
1078  *prxdata16bits = (uint16_t)(husart->Instance->RDR & uhMask);
1079  prxdata16bits++;
1080  }
1081  else
1082  {
1083  *prxdata8bits = (uint8_t)(husart->Instance->RDR & (uint8_t)(uhMask & 0xFFU));
1084  prxdata8bits++;
1085  }
1086 
1087  husart->RxXferCount--;
1088  }
1089  rxdatacount = husart->RxXferCount;
1090  }
1091 
1092  /* At end of TxRx process, restore husart->State to Ready */
1093  husart->State = HAL_USART_STATE_READY;
1094 
1095  /* Process Unlocked */
1096  __HAL_UNLOCK(husart);
1097 
1098  return HAL_OK;
1099  }
1100  else
1101  {
1102  return HAL_BUSY;
1103  }
1104 }
__IO HAL_USART_StateTypeDef State
uint32_t HAL_GetTick(void)
Provide a tick value in millisecond.
__HAL_UNLOCK(hrtc)
__HAL_LOCK(hrtc)
return HAL_OK
static HAL_StatusTypeDef USART_WaitOnFlagUntilTimeout(USART_HandleTypeDef *husart, uint32_t Flag, FlagStatus Status, uint32_t Tickstart, uint32_t Timeout)
Handle USART Communication Timeout.

◆ HAL_USART_TransmitReceive_DMA()

HAL_StatusTypeDef HAL_USART_TransmitReceive_DMA ( USART_HandleTypeDef husart,
uint8_t *  pTxData,
uint8_t *  pRxData,
uint16_t  Size 
)

Full-Duplex Transmit Receive an amount of data in non-blocking mode.

Note
When the USART parity is enabled (PCE = 1) the data received contain the parity bit.
Parameters
husartUSART handle.
pTxDatapointer to TX data buffer.
pRxDatapointer to RX data buffer.
Sizeamount of data to be received/sent.
Return values
HALstatus

Definition at line 1611 of file stm32l4xx_hal_usart.c.

1613 {
1614  HAL_StatusTypeDef status;
1615  uint32_t *tmp;
1616 
1617  if (husart->State == HAL_USART_STATE_READY)
1618  {
1619  if ((pTxData == NULL) || (pRxData == NULL) || (Size == 0U))
1620  {
1621  return HAL_ERROR;
1622  }
1623 
1624  /* Process Locked */
1625  __HAL_LOCK(husart);
1626 
1627  husart->pRxBuffPtr = pRxData;
1628  husart->RxXferSize = Size;
1629  husart->pTxBuffPtr = pTxData;
1630  husart->TxXferSize = Size;
1631 
1632  husart->ErrorCode = HAL_USART_ERROR_NONE;
1634 
1635  if ((husart->hdmarx != NULL) && (husart->hdmatx != NULL))
1636  {
1637  /* Set the USART DMA Rx transfer complete callback */
1639 
1640  /* Set the USART DMA Half transfer complete callback */
1642 
1643  /* Set the USART DMA Tx transfer complete callback */
1645 
1646  /* Set the USART DMA Half transfer complete callback */
1648 
1649  /* Set the USART DMA Tx transfer error callback */
1651 
1652  /* Set the USART DMA Rx transfer error callback */
1654 
1655  /* Enable the USART receive DMA channel */
1656  tmp = (uint32_t *)&pRxData;
1657  status = HAL_DMA_Start_IT(husart->hdmarx, (uint32_t)&husart->Instance->RDR, *(uint32_t *)tmp, Size);
1658 
1659  /* Enable the USART transmit DMA channel */
1660  if (status == HAL_OK)
1661  {
1662  tmp = (uint32_t *)&pTxData;
1663  status = HAL_DMA_Start_IT(husart->hdmatx, *(uint32_t *)tmp, (uint32_t)&husart->Instance->TDR, Size);
1664  }
1665  }
1666  else
1667  {
1668  status = HAL_ERROR;
1669  }
1670 
1671  if (status == HAL_OK)
1672  {
1673  /* Process Unlocked */
1674  __HAL_UNLOCK(husart);
1675 
1676  /* Enable the USART Parity Error Interrupt */
1677  SET_BIT(husart->Instance->CR1, USART_CR1_PEIE);
1678 
1679  /* Enable the USART Error Interrupt: (Frame error, noise error, overrun error) */
1680  SET_BIT(husart->Instance->CR3, USART_CR3_EIE);
1681 
1682  /* Clear the TC flag in the ICR register */
1683  __HAL_USART_CLEAR_FLAG(husart, USART_CLEAR_TCF);
1684 
1685  /* Enable the DMA transfer for the receiver request by setting the DMAR bit
1686  in the USART CR3 register */
1687  SET_BIT(husart->Instance->CR3, USART_CR3_DMAR);
1688 
1689  /* Enable the DMA transfer for transmit request by setting the DMAT bit
1690  in the USART CR3 register */
1691  SET_BIT(husart->Instance->CR3, USART_CR3_DMAT);
1692 
1693  return HAL_OK;
1694  }
1695  else
1696  {
1697  if (husart->hdmarx != NULL)
1698  {
1699  status = HAL_DMA_Abort(husart->hdmarx);
1700  }
1701 
1702  /* No need to check on error code */
1703  UNUSED(status);
1704 
1705  /* Set error code to DMA */
1706  husart->ErrorCode = HAL_USART_ERROR_DMA;
1707 
1708  /* Process Unlocked */
1709  __HAL_UNLOCK(husart);
1710 
1711  /* Restore husart->State to ready */
1712  husart->State = HAL_USART_STATE_READY;
1713 
1714  return HAL_ERROR;
1715  }
1716  }
1717  else
1718  {
1719  return HAL_BUSY;
1720  }
1721 }
static void USART_DMARxHalfCplt(DMA_HandleTypeDef *hdma)
DMA USART receive process half complete callback.
__IO HAL_USART_StateTypeDef State
static void USART_DMAReceiveCplt(DMA_HandleTypeDef *hdma)
DMA USART receive process complete callback.
void(* XferCpltCallback)(struct __DMA_HandleTypeDef *hdma)
void(* XferErrorCallback)(struct __DMA_HandleTypeDef *hdma)
__HAL_UNLOCK(hrtc)
void(* XferHalfCpltCallback)(struct __DMA_HandleTypeDef *hdma)
static void USART_DMATransmitCplt(DMA_HandleTypeDef *hdma)
DMA USART transmit process complete callback.
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
static void USART_DMAError(DMA_HandleTypeDef *hdma)
DMA USART communication error callback.
HAL_StatusTypeDef HAL_DMA_Abort(DMA_HandleTypeDef *hdma)
Abort the DMA Transfer.
DMA_HandleTypeDef * hdmatx
DMA_HandleTypeDef * hdmarx
static void USART_DMATxHalfCplt(DMA_HandleTypeDef *hdma)
DMA USART transmit process half complete callback.

◆ HAL_USART_TransmitReceive_IT()

HAL_StatusTypeDef HAL_USART_TransmitReceive_IT ( USART_HandleTypeDef husart,
uint8_t *  pTxData,
uint8_t *  pRxData,
uint16_t  Size 
)

Full-Duplex Send and Receive an amount of data in interrupt mode.

Parameters
husartUSART handle.
pTxDatapointer to TX data buffer.
pRxDatapointer to RX data buffer.
Sizeamount of data to be sent (same amount to be received).
Return values
HALstatus

Definition at line 1308 of file stm32l4xx_hal_usart.c.

1310 {
1311 
1312  if (husart->State == HAL_USART_STATE_READY)
1313  {
1314  if ((pTxData == NULL) || (pRxData == NULL) || (Size == 0U))
1315  {
1316  return HAL_ERROR;
1317  }
1318 
1319  /* Process Locked */
1320  __HAL_LOCK(husart);
1321 
1322  husart->pRxBuffPtr = pRxData;
1323  husart->RxXferSize = Size;
1324  husart->RxXferCount = Size;
1325  husart->pTxBuffPtr = pTxData;
1326  husart->TxXferSize = Size;
1327  husart->TxXferCount = Size;
1328 
1329  /* Computation of USART mask to apply to RDR register */
1330  USART_MASK_COMPUTATION(husart);
1331 
1332  husart->ErrorCode = HAL_USART_ERROR_NONE;
1334 
1335 #if defined(USART_CR1_FIFOEN)
1336  /* Configure TxRx interrupt processing */
1337  if ((husart->FifoMode == USART_FIFOMODE_ENABLE) && (Size >= husart->NbRxDataToProcess))
1338  {
1339  /* Set the Rx ISR function pointer according to the data word length */
1340  if ((husart->Init.WordLength == USART_WORDLENGTH_9B) && (husart->Init.Parity == USART_PARITY_NONE))
1341  {
1342  husart->TxISR = USART_TxISR_16BIT_FIFOEN;
1343  husart->RxISR = USART_RxISR_16BIT_FIFOEN;
1344  }
1345  else
1346  {
1347  husart->TxISR = USART_TxISR_8BIT_FIFOEN;
1348  husart->RxISR = USART_RxISR_8BIT_FIFOEN;
1349  }
1350 
1351  /* Process Locked */
1352  __HAL_UNLOCK(husart);
1353 
1354  /* Enable the USART Error Interrupt: (Frame error, noise error, overrun error) */
1355  SET_BIT(husart->Instance->CR3, USART_CR3_EIE);
1356 
1357  /* Enable the USART Parity Error interrupt */
1358  SET_BIT(husart->Instance->CR1, USART_CR1_PEIE);
1359 
1360  /* Enable the TX and RX FIFO Threshold interrupts */
1361  SET_BIT(husart->Instance->CR3, (USART_CR3_TXFTIE | USART_CR3_RXFTIE));
1362  }
1363  else
1364 #endif /* USART_CR1_FIFOEN */
1365  {
1366  if ((husart->Init.WordLength == USART_WORDLENGTH_9B) && (husart->Init.Parity == USART_PARITY_NONE))
1367  {
1368  husart->TxISR = USART_TxISR_16BIT;
1369  husart->RxISR = USART_RxISR_16BIT;
1370  }
1371  else
1372  {
1373  husart->TxISR = USART_TxISR_8BIT;
1374  husart->RxISR = USART_RxISR_8BIT;
1375  }
1376 
1377  /* Process Locked */
1378  __HAL_UNLOCK(husart);
1379 
1380  /* Enable the USART Error Interrupt: (Frame error, noise error, overrun error) */
1381  SET_BIT(husart->Instance->CR3, USART_CR3_EIE);
1382 
1383  /* Enable the USART Parity Error and USART Data Register not empty Interrupts */
1384 #if defined(USART_CR1_FIFOEN)
1385  SET_BIT(husart->Instance->CR1, USART_CR1_PEIE | USART_CR1_RXNEIE_RXFNEIE);
1386 #else
1387  SET_BIT(husart->Instance->CR1, USART_CR1_PEIE | USART_CR1_RXNEIE);
1388 #endif /* USART_CR1_FIFOEN */
1389 
1390  /* Enable the USART Transmit Data Register Empty Interrupt */
1391 #if defined(USART_CR1_FIFOEN)
1392  SET_BIT(husart->Instance->CR1, USART_CR1_TXEIE_TXFNFIE);
1393 #else
1394  SET_BIT(husart->Instance->CR1, USART_CR1_TXEIE);
1395 #endif /* USART_CR1_FIFOEN */
1396  }
1397 
1398  return HAL_OK;
1399  }
1400  else
1401  {
1402  return HAL_BUSY;
1403  }
1404 }
__IO HAL_USART_StateTypeDef State
static void USART_RxISR_16BIT_FIFOEN(USART_HandleTypeDef *husart)
Simplex receive an amount of data in non-blocking mode.
static void USART_TxISR_16BIT(USART_HandleTypeDef *husart)
Simplex send an amount of data in non-blocking mode.
static void USART_RxISR_16BIT(USART_HandleTypeDef *husart)
Simplex receive an amount of data in non-blocking mode.
static void USART_RxISR_8BIT_FIFOEN(USART_HandleTypeDef *husart)
Simplex receive an amount of data in non-blocking mode.
__HAL_UNLOCK(hrtc)
static void USART_TxISR_8BIT_FIFOEN(USART_HandleTypeDef *husart)
Simplex send an amount of data in non-blocking mode.
void(* TxISR)(struct __USART_HandleTypeDef *husart)
__HAL_LOCK(hrtc)
static void USART_TxISR_8BIT(USART_HandleTypeDef *husart)
Simplex send an amount of data in non-blocking mode.
static void USART_RxISR_8BIT(USART_HandleTypeDef *husart)
Simplex receive an amount of data in non-blocking mode.
return HAL_OK
static void USART_TxISR_16BIT_FIFOEN(USART_HandleTypeDef *husart)
Simplex send an amount of data in non-blocking mode.
void(* RxISR)(struct __USART_HandleTypeDef *husart)

◆ HAL_USART_TxCpltCallback()

__weak void HAL_USART_TxCpltCallback ( USART_HandleTypeDef husart)

Tx Transfer completed callback.

Parameters
husartUSART handle.
Return values
None

Definition at line 2385 of file stm32l4xx_hal_usart.c.

2386 {
2387  /* Prevent unused argument(s) compilation warning */
2388  UNUSED(husart);
2389 
2390  /* NOTE : This function should not be modified, when the callback is needed,
2391  the HAL_USART_TxCpltCallback can be implemented in the user file.
2392  */
2393 }

◆ HAL_USART_TxHalfCpltCallback()

__weak void HAL_USART_TxHalfCpltCallback ( USART_HandleTypeDef husart)

Tx Half Transfer completed callback.

Parameters
husartUSART handle.
Return values
None

Definition at line 2400 of file stm32l4xx_hal_usart.c.

2401 {
2402  /* Prevent unused argument(s) compilation warning */
2403  UNUSED(husart);
2404 
2405  /* NOTE: This function should not be modified, when the callback is needed,
2406  the HAL_USART_TxHalfCpltCallback can be implemented in the user file.
2407  */
2408 }

◆ HAL_USART_TxRxCpltCallback()

__weak void HAL_USART_TxRxCpltCallback ( USART_HandleTypeDef husart)

Tx/Rx Transfers completed callback for the non-blocking process.

Parameters
husartUSART handle.
Return values
None

Definition at line 2445 of file stm32l4xx_hal_usart.c.

2446 {
2447  /* Prevent unused argument(s) compilation warning */
2448  UNUSED(husart);
2449 
2450  /* NOTE : This function should not be modified, when the callback is needed,
2451  the HAL_USART_TxRxCpltCallback can be implemented in the user file
2452  */
2453 }