STM32L4xx_HAL_Driver  1.14.0
Input and Output operation functions

QSPI Transmit/Receive functions. More...

Functions

void HAL_QSPI_IRQHandler (QSPI_HandleTypeDef *hqspi)
 Handle QSPI interrupt request. More...
 
HAL_StatusTypeDef HAL_QSPI_Command (QSPI_HandleTypeDef *hqspi, QSPI_CommandTypeDef *cmd, uint32_t Timeout)
 Set the command configuration. More...
 
HAL_StatusTypeDef HAL_QSPI_Transmit (QSPI_HandleTypeDef *hqspi, uint8_t *pData, uint32_t Timeout)
 Transmit an amount of data in blocking mode. More...
 
HAL_StatusTypeDef HAL_QSPI_Receive (QSPI_HandleTypeDef *hqspi, uint8_t *pData, uint32_t Timeout)
 Receive an amount of data in blocking mode. More...
 
HAL_StatusTypeDef HAL_QSPI_Command_IT (QSPI_HandleTypeDef *hqspi, QSPI_CommandTypeDef *cmd)
 Set the command configuration in interrupt mode. More...
 
HAL_StatusTypeDef HAL_QSPI_Transmit_IT (QSPI_HandleTypeDef *hqspi, uint8_t *pData)
 Send an amount of data in non-blocking mode with interrupt. More...
 
HAL_StatusTypeDef HAL_QSPI_Receive_IT (QSPI_HandleTypeDef *hqspi, uint8_t *pData)
 Receive an amount of data in non-blocking mode with interrupt. More...
 
HAL_StatusTypeDef HAL_QSPI_Transmit_DMA (QSPI_HandleTypeDef *hqspi, uint8_t *pData)
 Send an amount of data in non-blocking mode with DMA. More...
 
HAL_StatusTypeDef HAL_QSPI_Receive_DMA (QSPI_HandleTypeDef *hqspi, uint8_t *pData)
 Receive an amount of data in non-blocking mode with DMA. More...
 
HAL_StatusTypeDef HAL_QSPI_AutoPolling (QSPI_HandleTypeDef *hqspi, QSPI_CommandTypeDef *cmd, QSPI_AutoPollingTypeDef *cfg, uint32_t Timeout)
 Configure the QSPI Automatic Polling Mode in blocking mode. More...
 
HAL_StatusTypeDef HAL_QSPI_AutoPolling_IT (QSPI_HandleTypeDef *hqspi, QSPI_CommandTypeDef *cmd, QSPI_AutoPollingTypeDef *cfg)
 Configure the QSPI Automatic Polling Mode in non-blocking mode. More...
 
HAL_StatusTypeDef HAL_QSPI_MemoryMapped (QSPI_HandleTypeDef *hqspi, QSPI_CommandTypeDef *cmd, QSPI_MemoryMappedTypeDef *cfg)
 Configure the Memory Mapped mode. More...
 
void HAL_QSPI_ErrorCallback (QSPI_HandleTypeDef *hqspi)
 Transfer Error callback. More...
 
void HAL_QSPI_AbortCpltCallback (QSPI_HandleTypeDef *hqspi)
 Abort completed callback. More...
 
void HAL_QSPI_FifoThresholdCallback (QSPI_HandleTypeDef *hqspi)
 FIFO Threshold callback. More...
 
void HAL_QSPI_CmdCpltCallback (QSPI_HandleTypeDef *hqspi)
 Command completed callback. More...
 
void HAL_QSPI_RxCpltCallback (QSPI_HandleTypeDef *hqspi)
 Rx Transfer completed callback. More...
 
void HAL_QSPI_TxCpltCallback (QSPI_HandleTypeDef *hqspi)
 Tx Transfer completed callback. More...
 
void HAL_QSPI_RxHalfCpltCallback (QSPI_HandleTypeDef *hqspi)
 Rx Half Transfer completed callback. More...
 
void HAL_QSPI_TxHalfCpltCallback (QSPI_HandleTypeDef *hqspi)
 Tx Half Transfer completed callback. More...
 
void HAL_QSPI_StatusMatchCallback (QSPI_HandleTypeDef *hqspi)
 Status Match callback. More...
 
void HAL_QSPI_TimeOutCallback (QSPI_HandleTypeDef *hqspi)
 Timeout callback. More...
 
HAL_StatusTypeDef HAL_QSPI_RegisterCallback (QSPI_HandleTypeDef *hqspi, HAL_QSPI_CallbackIDTypeDef CallbackId, pQSPI_CallbackTypeDef pCallback)
 Register a User QSPI Callback To be used instead of the weak (surcharged) predefined callback. More...
 
HAL_StatusTypeDef HAL_QSPI_UnRegisterCallback (QSPI_HandleTypeDef *hqspi, HAL_QSPI_CallbackIDTypeDef CallbackId)
 Unregister a User QSPI Callback QSPI Callback is redirected to the weak (surcharged) predefined callback. More...
 

Detailed Description

QSPI Transmit/Receive functions.

 ===============================================================================
                      ##### IO operation functions #####
 ===============================================================================
    [..]
    This subsection provides a set of functions allowing to :
      (+) Handle the interrupts.
      (+) Handle the command sequence.
      (+) Transmit data in blocking, interrupt or DMA mode.
      (+) Receive data in blocking, interrupt or DMA mode.
      (+) Manage the auto-polling functional mode.
      (+) Manage the memory-mapped functional mode.

Function Documentation

◆ HAL_QSPI_AbortCpltCallback()

__weak void HAL_QSPI_AbortCpltCallback ( QSPI_HandleTypeDef hqspi)

Abort completed callback.

Parameters
hqspi: QSPI handle
Return values
None

Definition at line 1886 of file stm32l4xx_hal_qspi.c.

1887 {
1888  /* Prevent unused argument(s) compilation warning */
1889  UNUSED(hqspi);
1890 
1891  /* NOTE: This function should not be modified, when the callback is needed,
1892  the HAL_QSPI_AbortCpltCallback could be implemented in the user file
1893  */
1894 }

◆ HAL_QSPI_AutoPolling()

HAL_StatusTypeDef HAL_QSPI_AutoPolling ( QSPI_HandleTypeDef hqspi,
QSPI_CommandTypeDef cmd,
QSPI_AutoPollingTypeDef cfg,
uint32_t  Timeout 
)

Configure the QSPI Automatic Polling Mode in blocking mode.

Parameters
hqspi: QSPI handle
cmd: structure that contains the command configuration information.
cfg: structure that contains the polling configuration information.
Timeout: Timeout duration
Note
This function is used only in Automatic Polling Mode
Return values
HALstatus

Definition at line 1581 of file stm32l4xx_hal_qspi.c.

1582 {
1583  HAL_StatusTypeDef status;
1584  uint32_t tickstart = HAL_GetTick();
1585 
1586  /* Check the parameters */
1587  assert_param(IS_QSPI_INSTRUCTION_MODE(cmd->InstructionMode));
1588  if (cmd->InstructionMode != QSPI_INSTRUCTION_NONE)
1589  {
1590  assert_param(IS_QSPI_INSTRUCTION(cmd->Instruction));
1591  }
1592 
1593  assert_param(IS_QSPI_ADDRESS_MODE(cmd->AddressMode));
1594  if (cmd->AddressMode != QSPI_ADDRESS_NONE)
1595  {
1596  assert_param(IS_QSPI_ADDRESS_SIZE(cmd->AddressSize));
1597  }
1598 
1599  assert_param(IS_QSPI_ALTERNATE_BYTES_MODE(cmd->AlternateByteMode));
1600  if (cmd->AlternateByteMode != QSPI_ALTERNATE_BYTES_NONE)
1601  {
1602  assert_param(IS_QSPI_ALTERNATE_BYTES_SIZE(cmd->AlternateBytesSize));
1603  }
1604 
1605  assert_param(IS_QSPI_DUMMY_CYCLES(cmd->DummyCycles));
1606  assert_param(IS_QSPI_DATA_MODE(cmd->DataMode));
1607 
1608  assert_param(IS_QSPI_DDR_MODE(cmd->DdrMode));
1609  assert_param(IS_QSPI_DDR_HHC(cmd->DdrHoldHalfCycle));
1610  assert_param(IS_QSPI_SIOO_MODE(cmd->SIOOMode));
1611 
1612  assert_param(IS_QSPI_INTERVAL(cfg->Interval));
1613  assert_param(IS_QSPI_STATUS_BYTES_SIZE(cfg->StatusBytesSize));
1614  assert_param(IS_QSPI_MATCH_MODE(cfg->MatchMode));
1615 
1616  /* Process locked */
1617  __HAL_LOCK(hqspi);
1618 
1619  if(hqspi->State == HAL_QSPI_STATE_READY)
1620  {
1621  hqspi->ErrorCode = HAL_QSPI_ERROR_NONE;
1622 
1623  /* Update state */
1624  hqspi->State = HAL_QSPI_STATE_BUSY_AUTO_POLLING;
1625 
1626  /* Wait till BUSY flag reset */
1627  status = QSPI_WaitFlagStateUntilTimeout(hqspi, QSPI_FLAG_BUSY, RESET, tickstart, Timeout);
1628 
1629  if (status == HAL_OK)
1630  {
1631  /* Configure QSPI: PSMAR register with the status match value */
1632  WRITE_REG(hqspi->Instance->PSMAR, cfg->Match);
1633 
1634  /* Configure QSPI: PSMKR register with the status mask value */
1635  WRITE_REG(hqspi->Instance->PSMKR, cfg->Mask);
1636 
1637  /* Configure QSPI: PIR register with the interval value */
1638  WRITE_REG(hqspi->Instance->PIR, cfg->Interval);
1639 
1640  /* Configure QSPI: CR register with Match mode and Automatic stop enabled
1641  (otherwise there will be an infinite loop in blocking mode) */
1642  MODIFY_REG(hqspi->Instance->CR, (QUADSPI_CR_PMM | QUADSPI_CR_APMS),
1643  (cfg->MatchMode | QSPI_AUTOMATIC_STOP_ENABLE));
1644 
1645  /* Call the configuration function */
1646  cmd->NbData = cfg->StatusBytesSize;
1647  QSPI_Config(hqspi, cmd, QSPI_FUNCTIONAL_MODE_AUTO_POLLING);
1648 
1649  /* Wait until SM flag is set to go back in idle state */
1650  status = QSPI_WaitFlagStateUntilTimeout(hqspi, QSPI_FLAG_SM, SET, tickstart, Timeout);
1651 
1652  if (status == HAL_OK)
1653  {
1654  __HAL_QSPI_CLEAR_FLAG(hqspi, QSPI_FLAG_SM);
1655 
1656  /* Update state */
1657  hqspi->State = HAL_QSPI_STATE_READY;
1658  }
1659  }
1660  }
1661  else
1662  {
1663  status = HAL_BUSY;
1664  }
1665 
1666  /* Process unlocked */
1667  __HAL_UNLOCK(hqspi);
1668 
1669  /* Return function status */
1670  return status;
1671 }
uint32_t HAL_GetTick(void)
Provide a tick value in millisecond.
__HAL_UNLOCK(hrtc)
__HAL_LOCK(hrtc)
return HAL_OK
static void QSPI_Config(QSPI_HandleTypeDef *hqspi, QSPI_CommandTypeDef *cmd, uint32_t FunctionalMode)
Configure the communication registers.
MODIFY_REG(hrtc->Instance->CR, RTC_CR_WUCKSEL,(uint32_t) WakeUpClock)
static HAL_StatusTypeDef QSPI_WaitFlagStateUntilTimeout(QSPI_HandleTypeDef *hqspi, uint32_t Flag, FlagStatus State, uint32_t Tickstart, uint32_t Timeout)
Wait for a flag state until timeout.
assert_param(IS_RTC_WAKEUP_CLOCK(WakeUpClock))

