STM32F769IDiscovery  1.00
uDANTE Audio Networking with STM32F7 DISCO board
stm32f7xx_hal_qspi.c
Go to the documentation of this file.
1 
168 /* Includes ------------------------------------------------------------------*/
169 #include "stm32f7xx_hal.h"
170 
179 #ifdef HAL_QSPI_MODULE_ENABLED
180 
181 /* Private typedef -----------------------------------------------------------*/
182 /* Private define ------------------------------------------------------------*/
186 #define QSPI_FUNCTIONAL_MODE_INDIRECT_WRITE ((uint32_t)0x00000000U)
187 #define QSPI_FUNCTIONAL_MODE_INDIRECT_READ ((uint32_t)QUADSPI_CCR_FMODE_0)
188 #define QSPI_FUNCTIONAL_MODE_AUTO_POLLING ((uint32_t)QUADSPI_CCR_FMODE_1)
189 #define QSPI_FUNCTIONAL_MODE_MEMORY_MAPPED ((uint32_t)QUADSPI_CCR_FMODE)
194 /* Private macro -------------------------------------------------------------*/
195 
198 #define IS_QSPI_FUNCTIONAL_MODE(MODE) (((MODE) == QSPI_FUNCTIONAL_MODE_INDIRECT_WRITE) || \
199  ((MODE) == QSPI_FUNCTIONAL_MODE_INDIRECT_READ) || \
200  ((MODE) == QSPI_FUNCTIONAL_MODE_AUTO_POLLING) || \
201  ((MODE) == QSPI_FUNCTIONAL_MODE_MEMORY_MAPPED))
202 
206 /* Private variables ---------------------------------------------------------*/
207 /* Private function prototypes -----------------------------------------------*/
211 static void QSPI_DMARxCplt(DMA_HandleTypeDef *hdma);
212 static void QSPI_DMATxCplt(DMA_HandleTypeDef *hdma);
213 static void QSPI_DMARxHalfCplt(DMA_HandleTypeDef *hdma);
214 static void QSPI_DMATxHalfCplt(DMA_HandleTypeDef *hdma);
215 static void QSPI_DMAError(DMA_HandleTypeDef *hdma);
216 static void QSPI_DMAAbortCplt(DMA_HandleTypeDef *hdma);
217 static HAL_StatusTypeDef QSPI_WaitFlagStateUntilTimeout(QSPI_HandleTypeDef *hqspi, uint32_t Flag, FlagStatus State, uint32_t tickstart, uint32_t Timeout);
218 static void QSPI_Config(QSPI_HandleTypeDef *hqspi, QSPI_CommandTypeDef *cmd, uint32_t FunctionalMode);
223 /* Exported functions ---------------------------------------------------------*/
224 
252 {
253  HAL_StatusTypeDef status = HAL_ERROR;
254  uint32_t tickstart = HAL_GetTick();
255 
256  /* Check the QSPI handle allocation */
257  if(hqspi == NULL)
258  {
259  return HAL_ERROR;
260  }
261 
262  /* Check the parameters */
271 
272  if (hqspi->Init.DualFlash != QSPI_DUALFLASH_ENABLE )
273  {
275  }
276 
277  /* Process locked */
278  __HAL_LOCK(hqspi);
279 
280  if(hqspi->State == HAL_QSPI_STATE_RESET)
281  {
282  /* Allocate lock resource and initialize it */
283  hqspi->Lock = HAL_UNLOCKED;
284 
285  /* Init the low level hardware : GPIO, CLOCK */
286  HAL_QSPI_MspInit(hqspi);
287 
288  /* Configure the default timeout for the QSPI memory access */
290  }
291 
292  /* Configure QSPI FIFO Threshold */
293  MODIFY_REG(hqspi->Instance->CR, QUADSPI_CR_FTHRES, ((hqspi->Init.FifoThreshold - 1) << 8));
294 
295  /* Wait till BUSY flag reset */
296  status = QSPI_WaitFlagStateUntilTimeout(hqspi, QSPI_FLAG_BUSY, RESET, tickstart, hqspi->Timeout);
297 
298  if(status == HAL_OK)
299  {
300 
301  /* Configure QSPI Clock Prescaler and Sample Shift */
303 
304  /* Configure QSPI Flash Size, CS High Time and Clock Mode */
306  ((hqspi->Init.FlashSize << 16) | hqspi->Init.ChipSelectHighTime | hqspi->Init.ClockMode));
307 
308  /* Enable the QSPI peripheral */
309  __HAL_QSPI_ENABLE(hqspi);
310 
311  /* Set QSPI error code to none */
312  hqspi->ErrorCode = HAL_QSPI_ERROR_NONE;
313 
314  /* Initialize the QSPI state */
315  hqspi->State = HAL_QSPI_STATE_READY;
316  }
317 
318  /* Release Lock */
319  __HAL_UNLOCK(hqspi);
320 
321  /* Return function status */
322  return status;
323 }
324 
331 {
332  /* Check the QSPI handle allocation */
333  if(hqspi == NULL)
334  {
335  return HAL_ERROR;
336  }
337 
338  /* Process locked */
339  __HAL_LOCK(hqspi);
340 
341  /* Disable the QSPI Peripheral Clock */
342  __HAL_QSPI_DISABLE(hqspi);
343 
344  /* DeInit the low level hardware: GPIO, CLOCK, NVIC... */
345  HAL_QSPI_MspDeInit(hqspi);
346 
347  /* Set QSPI error code to none */
349 
350  /* Initialize the QSPI state */
351  hqspi->State = HAL_QSPI_STATE_RESET;
352 
353  /* Release Lock */
354  __HAL_UNLOCK(hqspi);
355 
356  return HAL_OK;
357 }
358 
364  __weak void HAL_QSPI_MspInit(QSPI_HandleTypeDef *hqspi)
365 {
366  /* Prevent unused argument(s) compilation warning */
367  UNUSED(hqspi);
368 
369  /* NOTE : This function should not be modified, when the callback is needed,
370  the HAL_QSPI_MspInit can be implemented in the user file
371  */
372 }
373 
379  __weak void HAL_QSPI_MspDeInit(QSPI_HandleTypeDef *hqspi)
380 {
381  /* Prevent unused argument(s) compilation warning */
382  UNUSED(hqspi);
383 
384  /* NOTE : This function should not be modified, when the callback is needed,
385  the HAL_QSPI_MspDeInit can be implemented in the user file
386  */
387 }
388 
419 {
420  __IO uint32_t *data_reg;
421  uint32_t flag = READ_REG(hqspi->Instance->SR);
422  uint32_t itsource = READ_REG(hqspi->Instance->CR);
423 
424  /* QSPI Fifo Threshold interrupt occurred ----------------------------------*/
425  if(((flag & QSPI_FLAG_FT)!= RESET) && ((itsource & QSPI_IT_FT)!= RESET))
426  {
427  data_reg = &hqspi->Instance->DR;
428 
430  {
431  /* Transmission process */
432  while(__HAL_QSPI_GET_FLAG(hqspi, QSPI_FLAG_FT) != 0)
433  {
434  if (hqspi->TxXferCount > 0)
435  {
436  /* Fill the FIFO until it is full */
437  *(__IO uint8_t *)data_reg = *hqspi->pTxBuffPtr++;
438  hqspi->TxXferCount--;
439  }
440  else
441  {
442  /* No more data available for the transfer */
443  /* Disable the QSPI FIFO Threshold Interrupt */
444  __HAL_QSPI_DISABLE_IT(hqspi, QSPI_IT_FT);
445  break;
446  }
447  }
448  }
449  else if(hqspi->State == HAL_QSPI_STATE_BUSY_INDIRECT_RX)
450  {
451  /* Receiving Process */
452  while(__HAL_QSPI_GET_FLAG(hqspi, QSPI_FLAG_FT) != 0)
453  {
454  if (hqspi->RxXferCount > 0)
455  {
456  /* Read the FIFO until it is empty */
457  *hqspi->pRxBuffPtr++ = *(__IO uint8_t *)data_reg;
458  hqspi->RxXferCount--;
459  }
460  else
461  {
462  /* All data have been received for the transfer */
463  /* Disable the QSPI FIFO Threshold Interrupt */
464  __HAL_QSPI_DISABLE_IT(hqspi, QSPI_IT_FT);
465  break;
466  }
467  }
468  }
469 
470  /* FIFO Threshold callback */
472  }
473 
474  /* QSPI Transfer Complete interrupt occurred -------------------------------*/
475  else if(((flag & QSPI_FLAG_TC)!= RESET) && ((itsource & QSPI_IT_TC)!= RESET))
476  {
477  /* Clear interrupt */
478  WRITE_REG(hqspi->Instance->FCR, QSPI_FLAG_TC);
479 
480  /* Disable the QSPI FIFO Threshold, Transfer Error and Transfer complete Interrupts */
481  __HAL_QSPI_DISABLE_IT(hqspi, QSPI_IT_TC | QSPI_IT_TE | QSPI_IT_FT);
482 
483  /* Transfer complete callback */
485  {
486  if ((hqspi->Instance->CR & QUADSPI_CR_DMAEN)!= RESET)
487  {
488  /* Disable the DMA transfer by clearing the DMAEN bit in the QSPI CR register */
490 
491  /* Disable the DMA channel */
492  __HAL_DMA_DISABLE(hqspi->hdma);
493  }
494 
495 #if defined(QSPI1_V1_0)
496 /* Clear Busy bit */
497  HAL_QSPI_Abort_IT(hqspi);
498 #endif
499 
500  /* Change state of QSPI */
501  hqspi->State = HAL_QSPI_STATE_READY;
502 
503  /* TX Complete callback */
505  }
506  else if(hqspi->State == HAL_QSPI_STATE_BUSY_INDIRECT_RX)
507  {
508  if ((hqspi->Instance->CR & QUADSPI_CR_DMAEN)!= RESET)
509  {
510  /* Disable the DMA transfer by clearing the DMAEN bit in the QSPI CR register */
512 
513  /* Disable the DMA channel */
514  __HAL_DMA_DISABLE(hqspi->hdma);
515  }
516  else
517  {
518  data_reg = &hqspi->Instance->DR;
519  while(READ_BIT(hqspi->Instance->SR, QUADSPI_SR_FLEVEL) != 0)
520  {
521  if (hqspi->RxXferCount > 0)
522  {
523  /* Read the last data received in the FIFO until it is empty */
524  *hqspi->pRxBuffPtr++ = *(__IO uint8_t *)data_reg;
525  hqspi->RxXferCount--;
526  }
527  else
528  {
529  /* All data have been received for the transfer */
530  break;
531  }
532  }
533  }
534 #if defined(QSPI1_V1_0)
535  /* Workaround - Extra data written in the FIFO at the end of a read transfer */
536  HAL_QSPI_Abort_IT(hqspi);
537 #endif /* QSPI_V1_0*/
538 
539  /* Change state of QSPI */
540  hqspi->State = HAL_QSPI_STATE_READY;
541 
542  /* RX Complete callback */
544  }
545  else if(hqspi->State == HAL_QSPI_STATE_BUSY)
546  {
547  /* Change state of QSPI */
548  hqspi->State = HAL_QSPI_STATE_READY;
549 
550  /* Command Complete callback */
552  }
553  else if(hqspi->State == HAL_QSPI_STATE_ABORT)
554  {
555  /* Change state of QSPI */
556  hqspi->State = HAL_QSPI_STATE_READY;
557 
558  if (hqspi->ErrorCode == HAL_QSPI_ERROR_NONE)
559  {
560  /* Abort called by the user */
561 
562  /* Abort Complete callback */
564  }
565  else
566  {
567  /* Abort due to an error (eg : DMA error) */
568 
569  /* Error callback */
570  HAL_QSPI_ErrorCallback(hqspi);
571  }
572  }
573  }
574 
575  /* QSPI Status Match interrupt occurred ------------------------------------*/
576  else if(((flag & QSPI_FLAG_SM)!= RESET) && ((itsource & QSPI_IT_SM)!= RESET))
577  {
578  /* Clear interrupt */
579  WRITE_REG(hqspi->Instance->FCR, QSPI_FLAG_SM);
580 
581  /* Check if the automatic poll mode stop is activated */
582  if(READ_BIT(hqspi->Instance->CR, QUADSPI_CR_APMS) != 0)
583  {
584  /* Disable the QSPI Transfer Error and Status Match Interrupts */
585  __HAL_QSPI_DISABLE_IT(hqspi, (QSPI_IT_SM | QSPI_IT_TE));
586 
587  /* Change state of QSPI */
588  hqspi->State = HAL_QSPI_STATE_READY;
589  }
590 
591  /* Status match callback */
593  }
594 
595  /* QSPI Transfer Error interrupt occurred ----------------------------------*/
596  else if(((flag & QSPI_FLAG_TE)!= RESET) && ((itsource & QSPI_IT_TE)!= RESET))
597  {
598  /* Clear interrupt */
599  WRITE_REG(hqspi->Instance->FCR, QSPI_FLAG_TE);
600 
601  /* Disable all the QSPI Interrupts */
602  __HAL_QSPI_DISABLE_IT(hqspi, QSPI_IT_SM | QSPI_IT_TC | QSPI_IT_TE | QSPI_IT_FT);
603 
604  /* Set error code */
606 
607  if ((hqspi->Instance->CR & QUADSPI_CR_DMAEN)!= RESET)
608  {
609  /* Disable the DMA transfer by clearing the DMAEN bit in the QSPI CR register */
611 
612  /* Disable the DMA channel */
613  hqspi->hdma->XferAbortCallback = QSPI_DMAAbortCplt;
614  HAL_DMA_Abort_IT(hqspi->hdma);
615  }
616  else
617  {
618  /* Change state of QSPI */
619  hqspi->State = HAL_QSPI_STATE_READY;
620 
621  /* Error callback */
622  HAL_QSPI_ErrorCallback(hqspi);
623  }
624  }
625 
626  /* QSPI Timeout interrupt occurred -----------------------------------------*/
627  else if(((flag & QSPI_FLAG_TO)!= RESET) && ((itsource & QSPI_IT_TO)!= RESET))
628  {
629  /* Clear interrupt */
630  WRITE_REG(hqspi->Instance->FCR, QSPI_FLAG_TO);
631 
632  /* Time out callback */
634  }
635 }
636 
646 {
647  HAL_StatusTypeDef status = HAL_ERROR;
648  uint32_t tickstart = HAL_GetTick();
649 
650  /* Check the parameters */
653  {
655  }
656 
658  if (cmd->AddressMode != QSPI_ADDRESS_NONE)
659  {
661  }
662 
665  {
667  }
668 
671 
675 
676  /* Process locked */
677  __HAL_LOCK(hqspi);
678 
679  if(hqspi->State == HAL_QSPI_STATE_READY)
680  {
682 
683  /* Update QSPI state */
684  hqspi->State = HAL_QSPI_STATE_BUSY;
685 
686  /* Wait till BUSY flag reset */
687  status = QSPI_WaitFlagStateUntilTimeout(hqspi, QSPI_FLAG_BUSY, RESET, tickstart, Timeout);
688 
689  if (status == HAL_OK)
690  {
691  /* Call the configuration function */
692  QSPI_Config(hqspi, cmd, QSPI_FUNCTIONAL_MODE_INDIRECT_WRITE);
693 
694  if (cmd->DataMode == QSPI_DATA_NONE)
695  {
696  /* When there is no data phase, the transfer start as soon as the configuration is done
697  so wait until TC flag is set to go back in idle state */
698  status = QSPI_WaitFlagStateUntilTimeout(hqspi, QSPI_FLAG_TC, SET, tickstart, Timeout);
699 
700  if (status == HAL_OK)
701  {
702  __HAL_QSPI_CLEAR_FLAG(hqspi, QSPI_FLAG_TC);
703 
704  /* Update QSPI state */
705  hqspi->State = HAL_QSPI_STATE_READY;
706  }
707 
708  }
709  else
710  {
711  /* Update QSPI state */
712  hqspi->State = HAL_QSPI_STATE_READY;
713  }
714  }
715  }
716  else
717  {
718  status = HAL_BUSY;
719  }
720 
721  /* Process unlocked */
722  __HAL_UNLOCK(hqspi);
723 
724  /* Return function status */
725  return status;
726 }
727 
736 {
737  HAL_StatusTypeDef status = HAL_ERROR;
738  uint32_t tickstart = HAL_GetTick();
739 
740  /* Check the parameters */
743  {
745  }
746 
748  if (cmd->AddressMode != QSPI_ADDRESS_NONE)
749  {
751  }
752 
755  {
757  }
758 
761 
765 
766  /* Process locked */
767  __HAL_LOCK(hqspi);
768 
769  if(hqspi->State == HAL_QSPI_STATE_READY)
770  {
772 
773  /* Update QSPI state */
774  hqspi->State = HAL_QSPI_STATE_BUSY;
775 
776  /* Wait till BUSY flag reset */
777  status = QSPI_WaitFlagStateUntilTimeout(hqspi, QSPI_FLAG_BUSY, RESET, tickstart, hqspi->Timeout);
778 
779  if (status == HAL_OK)
780  {
781  if (cmd->DataMode == QSPI_DATA_NONE)
782  {
783  /* Clear interrupt */
784  __HAL_QSPI_CLEAR_FLAG(hqspi, QSPI_FLAG_TE | QSPI_FLAG_TC);
785  }
786 
787  /* Call the configuration function */
788  QSPI_Config(hqspi, cmd, QSPI_FUNCTIONAL_MODE_INDIRECT_WRITE);
789 
790  if (cmd->DataMode == QSPI_DATA_NONE)
791  {
792  /* When there is no data phase, the transfer start as soon as the configuration is done
793  so activate TC and TE interrupts */
794  /* Process unlocked */
795  __HAL_UNLOCK(hqspi);
796 
797  /* Enable the QSPI Transfer Error Interrupt */
798  __HAL_QSPI_ENABLE_IT(hqspi, QSPI_IT_TE | QSPI_IT_TC);
799  }
800  else
801  {
802  /* Update QSPI state */
803  hqspi->State = HAL_QSPI_STATE_READY;
804 
805  /* Process unlocked */
806  __HAL_UNLOCK(hqspi);
807  }
808  }
809  else
810  {
811  /* Process unlocked */
812  __HAL_UNLOCK(hqspi);
813  }
814  }
815  else
816  {
817  status = HAL_BUSY;
818 
819  /* Process unlocked */
820  __HAL_UNLOCK(hqspi);
821  }
822 
823  /* Return function status */
824  return status;
825 }
826 
835 HAL_StatusTypeDef HAL_QSPI_Transmit(QSPI_HandleTypeDef *hqspi, uint8_t *pData, uint32_t Timeout)
836 {
837  HAL_StatusTypeDef status = HAL_OK;
838  uint32_t tickstart = HAL_GetTick();
839  __IO uint32_t *data_reg = &hqspi->Instance->DR;
840 
841  /* Process locked */
842  __HAL_LOCK(hqspi);
843 
844  if(hqspi->State == HAL_QSPI_STATE_READY)
845  {
847 
848  if(pData != NULL )
849  {
850  /* Update state */
852 
853  /* Configure counters and size of the handle */
854  hqspi->TxXferCount = READ_REG(hqspi->Instance->DLR) + 1;
855  hqspi->TxXferSize = READ_REG(hqspi->Instance->DLR) + 1;
856  hqspi->pTxBuffPtr = pData;
857 
858  /* Configure QSPI: CCR register with functional as indirect write */
859  MODIFY_REG(hqspi->Instance->CCR, QUADSPI_CCR_FMODE, QSPI_FUNCTIONAL_MODE_INDIRECT_WRITE);
860 
861  while(hqspi->TxXferCount > 0)
862  {
863  /* Wait until FT flag is set to send data */
864  status = QSPI_WaitFlagStateUntilTimeout(hqspi, QSPI_FLAG_FT, SET, tickstart, Timeout);
865 
866  if (status != HAL_OK)
867  {
868  break;
869  }
870 
871  *(__IO uint8_t *)data_reg = *hqspi->pTxBuffPtr++;
872  hqspi->TxXferCount--;
873  }
874 
875  if (status == HAL_OK)
876  {
877  /* Wait until TC flag is set to go back in idle state */
878  status = QSPI_WaitFlagStateUntilTimeout(hqspi, QSPI_FLAG_TC, SET, tickstart, Timeout);
879 
880  if (status == HAL_OK)
881  {
882  /* Clear Transfer Complete bit */
883  __HAL_QSPI_CLEAR_FLAG(hqspi, QSPI_FLAG_TC);
884 
885 #if defined(QSPI1_V1_0)
886  /* Clear Busy bit */
887  status = HAL_QSPI_Abort(hqspi);
888 #endif /* QSPI_V1_0 */
889  }
890  }
891 
892  /* Update QSPI state */
893  hqspi->State = HAL_QSPI_STATE_READY;
894  }
895  else
896  {
898  status = HAL_ERROR;
899  }
900  }
901  else
902  {
903  status = HAL_BUSY;
904  }
905 
906  /* Process unlocked */
907  __HAL_UNLOCK(hqspi);
908 
909  return status;
910 }
911 
912 
921 HAL_StatusTypeDef HAL_QSPI_Receive(QSPI_HandleTypeDef *hqspi, uint8_t *pData, uint32_t Timeout)
922 {
923  HAL_StatusTypeDef status = HAL_OK;
924  uint32_t tickstart = HAL_GetTick();
925  uint32_t addr_reg = READ_REG(hqspi->Instance->AR);
926  __IO uint32_t *data_reg = &hqspi->Instance->DR;
927 
928  /* Process locked */
929  __HAL_LOCK(hqspi);
930 
931  if(hqspi->State == HAL_QSPI_STATE_READY)
932  {
934  if(pData != NULL )
935  {
936  /* Update state */
938 
939  /* Configure counters and size of the handle */
940  hqspi->RxXferCount = READ_REG(hqspi->Instance->DLR) + 1;
941  hqspi->RxXferSize = READ_REG(hqspi->Instance->DLR) + 1;
942  hqspi->pRxBuffPtr = pData;
943 
944  /* Configure QSPI: CCR register with functional as indirect read */
945  MODIFY_REG(hqspi->Instance->CCR, QUADSPI_CCR_FMODE, QSPI_FUNCTIONAL_MODE_INDIRECT_READ);
946 
947  /* Start the transfer by re-writing the address in AR register */
948  WRITE_REG(hqspi->Instance->AR, addr_reg);
949 
950  while(hqspi->RxXferCount > 0)
951  {
952  /* Wait until FT or TC flag is set to read received data */
953  status = QSPI_WaitFlagStateUntilTimeout(hqspi, (QSPI_FLAG_FT | QSPI_FLAG_TC), SET, tickstart, Timeout);
954 
955  if (status != HAL_OK)
956  {
957  break;
958  }
959 
960  *hqspi->pRxBuffPtr++ = *(__IO uint8_t *)data_reg;
961  hqspi->RxXferCount--;
962  }
963 
964  if (status == HAL_OK)
965  {
966  /* Wait until TC flag is set to go back in idle state */
967  status = QSPI_WaitFlagStateUntilTimeout(hqspi, QSPI_FLAG_TC, SET, tickstart, Timeout);
968 
969  if (status == HAL_OK)
970  {
971  /* Clear Transfer Complete bit */
972  __HAL_QSPI_CLEAR_FLAG(hqspi, QSPI_FLAG_TC);
973 
974 #if defined(QSPI1_V1_0)
975  /* Workaround - Extra data written in the FIFO at the end of a read transfer */
976  status = HAL_QSPI_Abort(hqspi);
977 #endif /* QSPI_V1_0 */
978  }
979  }
980 
981  /* Update QSPI state */
982  hqspi->State = HAL_QSPI_STATE_READY;
983  }
984  else
985  {
987  status = HAL_ERROR;
988  }
989  }
990  else
991  {
992  status = HAL_BUSY;
993  }
994 
995  /* Process unlocked */
996  __HAL_UNLOCK(hqspi);
997 
998  return status;
999 }
1000 
1009 {
1010  HAL_StatusTypeDef status = HAL_OK;
1011 
1012  /* Process locked */
1013  __HAL_LOCK(hqspi);
1014 
1015  if(hqspi->State == HAL_QSPI_STATE_READY)
1016  {
1017  hqspi->ErrorCode = HAL_QSPI_ERROR_NONE;
1018  if(pData != NULL )
1019  {
1020  /* Update state */
1022 
1023  /* Configure counters and size of the handle */
1024  hqspi->TxXferCount = READ_REG(hqspi->Instance->DLR) + 1;
1025  hqspi->TxXferSize = READ_REG(hqspi->Instance->DLR) + 1;
1026  hqspi->pTxBuffPtr = pData;
1027 
1028  /* Configure QSPI: CCR register with functional as indirect write */
1029  MODIFY_REG(hqspi->Instance->CCR, QUADSPI_CCR_FMODE, QSPI_FUNCTIONAL_MODE_INDIRECT_WRITE);
1030 
1031  /* Clear interrupt */
1032  __HAL_QSPI_CLEAR_FLAG(hqspi, QSPI_FLAG_TE | QSPI_FLAG_TC);
1033 
1034  /* Process unlocked */
1035  __HAL_UNLOCK(hqspi);
1036 
1037  /* Enable the QSPI transfer error, FIFO threshold and transfer complete Interrupts */
1038  __HAL_QSPI_ENABLE_IT(hqspi, QSPI_IT_TE | QSPI_IT_FT | QSPI_IT_TC);
1039 
1040  }
1041  else
1042  {
1044  status = HAL_ERROR;
1045 
1046  /* Process unlocked */
1047  __HAL_UNLOCK(hqspi);
1048  }
1049  }
1050  else
1051  {
1052  status = HAL_BUSY;
1053 
1054  /* Process unlocked */
1055  __HAL_UNLOCK(hqspi);
1056  }
1057 
1058  return status;
1059 }
1060 
1069 {
1070  HAL_StatusTypeDef status = HAL_OK;
1071  uint32_t addr_reg = READ_REG(hqspi->Instance->AR);
1072 
1073  /* Process locked */
1074  __HAL_LOCK(hqspi);
1075 
1076  if(hqspi->State == HAL_QSPI_STATE_READY)
1077  {
1078  hqspi->ErrorCode = HAL_QSPI_ERROR_NONE;
1079 
1080  if(pData != NULL )
1081  {
1082  /* Update state */
1084 
1085  /* Configure counters and size of the handle */
1086  hqspi->RxXferCount = READ_REG(hqspi->Instance->DLR) + 1;
1087  hqspi->RxXferSize = READ_REG(hqspi->Instance->DLR) + 1;
1088  hqspi->pRxBuffPtr = pData;
1089 
1090  /* Configure QSPI: CCR register with functional as indirect read */
1091  MODIFY_REG(hqspi->Instance->CCR, QUADSPI_CCR_FMODE, QSPI_FUNCTIONAL_MODE_INDIRECT_READ);
1092 
1093  /* Start the transfer by re-writing the address in AR register */
1094  WRITE_REG(hqspi->Instance->AR, addr_reg);
1095 
1096  /* Clear interrupt */
1097  __HAL_QSPI_CLEAR_FLAG(hqspi, QSPI_FLAG_TE | QSPI_FLAG_TC);
1098 
1099  /* Process unlocked */
1100  __HAL_UNLOCK(hqspi);
1101 
1102  /* Enable the QSPI transfer error, FIFO threshold and transfer complete Interrupts */
1103  __HAL_QSPI_ENABLE_IT(hqspi, QSPI_IT_TE | QSPI_IT_FT | QSPI_IT_TC);
1104  }
1105  else
1106  {
1108  status = HAL_ERROR;
1109 
1110  /* Process unlocked */
1111  __HAL_UNLOCK(hqspi);
1112  }
1113  }
1114  else
1115  {
1116  status = HAL_BUSY;
1117 
1118  /* Process unlocked */
1119  __HAL_UNLOCK(hqspi);
1120  }
1121 
1122  return status;
1123 }
1124 
1137 {
1138  HAL_StatusTypeDef status = HAL_OK;
1139  uint32_t *tmp;
1140  uint32_t data_size = (READ_REG(hqspi->Instance->DLR) + 1);
1141 
1142  /* Process locked */
1143  __HAL_LOCK(hqspi);
1144 
1145  if(hqspi->State == HAL_QSPI_STATE_READY)
1146  {
1147  /* Clear the error code */
1148  hqspi->ErrorCode = HAL_QSPI_ERROR_NONE;
1149 
1150  if(pData != NULL )
1151  {
1152  /* Configure counters of the handle */
1154  {
1155  hqspi->TxXferCount = data_size;
1156  }
1158  {
1159  if (((data_size % 2) != 0) || ((hqspi->Init.FifoThreshold % 2) != 0))
1160  {
1161  /* The number of data or the fifo threshold is not aligned on halfword
1162  => no transfer possible with DMA peripheral access configured as halfword */
1164  status = HAL_ERROR;
1165 
1166  /* Process unlocked */
1167  __HAL_UNLOCK(hqspi);
1168  }
1169  else
1170  {
1171  hqspi->TxXferCount = (data_size >> 1);
1172  }
1173  }
1174  else if (hqspi->hdma->Init.PeriphDataAlignment == DMA_PDATAALIGN_WORD)
1175  {
1176  if (((data_size % 4) != 0) || ((hqspi->Init.FifoThreshold % 4) != 0))
1177  {
1178  /* The number of data or the fifo threshold is not aligned on word
1179  => no transfer possible with DMA peripheral access configured as word */
1181  status = HAL_ERROR;
1182 
1183  /* Process unlocked */
1184  __HAL_UNLOCK(hqspi);
1185  }
1186  else
1187  {
1188  hqspi->TxXferCount = (data_size >> 2);
1189  }
1190  }
1191 
1192  if (status == HAL_OK)
1193  {
1194 
1195  /* Update state */
1197 
1198  /* Clear interrupt */
1199  __HAL_QSPI_CLEAR_FLAG(hqspi, (QSPI_FLAG_TE | QSPI_FLAG_TC));
1200 
1201  /* Configure size and pointer of the handle */
1202  hqspi->TxXferSize = hqspi->TxXferCount;
1203  hqspi->pTxBuffPtr = pData;
1204 
1205  /* Configure QSPI: CCR register with functional mode as indirect write */
1206  MODIFY_REG(hqspi->Instance->CCR, QUADSPI_CCR_FMODE, QSPI_FUNCTIONAL_MODE_INDIRECT_WRITE);
1207 
1208  /* Set the QSPI DMA transfer complete callback */
1209  hqspi->hdma->XferCpltCallback = QSPI_DMATxCplt;
1210 
1211  /* Set the QSPI DMA Half transfer complete callback */
1212  hqspi->hdma->XferHalfCpltCallback = QSPI_DMATxHalfCplt;
1213 
1214  /* Set the DMA error callback */
1215  hqspi->hdma->XferErrorCallback = QSPI_DMAError;
1216 
1217  /* Clear the DMA abort callback */
1218  hqspi->hdma->XferAbortCallback = NULL;
1219 
1220  /* Configure the direction of the DMA */
1222  MODIFY_REG(hqspi->hdma->Instance->CR, DMA_SxCR_DIR, hqspi->hdma->Init.Direction);
1223 
1224  /* Enable the QSPI transmit DMA Channel */
1225  tmp = (uint32_t*)&pData;
1226  HAL_DMA_Start_IT(hqspi->hdma, *(uint32_t*)tmp, (uint32_t)&hqspi->Instance->DR, hqspi->TxXferSize);
1227 
1228  /* Process unlocked */
1229  __HAL_UNLOCK(hqspi);
1230 
1231  /* Enable the QSPI transfer error Interrupt */
1232  __HAL_QSPI_ENABLE_IT(hqspi, QSPI_IT_TE);
1233 
1234  /* Enable the DMA transfer by setting the DMAEN bit in the QSPI CR register */
1235  SET_BIT(hqspi->Instance->CR, QUADSPI_CR_DMAEN);
1236  }
1237  }
1238  else
1239  {
1241 
1242  status = HAL_ERROR;
1243 
1244  /* Process unlocked */
1245  __HAL_UNLOCK(hqspi);
1246  }
1247  }
1248  else
1249  {
1250  status = HAL_BUSY;
1251 
1252  /* Process unlocked */
1253  __HAL_UNLOCK(hqspi);
1254  }
1255 
1256  return status;
1257 }
1258 
1271 {
1272  HAL_StatusTypeDef status = HAL_OK;
1273  uint32_t *tmp;
1274  uint32_t addr_reg = READ_REG(hqspi->Instance->AR);
1275  uint32_t data_size = (READ_REG(hqspi->Instance->DLR) + 1);
1276 
1277  /* Process locked */
1278  __HAL_LOCK(hqspi);
1279 
1280  if(hqspi->State == HAL_QSPI_STATE_READY)
1281  {
1282  hqspi->ErrorCode = HAL_QSPI_ERROR_NONE;
1283 
1284  if(pData != NULL )
1285  {
1286  /* Configure counters of the handle */
1288  {
1289  hqspi->RxXferCount = data_size;
1290  }
1292  {
1293  if (((data_size % 2) != 0) || ((hqspi->Init.FifoThreshold % 2) != 0))
1294  {
1295  /* The number of data or the fifo threshold is not aligned on halfword
1296  => no transfer possible with DMA peripheral access configured as halfword */
1298  status = HAL_ERROR;
1299 
1300  /* Process unlocked */
1301  __HAL_UNLOCK(hqspi);
1302  }
1303  else
1304  {
1305  hqspi->RxXferCount = (data_size >> 1);
1306  }
1307  }
1308  else if (hqspi->hdma->Init.PeriphDataAlignment == DMA_PDATAALIGN_WORD)
1309  {
1310  if (((data_size % 4) != 0) || ((hqspi->Init.FifoThreshold % 4) != 0))
1311  {
1312  /* The number of data or the fifo threshold is not aligned on word
1313  => no transfer possible with DMA peripheral access configured as word */
1315  status = HAL_ERROR;
1316 
1317  /* Process unlocked */
1318  __HAL_UNLOCK(hqspi);
1319  }
1320  else
1321  {
1322  hqspi->RxXferCount = (data_size >> 2);
1323  }
1324  }
1325 
1326  if (status == HAL_OK)
1327  {
1328 
1329  /* Update state */
1331 
1332  /* Clear interrupt */
1333  __HAL_QSPI_CLEAR_FLAG(hqspi, (QSPI_FLAG_TE | QSPI_FLAG_TC));
1334 
1335  /* Configure size and pointer of the handle */
1336  hqspi->RxXferSize = hqspi->RxXferCount;
1337  hqspi->pRxBuffPtr = pData;
1338 
1339  /* Set the QSPI DMA transfer complete callback */
1340  hqspi->hdma->XferCpltCallback = QSPI_DMARxCplt;
1341 
1342  /* Set the QSPI DMA Half transfer complete callback */
1343  hqspi->hdma->XferHalfCpltCallback = QSPI_DMARxHalfCplt;
1344 
1345  /* Set the DMA error callback */
1346  hqspi->hdma->XferErrorCallback = QSPI_DMAError;
1347 
1348  /* Clear the DMA abort callback */
1349  hqspi->hdma->XferAbortCallback = NULL;
1350 
1351  /* Configure the direction of the DMA */
1353  MODIFY_REG(hqspi->hdma->Instance->CR, DMA_SxCR_DIR, hqspi->hdma->Init.Direction);
1354 
1355  /* Enable the DMA Channel */
1356  tmp = (uint32_t*)&pData;
1357  HAL_DMA_Start_IT(hqspi->hdma, (uint32_t)&hqspi->Instance->DR, *(uint32_t*)tmp, hqspi->RxXferSize);
1358 
1359  /* Configure QSPI: CCR register with functional as indirect read */
1360  MODIFY_REG(hqspi->Instance->CCR, QUADSPI_CCR_FMODE, QSPI_FUNCTIONAL_MODE_INDIRECT_READ);
1361 
1362  /* Start the transfer by re-writing the address in AR register */
1363  WRITE_REG(hqspi->Instance->AR, addr_reg);
1364 
1365  /* Process unlocked */
1366  __HAL_UNLOCK(hqspi);
1367 
1368  /* Enable the QSPI transfer error Interrupt */
1369  __HAL_QSPI_ENABLE_IT(hqspi, QSPI_IT_TE);
1370 
1371  /* Enable the DMA transfer by setting the DMAEN bit in the QSPI CR register */
1372  SET_BIT(hqspi->Instance->CR, QUADSPI_CR_DMAEN);
1373  }
1374  }
1375  else
1376  {
1378  status = HAL_ERROR;
1379 
1380  /* Process unlocked */
1381  __HAL_UNLOCK(hqspi);
1382  }
1383  }
1384  else
1385  {
1386  status = HAL_BUSY;
1387 
1388  /* Process unlocked */
1389  __HAL_UNLOCK(hqspi);
1390  }
1391 
1392  return status;
1393 }
1394 
1405 {
1406  HAL_StatusTypeDef status = HAL_ERROR;
1407  uint32_t tickstart = HAL_GetTick();
1408 
1409  /* Check the parameters */
1412  {
1414  }
1415 
1417  if (cmd->AddressMode != QSPI_ADDRESS_NONE)
1418  {
1420  }
1421 
1424  {
1426  }
1427 
1430 
1434 
1438 
1439  /* Process locked */
1440  __HAL_LOCK(hqspi);
1441 
1442  if(hqspi->State == HAL_QSPI_STATE_READY)
1443  {
1444 
1445  hqspi->ErrorCode = HAL_QSPI_ERROR_NONE;
1446 
1447  /* Update state */
1449 
1450  /* Wait till BUSY flag reset */
1451  status = QSPI_WaitFlagStateUntilTimeout(hqspi, QSPI_FLAG_BUSY, RESET, tickstart, Timeout);
1452 
1453  if (status == HAL_OK)
1454  {
1455  /* Configure QSPI: PSMAR register with the status match value */
1456  WRITE_REG(hqspi->Instance->PSMAR, cfg->Match);
1457 
1458  /* Configure QSPI: PSMKR register with the status mask value */
1459  WRITE_REG(hqspi->Instance->PSMKR, cfg->Mask);
1460 
1461  /* Configure QSPI: PIR register with the interval value */
1462  WRITE_REG(hqspi->Instance->PIR, cfg->Interval);
1463 
1464  /* Configure QSPI: CR register with Match mode and Automatic stop enabled
1465  (otherwise there will be an infinite loop in blocking mode) */
1468 
1469  /* Call the configuration function */
1470  cmd->NbData = cfg->StatusBytesSize;
1471  QSPI_Config(hqspi, cmd, QSPI_FUNCTIONAL_MODE_AUTO_POLLING);
1472 
1473  /* Wait until SM flag is set to go back in idle state */
1474  status = QSPI_WaitFlagStateUntilTimeout(hqspi, QSPI_FLAG_SM, SET, tickstart, Timeout);
1475 
1476  if (status == HAL_OK)
1477  {
1478  __HAL_QSPI_CLEAR_FLAG(hqspi, QSPI_FLAG_SM);
1479 
1480  /* Update state */
1481  hqspi->State = HAL_QSPI_STATE_READY;
1482  }
1483  }
1484  }
1485  else
1486  {
1487  status = HAL_BUSY;
1488  }
1489  /* Process unlocked */
1490  __HAL_UNLOCK(hqspi);
1491 
1492  /* Return function status */
1493  return status;
1494 }
1495 
1505 {
1506  HAL_StatusTypeDef status = HAL_ERROR;
1507  uint32_t tickstart = HAL_GetTick();
1508 
1509  /* Check the parameters */
1512  {
1514  }
1515 
1517  if (cmd->AddressMode != QSPI_ADDRESS_NONE)
1518  {
1520  }
1521 
1524  {
1526  }
1527 
1530 
1534 
1539 
1540  /* Process locked */
1541  __HAL_LOCK(hqspi);
1542 
1543  if(hqspi->State == HAL_QSPI_STATE_READY)
1544  {
1545  hqspi->ErrorCode = HAL_QSPI_ERROR_NONE;
1546 
1547  /* Update state */
1549 
1550  /* Wait till BUSY flag reset */
1551  status = QSPI_WaitFlagStateUntilTimeout(hqspi, QSPI_FLAG_BUSY, RESET, tickstart, hqspi->Timeout);
1552 
1553  if (status == HAL_OK)
1554  {
1555  /* Configure QSPI: PSMAR register with the status match value */
1556  WRITE_REG(hqspi->Instance->PSMAR, cfg->Match);
1557 
1558  /* Configure QSPI: PSMKR register with the status mask value */
1559  WRITE_REG(hqspi->Instance->PSMKR, cfg->Mask);
1560 
1561  /* Configure QSPI: PIR register with the interval value */
1562  WRITE_REG(hqspi->Instance->PIR, cfg->Interval);
1563 
1564  /* Configure QSPI: CR register with Match mode and Automatic stop mode */
1566  (cfg->MatchMode | cfg->AutomaticStop));
1567 
1568  /* Clear interrupt */
1569  __HAL_QSPI_CLEAR_FLAG(hqspi, QSPI_FLAG_TE | QSPI_FLAG_SM);
1570 
1571  /* Call the configuration function */
1572  cmd->NbData = cfg->StatusBytesSize;
1573  QSPI_Config(hqspi, cmd, QSPI_FUNCTIONAL_MODE_AUTO_POLLING);
1574 
1575  /* Process unlocked */
1576  __HAL_UNLOCK(hqspi);
1577 
1578  /* Enable the QSPI Transfer Error and status match Interrupt */
1579  __HAL_QSPI_ENABLE_IT(hqspi, (QSPI_IT_SM | QSPI_IT_TE));
1580 
1581  }
1582  else
1583  {
1584  /* Process unlocked */
1585  __HAL_UNLOCK(hqspi);
1586  }
1587  }
1588  else
1589  {
1590  status = HAL_BUSY;
1591 
1592  /* Process unlocked */
1593  __HAL_UNLOCK(hqspi);
1594  }
1595 
1596  /* Return function status */
1597  return status;
1598 }
1599 
1609 {
1610  HAL_StatusTypeDef status = HAL_ERROR;
1611  uint32_t tickstart = HAL_GetTick();
1612 
1613  /* Check the parameters */
1616  {
1618  }
1619 
1621  if (cmd->AddressMode != QSPI_ADDRESS_NONE)
1622  {
1624  }
1625 
1628  {
1630  }
1631 
1634 
1638 
1640 
1641  /* Process locked */
1642  __HAL_LOCK(hqspi);
1643 
1644  if(hqspi->State == HAL_QSPI_STATE_READY)
1645  {
1646  hqspi->ErrorCode = HAL_QSPI_ERROR_NONE;
1647 
1648  /* Update state */
1650 
1651  /* Wait till BUSY flag reset */
1652  status = QSPI_WaitFlagStateUntilTimeout(hqspi, QSPI_FLAG_BUSY, RESET, tickstart, hqspi->Timeout);
1653 
1654  if (status == HAL_OK)
1655  {
1656  /* Configure QSPI: CR register with timeout counter enable */
1658 
1660  {
1662 
1663  /* Configure QSPI: LPTR register with the low-power timeout value */
1664  WRITE_REG(hqspi->Instance->LPTR, cfg->TimeOutPeriod);
1665 
1666  /* Clear interrupt */
1667  __HAL_QSPI_CLEAR_FLAG(hqspi, QSPI_FLAG_TO);
1668 
1669  /* Enable the QSPI TimeOut Interrupt */
1671  }
1672 
1673  /* Call the configuration function */
1674  QSPI_Config(hqspi, cmd, QSPI_FUNCTIONAL_MODE_MEMORY_MAPPED);
1675  }
1676  }
1677  else
1678  {
1679  status = HAL_BUSY;
1680  }
1681 
1682  /* Process unlocked */
1683  __HAL_UNLOCK(hqspi);
1684 
1685  /* Return function status */
1686  return status;
1687 }
1688 
1694 __weak void HAL_QSPI_ErrorCallback(QSPI_HandleTypeDef *hqspi)
1695 {
1696  /* Prevent unused argument(s) compilation warning */
1697  UNUSED(hqspi);
1698 
1699  /* NOTE : This function Should not be modified, when the callback is needed,
1700  the HAL_QSPI_ErrorCallback could be implemented in the user file
1701  */
1702 }
1703 
1710 {
1711  /* Prevent unused argument(s) compilation warning */
1712  UNUSED(hqspi);
1713 
1714  /* NOTE: This function should not be modified, when the callback is needed,
1715  the HAL_QSPI_AbortCpltCallback could be implemented in the user file
1716  */
1717 }
1718 
1724 __weak void HAL_QSPI_CmdCpltCallback(QSPI_HandleTypeDef *hqspi)
1725 {
1726  /* Prevent unused argument(s) compilation warning */
1727  UNUSED(hqspi);
1728 
1729  /* NOTE: This function Should not be modified, when the callback is needed,
1730  the HAL_QSPI_CmdCpltCallback could be implemented in the user file
1731  */
1732 }
1733 
1739 __weak void HAL_QSPI_RxCpltCallback(QSPI_HandleTypeDef *hqspi)
1740 {
1741  /* Prevent unused argument(s) compilation warning */
1742  UNUSED(hqspi);
1743 
1744  /* NOTE: This function Should not be modified, when the callback is needed,
1745  the HAL_QSPI_RxCpltCallback could be implemented in the user file
1746  */
1747 }
1748 
1754  __weak void HAL_QSPI_TxCpltCallback(QSPI_HandleTypeDef *hqspi)
1755 {
1756  /* Prevent unused argument(s) compilation warning */
1757  UNUSED(hqspi);
1758 
1759  /* NOTE: This function Should not be modified, when the callback is needed,
1760  the HAL_QSPI_TxCpltCallback could be implemented in the user file
1761  */
1762 }
1763 
1770 {
1771  /* Prevent unused argument(s) compilation warning */
1772  UNUSED(hqspi);
1773 
1774  /* NOTE: This function Should not be modified, when the callback is needed,
1775  the HAL_QSPI_RxHalfCpltCallback could be implemented in the user file
1776  */
1777 }
1778 
1785 {
1786  /* Prevent unused argument(s) compilation warning */
1787  UNUSED(hqspi);
1788 
1789  /* NOTE: This function Should not be modified, when the callback is needed,
1790  the HAL_QSPI_TxHalfCpltCallback could be implemented in the user file
1791  */
1792 }
1793 
1800 {
1801  /* Prevent unused argument(s) compilation warning */
1802  UNUSED(hqspi);
1803 
1804  /* NOTE : This function Should not be modified, when the callback is needed,
1805  the HAL_QSPI_FIFOThresholdCallback could be implemented in the user file
1806  */
1807 }
1808 
1815 {
1816  /* Prevent unused argument(s) compilation warning */
1817  UNUSED(hqspi);
1818 
1819  /* NOTE : This function Should not be modified, when the callback is needed,
1820  the HAL_QSPI_StatusMatchCallback could be implemented in the user file
1821  */
1822 }
1823 
1829 __weak void HAL_QSPI_TimeOutCallback(QSPI_HandleTypeDef *hqspi)
1830 {
1831  /* Prevent unused argument(s) compilation warning */
1832  UNUSED(hqspi);
1833 
1834  /* NOTE : This function Should not be modified, when the callback is needed,
1835  the HAL_QSPI_TimeOutCallback could be implemented in the user file
1836  */
1837 }
1838 
1866 {
1867  /* Return QSPI handle state */
1868  return hqspi->State;
1869 }
1870 
1876 uint32_t HAL_QSPI_GetError(QSPI_HandleTypeDef *hqspi)
1877 {
1878  return hqspi->ErrorCode;
1879 }
1880 
1887 {
1888  HAL_StatusTypeDef status = HAL_OK;
1889  uint32_t tickstart = HAL_GetTick();
1890 
1891  /* Check if the state is in one of the busy states */
1892  if ((hqspi->State & 0x2) != 0)
1893  {
1894  /* Process unlocked */
1895  __HAL_UNLOCK(hqspi);
1896 
1897  if ((hqspi->Instance->CR & QUADSPI_CR_DMAEN)!= RESET)
1898  {
1899  /* Disable the DMA transfer by clearing the DMAEN bit in the QSPI CR register */
1901 
1902  /* Abort DMA channel */
1903  status = HAL_DMA_Abort(hqspi->hdma);
1904  if(status != HAL_OK)
1905  {
1906  hqspi->ErrorCode |= HAL_QSPI_ERROR_DMA;
1907  }
1908  }
1909 
1910  /* Configure QSPI: CR register with Abort request */
1911  SET_BIT(hqspi->Instance->CR, QUADSPI_CR_ABORT);
1912 
1913  /* Wait until TC flag is set to go back in idle state */
1914  status = QSPI_WaitFlagStateUntilTimeout(hqspi, QSPI_FLAG_TC, SET, tickstart, hqspi->Timeout);
1915 
1916  if(status == HAL_OK)
1917  {
1918  __HAL_QSPI_CLEAR_FLAG(hqspi, QSPI_FLAG_TC);
1919 
1920  /* Wait until BUSY flag is reset */
1921  status = QSPI_WaitFlagStateUntilTimeout(hqspi, QSPI_FLAG_BUSY, RESET, tickstart, hqspi->Timeout);
1922  }
1923 
1924  if (status == HAL_OK)
1925  {
1926  /* Update state */
1927  hqspi->State = HAL_QSPI_STATE_READY;
1928  }
1929  }
1930 
1931  return status;
1932 }
1933 
1940 {
1941  HAL_StatusTypeDef status = HAL_OK;
1942 
1943  /* Check if the state is in one of the busy states */
1944  if ((hqspi->State & 0x2) != 0)
1945  {
1946  /* Process unlocked */
1947  __HAL_UNLOCK(hqspi);
1948 
1949  /* Update QSPI state */
1950  hqspi->State = HAL_QSPI_STATE_ABORT;
1951 
1952  /* Disable all interrupts */
1953  __HAL_QSPI_DISABLE_IT(hqspi, (QSPI_IT_TO | QSPI_IT_SM | QSPI_IT_FT | QSPI_IT_TC | QSPI_IT_TE));
1954 
1955  if ((hqspi->Instance->CR & QUADSPI_CR_DMAEN)!= RESET)
1956  {
1957  /* Disable the DMA transfer by clearing the DMAEN bit in the QSPI CR register */
1959 
1960  /* Abort DMA channel */
1961  hqspi->hdma->XferAbortCallback = QSPI_DMAAbortCplt;
1962  HAL_DMA_Abort_IT(hqspi->hdma);
1963  }
1964  else
1965  {
1966  /* Clear interrupt */
1967  __HAL_QSPI_CLEAR_FLAG(hqspi, QSPI_FLAG_TC);
1968 
1969  /* Enable the QSPI Transfer Complete Interrupt */
1970  __HAL_QSPI_ENABLE_IT(hqspi, QSPI_IT_TC);
1971 
1972  /* Configure QSPI: CR register with Abort request */
1973  SET_BIT(hqspi->Instance->CR, QUADSPI_CR_ABORT);
1974  }
1975  }
1976 
1977  return status;
1978 }
1979 
1985 void HAL_QSPI_SetTimeout(QSPI_HandleTypeDef *hqspi, uint32_t Timeout)
1986 {
1987  hqspi->Timeout = Timeout;
1988 }
1989 
1996 {
1997  HAL_StatusTypeDef status = HAL_OK;
1998 
1999  /* Process locked */
2000  __HAL_LOCK(hqspi);
2001 
2002  if(hqspi->State == HAL_QSPI_STATE_READY)
2003  {
2004  /* Synchronize init structure with new FIFO threshold value */
2005  hqspi->Init.FifoThreshold = Threshold;
2006 
2007  /* Configure QSPI FIFO Threshold */
2009  ((hqspi->Init.FifoThreshold - 1) << POSITION_VAL(QUADSPI_CR_FTHRES)));
2010  }
2011  else
2012  {
2013  status = HAL_BUSY;
2014  }
2015 
2016  /* Process unlocked */
2017  __HAL_UNLOCK(hqspi);
2018 
2019  /* Return function status */
2020  return status;
2021 }
2022 
2028 {
2029  return ((READ_BIT(hqspi->Instance->CR, QUADSPI_CR_FTHRES) >> POSITION_VAL(QUADSPI_CR_FTHRES)) + 1);
2030 }
2031 
2036 /* Private functions ---------------------------------------------------------*/
2037 
2043 static void QSPI_DMARxCplt(DMA_HandleTypeDef *hdma)
2044 {
2045  QSPI_HandleTypeDef* hqspi = ( QSPI_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
2046  hqspi->RxXferCount = 0;
2047 
2048  /* Enable the QSPI transfer complete Interrupt */
2049  __HAL_QSPI_ENABLE_IT(hqspi, QSPI_IT_TC);
2050 }
2051 
2057 static void QSPI_DMATxCplt(DMA_HandleTypeDef *hdma)
2058 {
2059  QSPI_HandleTypeDef* hqspi = ( QSPI_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
2060  hqspi->TxXferCount = 0;
2061 
2062  /* Enable the QSPI transfer complete Interrupt */
2063  __HAL_QSPI_ENABLE_IT(hqspi, QSPI_IT_TC);
2064 }
2065 
2071 static void QSPI_DMARxHalfCplt(DMA_HandleTypeDef *hdma)
2072 {
2073  QSPI_HandleTypeDef* hqspi = (QSPI_HandleTypeDef*)((DMA_HandleTypeDef*)hdma)->Parent;
2074 
2076 }
2077 
2083 static void QSPI_DMATxHalfCplt(DMA_HandleTypeDef *hdma)
2084 {
2085  QSPI_HandleTypeDef* hqspi = (QSPI_HandleTypeDef*)((DMA_HandleTypeDef*)hdma)->Parent;
2086 
2088 }
2089 
2095 static void QSPI_DMAError(DMA_HandleTypeDef *hdma)
2096 {
2097  QSPI_HandleTypeDef* hqspi = ( QSPI_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
2098 
2099  /* if DMA error is FIFO error ignore it */
2100  if(HAL_DMA_GetError(hdma) != HAL_DMA_ERROR_FE)
2101  {
2102  hqspi->RxXferCount = 0;
2103  hqspi->TxXferCount = 0;
2104  hqspi->ErrorCode |= HAL_QSPI_ERROR_DMA;
2105 
2106  /* Disable the DMA transfer by clearing the DMAEN bit in the QSPI CR register */
2108 
2109  /* Abort the QSPI */
2110  HAL_QSPI_Abort_IT(hqspi);
2111  }
2112 }
2113 
2119 static void QSPI_DMAAbortCplt(DMA_HandleTypeDef *hdma)
2120 {
2121  QSPI_HandleTypeDef* hqspi = ( QSPI_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
2122 
2123  hqspi->RxXferCount = 0;
2124  hqspi->TxXferCount = 0;
2125 
2126  if(hqspi->State == HAL_QSPI_STATE_ABORT)
2127  {
2128  /* DMA Abort called by QSPI abort */
2129  /* Clear interrupt */
2130  __HAL_QSPI_CLEAR_FLAG(hqspi, QSPI_FLAG_TC);
2131 
2132  /* Enable the QSPI Transfer Complete Interrupt */
2133  __HAL_QSPI_ENABLE_IT(hqspi, QSPI_IT_TC);
2134 
2135  /* Configure QSPI: CR register with Abort request */
2136  SET_BIT(hqspi->Instance->CR, QUADSPI_CR_ABORT);
2137  }
2138  else
2139  {
2140  /* DMA Abort called due to a transfer error interrupt */
2141  /* Change state of QSPI */
2142  hqspi->State = HAL_QSPI_STATE_READY;
2143 
2144  /* Error callback */
2145  HAL_QSPI_ErrorCallback(hqspi);
2146  }
2147 }
2148 
2158 static HAL_StatusTypeDef QSPI_WaitFlagStateUntilTimeout(QSPI_HandleTypeDef *hqspi, uint32_t Flag,
2159  FlagStatus State, uint32_t tickstart, uint32_t Timeout)
2160 {
2161  /* Wait until flag is in expected state */
2162  while((FlagStatus)(__HAL_QSPI_GET_FLAG(hqspi, Flag)) != State)
2163  {
2164  /* Check for the Timeout */
2165  if (Timeout != HAL_MAX_DELAY)
2166  {
2167  if((Timeout == 0) || ((HAL_GetTick() - tickstart) > Timeout))
2168  {
2169  hqspi->State = HAL_QSPI_STATE_ERROR;
2171 
2172  return HAL_ERROR;
2173  }
2174  }
2175  }
2176  return HAL_OK;
2177 }
2178 
2191 static void QSPI_Config(QSPI_HandleTypeDef *hqspi, QSPI_CommandTypeDef *cmd, uint32_t FunctionalMode)
2192 {
2193  assert_param(IS_QSPI_FUNCTIONAL_MODE(FunctionalMode));
2194 
2195  if ((cmd->DataMode != QSPI_DATA_NONE) && (FunctionalMode != QSPI_FUNCTIONAL_MODE_MEMORY_MAPPED))
2196  {
2197  /* Configure QSPI: DLR register with the number of data to read or write */
2198  WRITE_REG(hqspi->Instance->DLR, (cmd->NbData - 1));
2199  }
2200 
2202  {
2204  {
2205  /* Configure QSPI: ABR register with alternate bytes value */
2206  WRITE_REG(hqspi->Instance->ABR, cmd->AlternateBytes);
2207 
2208  if (cmd->AddressMode != QSPI_ADDRESS_NONE)
2209  {
2210  /*---- Command with instruction, address and alternate bytes ----*/
2211  /* Configure QSPI: CCR register with all communications parameters */
2212  WRITE_REG(hqspi->Instance->CCR, (cmd->DdrMode | cmd->DdrHoldHalfCycle | cmd->SIOOMode |
2213  cmd->DataMode | (cmd->DummyCycles << 18) | cmd->AlternateBytesSize |
2214  cmd->AlternateByteMode | cmd->AddressSize | cmd->AddressMode |
2215  cmd->InstructionMode | cmd->Instruction | FunctionalMode));
2216 
2217  if (FunctionalMode != QSPI_FUNCTIONAL_MODE_MEMORY_MAPPED)
2218  {
2219  /* Configure QSPI: AR register with address value */
2220  WRITE_REG(hqspi->Instance->AR, cmd->Address);
2221  }
2222  }
2223  else
2224  {
2225  /*---- Command with instruction and alternate bytes ----*/
2226  /* Configure QSPI: CCR register with all communications parameters */
2227  WRITE_REG(hqspi->Instance->CCR, (cmd->DdrMode | cmd->DdrHoldHalfCycle | cmd->SIOOMode |
2228  cmd->DataMode | (cmd->DummyCycles << 18) | cmd->AlternateBytesSize |
2229  cmd->AlternateByteMode | cmd->AddressMode | cmd->InstructionMode |
2230  cmd->Instruction | FunctionalMode));
2231  }
2232  }
2233  else
2234  {
2235  if (cmd->AddressMode != QSPI_ADDRESS_NONE)
2236  {
2237  /*---- Command with instruction and address ----*/
2238  /* Configure QSPI: CCR register with all communications parameters */
2239  WRITE_REG(hqspi->Instance->CCR, (cmd->DdrMode | cmd->DdrHoldHalfCycle | cmd->SIOOMode |
2240  cmd->DataMode | (cmd->DummyCycles << 18) | cmd->AlternateByteMode |
2241  cmd->AddressSize | cmd->AddressMode | cmd->InstructionMode |
2242  cmd->Instruction | FunctionalMode));
2243 
2244  if (FunctionalMode != QSPI_FUNCTIONAL_MODE_MEMORY_MAPPED)
2245  {
2246  /* Configure QSPI: AR register with address value */
2247  WRITE_REG(hqspi->Instance->AR, cmd->Address);
2248  }
2249  }
2250  else
2251  {
2252  /*---- Command with only instruction ----*/
2253  /* Configure QSPI: CCR register with all communications parameters */
2254  WRITE_REG(hqspi->Instance->CCR, (cmd->DdrMode | cmd->DdrHoldHalfCycle | cmd->SIOOMode |
2255  cmd->DataMode | (cmd->DummyCycles << 18) | cmd->AlternateByteMode |
2256  cmd->AddressMode | cmd->InstructionMode | cmd->Instruction |
2257  FunctionalMode));
2258  }
2259  }
2260  }
2261  else
2262  {
2264  {
2265  /* Configure QSPI: ABR register with alternate bytes value */
2266  WRITE_REG(hqspi->Instance->ABR, cmd->AlternateBytes);
2267 
2268  if (cmd->AddressMode != QSPI_ADDRESS_NONE)
2269  {
2270  /*---- Command with address and alternate bytes ----*/
2271  /* Configure QSPI: CCR register with all communications parameters */
2272  WRITE_REG(hqspi->Instance->CCR, (cmd->DdrMode | cmd->DdrHoldHalfCycle | cmd->SIOOMode |
2273  cmd->DataMode | (cmd->DummyCycles << 18) | cmd->AlternateBytesSize |
2274  cmd->AlternateByteMode | cmd->AddressSize | cmd->AddressMode |
2275  cmd->InstructionMode | FunctionalMode));
2276 
2277  if (FunctionalMode != QSPI_FUNCTIONAL_MODE_MEMORY_MAPPED)
2278  {
2279  /* Configure QSPI: AR register with address value */
2280  WRITE_REG(hqspi->Instance->AR, cmd->Address);
2281  }
2282  }
2283  else
2284  {
2285  /*---- Command with only alternate bytes ----*/
2286  /* Configure QSPI: CCR register with all communications parameters */
2287  WRITE_REG(hqspi->Instance->CCR, (cmd->DdrMode | cmd->DdrHoldHalfCycle | cmd->SIOOMode |
2288  cmd->DataMode | (cmd->DummyCycles << 18) | cmd->AlternateBytesSize |
2289  cmd->AlternateByteMode | cmd->AddressMode | cmd->InstructionMode |
2290  FunctionalMode));
2291  }
2292  }
2293  else
2294  {
2295  if (cmd->AddressMode != QSPI_ADDRESS_NONE)
2296  {
2297  /*---- Command with only address ----*/
2298  /* Configure QSPI: CCR register with all communications parameters */
2299  WRITE_REG(hqspi->Instance->CCR, (cmd->DdrMode | cmd->DdrHoldHalfCycle | cmd->SIOOMode |
2300  cmd->DataMode | (cmd->DummyCycles << 18) | cmd->AlternateByteMode |
2301  cmd->AddressSize | cmd->AddressMode | cmd->InstructionMode |
2302  FunctionalMode));
2303 
2304  if (FunctionalMode != QSPI_FUNCTIONAL_MODE_MEMORY_MAPPED)
2305  {
2306  /* Configure QSPI: AR register with address value */
2307  WRITE_REG(hqspi->Instance->AR, cmd->Address);
2308  }
2309  }
2310  else
2311  {
2312  /*---- Command with only data phase ----*/
2313  if (cmd->DataMode != QSPI_DATA_NONE)
2314  {
2315  /* Configure QSPI: CCR register with all communications parameters */
2316  WRITE_REG(hqspi->Instance->CCR, (cmd->DdrMode | cmd->DdrHoldHalfCycle | cmd->SIOOMode |
2317  cmd->DataMode | (cmd->DummyCycles << 18) | cmd->AlternateByteMode |
2318  cmd->AddressMode | cmd->InstructionMode | FunctionalMode));
2319  }
2320  }
2321  }
2322  }
2323 }
2328 #endif /* HAL_QSPI_MODULE_ENABLED */
2329 
2337 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
QSPI Handle Structure definition.
__IO uint32_t CCR
Definition: stm32f745xx.h:865
#define CLEAR_BIT(REG, BIT)
Definition: stm32f7xx.h:180
#define MODIFY_REG(REG, CLEARMASK, SETMASK)
Definition: stm32f7xx.h:190
#define IS_QSPI_TIMEOUT_PERIOD(PERIOD)
#define IS_QSPI_ALTERNATE_BYTES_SIZE(SIZE)
#define IS_QSPI_MATCH_MODE(MODE)
#define QSPI_IT_TE
#define QUADSPI_CR_PRESCALER
Definition: stm32f745xx.h:5064
#define QUADSPI_DCR_CSHT
Definition: stm32f745xx.h:5076
#define QSPI_ALTERNATE_BYTES_NONE
HAL_QSPI_StateTypeDef
HAL QSPI State structures definition.
HAL_StatusTypeDef HAL_QSPI_Abort(QSPI_HandleTypeDef *hqspi)
__IO uint32_t DLR
Definition: stm32f745xx.h:864
HAL_StatusTypeDef HAL_QSPI_SetFifoThreshold(QSPI_HandleTypeDef *hqspi, uint32_t Threshold)
#define __HAL_QSPI_CLEAR_FLAG(__HANDLE__, __FLAG__)
Clears the specified QSPI&#39;s flag status.
#define QUADSPI_CR_DFM
Definition: stm32f745xx.h:5049
HAL_StatusTypeDef HAL_DMA_Abort(DMA_HandleTypeDef *hdma)
__IO uint32_t PSMKR
Definition: stm32f745xx.h:869
void HAL_QSPI_IRQHandler(QSPI_HandleTypeDef *hqspi)
#define IS_QSPI_ALL_INSTANCE(__INSTANCE__)
Definition: stm32f745xx.h:8849
#define IS_QSPI_INTERVAL(INTERVAL)
#define assert_param(expr)
Include module&#39;s header file.
#define HAL_QSPI_ERROR_TRANSFER
#define __HAL_QSPI_DISABLE_IT(__HANDLE__, __INTERRUPT__)
Disables the specified QSPI interrupt.
#define QSPI_DUALFLASH_ENABLE
#define QSPI_FLAG_SM
#define IS_QSPI_TIMEOUT_ACTIVATION(TCEN)
void HAL_QSPI_TxCpltCallback(QSPI_HandleTypeDef *hqspi)
#define QSPI_INSTRUCTION_NONE
#define QSPI_ADDRESS_NONE
HAL_StatusTypeDef HAL_QSPI_Transmit_DMA(QSPI_HandleTypeDef *hqspi, uint8_t *pData)
Definition: stm32f7xx.h:155
__IO uint32_t ABR
Definition: stm32f745xx.h:867
QSPI_InitTypeDef Init
HAL_StatusTypeDef HAL_QSPI_AutoPolling_IT(QSPI_HandleTypeDef *hqspi, QSPI_CommandTypeDef *cmd, QSPI_AutoPollingTypeDef *cfg)
__IO uint32_t AR
Definition: stm32f745xx.h:866
#define __HAL_UNLOCK(__HANDLE__)
#define HAL_QSPI_ERROR_INVALID_PARAM
__IO uint32_t DR
Definition: stm32f745xx.h:868
DMA_HandleTypeDef * hdma
QSPI Command structure definition.
HAL_StatusTypeDef HAL_DMA_Start_IT(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength)
#define IS_QSPI_INSTRUCTION_MODE(MODE)
__IO HAL_QSPI_StateTypeDef State
__IO uint16_t TxXferCount
#define IS_QSPI_DUMMY_CYCLES(DCY)
DMA_InitTypeDef Init
#define IS_QSPI_CLOCK_PRESCALER(PRESCALER)
void HAL_QSPI_FifoThresholdCallback(QSPI_HandleTypeDef *hqspi)
uint32_t HAL_DMA_GetError(DMA_HandleTypeDef *hdma)
#define IS_QSPI_DDR_HHC(DDR_HHC)
HAL_StatusTypeDef HAL_QSPI_DeInit(QSPI_HandleTypeDef *hqspi)
__IO uint32_t PSMAR
Definition: stm32f745xx.h:870
#define WRITE_REG(REG, VAL)
Definition: stm32f7xx.h:186
#define QUADSPI_CR_ABORT
Definition: stm32f745xx.h:5045
#define QUADSPI_CR_APMS
Definition: stm32f745xx.h:5062
void HAL_QSPI_StatusMatchCallback(QSPI_HandleTypeDef *hqspi)
HAL_StatusTypeDef HAL_QSPI_Receive_DMA(QSPI_HandleTypeDef *hqspi, uint8_t *pData)
#define QUADSPI_CR_FTHRES
Definition: stm32f745xx.h:5051
#define QSPI_TIMEOUT_COUNTER_ENABLE
#define POSITION_VAL(VAL)
Definition: stm32f7xx.h:192
HAL_StatusTypeDef HAL_QSPI_Transmit(QSPI_HandleTypeDef *hqspi, uint8_t *pData, uint32_t Timeout)
#define HAL_DMA_ERROR_FE
#define IS_QSPI_ADDRESS_MODE(MODE)
#define QSPI_IT_TC
void HAL_QSPI_ErrorCallback(QSPI_HandleTypeDef *hqspi)
void(* XferCpltCallback)(struct __DMA_HandleTypeDef *hdma)
#define __HAL_LOCK(__HANDLE__)
void HAL_QSPI_RxHalfCpltCallback(QSPI_HandleTypeDef *hqspi)
HAL_StatusTypeDef HAL_QSPI_AutoPolling(QSPI_HandleTypeDef *hqspi, QSPI_CommandTypeDef *cmd, QSPI_AutoPollingTypeDef *cfg, uint32_t Timeout)
#define NULL
Definition: usbd_def.h:53
__IO uint32_t FCR
Definition: stm32f745xx.h:863
void HAL_QSPI_RxCpltCallback(QSPI_HandleTypeDef *hqspi)
QSPI Memory Mapped mode configuration structure definition.
#define DMA_PDATAALIGN_WORD
#define HAL_MAX_DELAY
HAL_StatusTypeDef HAL_DMA_Abort_IT(DMA_HandleTypeDef *hdma)
#define QUADSPI_CR_FSEL
Definition: stm32f745xx.h:5050
void HAL_QSPI_MspInit(QSPI_HandleTypeDef *hqspi)
__IO uint16_t RxXferSize
#define __IO
Definition: core_cm0.h:213
FlagStatus
Definition: stm32f7xx.h:152
void HAL_QSPI_TxHalfCpltCallback(QSPI_HandleTypeDef *hqspi)
#define DMA_PDATAALIGN_BYTE
#define IS_QSPI_DATA_MODE(MODE)
QSPI Auto Polling mode configuration structure definition.
#define QSPI_AUTOMATIC_STOP_ENABLE
#define READ_BIT(REG, BIT)
Definition: stm32f7xx.h:182
QUADSPI_TypeDef * Instance
This file contains all the functions prototypes for the HAL module driver.
#define IS_QSPI_ADDRESS_SIZE(ADDR_SIZE)
void HAL_QSPI_SetTimeout(QSPI_HandleTypeDef *hqspi, uint32_t Timeout)
DMA_Stream_TypeDef * Instance
__IO uint32_t SR
Definition: stm32f745xx.h:862
#define QSPI_IT_SM
#define QSPI_FLAG_TE
uint32_t HAL_QSPI_GetError(QSPI_HandleTypeDef *hqspi)
#define QUADSPI_DCR_CKMODE
Definition: stm32f745xx.h:5075
#define QUADSPI_CR_PMM
Definition: stm32f745xx.h:5063
#define DMA_PDATAALIGN_HALFWORD
void(* XferHalfCpltCallback)(struct __DMA_HandleTypeDef *hdma)
#define QUADSPI_CR_SSHIFT
Definition: stm32f745xx.h:5048
#define IS_QSPI_DUAL_FLASH_MODE(MODE)
HAL_StatusTypeDef HAL_QSPI_Command_IT(QSPI_HandleTypeDef *hqspi, QSPI_CommandTypeDef *cmd)
#define IS_QSPI_CS_HIGH_TIME(CSHTIME)
#define QSPI_FLAG_TC
void HAL_QSPI_AbortCpltCallback(QSPI_HandleTypeDef *hqspi)
#define QUADSPI_CR_TCEN
Definition: stm32f745xx.h:5047
#define QSPI_FLAG_FT
#define QUADSPI_SR_FLEVEL
Definition: stm32f745xx.h:5094
#define IS_QSPI_FLASH_SIZE(FSIZE)
__IO uint32_t CR
Definition: stm32f745xx.h:392
uint32_t PeriphDataAlignment
#define UNUSED(x)
__IO uint32_t DCR
Definition: stm32f745xx.h:861
void HAL_QSPI_MspDeInit(QSPI_HandleTypeDef *hqspi)
#define IS_QSPI_DDR_MODE(DDR_MODE)
#define DMA_SxCR_DIR
Definition: stm32f745xx.h:3314
void(* XferAbortCallback)(struct __DMA_HandleTypeDef *hdma)
HAL_StatusTypeDef HAL_QSPI_Transmit_IT(QSPI_HandleTypeDef *hqspi, uint8_t *pData)
#define QSPI_DATA_NONE
HAL_StatusTypeDef HAL_QSPI_Abort_IT(QSPI_HandleTypeDef *hqspi)
#define SET_BIT(REG, BIT)
Definition: stm32f7xx.h:178
#define QUADSPI_CCR_FMODE
Definition: stm32f745xx.h:5144
#define __HAL_QSPI_DISABLE(__HANDLE__)
Disable QSPI.
#define QUADSPI_DCR_FSIZE
Definition: stm32f745xx.h:5080
#define IS_QSPI_FIFO_THRESHOLD(THR)
#define __HAL_DMA_DISABLE(__HANDLE__)
Disable the specified DMA Stream.
#define IS_QSPI_AUTOMATIC_STOP(APMS)
#define READ_REG(REG)
Definition: stm32f7xx.h:188
#define HAL_QPSI_TIMEOUT_DEFAULT_VALUE
#define IS_QSPI_ALTERNATE_BYTES_MODE(MODE)
__IO uint32_t CR
Definition: stm32f745xx.h:860
HAL_StatusTypeDef HAL_QSPI_MemoryMapped(QSPI_HandleTypeDef *hqspi, QSPI_CommandTypeDef *cmd, QSPI_MemoryMappedTypeDef *cfg)
#define QSPI_IT_FT
DMA handle Structure definition.
#define QUADSPI_CR_DMAEN
Definition: stm32f745xx.h:5046
#define HAL_QSPI_ERROR_DMA
#define QSPI_IT_TO
__IO uint16_t TxXferSize
__IO uint16_t RxXferCount
__IO uint32_t PIR
Definition: stm32f745xx.h:871
#define __HAL_QSPI_ENABLE(__HANDLE__)
Enable QSPI.
__IO HAL_LockTypeDef Lock
#define QSPI_FLAG_BUSY
#define IS_QSPI_CLOCK_MODE(CLKMODE)
HAL_StatusTypeDef HAL_QSPI_Init(QSPI_HandleTypeDef *hqspi)
#define IS_QSPI_INSTRUCTION(INSTRUCTION)
HAL_StatusTypeDef
HAL Status structures definition.
__IO uint32_t LPTR
Definition: stm32f745xx.h:872
void(* XferErrorCallback)(struct __DMA_HandleTypeDef *hdma)
#define DMA_PERIPH_TO_MEMORY
#define HAL_QSPI_ERROR_TIMEOUT
#define IS_QSPI_SIOO_MODE(SIOO_MODE)
uint32_t HAL_GetTick(void)
Provides a tick value in millisecond.
uint32_t HAL_QSPI_GetFifoThreshold(QSPI_HandleTypeDef *hqspi)
#define IS_QSPI_SSHIFT(SSHIFT)
HAL_StatusTypeDef HAL_QSPI_Command(QSPI_HandleTypeDef *hqspi, QSPI_CommandTypeDef *cmd, uint32_t Timeout)
void HAL_QSPI_CmdCpltCallback(QSPI_HandleTypeDef *hqspi)
HAL_StatusTypeDef HAL_QSPI_Receive_IT(QSPI_HandleTypeDef *hqspi, uint8_t *pData)
HAL_QSPI_StateTypeDef HAL_QSPI_GetState(QSPI_HandleTypeDef *hqspi)
#define IS_QSPI_FLASH_ID(FLA)
void HAL_QSPI_TimeOutCallback(QSPI_HandleTypeDef *hqspi)
#define HAL_QSPI_ERROR_NONE
#define __HAL_QSPI_ENABLE_IT(__HANDLE__, __INTERRUPT__)
Enables the specified QSPI interrupt.
#define DMA_MEMORY_TO_PERIPH
#define IS_QSPI_STATUS_BYTES_SIZE(SIZE)
#define __HAL_QSPI_GET_FLAG(__HANDLE__, __FLAG__)
Get the selected QSPI&#39;s flag status.
#define QSPI_FLAG_TO
HAL_StatusTypeDef HAL_QSPI_Receive(QSPI_HandleTypeDef *hqspi, uint8_t *pData, uint32_t Timeout)