◆ HAL_QSPI_AutoPolling_IT()

HAL_StatusTypeDef HAL_QSPI_AutoPolling_IT ( QSPI_HandleTypeDef hqspi,
QSPI_CommandTypeDef cmd,
QSPI_AutoPollingTypeDef cfg 
)

Configure the QSPI Automatic Polling Mode in non-blocking mode.

Parameters
hqspi: QSPI handle
cmd: structure that contains the command configuration information.
cfg: structure that contains the polling configuration information.
Note
This function is used only in Automatic Polling Mode
Return values
HALstatus

Definition at line 1681 of file stm32l4xx_hal_qspi.c.

1682 {
1683  HAL_StatusTypeDef status;
1684  uint32_t tickstart = HAL_GetTick();
1685 
1686  /* Check the parameters */
1687  assert_param(IS_QSPI_INSTRUCTION_MODE(cmd->InstructionMode));
1688  if (cmd->InstructionMode != QSPI_INSTRUCTION_NONE)
1689  {
1690  assert_param(IS_QSPI_INSTRUCTION(cmd->Instruction));
1691  }
1692 
1693  assert_param(IS_QSPI_ADDRESS_MODE(cmd->AddressMode));
1694  if (cmd->AddressMode != QSPI_ADDRESS_NONE)
1695  {
1696  assert_param(IS_QSPI_ADDRESS_SIZE(cmd->AddressSize));
1697  }
1698 
1699  assert_param(IS_QSPI_ALTERNATE_BYTES_MODE(cmd->AlternateByteMode));
1700  if (cmd->AlternateByteMode != QSPI_ALTERNATE_BYTES_NONE)
1701  {
1702  assert_param(IS_QSPI_ALTERNATE_BYTES_SIZE(cmd->AlternateBytesSize));
1703  }
1704 
1705  assert_param(IS_QSPI_DUMMY_CYCLES(cmd->DummyCycles));
1706  assert_param(IS_QSPI_DATA_MODE(cmd->DataMode));
1707 
1708  assert_param(IS_QSPI_DDR_MODE(cmd->DdrMode));
1709  assert_param(IS_QSPI_DDR_HHC(cmd->DdrHoldHalfCycle));
1710  assert_param(IS_QSPI_SIOO_MODE(cmd->SIOOMode));
1711 
1712  assert_param(IS_QSPI_INTERVAL(cfg->Interval));
1713  assert_param(IS_QSPI_STATUS_BYTES_SIZE(cfg->StatusBytesSize));
1714  assert_param(IS_QSPI_MATCH_MODE(cfg->MatchMode));
1715  assert_param(IS_QSPI_AUTOMATIC_STOP(cfg->AutomaticStop));
1716 
1717  /* Process locked */
1718  __HAL_LOCK(hqspi);
1719 
1720  if(hqspi->State == HAL_QSPI_STATE_READY)
1721  {
1722  hqspi->ErrorCode = HAL_QSPI_ERROR_NONE;
1723 
1724  /* Update state */
1725  hqspi->State = HAL_QSPI_STATE_BUSY_AUTO_POLLING;
1726 
1727  /* Wait till BUSY flag reset */
1728  status = QSPI_WaitFlagStateUntilTimeout(hqspi, QSPI_FLAG_BUSY, RESET, tickstart, hqspi->Timeout);
1729 
1730  if (status == HAL_OK)
1731  {
1732  /* Configure QSPI: PSMAR register with the status match value */
1733  WRITE_REG(hqspi->Instance->PSMAR, cfg->Match);
1734 
1735  /* Configure QSPI: PSMKR register with the status mask value */
1736  WRITE_REG(hqspi->Instance->PSMKR, cfg->Mask);
1737 
1738  /* Configure QSPI: PIR register with the interval value */
1739  WRITE_REG(hqspi->Instance->PIR, cfg->Interval);
1740 
1741  /* Configure QSPI: CR register with Match mode and Automatic stop mode */
1742  MODIFY_REG(hqspi->Instance->CR, (QUADSPI_CR_PMM | QUADSPI_CR_APMS),
1743  (cfg->MatchMode | cfg->AutomaticStop));
1744 
1745  /* Clear interrupt */
1746  __HAL_QSPI_CLEAR_FLAG(hqspi, QSPI_FLAG_TE | QSPI_FLAG_SM);
1747 
1748  /* Call the configuration function */
1749  cmd->NbData = cfg->StatusBytesSize;
1750  QSPI_Config(hqspi, cmd, QSPI_FUNCTIONAL_MODE_AUTO_POLLING);
1751 
1752  /* Process unlocked */
1753  __HAL_UNLOCK(hqspi);
1754 
1755  /* Enable the QSPI Transfer Error and status match Interrupt */
1756  __HAL_QSPI_ENABLE_IT(hqspi, (QSPI_IT_SM | QSPI_IT_TE));
1757 
1758  }
1759  else
1760  {
1761  /* Process unlocked */
1762  __HAL_UNLOCK(hqspi);
1763  }
1764  }
1765  else
1766  {
1767  status = HAL_BUSY;
1768 
1769  /* Process unlocked */
1770  __HAL_UNLOCK(hqspi);
1771  }
1772 
1773  /* Return function status */
1774  return status;
1775 }
uint32_t HAL_GetTick(void)
Provide a tick value in millisecond.
__HAL_UNLOCK(hrtc)
__HAL_LOCK(hrtc)
return HAL_OK
static void QSPI_Config(QSPI_HandleTypeDef *hqspi, QSPI_CommandTypeDef *cmd, uint32_t FunctionalMode)
Configure the communication registers.
MODIFY_REG(hrtc->Instance->CR, RTC_CR_WUCKSEL,(uint32_t) WakeUpClock)
static HAL_StatusTypeDef QSPI_WaitFlagStateUntilTimeout(QSPI_HandleTypeDef *hqspi, uint32_t Flag, FlagStatus State, uint32_t Tickstart, uint32_t Timeout)
Wait for a flag state until timeout.
assert_param(IS_RTC_WAKEUP_CLOCK(WakeUpClock))

◆ HAL_QSPI_CmdCpltCallback()

__weak void HAL_QSPI_CmdCpltCallback ( QSPI_HandleTypeDef hqspi)

Command completed callback.

Parameters
hqspi: QSPI handle
Return values
None

Definition at line 1901 of file stm32l4xx_hal_qspi.c.

1902 {
1903  /* Prevent unused argument(s) compilation warning */
1904  UNUSED(hqspi);
1905 
1906  /* NOTE: This function should not be modified, when the callback is needed,
1907  the HAL_QSPI_CmdCpltCallback could be implemented in the user file
1908  */
1909 }

◆ HAL_QSPI_Command()

HAL_StatusTypeDef HAL_QSPI_Command ( QSPI_HandleTypeDef hqspi,
QSPI_CommandTypeDef cmd,
uint32_t  Timeout 
)

Set the command configuration.

Parameters
hqspi: QSPI handle
cmd: structure that contains the command configuration information
Timeout: Timeout duration
Note
This function is used only in Indirect Read or Write Modes
Return values
HALstatus

Definition at line 798 of file stm32l4xx_hal_qspi.c.

799 {
800  HAL_StatusTypeDef status;
801  uint32_t tickstart = HAL_GetTick();
802 
803  /* Check the parameters */
804  assert_param(IS_QSPI_INSTRUCTION_MODE(cmd->InstructionMode));
805  if (cmd->InstructionMode != QSPI_INSTRUCTION_NONE)
806  {
807  assert_param(IS_QSPI_INSTRUCTION(cmd->Instruction));
808  }
809 
810  assert_param(IS_QSPI_ADDRESS_MODE(cmd->AddressMode));
811  if (cmd->AddressMode != QSPI_ADDRESS_NONE)
812  {
813  assert_param(IS_QSPI_ADDRESS_SIZE(cmd->AddressSize));
814  }
815 
816  assert_param(IS_QSPI_ALTERNATE_BYTES_MODE(cmd->AlternateByteMode));
817  if (cmd->AlternateByteMode != QSPI_ALTERNATE_BYTES_NONE)
818  {
819  assert_param(IS_QSPI_ALTERNATE_BYTES_SIZE(cmd->AlternateBytesSize));
820  }
821 
822  assert_param(IS_QSPI_DUMMY_CYCLES(cmd->DummyCycles));
823  assert_param(IS_QSPI_DATA_MODE(cmd->DataMode));
824 
825  assert_param(IS_QSPI_DDR_MODE(cmd->DdrMode));
826  assert_param(IS_QSPI_DDR_HHC(cmd->DdrHoldHalfCycle));
827  assert_param(IS_QSPI_SIOO_MODE(cmd->SIOOMode));
828 
829  /* Process locked */
830  __HAL_LOCK(hqspi);
831 
832  if(hqspi->State == HAL_QSPI_STATE_READY)
833  {
834  hqspi->ErrorCode = HAL_QSPI_ERROR_NONE;
835 
836  /* Update QSPI state */
837  hqspi->State = HAL_QSPI_STATE_BUSY;
838 
839  /* Wait till BUSY flag reset */
840  status = QSPI_WaitFlagStateUntilTimeout(hqspi, QSPI_FLAG_BUSY, RESET, tickstart, Timeout);
841 
842  if (status == HAL_OK)
843  {
844  /* Call the configuration function */
845  QSPI_Config(hqspi, cmd, QSPI_FUNCTIONAL_MODE_INDIRECT_WRITE);
846 
847  if (cmd->DataMode == QSPI_DATA_NONE)
848  {
849  /* When there is no data phase, the transfer start as soon as the configuration is done
850  so wait until TC flag is set to go back in idle state */
851  status = QSPI_WaitFlagStateUntilTimeout(hqspi, QSPI_FLAG_TC, SET, tickstart, Timeout);
852 
853  if (status == HAL_OK)
854  {
855  __HAL_QSPI_CLEAR_FLAG(hqspi, QSPI_FLAG_TC);
856 
857  /* Update QSPI state */
858  hqspi->State = HAL_QSPI_STATE_READY;
859  }
860  }
861  else
862  {
863  /* Update QSPI state */
864  hqspi->State = HAL_QSPI_STATE_READY;
865  }
866  }
867  }
868  else
869  {
870  status = HAL_BUSY;
871  }
872 
873  /* Process unlocked */
874  __HAL_UNLOCK(hqspi);
875 
876  /* Return function status */
877  return status;
878 }
uint32_t HAL_GetTick(void)
Provide a tick value in millisecond.
__HAL_UNLOCK(hrtc)
__HAL_LOCK(hrtc)
return HAL_OK
static void QSPI_Config(QSPI_HandleTypeDef *hqspi, QSPI_CommandTypeDef *cmd, uint32_t FunctionalMode)
Configure the communication registers.
static HAL_StatusTypeDef QSPI_WaitFlagStateUntilTimeout(QSPI_HandleTypeDef *hqspi, uint32_t Flag, FlagStatus State, uint32_t Tickstart, uint32_t Timeout)
Wait for a flag state until timeout.
assert_param(IS_RTC_WAKEUP_CLOCK(WakeUpClock))

◆ HAL_QSPI_Command_IT()

HAL_StatusTypeDef HAL_QSPI_Command_IT ( QSPI_HandleTypeDef hqspi,
QSPI_CommandTypeDef cmd 
)

Set the command configuration in interrupt mode.

Parameters
hqspi: QSPI handle
cmd: structure that contains the command configuration information
Note
This function is used only in Indirect Read or Write Modes
Return values
HALstatus

Definition at line 887 of file stm32l4xx_hal_qspi.c.

888 {
889  HAL_StatusTypeDef status;
890  uint32_t tickstart = HAL_GetTick();
891 
892  /* Check the parameters */
893  assert_param(IS_QSPI_INSTRUCTION_MODE(cmd->InstructionMode));
894  if (cmd->InstructionMode != QSPI_INSTRUCTION_NONE)
895  {
896  assert_param(IS_QSPI_INSTRUCTION(cmd->Instruction));
897  }
898 
899  assert_param(IS_QSPI_ADDRESS_MODE(cmd->AddressMode));
900  if (cmd->AddressMode != QSPI_ADDRESS_NONE)
901  {
902  assert_param(IS_QSPI_ADDRESS_SIZE(cmd->AddressSize));
903  }
904 
905  assert_param(IS_QSPI_ALTERNATE_BYTES_MODE(cmd->AlternateByteMode));
906  if (cmd->AlternateByteMode != QSPI_ALTERNATE_BYTES_NONE)
907  {
908  assert_param(IS_QSPI_ALTERNATE_BYTES_SIZE(cmd->AlternateBytesSize));
909  }
910 
911  assert_param(IS_QSPI_DUMMY_CYCLES(cmd->DummyCycles));
912  assert_param(IS_QSPI_DATA_MODE(cmd->DataMode));
913 
914  assert_param(IS_QSPI_DDR_MODE(cmd->DdrMode));
915  assert_param(IS_QSPI_DDR_HHC(cmd->DdrHoldHalfCycle));
916  assert_param(IS_QSPI_SIOO_MODE(cmd->SIOOMode));
917 
918  /* Process locked */
919  __HAL_LOCK(hqspi);
920 
921  if(hqspi->State == HAL_QSPI_STATE_READY)
922  {
923  hqspi->ErrorCode = HAL_QSPI_ERROR_NONE;
924 
925  /* Update QSPI state */
926  hqspi->State = HAL_QSPI_STATE_BUSY;
927 
928  /* Wait till BUSY flag reset */
929  status = QSPI_WaitFlagStateUntilTimeout(hqspi, QSPI_FLAG_BUSY, RESET, tickstart, hqspi->Timeout);
930 
931  if (status == HAL_OK)
932  {
933  if (cmd->DataMode == QSPI_DATA_NONE)
934  {
935  /* Clear interrupt */
936  __HAL_QSPI_CLEAR_FLAG(hqspi, QSPI_FLAG_TE | QSPI_FLAG_TC);
937  }
938 
939  /* Call the configuration function */
940  QSPI_Config(hqspi, cmd, QSPI_FUNCTIONAL_MODE_INDIRECT_WRITE);
941 
942  if (cmd->DataMode == QSPI_DATA_NONE)
943  {
944  /* When there is no data phase, the transfer start as soon as the configuration is done
945  so activate TC and TE interrupts */
946  /* Process unlocked */
947  __HAL_UNLOCK(hqspi);
948 
949  /* Enable the QSPI Transfer Error Interrupt */
950  __HAL_QSPI_ENABLE_IT(hqspi, QSPI_IT_TE | QSPI_IT_TC);
951  }
952  else
953  {
954  /* Update QSPI state */
955  hqspi->State = HAL_QSPI_STATE_READY;
956 
957  /* Process unlocked */
958  __HAL_UNLOCK(hqspi);
959  }
960  }
961  else
962  {
963  /* Process unlocked */
964  __HAL_UNLOCK(hqspi);
965  }
966  }
967  else
968  {
969  status = HAL_BUSY;
970 
971  /* Process unlocked */
972  __HAL_UNLOCK(hqspi);
973  }
974 
975  /* Return function status */
976  return status;
977 }
uint32_t HAL_GetTick(void)
Provide a tick value in millisecond.
__HAL_UNLOCK(hrtc)
__HAL_LOCK(hrtc)
return HAL_OK
static void QSPI_Config(QSPI_HandleTypeDef *hqspi, QSPI_CommandTypeDef *cmd, uint32_t FunctionalMode)
Configure the communication registers.
static HAL_StatusTypeDef QSPI_WaitFlagStateUntilTimeout(QSPI_HandleTypeDef *hqspi, uint32_t Flag, FlagStatus State, uint32_t Tickstart, uint32_t Timeout)
Wait for a flag state until timeout.
assert_param(IS_RTC_WAKEUP_CLOCK(WakeUpClock))

◆ HAL_QSPI_ErrorCallback()

__weak void HAL_QSPI_ErrorCallback ( QSPI_HandleTypeDef hqspi)

Transfer Error callback.

Parameters
hqspi: QSPI handle
Return values
None

Definition at line 1871 of file stm32l4xx_hal_qspi.c.

1872 {
1873  /* Prevent unused argument(s) compilation warning */
1874  UNUSED(hqspi);
1875 
1876  /* NOTE : This function should not be modified, when the callback is needed,
1877  the HAL_QSPI_ErrorCallback could be implemented in the user file
1878  */
1879 }

◆ HAL_QSPI_FifoThresholdCallback()

__weak void HAL_QSPI_FifoThresholdCallback ( QSPI_HandleTypeDef hqspi)

FIFO Threshold callback.

Parameters
hqspi: QSPI handle
Return values
None

Definition at line 1976 of file stm32l4xx_hal_qspi.c.

1977 {
1978  /* Prevent unused argument(s) compilation warning */
1979  UNUSED(hqspi);
1980 
1981  /* NOTE : This function should not be modified, when the callback is needed,
1982  the HAL_QSPI_FIFOThresholdCallback could be implemented in the user file
1983  */
1984 }

◆ HAL_QSPI_IRQHandler()

void HAL_QSPI_IRQHandler ( QSPI_HandleTypeDef hqspi)

Handle QSPI interrupt request.

Parameters
hqspi: QSPI handle
Return values
None

Definition at line 501 of file stm32l4xx_hal_qspi.c.

502 {
503  __IO uint32_t *data_reg;
504  uint32_t flag = READ_REG(hqspi->Instance->SR);
505  uint32_t itsource = READ_REG(hqspi->Instance->CR);
506 
507  /* QSPI Fifo Threshold interrupt occurred ----------------------------------*/
508  if(((flag & QSPI_FLAG_FT) != 0U) && ((itsource & QSPI_IT_FT) != 0U))
509  {
510  data_reg = &hqspi->Instance->DR;
511 
512  if(hqspi->State == HAL_QSPI_STATE_BUSY_INDIRECT_TX)
513  {
514  /* Transmission process */
515  while(__HAL_QSPI_GET_FLAG(hqspi, QSPI_FLAG_FT) != RESET)
516  {
517  if (hqspi->TxXferCount > 0U)
518  {
519  /* Fill the FIFO until the threshold is reached */
520  *((__IO uint8_t *)data_reg) = *hqspi->pTxBuffPtr;
521  hqspi->pTxBuffPtr++;
522  hqspi->TxXferCount--;
523  }
524  else
525  {
526  /* No more data available for the transfer */
527  /* Disable the QSPI FIFO Threshold Interrupt */
528  __HAL_QSPI_DISABLE_IT(hqspi, QSPI_IT_FT);
529  break;
530  }
531  }
532  }
533  else if(hqspi->State == HAL_QSPI_STATE_BUSY_INDIRECT_RX)
534  {
535  /* Receiving Process */
536  while(__HAL_QSPI_GET_FLAG(hqspi, QSPI_FLAG_FT) != RESET)
537  {
538  if (hqspi->RxXferCount > 0U)
539  {
540  /* Read the FIFO until the threshold is reached */
541  *hqspi->pRxBuffPtr = *((__IO uint8_t *)data_reg);
542  hqspi->pRxBuffPtr++;
543  hqspi->RxXferCount--;
544  }
545  else
546  {
547  /* All data have been received for the transfer */
548  /* Disable the QSPI FIFO Threshold Interrupt */
549  __HAL_QSPI_DISABLE_IT(hqspi, QSPI_IT_FT);
550  break;
551  }
552  }
553  }
554  else
555  {
556  /* Nothing to do */
557  }
558 
559  /* FIFO Threshold callback */
560 #if (USE_HAL_QSPI_REGISTER_CALLBACKS == 1)
561  hqspi->FifoThresholdCallback(hqspi);
562 #else
564 #endif
565  }
566 
567  /* QSPI Transfer Complete interrupt occurred -------------------------------*/
568  else if(((flag & QSPI_FLAG_TC) != 0U) && ((itsource & QSPI_IT_TC) != 0U))
569  {
570  /* Clear interrupt */
571  WRITE_REG(hqspi->Instance->FCR, QSPI_FLAG_TC);
572 
573  /* Disable the QSPI FIFO Threshold, Transfer Error and Transfer complete Interrupts */
574  __HAL_QSPI_DISABLE_IT(hqspi, QSPI_IT_TC | QSPI_IT_TE | QSPI_IT_FT);
575 
576  /* Transfer complete callback */
577  if(hqspi->State == HAL_QSPI_STATE_BUSY_INDIRECT_TX)
578  {
579  if ((hqspi->Instance->CR & QUADSPI_CR_DMAEN) != 0U)
580  {
581  /* Disable the DMA transfer by clearing the DMAEN bit in the QSPI CR register */
582  CLEAR_BIT(hqspi->Instance->CR, QUADSPI_CR_DMAEN);
583 
584  /* Disable the DMA channel */
585  __HAL_DMA_DISABLE(hqspi->hdma);
586  }
587 
588 #if (defined(STM32L471xx) || defined(STM32L475xx) || defined(STM32L476xx) || defined(STM32L485xx) || defined(STM32L486xx))
589  /* Clear Busy bit */
590  HAL_QSPI_Abort_IT(hqspi);
591 #endif
592 
593  /* Change state of QSPI */
594  hqspi->State = HAL_QSPI_STATE_READY;
595 
596  /* TX Complete callback */
597 #if (USE_HAL_QSPI_REGISTER_CALLBACKS == 1)
598  hqspi->TxCpltCallback(hqspi);
599 #else
601 #endif
602  }
603  else if(hqspi->State == HAL_QSPI_STATE_BUSY_INDIRECT_RX)
604  {
605  if ((hqspi->Instance->CR & QUADSPI_CR_DMAEN) != 0U)
606  {
607  /* Disable the DMA transfer by clearing the DMAEN bit in the QSPI CR register */
608  CLEAR_BIT(hqspi->Instance->CR, QUADSPI_CR_DMAEN);
609 
610  /* Disable the DMA channel */
611  __HAL_DMA_DISABLE(hqspi->hdma);
612  }
613  else
614  {
615  data_reg = &hqspi->Instance->DR;
616  while(READ_BIT(hqspi->Instance->SR, QUADSPI_SR_FLEVEL) != 0U)
617  {
618  if (hqspi->RxXferCount > 0U)
619  {
620  /* Read the last data received in the FIFO until it is empty */
621  *hqspi->pRxBuffPtr = *((__IO uint8_t *)data_reg);
622  hqspi->pRxBuffPtr++;
623  hqspi->RxXferCount--;
624  }
625  else
626  {
627  /* All data have been received for the transfer */
628  break;
629  }
630  }
631  }
632 
633 #if (defined(STM32L471xx) || defined(STM32L475xx) || defined(STM32L476xx) || defined(STM32L485xx) || defined(STM32L486xx))
634  /* Workaround - Extra data written in the FIFO at the end of a read transfer */
635  HAL_QSPI_Abort_IT(hqspi);
636 #endif
637 
638  /* Change state of QSPI */
639  hqspi->State = HAL_QSPI_STATE_READY;
640 
641  /* RX Complete callback */
642 #if (USE_HAL_QSPI_REGISTER_CALLBACKS == 1)
643  hqspi->RxCpltCallback(hqspi);
644 #else
646 #endif
647  }
648  else if(hqspi->State == HAL_QSPI_STATE_BUSY)
649  {
650  /* Change state of QSPI */
651  hqspi->State = HAL_QSPI_STATE_READY;
652 
653  /* Command Complete callback */
654 #if (USE_HAL_QSPI_REGISTER_CALLBACKS == 1)
655  hqspi->CmdCpltCallback(hqspi);
656 #else
658 #endif
659  }
660  else if(hqspi->State == HAL_QSPI_STATE_ABORT)
661  {
662  /* Reset functional mode configuration to indirect write mode by default */
663  CLEAR_BIT(hqspi->Instance->CCR, QUADSPI_CCR_FMODE);
664 
665  /* Change state of QSPI */
666  hqspi->State = HAL_QSPI_STATE_READY;
667 
668  if (hqspi->ErrorCode == HAL_QSPI_ERROR_NONE)
669  {
670  /* Abort called by the user */
671 
672  /* Abort Complete callback */
673 #if (USE_HAL_QSPI_REGISTER_CALLBACKS == 1)
674  hqspi->AbortCpltCallback(hqspi);
675 #else
677 #endif
678  }
679  else
680  {
681  /* Abort due to an error (eg : DMA error) */
682 
683  /* Error callback */
684 #if (USE_HAL_QSPI_REGISTER_CALLBACKS == 1)
685  hqspi->ErrorCallback(hqspi);
686 #else
687  HAL_QSPI_ErrorCallback(hqspi);
688 #endif
689  }
690  }
691  else
692  {
693  /* Nothing to do */
694  }
695  }
696 
697  /* QSPI Status Match interrupt occurred ------------------------------------*/
698  else if(((flag & QSPI_FLAG_SM) != 0U) && ((itsource & QSPI_IT_SM) != 0U))
699  {
700  /* Clear interrupt */
701  WRITE_REG(hqspi->Instance->FCR, QSPI_FLAG_SM);
702 
703  /* Check if the automatic poll mode stop is activated */
704  if(READ_BIT(hqspi->Instance->CR, QUADSPI_CR_APMS) != 0U)
705  {
706  /* Disable the QSPI Transfer Error and Status Match Interrupts */
707  __HAL_QSPI_DISABLE_IT(hqspi, (QSPI_IT_SM | QSPI_IT_TE));
708 
709  /* Change state of QSPI */
710  hqspi->State = HAL_QSPI_STATE_READY;
711  }
712 
713  /* Status match callback */
714 #if (USE_HAL_QSPI_REGISTER_CALLBACKS == 1)
715  hqspi->StatusMatchCallback(hqspi);
716 #else
718 #endif
719  }
720 
721  /* QSPI Transfer Error interrupt occurred ----------------------------------*/
722  else if(((flag & QSPI_FLAG_TE) != 0U) && ((itsource & QSPI_IT_TE) != 0U))
723  {
724  /* Clear interrupt */
725  WRITE_REG(hqspi->Instance->FCR, QSPI_FLAG_TE);
726 
727  /* Disable all the QSPI Interrupts */
728  __HAL_QSPI_DISABLE_IT(hqspi, QSPI_IT_SM | QSPI_IT_TC | QSPI_IT_TE | QSPI_IT_FT);
729 
730  /* Set error code */
731  hqspi->ErrorCode |= HAL_QSPI_ERROR_TRANSFER;
732 
733  if ((hqspi->Instance->CR & QUADSPI_CR_DMAEN) != 0U)
734  {
735  /* Disable the DMA transfer by clearing the DMAEN bit in the QSPI CR register */
736  CLEAR_BIT(hqspi->Instance->CR, QUADSPI_CR_DMAEN);
737 
738  /* Disable the DMA channel */
739  hqspi->hdma->XferAbortCallback = QSPI_DMAAbortCplt;
740  if (HAL_DMA_Abort_IT(hqspi->hdma) != HAL_OK)
741  {
742  /* Set error code to DMA */
743  hqspi->ErrorCode |= HAL_QSPI_ERROR_DMA;
744 
745  /* Change state of QSPI */
746  hqspi->State = HAL_QSPI_STATE_READY;
747 
748  /* Error callback */
749 #if (USE_HAL_QSPI_REGISTER_CALLBACKS == 1)
750  hqspi->ErrorCallback(hqspi);
751 #else
752  HAL_QSPI_ErrorCallback(hqspi);
753 #endif
754  }
755  }
756  else
757  {
758  /* Change state of QSPI */
759  hqspi->State = HAL_QSPI_STATE_READY;
760 
761  /* Error callback */
762 #if (USE_HAL_QSPI_REGISTER_CALLBACKS == 1)
763  hqspi->ErrorCallback(hqspi);
764 #else
765  HAL_QSPI_ErrorCallback(hqspi);
766 #endif
767  }
768  }
769 
770  /* QSPI Timeout interrupt occurred -----------------------------------------*/
771  else if(((flag & QSPI_FLAG_TO) != 0U) && ((itsource & QSPI_IT_TO) != 0U))
772  {
773  /* Clear interrupt */
774  WRITE_REG(hqspi->Instance->FCR, QSPI_FLAG_TO);
775 
776  /* Timeout callback */
777 #if (USE_HAL_QSPI_REGISTER_CALLBACKS == 1)
778  hqspi->TimeOutCallback(hqspi);
779 #else
781 #endif
782  }
783 
784  else
785  {
786  /* Nothing to do */
787  }
788 }
void HAL_QSPI_TimeOutCallback(QSPI_HandleTypeDef *hqspi)
Timeout callback.
HAL_StatusTypeDef HAL_QSPI_Abort_IT(QSPI_HandleTypeDef *hqspi)
Abort the current transmission (non-blocking function)
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
static void QSPI_DMAAbortCplt(DMA_HandleTypeDef *hdma)
DMA QSPI abort complete callback.
void HAL_QSPI_RxCpltCallback(QSPI_HandleTypeDef *hqspi)
Rx Transfer completed callback.
void HAL_QSPI_AbortCpltCallback(QSPI_HandleTypeDef *hqspi)
Abort completed callback.
void HAL_QSPI_ErrorCallback(QSPI_HandleTypeDef *hqspi)
Transfer Error callback.
void HAL_QSPI_FifoThresholdCallback(QSPI_HandleTypeDef *hqspi)
FIFO Threshold callback.
void HAL_QSPI_TxCpltCallback(QSPI_HandleTypeDef *hqspi)
Tx Transfer completed callback.
void HAL_QSPI_CmdCpltCallback(QSPI_HandleTypeDef *hqspi)
Command completed callback.
void HAL_QSPI_StatusMatchCallback(QSPI_HandleTypeDef *hqspi)
Status Match callback.

◆ HAL_QSPI_MemoryMapped()

HAL_StatusTypeDef HAL_QSPI_MemoryMapped ( QSPI_HandleTypeDef hqspi,
QSPI_CommandTypeDef cmd,
QSPI_MemoryMappedTypeDef cfg 
)

Configure the Memory Mapped mode.

Parameters
hqspi: QSPI handle
cmd: structure that contains the command configuration information.
cfg: structure that contains the memory mapped configuration information.
Note
This function is used only in Memory mapped Mode
Return values
HALstatus

Definition at line 1785 of file stm32l4xx_hal_qspi.c.

1786 {
1787  HAL_StatusTypeDef status;
1788  uint32_t tickstart = HAL_GetTick();
1789 
1790  /* Check the parameters */
1791  assert_param(IS_QSPI_INSTRUCTION_MODE(cmd->InstructionMode));
1792  if (cmd->InstructionMode != QSPI_INSTRUCTION_NONE)
1793  {
1794  assert_param(IS_QSPI_INSTRUCTION(cmd->Instruction));
1795  }
1796 
1797  assert_param(IS_QSPI_ADDRESS_MODE(cmd->AddressMode));
1798  if (cmd->AddressMode != QSPI_ADDRESS_NONE)
1799  {
1800  assert_param(IS_QSPI_ADDRESS_SIZE(cmd->AddressSize));
1801  }
1802 
1803  assert_param(IS_QSPI_ALTERNATE_BYTES_MODE(cmd->AlternateByteMode));
1804  if (cmd->AlternateByteMode != QSPI_ALTERNATE_BYTES_NONE)
1805  {
1806  assert_param(IS_QSPI_ALTERNATE_BYTES_SIZE(cmd->AlternateBytesSize));
1807  }
1808 
1809  assert_param(IS_QSPI_DUMMY_CYCLES(cmd->DummyCycles));
1810  assert_param(IS_QSPI_DATA_MODE(cmd->DataMode));
1811 
1812  assert_param(IS_QSPI_DDR_MODE(cmd->DdrMode));
1813  assert_param(IS_QSPI_DDR_HHC(cmd->DdrHoldHalfCycle));
1814  assert_param(IS_QSPI_SIOO_MODE(cmd->SIOOMode));
1815 
1816  assert_param(IS_QSPI_TIMEOUT_ACTIVATION(cfg->TimeOutActivation));
1817 
1818  /* Process locked */
1819  __HAL_LOCK(hqspi);
1820 
1821  if(hqspi->State == HAL_QSPI_STATE_READY)
1822  {
1823  hqspi->ErrorCode = HAL_QSPI_ERROR_NONE;
1824 
1825  /* Update state */
1826  hqspi->State = HAL_QSPI_STATE_BUSY_MEM_MAPPED;
1827 
1828  /* Wait till BUSY flag reset */
1829  status = QSPI_WaitFlagStateUntilTimeout(hqspi, QSPI_FLAG_BUSY, RESET, tickstart, hqspi->Timeout);
1830 
1831  if (status == HAL_OK)
1832  {
1833  /* Configure QSPI: CR register with timeout counter enable */
1834  MODIFY_REG(hqspi->Instance->CR, QUADSPI_CR_TCEN, cfg->TimeOutActivation);
1835 
1836  if (cfg->TimeOutActivation == QSPI_TIMEOUT_COUNTER_ENABLE)
1837  {
1838  assert_param(IS_QSPI_TIMEOUT_PERIOD(cfg->TimeOutPeriod));
1839 
1840  /* Configure QSPI: LPTR register with the low-power timeout value */
1841  WRITE_REG(hqspi->Instance->LPTR, cfg->TimeOutPeriod);
1842 
1843  /* Clear interrupt */
1844  __HAL_QSPI_CLEAR_FLAG(hqspi, QSPI_FLAG_TO);
1845 
1846  /* Enable the QSPI TimeOut Interrupt */
1847  __HAL_QSPI_ENABLE_IT(hqspi, QSPI_IT_TO);
1848  }
1849 
1850  /* Call the configuration function */
1851  QSPI_Config(hqspi, cmd, QSPI_FUNCTIONAL_MODE_MEMORY_MAPPED);
1852  }
1853  }
1854  else
1855  {
1856  status = HAL_BUSY;
1857  }
1858 
1859  /* Process unlocked */
1860  __HAL_UNLOCK(hqspi);
1861 
1862  /* Return function status */
1863  return status;
1864 }
uint32_t HAL_GetTick(void)
Provide a tick value in millisecond.
__HAL_UNLOCK(hrtc)
__HAL_LOCK(hrtc)
return HAL_OK
static void QSPI_Config(QSPI_HandleTypeDef *hqspi, QSPI_CommandTypeDef *cmd, uint32_t FunctionalMode)
Configure the communication registers.
MODIFY_REG(hrtc->Instance->CR, RTC_CR_WUCKSEL,(uint32_t) WakeUpClock)
static HAL_StatusTypeDef QSPI_WaitFlagStateUntilTimeout(QSPI_HandleTypeDef *hqspi, uint32_t Flag, FlagStatus State, uint32_t Tickstart, uint32_t Timeout)
Wait for a flag state until timeout.
assert_param(IS_RTC_WAKEUP_CLOCK(WakeUpClock))

◆ HAL_QSPI_Receive()

HAL_StatusTypeDef HAL_QSPI_Receive ( QSPI_HandleTypeDef hqspi,
uint8_t *  pData,
uint32_t  Timeout 
)

Receive an amount of data in blocking mode.

Parameters
hqspi: QSPI handle
pData: pointer to data buffer
Timeout: Timeout duration
Note
This function is used only in Indirect Read Mode
Return values
HALstatus

Definition at line 1074 of file stm32l4xx_hal_qspi.c.

1075 {
1076  HAL_StatusTypeDef status = HAL_OK;
1077  uint32_t tickstart = HAL_GetTick();
1078  uint32_t addr_reg = READ_REG(hqspi->Instance->AR);
1079  __IO uint32_t *data_reg = &hqspi->Instance->DR;
1080 
1081  /* Process locked */
1082  __HAL_LOCK(hqspi);
1083 
1084  if(hqspi->State == HAL_QSPI_STATE_READY)
1085  {
1086  hqspi->ErrorCode = HAL_QSPI_ERROR_NONE;
1087 
1088  if(pData != NULL )
1089  {
1090  /* Update state */
1091  hqspi->State = HAL_QSPI_STATE_BUSY_INDIRECT_RX;
1092 
1093  /* Configure counters and size of the handle */
1094  hqspi->RxXferCount = READ_REG(hqspi->Instance->DLR) + 1U;
1095  hqspi->RxXferSize = READ_REG(hqspi->Instance->DLR) + 1U;
1096  hqspi->pRxBuffPtr = pData;
1097 
1098  /* Configure QSPI: CCR register with functional as indirect read */
1099  MODIFY_REG(hqspi->Instance->CCR, QUADSPI_CCR_FMODE, QSPI_FUNCTIONAL_MODE_INDIRECT_READ);
1100 
1101  /* Start the transfer by re-writing the address in AR register */
1102  WRITE_REG(hqspi->Instance->AR, addr_reg);
1103 
1104  while(hqspi->RxXferCount > 0U)
1105  {
1106  /* Wait until FT or TC flag is set to read received data */
1107  status = QSPI_WaitFlagStateUntilTimeout(hqspi, (QSPI_FLAG_FT | QSPI_FLAG_TC), SET, tickstart, Timeout);
1108 
1109  if (status != HAL_OK)
1110  {
1111  break;
1112  }
1113 
1114  *hqspi->pRxBuffPtr = *((__IO uint8_t *)data_reg);
1115  hqspi->pRxBuffPtr++;
1116  hqspi->RxXferCount--;
1117  }
1118 
1119  if (status == HAL_OK)
1120  {
1121  /* Wait until TC flag is set to go back in idle state */
1122  status = QSPI_WaitFlagStateUntilTimeout(hqspi, QSPI_FLAG_TC, SET, tickstart, Timeout);
1123 
1124  if (status == HAL_OK)
1125  {
1126  /* Clear Transfer Complete bit */
1127  __HAL_QSPI_CLEAR_FLAG(hqspi, QSPI_FLAG_TC);
1128 
1129 #if (defined(STM32L471xx) || defined(STM32L475xx) || defined(STM32L476xx) || defined(STM32L485xx) || defined(STM32L486xx))
1130  /* Workaround - Extra data written in the FIFO at the end of a read transfer */
1131  status = HAL_QSPI_Abort(hqspi);
1132 #endif
1133  }
1134  }
1135 
1136  /* Update QSPI state */
1137  hqspi->State = HAL_QSPI_STATE_READY;
1138  }
1139  else
1140  {
1141  hqspi->ErrorCode |= HAL_QSPI_ERROR_INVALID_PARAM;
1142  status = HAL_ERROR;
1143  }
1144  }
1145  else
1146  {
1147  status = HAL_BUSY;
1148  }
1149 
1150  /* Process unlocked */
1151  __HAL_UNLOCK(hqspi);
1152 
1153  return status;
1154 }
uint32_t HAL_GetTick(void)
Provide a tick value in millisecond.
__HAL_UNLOCK(hrtc)
__HAL_LOCK(hrtc)
return HAL_OK
MODIFY_REG(hrtc->Instance->CR, RTC_CR_WUCKSEL,(uint32_t) WakeUpClock)
static HAL_StatusTypeDef QSPI_WaitFlagStateUntilTimeout(QSPI_HandleTypeDef *hqspi, uint32_t Flag, FlagStatus State, uint32_t Tickstart, uint32_t Timeout)
Wait for a flag state until timeout.
HAL_StatusTypeDef HAL_QSPI_Abort(QSPI_HandleTypeDef *hqspi)
Abort the current transmission.

◆ HAL_QSPI_Receive_DMA()

HAL_StatusTypeDef HAL_QSPI_Receive_DMA ( QSPI_HandleTypeDef hqspi,
uint8_t *  pData 
)

Receive an amount of data in non-blocking mode with DMA.

Parameters
hqspi: QSPI handle
pData: pointer to data buffer.
Note
This function is used only in Indirect Read Mode
If DMA peripheral access is configured as halfword, the number of data and the fifo threshold should be aligned on halfword
If DMA peripheral access is configured as word, the number of data and the fifo threshold should be aligned on word
Return values
HALstatus

Definition at line 1435 of file stm32l4xx_hal_qspi.c.

1436 {
1437  HAL_StatusTypeDef status = HAL_OK;
1438  uint32_t addr_reg = READ_REG(hqspi->Instance->AR);
1439  uint32_t data_size = (READ_REG(hqspi->Instance->DLR) + 1U);
1440 
1441  /* Process locked */
1442  __HAL_LOCK(hqspi);
1443 
1444  if(hqspi->State == HAL_QSPI_STATE_READY)
1445  {
1446  /* Clear the error code */
1447  hqspi->ErrorCode = HAL_QSPI_ERROR_NONE;
1448 
1449  if(pData != NULL )
1450  {
1451  /* Configure counters of the handle */
1452  if (hqspi->hdma->Init.PeriphDataAlignment == DMA_PDATAALIGN_BYTE)
1453  {
1454  hqspi->RxXferCount = data_size;
1455  }
1456  else if (hqspi->hdma->Init.PeriphDataAlignment == DMA_PDATAALIGN_HALFWORD)
1457  {
1458  if (((data_size % 2U) != 0U) || ((hqspi->Init.FifoThreshold % 2U) != 0U))
1459  {
1460  /* The number of data or the fifo threshold is not aligned on halfword
1461  => no transfer possible with DMA peripheral access configured as halfword */
1462  hqspi->ErrorCode |= HAL_QSPI_ERROR_INVALID_PARAM;
1463  status = HAL_ERROR;
1464 
1465  /* Process unlocked */
1466  __HAL_UNLOCK(hqspi);
1467  }
1468  else
1469  {
1470  hqspi->RxXferCount = (data_size >> 1U);
1471  }
1472  }
1473  else if (hqspi->hdma->Init.PeriphDataAlignment == DMA_PDATAALIGN_WORD)
1474  {
1475  if (((data_size % 4U) != 0U) || ((hqspi->Init.FifoThreshold % 4U) != 0U))
1476  {
1477  /* The number of data or the fifo threshold is not aligned on word
1478  => no transfer possible with DMA peripheral access configured as word */
1479  hqspi->ErrorCode |= HAL_QSPI_ERROR_INVALID_PARAM;
1480  status = HAL_ERROR;
1481 
1482  /* Process unlocked */
1483  __HAL_UNLOCK(hqspi);
1484  }
1485  else
1486  {
1487  hqspi->RxXferCount = (data_size >> 2U);
1488  }
1489  }
1490  else
1491  {
1492  /* Nothing to do */
1493  }
1494 
1495  if (status == HAL_OK)
1496  {
1497  /* Update state */
1498  hqspi->State = HAL_QSPI_STATE_BUSY_INDIRECT_RX;
1499 
1500  /* Clear interrupt */
1501  __HAL_QSPI_CLEAR_FLAG(hqspi, (QSPI_FLAG_TE | QSPI_FLAG_TC));
1502 
1503  /* Configure size and pointer of the handle */
1504  hqspi->RxXferSize = hqspi->RxXferCount;
1505  hqspi->pRxBuffPtr = pData;
1506 
1507  /* Set the QSPI DMA transfer complete callback */
1508  hqspi->hdma->XferCpltCallback = QSPI_DMARxCplt;
1509 
1510  /* Set the QSPI DMA Half transfer complete callback */
1511  hqspi->hdma->XferHalfCpltCallback = QSPI_DMARxHalfCplt;
1512 
1513  /* Set the DMA error callback */
1514  hqspi->hdma->XferErrorCallback = QSPI_DMAError;
1515 
1516  /* Clear the DMA abort callback */
1517  hqspi->hdma->XferAbortCallback = NULL;
1518 
1519  /* Configure the direction of the DMA */
1520  hqspi->hdma->Init.Direction = DMA_PERIPH_TO_MEMORY;
1521  MODIFY_REG(hqspi->hdma->Instance->CCR, DMA_CCR_DIR, hqspi->hdma->Init.Direction);
1522 
1523  /* Enable the DMA Channel */
1524  if (HAL_DMA_Start_IT(hqspi->hdma, (uint32_t)&hqspi->Instance->DR, (uint32_t)pData, hqspi->RxXferSize) == HAL_OK)
1525  {
1526  /* Configure QSPI: CCR register with functional as indirect read */
1527  MODIFY_REG(hqspi->Instance->CCR, QUADSPI_CCR_FMODE, QSPI_FUNCTIONAL_MODE_INDIRECT_READ);
1528 
1529  /* Start the transfer by re-writing the address in AR register */
1530  WRITE_REG(hqspi->Instance->AR, addr_reg);
1531 
1532  /* Process unlocked */
1533  __HAL_UNLOCK(hqspi);
1534 
1535  /* Enable the QSPI transfer error Interrupt */
1536  __HAL_QSPI_ENABLE_IT(hqspi, QSPI_IT_TE);
1537 
1538  /* Enable the DMA transfer by setting the DMAEN bit in the QSPI CR register */
1539  SET_BIT(hqspi->Instance->CR, QUADSPI_CR_DMAEN);
1540  }
1541  else
1542  {
1543  status = HAL_ERROR;
1544  hqspi->ErrorCode |= HAL_QSPI_ERROR_DMA;
1545  hqspi->State = HAL_QSPI_STATE_READY;
1546 
1547  /* Process unlocked */
1548  __HAL_UNLOCK(hqspi);
1549  }
1550  }
1551  }
1552  else
1553  {
1554  hqspi->ErrorCode |= HAL_QSPI_ERROR_INVALID_PARAM;
1555  status = HAL_ERROR;
1556 
1557  /* Process unlocked */
1558  __HAL_UNLOCK(hqspi);
1559  }
1560  }
1561  else
1562  {
1563  status = HAL_BUSY;
1564 
1565  /* Process unlocked */
1566  __HAL_UNLOCK(hqspi);
1567  }
1568 
1569  return status;
1570 }
static void QSPI_DMAError(DMA_HandleTypeDef *hdma)
DMA QSPI communication error callback.
static void QSPI_DMARxHalfCplt(DMA_HandleTypeDef *hdma)
DMA QSPI receive process half complete callback.
__HAL_UNLOCK(hrtc)
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)
static void QSPI_DMARxCplt(DMA_HandleTypeDef *hdma)
DMA QSPI receive process complete callback.
return HAL_OK
MODIFY_REG(hrtc->Instance->CR, RTC_CR_WUCKSEL,(uint32_t) WakeUpClock)

◆ HAL_QSPI_Receive_IT()

HAL_StatusTypeDef HAL_QSPI_Receive_IT ( QSPI_HandleTypeDef hqspi,
uint8_t *  pData 
)

Receive an amount of data in non-blocking mode with interrupt.

Parameters
hqspi: QSPI handle
pData: pointer to data buffer
Note
This function is used only in Indirect Read Mode
Return values
HALstatus

Definition at line 1223 of file stm32l4xx_hal_qspi.c.

1224 {
1225  HAL_StatusTypeDef status = HAL_OK;
1226  uint32_t addr_reg = READ_REG(hqspi->Instance->AR);
1227 
1228  /* Process locked */
1229  __HAL_LOCK(hqspi);
1230 
1231  if(hqspi->State == HAL_QSPI_STATE_READY)
1232  {
1233  hqspi->ErrorCode = HAL_QSPI_ERROR_NONE;
1234 
1235  if(pData != NULL )
1236  {
1237  /* Update state */
1238  hqspi->State = HAL_QSPI_STATE_BUSY_INDIRECT_RX;
1239 
1240  /* Configure counters and size of the handle */
1241  hqspi->RxXferCount = READ_REG(hqspi->Instance->DLR) + 1U;
1242  hqspi->RxXferSize = READ_REG(hqspi->Instance->DLR) + 1U;
1243  hqspi->pRxBuffPtr = pData;
1244 
1245  /* Clear interrupt */
1246  __HAL_QSPI_CLEAR_FLAG(hqspi, QSPI_FLAG_TE | QSPI_FLAG_TC);
1247 
1248  /* Configure QSPI: CCR register with functional as indirect read */
1249  MODIFY_REG(hqspi->Instance->CCR, QUADSPI_CCR_FMODE, QSPI_FUNCTIONAL_MODE_INDIRECT_READ);
1250 
1251  /* Start the transfer by re-writing the address in AR register */
1252  WRITE_REG(hqspi->Instance->AR, addr_reg);
1253 
1254  /* Process unlocked */
1255  __HAL_UNLOCK(hqspi);
1256 
1257  /* Enable the QSPI transfer error, FIFO threshold and transfer complete Interrupts */
1258  __HAL_QSPI_ENABLE_IT(hqspi, QSPI_IT_TE | QSPI_IT_FT | QSPI_IT_TC);
1259  }
1260  else
1261  {
1262  hqspi->ErrorCode |= HAL_QSPI_ERROR_INVALID_PARAM;
1263  status = HAL_ERROR;
1264 
1265  /* Process unlocked */
1266  __HAL_UNLOCK(hqspi);
1267  }
1268  }
1269  else
1270  {
1271  status = HAL_BUSY;
1272 
1273  /* Process unlocked */
1274  __HAL_UNLOCK(hqspi);
1275  }
1276 
1277  return status;
1278 }
__HAL_UNLOCK(hrtc)
__HAL_LOCK(hrtc)
return HAL_OK
MODIFY_REG(hrtc->Instance->CR, RTC_CR_WUCKSEL,(uint32_t) WakeUpClock)

◆ HAL_QSPI_RegisterCallback()

HAL_StatusTypeDef HAL_QSPI_RegisterCallback ( QSPI_HandleTypeDef hqspi,
HAL_QSPI_CallbackIDTypeDef  CallbackId,
pQSPI_CallbackTypeDef  pCallback 
)

Register a User QSPI Callback To be used instead of the weak (surcharged) predefined callback.

Parameters
hqspi: QSPI handle
CallbackId: ID of the callback to be registered This parameter can be one of the following values:
pCallback: pointer to the Callback function
Return values
status

Definition at line 2037 of file stm32l4xx_hal_qspi.c.

2038 {
2039  HAL_StatusTypeDef status = HAL_OK;
2040 
2041  if(pCallback == NULL)
2042  {
2043  /* Update the error code */
2044  hqspi->ErrorCode |= HAL_QSPI_ERROR_INVALID_CALLBACK;
2045  return HAL_ERROR;
2046  }
2047 
2048  /* Process locked */
2049  __HAL_LOCK(hqspi);
2050 
2051  if(hqspi->State == HAL_QSPI_STATE_READY)
2052  {
2053  switch (CallbackId)
2054  {
2055  case HAL_QSPI_ERROR_CB_ID :
2056  hqspi->ErrorCallback = pCallback;
2057  break;
2058  case HAL_QSPI_ABORT_CB_ID :
2059  hqspi->AbortCpltCallback = pCallback;
2060  break;
2062  hqspi->FifoThresholdCallback = pCallback;
2063  break;
2065  hqspi->CmdCpltCallback = pCallback;
2066  break;
2067  case HAL_QSPI_RX_CPLT_CB_ID :
2068  hqspi->RxCpltCallback = pCallback;
2069  break;
2070  case HAL_QSPI_TX_CPLT_CB_ID :
2071  hqspi->TxCpltCallback = pCallback;
2072  break;
2074  hqspi->RxHalfCpltCallback = pCallback;
2075  break;
2077  hqspi->TxHalfCpltCallback = pCallback;
2078  break;
2080  hqspi->StatusMatchCallback = pCallback;
2081  break;
2082  case HAL_QSPI_TIMEOUT_CB_ID :
2083  hqspi->TimeOutCallback = pCallback;
2084  break;
2086  hqspi->MspInitCallback = pCallback;
2087  break;
2089  hqspi->MspDeInitCallback = pCallback;
2090  break;
2091  default :
2092  /* Update the error code */
2093  hqspi->ErrorCode |= HAL_QSPI_ERROR_INVALID_CALLBACK;
2094  /* update return status */
2095  status = HAL_ERROR;
2096  break;
2097  }
2098  }
2099  else if (hqspi->State == HAL_QSPI_STATE_RESET)
2100  {
2101  switch (CallbackId)
2102  {
2104  hqspi->MspInitCallback = pCallback;
2105  break;
2107  hqspi->MspDeInitCallback = pCallback;
2108  break;
2109  default :
2110  /* Update the error code */
2111  hqspi->ErrorCode |= HAL_QSPI_ERROR_INVALID_CALLBACK;
2112  /* update return status */
2113  status = HAL_ERROR;
2114  break;
2115  }
2116  }
2117  else
2118  {
2119  /* Update the error code */
2120  hqspi->ErrorCode |= HAL_QSPI_ERROR_INVALID_CALLBACK;
2121  /* update return status */
2122  status = HAL_ERROR;
2123  }
2124 
2125  /* Release Lock */
2126  __HAL_UNLOCK(hqspi);
2127  return status;
2128 }
__HAL_UNLOCK(hrtc)
__HAL_LOCK(hrtc)
return HAL_OK

◆ HAL_QSPI_RxCpltCallback()

__weak void HAL_QSPI_RxCpltCallback ( QSPI_HandleTypeDef hqspi)

Rx Transfer completed callback.

Parameters
hqspi: QSPI handle
Return values
None

Definition at line 1916 of file stm32l4xx_hal_qspi.c.

1917 {
1918  /* Prevent unused argument(s) compilation warning */
1919  UNUSED(hqspi);
1920 
1921  /* NOTE: This function should not be modified, when the callback is needed,
1922  the HAL_QSPI_RxCpltCallback could be implemented in the user file
1923  */
1924 }

◆ HAL_QSPI_RxHalfCpltCallback()

__weak void HAL_QSPI_RxHalfCpltCallback ( QSPI_HandleTypeDef hqspi)

Rx Half Transfer completed callback.

Parameters
hqspi: QSPI handle
Return values
None

Definition at line 1946 of file stm32l4xx_hal_qspi.c.

1947 {
1948  /* Prevent unused argument(s) compilation warning */
1949  UNUSED(hqspi);
1950 
1951  /* NOTE: This function should not be modified, when the callback is needed,
1952  the HAL_QSPI_RxHalfCpltCallback could be implemented in the user file
1953  */
1954 }

◆ HAL_QSPI_StatusMatchCallback()

__weak void HAL_QSPI_StatusMatchCallback ( QSPI_HandleTypeDef hqspi)

Status Match callback.

Parameters
hqspi: QSPI handle
Return values
None

Definition at line 1991 of file stm32l4xx_hal_qspi.c.

1992 {
1993  /* Prevent unused argument(s) compilation warning */
1994  UNUSED(hqspi);
1995 
1996  /* NOTE : This function should not be modified, when the callback is needed,
1997  the HAL_QSPI_StatusMatchCallback could be implemented in the user file
1998  */
1999 }

◆ HAL_QSPI_TimeOutCallback()

__weak void HAL_QSPI_TimeOutCallback ( QSPI_HandleTypeDef hqspi)

Timeout callback.

Parameters
hqspi: QSPI handle
Return values
None

Definition at line 2006 of file stm32l4xx_hal_qspi.c.

2007 {
2008  /* Prevent unused argument(s) compilation warning */
2009  UNUSED(hqspi);
2010 
2011  /* NOTE : This function should not be modified, when the callback is needed,
2012  the HAL_QSPI_TimeOutCallback could be implemented in the user file
2013  */
2014 }

◆ HAL_QSPI_Transmit()

HAL_StatusTypeDef HAL_QSPI_Transmit ( QSPI_HandleTypeDef hqspi,
uint8_t *  pData,
uint32_t  Timeout 
)

Transmit an amount of data in blocking mode.

Parameters
hqspi: QSPI handle
pData: pointer to data buffer
Timeout: Timeout duration
Note
This function is used only in Indirect Write Mode
Return values
HALstatus

Definition at line 987 of file stm32l4xx_hal_qspi.c.

988 {
989  HAL_StatusTypeDef status = HAL_OK;
990  uint32_t tickstart = HAL_GetTick();
991  __IO uint32_t *data_reg = &hqspi->Instance->DR;
992 
993  /* Process locked */
994  __HAL_LOCK(hqspi);
995 
996  if(hqspi->State == HAL_QSPI_STATE_READY)
997  {
998  hqspi->ErrorCode = HAL_QSPI_ERROR_NONE;
999 
1000  if(pData != NULL )
1001  {
1002  /* Update state */
1003  hqspi->State = HAL_QSPI_STATE_BUSY_INDIRECT_TX;
1004 
1005  /* Configure counters and size of the handle */
1006  hqspi->TxXferCount = READ_REG(hqspi->Instance->DLR) + 1U;
1007  hqspi->TxXferSize = READ_REG(hqspi->Instance->DLR) + 1U;
1008  hqspi->pTxBuffPtr = pData;
1009 
1010  /* Configure QSPI: CCR register with functional as indirect write */
1011  MODIFY_REG(hqspi->Instance->CCR, QUADSPI_CCR_FMODE, QSPI_FUNCTIONAL_MODE_INDIRECT_WRITE);
1012 
1013  while(hqspi->TxXferCount > 0U)
1014  {
1015  /* Wait until FT flag is set to send data */
1016  status = QSPI_WaitFlagStateUntilTimeout(hqspi, QSPI_FLAG_FT, SET, tickstart, Timeout);
1017 
1018  if (status != HAL_OK)
1019  {
1020  break;
1021  }
1022 
1023  *((__IO uint8_t *)data_reg) = *hqspi->pTxBuffPtr;
1024  hqspi->pTxBuffPtr++;
1025  hqspi->TxXferCount--;
1026  }
1027 
1028  if (status == HAL_OK)
1029  {
1030  /* Wait until TC flag is set to go back in idle state */
1031  status = QSPI_WaitFlagStateUntilTimeout(hqspi, QSPI_FLAG_TC, SET, tickstart, Timeout);
1032 
1033  if (status == HAL_OK)
1034  {
1035  /* Clear Transfer Complete bit */
1036  __HAL_QSPI_CLEAR_FLAG(hqspi, QSPI_FLAG_TC);
1037 
1038 #if (defined(STM32L471xx) || defined(STM32L475xx) || defined(STM32L476xx) || defined(STM32L485xx) || defined(STM32L486xx))
1039  /* Clear Busy bit */
1040  status = HAL_QSPI_Abort(hqspi);
1041 #endif
1042  }
1043  }
1044 
1045  /* Update QSPI state */
1046  hqspi->State = HAL_QSPI_STATE_READY;
1047  }
1048  else
1049  {
1050  hqspi->ErrorCode |= HAL_QSPI_ERROR_INVALID_PARAM;
1051  status = HAL_ERROR;
1052  }
1053  }
1054  else
1055  {
1056  status = HAL_BUSY;
1057  }
1058 
1059  /* Process unlocked */
1060  __HAL_UNLOCK(hqspi);
1061 
1062  return status;
1063 }
uint32_t HAL_GetTick(void)
Provide a tick value in millisecond.
__HAL_UNLOCK(hrtc)
__HAL_LOCK(hrtc)
return HAL_OK
MODIFY_REG(hrtc->Instance->CR, RTC_CR_WUCKSEL,(uint32_t) WakeUpClock)
static HAL_StatusTypeDef QSPI_WaitFlagStateUntilTimeout(QSPI_HandleTypeDef *hqspi, uint32_t Flag, FlagStatus State, uint32_t Tickstart, uint32_t Timeout)
Wait for a flag state until timeout.
HAL_StatusTypeDef HAL_QSPI_Abort(QSPI_HandleTypeDef *hqspi)
Abort the current transmission.

◆ HAL_QSPI_Transmit_DMA()

HAL_StatusTypeDef HAL_QSPI_Transmit_DMA ( QSPI_HandleTypeDef hqspi,
uint8_t *  pData 
)

Send an amount of data in non-blocking mode with DMA.

Parameters
hqspi: QSPI handle
pData: pointer to data buffer
Note
This function is used only in Indirect Write Mode
If DMA peripheral access is configured as halfword, the number of data and the fifo threshold should be aligned on halfword
If DMA peripheral access is configured as word, the number of data and the fifo threshold should be aligned on word
Return values
HALstatus

Definition at line 1291 of file stm32l4xx_hal_qspi.c.

1292 {
1293  HAL_StatusTypeDef status = HAL_OK;
1294  uint32_t data_size = (READ_REG(hqspi->Instance->DLR) + 1U);
1295 
1296  /* Process locked */
1297  __HAL_LOCK(hqspi);
1298 
1299  if(hqspi->State == HAL_QSPI_STATE_READY)
1300  {
1301  /* Clear the error code */
1302  hqspi->ErrorCode = HAL_QSPI_ERROR_NONE;
1303 
1304  if(pData != NULL )
1305  {
1306  /* Configure counters of the handle */
1307  if (hqspi->hdma->Init.PeriphDataAlignment == DMA_PDATAALIGN_BYTE)
1308  {
1309  hqspi->TxXferCount = data_size;
1310  }
1311  else if (hqspi->hdma->Init.PeriphDataAlignment == DMA_PDATAALIGN_HALFWORD)
1312  {
1313  if (((data_size % 2U) != 0U) || ((hqspi->Init.FifoThreshold % 2U) != 0U))
1314  {
1315  /* The number of data or the fifo threshold is not aligned on halfword
1316  => no transfer possible with DMA peripheral access configured as halfword */
1317  hqspi->ErrorCode |= HAL_QSPI_ERROR_INVALID_PARAM;
1318  status = HAL_ERROR;
1319 
1320  /* Process unlocked */
1321  __HAL_UNLOCK(hqspi);
1322  }
1323  else
1324  {
1325  hqspi->TxXferCount = (data_size >> 1U);
1326  }
1327  }
1328  else if (hqspi->hdma->Init.PeriphDataAlignment == DMA_PDATAALIGN_WORD)
1329  {
1330  if (((data_size % 4U) != 0U) || ((hqspi->Init.FifoThreshold % 4U) != 0U))
1331  {
1332  /* The number of data or the fifo threshold is not aligned on word
1333  => no transfer possible with DMA peripheral access configured as word */
1334  hqspi->ErrorCode |= HAL_QSPI_ERROR_INVALID_PARAM;
1335  status = HAL_ERROR;
1336 
1337  /* Process unlocked */
1338  __HAL_UNLOCK(hqspi);
1339  }
1340  else
1341  {
1342  hqspi->TxXferCount = (data_size >> 2U);
1343  }
1344  }
1345  else
1346  {
1347  /* Nothing to do */
1348  }
1349 
1350  if (status == HAL_OK)
1351  {
1352  /* Update state */
1353  hqspi->State = HAL_QSPI_STATE_BUSY_INDIRECT_TX;
1354 
1355  /* Clear interrupt */
1356  __HAL_QSPI_CLEAR_FLAG(hqspi, (QSPI_FLAG_TE | QSPI_FLAG_TC));
1357 
1358  /* Configure size and pointer of the handle */
1359  hqspi->TxXferSize = hqspi->TxXferCount;
1360  hqspi->pTxBuffPtr = pData;
1361 
1362  /* Configure QSPI: CCR register with functional mode as indirect write */
1363  MODIFY_REG(hqspi->Instance->CCR, QUADSPI_CCR_FMODE, QSPI_FUNCTIONAL_MODE_INDIRECT_WRITE);
1364 
1365  /* Set the QSPI DMA transfer complete callback */
1366  hqspi->hdma->XferCpltCallback = QSPI_DMATxCplt;
1367 
1368  /* Set the QSPI DMA Half transfer complete callback */
1369  hqspi->hdma->XferHalfCpltCallback = QSPI_DMATxHalfCplt;
1370 
1371  /* Set the DMA error callback */
1372  hqspi->hdma->XferErrorCallback = QSPI_DMAError;
1373 
1374  /* Clear the DMA abort callback */
1375  hqspi->hdma->XferAbortCallback = NULL;
1376 
1377  /* Configure the direction of the DMA */
1378  hqspi->hdma->Init.Direction = DMA_MEMORY_TO_PERIPH;
1379  MODIFY_REG(hqspi->hdma->Instance->CCR, DMA_CCR_DIR, hqspi->hdma->Init.Direction);
1380 
1381  /* Enable the QSPI transmit DMA Channel */
1382  if (HAL_DMA_Start_IT(hqspi->hdma, (uint32_t)pData, (uint32_t)&hqspi->Instance->DR, hqspi->TxXferSize) == HAL_OK)
1383  {
1384  /* Process unlocked */
1385  __HAL_UNLOCK(hqspi);
1386 
1387  /* Enable the QSPI transfer error Interrupt */
1388  __HAL_QSPI_ENABLE_IT(hqspi, QSPI_IT_TE);
1389 
1390  /* Enable the DMA transfer by setting the DMAEN bit in the QSPI CR register */
1391  SET_BIT(hqspi->Instance->CR, QUADSPI_CR_DMAEN);
1392  }
1393  else
1394  {
1395  status = HAL_ERROR;
1396  hqspi->ErrorCode |= HAL_QSPI_ERROR_DMA;
1397  hqspi->State = HAL_QSPI_STATE_READY;
1398 
1399  /* Process unlocked */
1400  __HAL_UNLOCK(hqspi);
1401  }
1402  }
1403  }
1404  else
1405  {
1406  hqspi->ErrorCode |= HAL_QSPI_ERROR_INVALID_PARAM;
1407  status = HAL_ERROR;
1408 
1409  /* Process unlocked */
1410  __HAL_UNLOCK(hqspi);
1411  }
1412  }
1413  else
1414  {
1415  status = HAL_BUSY;
1416 
1417  /* Process unlocked */
1418  __HAL_UNLOCK(hqspi);
1419  }
1420 
1421  return status;
1422 }
static void QSPI_DMAError(DMA_HandleTypeDef *hdma)
DMA QSPI communication error callback.
static void QSPI_DMATxHalfCplt(DMA_HandleTypeDef *hdma)
DMA QSPI transmit process half complete callback.
__HAL_UNLOCK(hrtc)
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 QSPI_DMATxCplt(DMA_HandleTypeDef *hdma)
DMA QSPI transmit process complete callback.
MODIFY_REG(hrtc->Instance->CR, RTC_CR_WUCKSEL,(uint32_t) WakeUpClock)

◆ HAL_QSPI_Transmit_IT()

HAL_StatusTypeDef HAL_QSPI_Transmit_IT ( QSPI_HandleTypeDef hqspi,
uint8_t *  pData 
)

Send an amount of data in non-blocking mode with interrupt.

Parameters
hqspi: QSPI handle
pData: pointer to data buffer
Note
This function is used only in Indirect Write Mode
Return values
HALstatus

Definition at line 1163 of file stm32l4xx_hal_qspi.c.

1164 {
1165  HAL_StatusTypeDef status = HAL_OK;
1166 
1167  /* Process locked */
1168  __HAL_LOCK(hqspi);
1169 
1170  if(hqspi->State == HAL_QSPI_STATE_READY)
1171  {
1172  hqspi->ErrorCode = HAL_QSPI_ERROR_NONE;
1173 
1174  if(pData != NULL )
1175  {
1176  /* Update state */
1177  hqspi->State = HAL_QSPI_STATE_BUSY_INDIRECT_TX;
1178 
1179  /* Configure counters and size of the handle */
1180  hqspi->TxXferCount = READ_REG(hqspi->Instance->DLR) + 1U;
1181  hqspi->TxXferSize = READ_REG(hqspi->Instance->DLR) + 1U;
1182  hqspi->pTxBuffPtr = pData;
1183 
1184  /* Clear interrupt */
1185  __HAL_QSPI_CLEAR_FLAG(hqspi, QSPI_FLAG_TE | QSPI_FLAG_TC);
1186 
1187  /* Configure QSPI: CCR register with functional as indirect write */
1188  MODIFY_REG(hqspi->Instance->CCR, QUADSPI_CCR_FMODE, QSPI_FUNCTIONAL_MODE_INDIRECT_WRITE);
1189 
1190  /* Process unlocked */
1191  __HAL_UNLOCK(hqspi);
1192 
1193  /* Enable the QSPI transfer error, FIFO threshold and transfer complete Interrupts */
1194  __HAL_QSPI_ENABLE_IT(hqspi, QSPI_IT_TE | QSPI_IT_FT | QSPI_IT_TC);
1195  }
1196  else
1197  {
1198  hqspi->ErrorCode |= HAL_QSPI_ERROR_INVALID_PARAM;
1199  status = HAL_ERROR;
1200 
1201  /* Process unlocked */
1202  __HAL_UNLOCK(hqspi);
1203  }
1204  }
1205  else
1206  {
1207  status = HAL_BUSY;
1208 
1209  /* Process unlocked */
1210  __HAL_UNLOCK(hqspi);
1211  }
1212 
1213  return status;
1214 }
__HAL_UNLOCK(hrtc)
__HAL_LOCK(hrtc)
return HAL_OK
MODIFY_REG(hrtc->Instance->CR, RTC_CR_WUCKSEL,(uint32_t) WakeUpClock)

◆ HAL_QSPI_TxCpltCallback()

__weak void HAL_QSPI_TxCpltCallback ( QSPI_HandleTypeDef hqspi)

Tx Transfer completed callback.

Parameters
hqspi: QSPI handle
Return values
None

Definition at line 1931 of file stm32l4xx_hal_qspi.c.

1932 {
1933  /* Prevent unused argument(s) compilation warning */
1934  UNUSED(hqspi);
1935 
1936  /* NOTE: This function should not be modified, when the callback is needed,
1937  the HAL_QSPI_TxCpltCallback could be implemented in the user file
1938  */
1939 }

◆ HAL_QSPI_TxHalfCpltCallback()

__weak void HAL_QSPI_TxHalfCpltCallback ( QSPI_HandleTypeDef hqspi)

Tx Half Transfer completed callback.

Parameters
hqspi: QSPI handle
Return values
None

Definition at line 1961 of file stm32l4xx_hal_qspi.c.

1962 {
1963  /* Prevent unused argument(s) compilation warning */
1964  UNUSED(hqspi);
1965 
1966  /* NOTE: This function should not be modified, when the callback is needed,
1967  the HAL_QSPI_TxHalfCpltCallback could be implemented in the user file
1968  */
1969 }

◆ HAL_QSPI_UnRegisterCallback()

HAL_StatusTypeDef HAL_QSPI_UnRegisterCallback ( QSPI_HandleTypeDef hqspi,
HAL_QSPI_CallbackIDTypeDef  CallbackId 
)

Unregister a User QSPI Callback QSPI Callback is redirected to the weak (surcharged) predefined callback.

Parameters
hqspi: QSPI handle
CallbackId: ID of the callback to be unregistered This parameter can be one of the following values:
Return values
status

Definition at line 2150 of file stm32l4xx_hal_qspi.c.

2151 {
2152  HAL_StatusTypeDef status = HAL_OK;
2153 
2154  /* Process locked */
2155  __HAL_LOCK(hqspi);
2156 
2157  if(hqspi->State == HAL_QSPI_STATE_READY)
2158  {
2159  switch (CallbackId)
2160  {
2161  case HAL_QSPI_ERROR_CB_ID :
2162  hqspi->ErrorCallback = HAL_QSPI_ErrorCallback;
2163  break;
2164  case HAL_QSPI_ABORT_CB_ID :
2165  hqspi->AbortCpltCallback = HAL_QSPI_AbortCpltCallback;
2166  break;
2168  hqspi->FifoThresholdCallback = HAL_QSPI_FifoThresholdCallback;
2169  break;
2171  hqspi->CmdCpltCallback = HAL_QSPI_CmdCpltCallback;
2172  break;
2173  case HAL_QSPI_RX_CPLT_CB_ID :
2174  hqspi->RxCpltCallback = HAL_QSPI_RxCpltCallback;
2175  break;
2176  case HAL_QSPI_TX_CPLT_CB_ID :
2177  hqspi->TxCpltCallback = HAL_QSPI_TxCpltCallback;
2178  break;
2180  hqspi->RxHalfCpltCallback = HAL_QSPI_RxHalfCpltCallback;
2181  break;
2183  hqspi->TxHalfCpltCallback = HAL_QSPI_TxHalfCpltCallback;
2184  break;
2186  hqspi->StatusMatchCallback = HAL_QSPI_StatusMatchCallback;
2187  break;
2188  case HAL_QSPI_TIMEOUT_CB_ID :
2189  hqspi->TimeOutCallback = HAL_QSPI_TimeOutCallback;
2190  break;
2192  hqspi->MspInitCallback = HAL_QSPI_MspInit;
2193  break;
2195  hqspi->MspDeInitCallback = HAL_QSPI_MspDeInit;
2196  break;
2197  default :
2198  /* Update the error code */
2199  hqspi->ErrorCode |= HAL_QSPI_ERROR_INVALID_CALLBACK;
2200  /* update return status */
2201  status = HAL_ERROR;
2202  break;
2203  }
2204  }
2205  else if (hqspi->State == HAL_QSPI_STATE_RESET)
2206  {
2207  switch (CallbackId)
2208  {
2210  hqspi->MspInitCallback = HAL_QSPI_MspInit;
2211  break;
2213  hqspi->MspDeInitCallback = HAL_QSPI_MspDeInit;
2214  break;
2215  default :
2216  /* Update the error code */
2217  hqspi->ErrorCode |= HAL_QSPI_ERROR_INVALID_CALLBACK;
2218  /* update return status */
2219  status = HAL_ERROR;
2220  break;
2221  }
2222  }
2223  else
2224  {
2225  /* Update the error code */
2226  hqspi->ErrorCode |= HAL_QSPI_ERROR_INVALID_CALLBACK;
2227  /* update return status */
2228  status = HAL_ERROR;
2229  }
2230 
2231  /* Release Lock */
2232  __HAL_UNLOCK(hqspi);
2233  return status;
2234 }
void HAL_QSPI_TimeOutCallback(QSPI_HandleTypeDef *hqspi)
Timeout callback.
__HAL_UNLOCK(hrtc)
void HAL_QSPI_MspDeInit(QSPI_HandleTypeDef *hqspi)
DeInitialize the QSPI MSP.
__HAL_LOCK(hrtc)
return HAL_OK
void HAL_QSPI_MspInit(QSPI_HandleTypeDef *hqspi)
Initialize the QSPI MSP.
void HAL_QSPI_RxCpltCallback(QSPI_HandleTypeDef *hqspi)
Rx Transfer completed callback.
void HAL_QSPI_AbortCpltCallback(QSPI_HandleTypeDef *hqspi)
Abort completed callback.
void HAL_QSPI_ErrorCallback(QSPI_HandleTypeDef *hqspi)
Transfer Error callback.
void HAL_QSPI_FifoThresholdCallback(QSPI_HandleTypeDef *hqspi)
FIFO Threshold callback.
void HAL_QSPI_TxCpltCallback(QSPI_HandleTypeDef *hqspi)
Tx Transfer completed callback.
void HAL_QSPI_RxHalfCpltCallback(QSPI_HandleTypeDef *hqspi)
Rx Half Transfer completed callback.
void HAL_QSPI_CmdCpltCallback(QSPI_HandleTypeDef *hqspi)
Command completed callback.
void HAL_QSPI_StatusMatchCallback(QSPI_HandleTypeDef *hqspi)
Status Match callback.
void HAL_QSPI_TxHalfCpltCallback(QSPI_HandleTypeDef *hqspi)
Tx Half Transfer completed callback.