STM32F4xx HAL Documentation
Hardware Abstraction Layer for STM32F4 familiy
Loading...
Searching...
No Matches
stm32f4xx_hal_qspi.c
Go to the documentation of this file.
1
210/* Includes ------------------------------------------------------------------*/
211#include "stm32f4xx_hal.h"
212
213#if defined(QUADSPI)
214
223#ifdef HAL_QSPI_MODULE_ENABLED
224
225/* Private typedef -----------------------------------------------------------*/
226
227/* Private define ------------------------------------------------------------*/
231#define QSPI_FUNCTIONAL_MODE_INDIRECT_WRITE 0x00000000U
232#define QSPI_FUNCTIONAL_MODE_INDIRECT_READ ((uint32_t)QUADSPI_CCR_FMODE_0)
233#define QSPI_FUNCTIONAL_MODE_AUTO_POLLING ((uint32_t)QUADSPI_CCR_FMODE_1)
234#define QSPI_FUNCTIONAL_MODE_MEMORY_MAPPED ((uint32_t)QUADSPI_CCR_FMODE)
239/* Private macro -------------------------------------------------------------*/
243#define IS_QSPI_FUNCTIONAL_MODE(MODE) (((MODE) == QSPI_FUNCTIONAL_MODE_INDIRECT_WRITE) || \
244 ((MODE) == QSPI_FUNCTIONAL_MODE_INDIRECT_READ) || \
245 ((MODE) == QSPI_FUNCTIONAL_MODE_AUTO_POLLING) || \
246 ((MODE) == QSPI_FUNCTIONAL_MODE_MEMORY_MAPPED))
251/* Private variables ---------------------------------------------------------*/
252
253/* Private function prototypes -----------------------------------------------*/
254static void QSPI_DMARxCplt(DMA_HandleTypeDef *hdma);
255static void QSPI_DMATxCplt(DMA_HandleTypeDef *hdma);
256static void QSPI_DMARxHalfCplt(DMA_HandleTypeDef *hdma);
257static void QSPI_DMATxHalfCplt(DMA_HandleTypeDef *hdma);
258static void QSPI_DMAError(DMA_HandleTypeDef *hdma);
259static void QSPI_DMAAbortCplt(DMA_HandleTypeDef *hdma);
260static HAL_StatusTypeDef QSPI_WaitFlagStateUntilTimeout(QSPI_HandleTypeDef *hqspi, uint32_t Flag, FlagStatus State, uint32_t Tickstart, uint32_t Timeout);
261static HAL_StatusTypeDef QSPI_WaitFlagStateUntilTimeout_CPUCycle(QSPI_HandleTypeDef *hqspi, uint32_t Flag, FlagStatus State, uint32_t Timeout);
262static void QSPI_Config(QSPI_HandleTypeDef *hqspi, QSPI_CommandTypeDef *cmd, uint32_t FunctionalMode);
263
264/* Exported functions --------------------------------------------------------*/
265
292HAL_StatusTypeDef HAL_QSPI_Init(QSPI_HandleTypeDef *hqspi)
293{
294 HAL_StatusTypeDef status;
295 uint32_t tickstart = HAL_GetTick();
296
297 /* Check the QSPI handle allocation */
298 if(hqspi == NULL)
299 {
300 return HAL_ERROR;
301 }
302
303 /* Check the parameters */
304 assert_param(IS_QSPI_ALL_INSTANCE(hqspi->Instance));
305 assert_param(IS_QSPI_CLOCK_PRESCALER(hqspi->Init.ClockPrescaler));
306 assert_param(IS_QSPI_FIFO_THRESHOLD(hqspi->Init.FifoThreshold));
307 assert_param(IS_QSPI_SSHIFT(hqspi->Init.SampleShifting));
308 assert_param(IS_QSPI_FLASH_SIZE(hqspi->Init.FlashSize));
309 assert_param(IS_QSPI_CS_HIGH_TIME(hqspi->Init.ChipSelectHighTime));
310 assert_param(IS_QSPI_CLOCK_MODE(hqspi->Init.ClockMode));
311 assert_param(IS_QSPI_DUAL_FLASH_MODE(hqspi->Init.DualFlash));
312
313 if (hqspi->Init.DualFlash != QSPI_DUALFLASH_ENABLE )
314 {
315 assert_param(IS_QSPI_FLASH_ID(hqspi->Init.FlashID));
316 }
317
318 if(hqspi->State == HAL_QSPI_STATE_RESET)
319 {
320 /* Allocate lock resource and initialize it */
321 hqspi->Lock = HAL_UNLOCKED;
322
323#if (USE_HAL_QSPI_REGISTER_CALLBACKS == 1)
324 /* Reset Callback pointers in HAL_QSPI_STATE_RESET only */
325 hqspi->ErrorCallback = HAL_QSPI_ErrorCallback;
326 hqspi->AbortCpltCallback = HAL_QSPI_AbortCpltCallback;
327 hqspi->FifoThresholdCallback = HAL_QSPI_FifoThresholdCallback;
328 hqspi->CmdCpltCallback = HAL_QSPI_CmdCpltCallback;
329 hqspi->RxCpltCallback = HAL_QSPI_RxCpltCallback;
330 hqspi->TxCpltCallback = HAL_QSPI_TxCpltCallback;
331 hqspi->RxHalfCpltCallback = HAL_QSPI_RxHalfCpltCallback;
332 hqspi->TxHalfCpltCallback = HAL_QSPI_TxHalfCpltCallback;
333 hqspi->StatusMatchCallback = HAL_QSPI_StatusMatchCallback;
334 hqspi->TimeOutCallback = HAL_QSPI_TimeOutCallback;
335
336 if(hqspi->MspInitCallback == NULL)
337 {
338 hqspi->MspInitCallback = HAL_QSPI_MspInit;
339 }
340
341 /* Init the low level hardware */
342 hqspi->MspInitCallback(hqspi);
343#else
344 /* Init the low level hardware : GPIO, CLOCK */
345 HAL_QSPI_MspInit(hqspi);
346#endif
347
348 /* Configure the default timeout for the QSPI memory access */
349 HAL_QSPI_SetTimeout(hqspi, HAL_QSPI_TIMEOUT_DEFAULT_VALUE);
350 }
351
352 /* Configure QSPI FIFO Threshold */
353 MODIFY_REG(hqspi->Instance->CR, QUADSPI_CR_FTHRES,
354 ((hqspi->Init.FifoThreshold - 1U) << QUADSPI_CR_FTHRES_Pos));
355
356 /* Wait till BUSY flag reset */
357 status = QSPI_WaitFlagStateUntilTimeout(hqspi, QSPI_FLAG_BUSY, RESET, tickstart, hqspi->Timeout);
358
359 if(status == HAL_OK)
360 {
361 /* Configure QSPI Clock Prescaler and Sample Shift */
362 MODIFY_REG(hqspi->Instance->CR, (QUADSPI_CR_PRESCALER | QUADSPI_CR_SSHIFT | QUADSPI_CR_FSEL | QUADSPI_CR_DFM),
363 ((hqspi->Init.ClockPrescaler << QUADSPI_CR_PRESCALER_Pos) |
364 hqspi->Init.SampleShifting | hqspi->Init.FlashID | hqspi->Init.DualFlash));
365
366 /* Configure QSPI Flash Size, CS High Time and Clock Mode */
367 MODIFY_REG(hqspi->Instance->DCR, (QUADSPI_DCR_FSIZE | QUADSPI_DCR_CSHT | QUADSPI_DCR_CKMODE),
368 ((hqspi->Init.FlashSize << QUADSPI_DCR_FSIZE_Pos) |
369 hqspi->Init.ChipSelectHighTime | hqspi->Init.ClockMode));
370
371 /* Enable the QSPI peripheral */
372 __HAL_QSPI_ENABLE(hqspi);
373
374 /* Set QSPI error code to none */
375 hqspi->ErrorCode = HAL_QSPI_ERROR_NONE;
376
377 /* Initialize the QSPI state */
378 hqspi->State = HAL_QSPI_STATE_READY;
379 }
380
381 /* Release Lock */
382 __HAL_UNLOCK(hqspi);
383
384 /* Return function status */
385 return status;
386}
387
393HAL_StatusTypeDef HAL_QSPI_DeInit(QSPI_HandleTypeDef *hqspi)
394{
395 /* Check the QSPI handle allocation */
396 if(hqspi == NULL)
397 {
398 return HAL_ERROR;
399 }
400
401 /* Disable the QSPI Peripheral Clock */
402 __HAL_QSPI_DISABLE(hqspi);
403
404#if (USE_HAL_QSPI_REGISTER_CALLBACKS == 1)
405 if(hqspi->MspDeInitCallback == NULL)
406 {
407 hqspi->MspDeInitCallback = HAL_QSPI_MspDeInit;
408 }
409
410 /* DeInit the low level hardware */
411 hqspi->MspDeInitCallback(hqspi);
412#else
413 /* DeInit the low level hardware: GPIO, CLOCK, NVIC... */
414 HAL_QSPI_MspDeInit(hqspi);
415#endif
416
417 /* Set QSPI error code to none */
418 hqspi->ErrorCode = HAL_QSPI_ERROR_NONE;
419
420 /* Initialize the QSPI state */
421 hqspi->State = HAL_QSPI_STATE_RESET;
422
423 /* Release Lock */
424 __HAL_UNLOCK(hqspi);
425
426 return HAL_OK;
427}
428
434__weak void HAL_QSPI_MspInit(QSPI_HandleTypeDef *hqspi)
435{
436 /* Prevent unused argument(s) compilation warning */
437 UNUSED(hqspi);
438
439 /* NOTE : This function should not be modified, when the callback is needed,
440 the HAL_QSPI_MspInit can be implemented in the user file
441 */
442}
443
449__weak void HAL_QSPI_MspDeInit(QSPI_HandleTypeDef *hqspi)
450{
451 /* Prevent unused argument(s) compilation warning */
452 UNUSED(hqspi);
453
454 /* NOTE : This function should not be modified, when the callback is needed,
455 the HAL_QSPI_MspDeInit can be implemented in the user file
456 */
457}
458
488void HAL_QSPI_IRQHandler(QSPI_HandleTypeDef *hqspi)
489{
490 __IO uint32_t *data_reg;
491 uint32_t flag = READ_REG(hqspi->Instance->SR);
492 uint32_t itsource = READ_REG(hqspi->Instance->CR);
493
494 /* QSPI Fifo Threshold interrupt occurred ----------------------------------*/
495 if(((flag & QSPI_FLAG_FT) != 0U) && ((itsource & QSPI_IT_FT) != 0U))
496 {
497 data_reg = &hqspi->Instance->DR;
498
499 if(hqspi->State == HAL_QSPI_STATE_BUSY_INDIRECT_TX)
500 {
501 /* Transmission process */
502 while(__HAL_QSPI_GET_FLAG(hqspi, QSPI_FLAG_FT) != RESET)
503 {
504 if (hqspi->TxXferCount > 0U)
505 {
506 /* Fill the FIFO until the threshold is reached */
507 *((__IO uint8_t *)data_reg) = *hqspi->pTxBuffPtr;
508 hqspi->pTxBuffPtr++;
509 hqspi->TxXferCount--;
510 }
511 else
512 {
513 /* No more data available for the transfer */
514 /* Disable the QSPI FIFO Threshold Interrupt */
515 __HAL_QSPI_DISABLE_IT(hqspi, QSPI_IT_FT);
516 break;
517 }
518 }
519 }
520 else if(hqspi->State == HAL_QSPI_STATE_BUSY_INDIRECT_RX)
521 {
522 /* Receiving Process */
523 while(__HAL_QSPI_GET_FLAG(hqspi, QSPI_FLAG_FT) != RESET)
524 {
525 if (hqspi->RxXferCount > 0U)
526 {
527 /* Read the FIFO until the threshold is reached */
528 *hqspi->pRxBuffPtr = *((__IO uint8_t *)data_reg);
529 hqspi->pRxBuffPtr++;
530 hqspi->RxXferCount--;
531 }
532 else
533 {
534 /* All data have been received for the transfer */
535 /* Disable the QSPI FIFO Threshold Interrupt */
536 __HAL_QSPI_DISABLE_IT(hqspi, QSPI_IT_FT);
537 break;
538 }
539 }
540 }
541 else
542 {
543 /* Nothing to do */
544 }
545
546 /* FIFO Threshold callback */
547#if (USE_HAL_QSPI_REGISTER_CALLBACKS == 1)
548 hqspi->FifoThresholdCallback(hqspi);
549#else
550 HAL_QSPI_FifoThresholdCallback(hqspi);
551#endif
552 }
553
554 /* QSPI Transfer Complete interrupt occurred -------------------------------*/
555 else if(((flag & QSPI_FLAG_TC) != 0U) && ((itsource & QSPI_IT_TC) != 0U))
556 {
557 /* Clear interrupt */
558 WRITE_REG(hqspi->Instance->FCR, QSPI_FLAG_TC);
559
560 /* Disable the QSPI FIFO Threshold, Transfer Error and Transfer complete Interrupts */
561 __HAL_QSPI_DISABLE_IT(hqspi, QSPI_IT_TC | QSPI_IT_TE | QSPI_IT_FT);
562
563 /* Transfer complete callback */
564 if(hqspi->State == HAL_QSPI_STATE_BUSY_INDIRECT_TX)
565 {
566 if ((hqspi->Instance->CR & QUADSPI_CR_DMAEN) != 0U)
567 {
568 /* Disable the DMA transfer by clearing the DMAEN bit in the QSPI CR register */
569 CLEAR_BIT(hqspi->Instance->CR, QUADSPI_CR_DMAEN);
570
571 /* Disable the DMA channel */
572 __HAL_DMA_DISABLE(hqspi->hdma);
573 }
574
575 /* Clear Busy bit */
576 HAL_QSPI_Abort_IT(hqspi);
577
578 /* Change state of QSPI */
579 hqspi->State = HAL_QSPI_STATE_READY;
580
581 /* TX Complete callback */
582#if (USE_HAL_QSPI_REGISTER_CALLBACKS == 1)
583 hqspi->TxCpltCallback(hqspi);
584#else
585 HAL_QSPI_TxCpltCallback(hqspi);
586#endif
587 }
588 else if(hqspi->State == HAL_QSPI_STATE_BUSY_INDIRECT_RX)
589 {
590 if ((hqspi->Instance->CR & QUADSPI_CR_DMAEN) != 0U)
591 {
592 /* Disable the DMA transfer by clearing the DMAEN bit in the QSPI CR register */
593 CLEAR_BIT(hqspi->Instance->CR, QUADSPI_CR_DMAEN);
594
595 /* Disable the DMA channel */
596 __HAL_DMA_DISABLE(hqspi->hdma);
597 }
598 else
599 {
600 data_reg = &hqspi->Instance->DR;
601 while(READ_BIT(hqspi->Instance->SR, QUADSPI_SR_FLEVEL) != 0U)
602 {
603 if (hqspi->RxXferCount > 0U)
604 {
605 /* Read the last data received in the FIFO until it is empty */
606 *hqspi->pRxBuffPtr = *((__IO uint8_t *)data_reg);
607 hqspi->pRxBuffPtr++;
608 hqspi->RxXferCount--;
609 }
610 else
611 {
612 /* All data have been received for the transfer */
613 break;
614 }
615 }
616 }
617
618 /* Workaround - Extra data written in the FIFO at the end of a read transfer */
619 HAL_QSPI_Abort_IT(hqspi);
620
621 /* Change state of QSPI */
622 hqspi->State = HAL_QSPI_STATE_READY;
623
624 /* RX Complete callback */
625#if (USE_HAL_QSPI_REGISTER_CALLBACKS == 1)
626 hqspi->RxCpltCallback(hqspi);
627#else
628 HAL_QSPI_RxCpltCallback(hqspi);
629#endif
630 }
631 else if(hqspi->State == HAL_QSPI_STATE_BUSY)
632 {
633 /* Change state of QSPI */
634 hqspi->State = HAL_QSPI_STATE_READY;
635
636 /* Command Complete callback */
637#if (USE_HAL_QSPI_REGISTER_CALLBACKS == 1)
638 hqspi->CmdCpltCallback(hqspi);
639#else
640 HAL_QSPI_CmdCpltCallback(hqspi);
641#endif
642 }
643 else if(hqspi->State == HAL_QSPI_STATE_ABORT)
644 {
645 /* Reset functional mode configuration to indirect write mode by default */
646 CLEAR_BIT(hqspi->Instance->CCR, QUADSPI_CCR_FMODE);
647
648 /* Change state of QSPI */
649 hqspi->State = HAL_QSPI_STATE_READY;
650
651 if (hqspi->ErrorCode == HAL_QSPI_ERROR_NONE)
652 {
653 /* Abort called by the user */
654
655 /* Abort Complete callback */
656#if (USE_HAL_QSPI_REGISTER_CALLBACKS == 1)
657 hqspi->AbortCpltCallback(hqspi);
658#else
659 HAL_QSPI_AbortCpltCallback(hqspi);
660#endif
661 }
662 else
663 {
664 /* Abort due to an error (eg : DMA error) */
665
666 /* Error callback */
667#if (USE_HAL_QSPI_REGISTER_CALLBACKS == 1)
668 hqspi->ErrorCallback(hqspi);
669#else
670 HAL_QSPI_ErrorCallback(hqspi);
671#endif
672 }
673 }
674 else
675 {
676 /* Nothing to do */
677 }
678 }
679
680 /* QSPI Status Match interrupt occurred ------------------------------------*/
681 else if(((flag & QSPI_FLAG_SM) != 0U) && ((itsource & QSPI_IT_SM) != 0U))
682 {
683 /* Clear interrupt */
684 WRITE_REG(hqspi->Instance->FCR, QSPI_FLAG_SM);
685
686 /* Check if the automatic poll mode stop is activated */
687 if(READ_BIT(hqspi->Instance->CR, QUADSPI_CR_APMS) != 0U)
688 {
689 /* Disable the QSPI Transfer Error and Status Match Interrupts */
690 __HAL_QSPI_DISABLE_IT(hqspi, (QSPI_IT_SM | QSPI_IT_TE));
691
692 /* Change state of QSPI */
693 hqspi->State = HAL_QSPI_STATE_READY;
694 }
695
696 /* Status match callback */
697#if (USE_HAL_QSPI_REGISTER_CALLBACKS == 1)
698 hqspi->StatusMatchCallback(hqspi);
699#else
700 HAL_QSPI_StatusMatchCallback(hqspi);
701#endif
702 }
703
704 /* QSPI Transfer Error interrupt occurred ----------------------------------*/
705 else if(((flag & QSPI_FLAG_TE) != 0U) && ((itsource & QSPI_IT_TE) != 0U))
706 {
707 /* Clear interrupt */
708 WRITE_REG(hqspi->Instance->FCR, QSPI_FLAG_TE);
709
710 /* Disable all the QSPI Interrupts */
711 __HAL_QSPI_DISABLE_IT(hqspi, QSPI_IT_SM | QSPI_IT_TC | QSPI_IT_TE | QSPI_IT_FT);
712
713 /* Set error code */
714 hqspi->ErrorCode |= HAL_QSPI_ERROR_TRANSFER;
715
716 if ((hqspi->Instance->CR & QUADSPI_CR_DMAEN) != 0U)
717 {
718 /* Disable the DMA transfer by clearing the DMAEN bit in the QSPI CR register */
719 CLEAR_BIT(hqspi->Instance->CR, QUADSPI_CR_DMAEN);
720
721 /* Disable the DMA channel */
722 hqspi->hdma->XferAbortCallback = QSPI_DMAAbortCplt;
723 if (HAL_DMA_Abort_IT(hqspi->hdma) != HAL_OK)
724 {
725 /* Set error code to DMA */
726 hqspi->ErrorCode |= HAL_QSPI_ERROR_DMA;
727
728 /* Change state of QSPI */
729 hqspi->State = HAL_QSPI_STATE_READY;
730
731 /* Error callback */
732#if (USE_HAL_QSPI_REGISTER_CALLBACKS == 1)
733 hqspi->ErrorCallback(hqspi);
734#else
735 HAL_QSPI_ErrorCallback(hqspi);
736#endif
737 }
738 }
739 else
740 {
741 /* Change state of QSPI */
742 hqspi->State = HAL_QSPI_STATE_READY;
743
744 /* Error callback */
745#if (USE_HAL_QSPI_REGISTER_CALLBACKS == 1)
746 hqspi->ErrorCallback(hqspi);
747#else
748 HAL_QSPI_ErrorCallback(hqspi);
749#endif
750 }
751 }
752
753 /* QSPI Timeout interrupt occurred -----------------------------------------*/
754 else if(((flag & QSPI_FLAG_TO) != 0U) && ((itsource & QSPI_IT_TO) != 0U))
755 {
756 /* Clear interrupt */
757 WRITE_REG(hqspi->Instance->FCR, QSPI_FLAG_TO);
758
759 /* Timeout callback */
760#if (USE_HAL_QSPI_REGISTER_CALLBACKS == 1)
761 hqspi->TimeOutCallback(hqspi);
762#else
763 HAL_QSPI_TimeOutCallback(hqspi);
764#endif
765 }
766
767 else
768 {
769 /* Nothing to do */
770 }
771}
772
781HAL_StatusTypeDef HAL_QSPI_Command(QSPI_HandleTypeDef *hqspi, QSPI_CommandTypeDef *cmd, uint32_t Timeout)
782{
783 HAL_StatusTypeDef status;
784 uint32_t tickstart = HAL_GetTick();
785
786 /* Check the parameters */
787 assert_param(IS_QSPI_INSTRUCTION_MODE(cmd->InstructionMode));
788 if (cmd->InstructionMode != QSPI_INSTRUCTION_NONE)
789 {
790 assert_param(IS_QSPI_INSTRUCTION(cmd->Instruction));
791 }
792
793 assert_param(IS_QSPI_ADDRESS_MODE(cmd->AddressMode));
794 if (cmd->AddressMode != QSPI_ADDRESS_NONE)
795 {
796 assert_param(IS_QSPI_ADDRESS_SIZE(cmd->AddressSize));
797 }
798
799 assert_param(IS_QSPI_ALTERNATE_BYTES_MODE(cmd->AlternateByteMode));
800 if (cmd->AlternateByteMode != QSPI_ALTERNATE_BYTES_NONE)
801 {
802 assert_param(IS_QSPI_ALTERNATE_BYTES_SIZE(cmd->AlternateBytesSize));
803 }
804
805 assert_param(IS_QSPI_DUMMY_CYCLES(cmd->DummyCycles));
806 assert_param(IS_QSPI_DATA_MODE(cmd->DataMode));
807
808 assert_param(IS_QSPI_DDR_MODE(cmd->DdrMode));
809 assert_param(IS_QSPI_DDR_HHC(cmd->DdrHoldHalfCycle));
810 assert_param(IS_QSPI_SIOO_MODE(cmd->SIOOMode));
811
812 /* Process locked */
813 __HAL_LOCK(hqspi);
814
815 if(hqspi->State == HAL_QSPI_STATE_READY)
816 {
817 hqspi->ErrorCode = HAL_QSPI_ERROR_NONE;
818
819 /* Update QSPI state */
820 hqspi->State = HAL_QSPI_STATE_BUSY;
821
822 /* Wait till BUSY flag reset */
823 status = QSPI_WaitFlagStateUntilTimeout(hqspi, QSPI_FLAG_BUSY, RESET, tickstart, Timeout);
824
825 if (status == HAL_OK)
826 {
827 /* Call the configuration function */
828 QSPI_Config(hqspi, cmd, QSPI_FUNCTIONAL_MODE_INDIRECT_WRITE);
829
830 if (cmd->DataMode == QSPI_DATA_NONE)
831 {
832 /* When there is no data phase, the transfer start as soon as the configuration is done
833 so wait until TC flag is set to go back in idle state */
834 status = QSPI_WaitFlagStateUntilTimeout(hqspi, QSPI_FLAG_TC, SET, tickstart, Timeout);
835
836 if (status == HAL_OK)
837 {
838 __HAL_QSPI_CLEAR_FLAG(hqspi, QSPI_FLAG_TC);
839
840 /* Update QSPI state */
841 hqspi->State = HAL_QSPI_STATE_READY;
842 }
843 }
844 else
845 {
846 /* Update QSPI state */
847 hqspi->State = HAL_QSPI_STATE_READY;
848 }
849 }
850 }
851 else
852 {
853 status = HAL_BUSY;
854 }
855
856 /* Process unlocked */
857 __HAL_UNLOCK(hqspi);
858
859 /* Return function status */
860 return status;
861}
862
870HAL_StatusTypeDef HAL_QSPI_Command_IT(QSPI_HandleTypeDef *hqspi, QSPI_CommandTypeDef *cmd)
871{
872 HAL_StatusTypeDef status;
873
874 /* Check the parameters */
875 assert_param(IS_QSPI_INSTRUCTION_MODE(cmd->InstructionMode));
876 if (cmd->InstructionMode != QSPI_INSTRUCTION_NONE)
877 {
878 assert_param(IS_QSPI_INSTRUCTION(cmd->Instruction));
879 }
880
881 assert_param(IS_QSPI_ADDRESS_MODE(cmd->AddressMode));
882 if (cmd->AddressMode != QSPI_ADDRESS_NONE)
883 {
884 assert_param(IS_QSPI_ADDRESS_SIZE(cmd->AddressSize));
885 }
886
887 assert_param(IS_QSPI_ALTERNATE_BYTES_MODE(cmd->AlternateByteMode));
888 if (cmd->AlternateByteMode != QSPI_ALTERNATE_BYTES_NONE)
889 {
890 assert_param(IS_QSPI_ALTERNATE_BYTES_SIZE(cmd->AlternateBytesSize));
891 }
892
893 assert_param(IS_QSPI_DUMMY_CYCLES(cmd->DummyCycles));
894 assert_param(IS_QSPI_DATA_MODE(cmd->DataMode));
895
896 assert_param(IS_QSPI_DDR_MODE(cmd->DdrMode));
897 assert_param(IS_QSPI_DDR_HHC(cmd->DdrHoldHalfCycle));
898 assert_param(IS_QSPI_SIOO_MODE(cmd->SIOOMode));
899
900 /* Process locked */
901 __HAL_LOCK(hqspi);
902
903 if(hqspi->State == HAL_QSPI_STATE_READY)
904 {
905 hqspi->ErrorCode = HAL_QSPI_ERROR_NONE;
906
907 /* Update QSPI state */
908 hqspi->State = HAL_QSPI_STATE_BUSY;
909
910 /* Wait till BUSY flag reset */
911 status = QSPI_WaitFlagStateUntilTimeout_CPUCycle(hqspi, QSPI_FLAG_BUSY, RESET, hqspi->Timeout);
912
913 if (status == HAL_OK)
914 {
915 if (cmd->DataMode == QSPI_DATA_NONE)
916 {
917 /* Clear interrupt */
918 __HAL_QSPI_CLEAR_FLAG(hqspi, QSPI_FLAG_TE | QSPI_FLAG_TC);
919 }
920
921 /* Call the configuration function */
922 QSPI_Config(hqspi, cmd, QSPI_FUNCTIONAL_MODE_INDIRECT_WRITE);
923
924 if (cmd->DataMode == QSPI_DATA_NONE)
925 {
926 /* When there is no data phase, the transfer start as soon as the configuration is done
927 so activate TC and TE interrupts */
928 /* Process unlocked */
929 __HAL_UNLOCK(hqspi);
930
931 /* Enable the QSPI Transfer Error Interrupt */
932 __HAL_QSPI_ENABLE_IT(hqspi, QSPI_IT_TE | QSPI_IT_TC);
933 }
934 else
935 {
936 /* Update QSPI state */
937 hqspi->State = HAL_QSPI_STATE_READY;
938
939 /* Process unlocked */
940 __HAL_UNLOCK(hqspi);
941 }
942 }
943 else
944 {
945 /* Process unlocked */
946 __HAL_UNLOCK(hqspi);
947 }
948 }
949 else
950 {
951 status = HAL_BUSY;
952
953 /* Process unlocked */
954 __HAL_UNLOCK(hqspi);
955 }
956
957 /* Return function status */
958 return status;
959}
960
969HAL_StatusTypeDef HAL_QSPI_Transmit(QSPI_HandleTypeDef *hqspi, uint8_t *pData, uint32_t Timeout)
970{
971 HAL_StatusTypeDef status = HAL_OK;
972 uint32_t tickstart = HAL_GetTick();
973 __IO uint32_t *data_reg = &hqspi->Instance->DR;
974
975 /* Process locked */
976 __HAL_LOCK(hqspi);
977
978 if(hqspi->State == HAL_QSPI_STATE_READY)
979 {
980 hqspi->ErrorCode = HAL_QSPI_ERROR_NONE;
981
982 if(pData != NULL )
983 {
984 /* Update state */
985 hqspi->State = HAL_QSPI_STATE_BUSY_INDIRECT_TX;
986
987 /* Configure counters and size of the handle */
988 hqspi->TxXferCount = READ_REG(hqspi->Instance->DLR) + 1U;
989 hqspi->TxXferSize = READ_REG(hqspi->Instance->DLR) + 1U;
990 hqspi->pTxBuffPtr = pData;
991
992 /* Configure QSPI: CCR register with functional as indirect write */
993 MODIFY_REG(hqspi->Instance->CCR, QUADSPI_CCR_FMODE, QSPI_FUNCTIONAL_MODE_INDIRECT_WRITE);
994
995 while(hqspi->TxXferCount > 0U)
996 {
997 /* Wait until FT flag is set to send data */
998 status = QSPI_WaitFlagStateUntilTimeout(hqspi, QSPI_FLAG_FT, SET, tickstart, Timeout);
999
1000 if (status != HAL_OK)
1001 {
1002 break;
1003 }
1004
1005 *((__IO uint8_t *)data_reg) = *hqspi->pTxBuffPtr;
1006 hqspi->pTxBuffPtr++;
1007 hqspi->TxXferCount--;
1008 }
1009
1010 if (status == HAL_OK)
1011 {
1012 /* Wait until TC flag is set to go back in idle state */
1013 status = QSPI_WaitFlagStateUntilTimeout(hqspi, QSPI_FLAG_TC, SET, tickstart, Timeout);
1014
1015 if (status == HAL_OK)
1016 {
1017 /* Clear Transfer Complete bit */
1018 __HAL_QSPI_CLEAR_FLAG(hqspi, QSPI_FLAG_TC);
1019
1020 /* Clear Busy bit */
1021 status = HAL_QSPI_Abort(hqspi);
1022 }
1023 }
1024
1025 /* Update QSPI state */
1026 hqspi->State = HAL_QSPI_STATE_READY;
1027 }
1028 else
1029 {
1030 hqspi->ErrorCode |= HAL_QSPI_ERROR_INVALID_PARAM;
1031 status = HAL_ERROR;
1032 }
1033 }
1034 else
1035 {
1036 status = HAL_BUSY;
1037 }
1038
1039 /* Process unlocked */
1040 __HAL_UNLOCK(hqspi);
1041
1042 return status;
1043}
1044
1045
1054HAL_StatusTypeDef HAL_QSPI_Receive(QSPI_HandleTypeDef *hqspi, uint8_t *pData, uint32_t Timeout)
1055{
1056 HAL_StatusTypeDef status = HAL_OK;
1057 uint32_t tickstart = HAL_GetTick();
1058 uint32_t addr_reg = READ_REG(hqspi->Instance->AR);
1059 __IO uint32_t *data_reg = &hqspi->Instance->DR;
1060
1061 /* Process locked */
1062 __HAL_LOCK(hqspi);
1063
1064 if(hqspi->State == HAL_QSPI_STATE_READY)
1065 {
1066 hqspi->ErrorCode = HAL_QSPI_ERROR_NONE;
1067
1068 if(pData != NULL )
1069 {
1070 /* Update state */
1071 hqspi->State = HAL_QSPI_STATE_BUSY_INDIRECT_RX;
1072
1073 /* Configure counters and size of the handle */
1074 hqspi->RxXferCount = READ_REG(hqspi->Instance->DLR) + 1U;
1075 hqspi->RxXferSize = READ_REG(hqspi->Instance->DLR) + 1U;
1076 hqspi->pRxBuffPtr = pData;
1077
1078 /* Configure QSPI: CCR register with functional as indirect read */
1079 MODIFY_REG(hqspi->Instance->CCR, QUADSPI_CCR_FMODE, QSPI_FUNCTIONAL_MODE_INDIRECT_READ);
1080
1081 /* Start the transfer by re-writing the address in AR register */
1082 WRITE_REG(hqspi->Instance->AR, addr_reg);
1083
1084 while(hqspi->RxXferCount > 0U)
1085 {
1086 /* Wait until FT or TC flag is set to read received data */
1087 status = QSPI_WaitFlagStateUntilTimeout(hqspi, (QSPI_FLAG_FT | QSPI_FLAG_TC), SET, tickstart, Timeout);
1088
1089 if (status != HAL_OK)
1090 {
1091 break;
1092 }
1093
1094 *hqspi->pRxBuffPtr = *((__IO uint8_t *)data_reg);
1095 hqspi->pRxBuffPtr++;
1096 hqspi->RxXferCount--;
1097 }
1098
1099 if (status == HAL_OK)
1100 {
1101 /* Wait until TC flag is set to go back in idle state */
1102 status = QSPI_WaitFlagStateUntilTimeout(hqspi, QSPI_FLAG_TC, SET, tickstart, Timeout);
1103
1104 if (status == HAL_OK)
1105 {
1106 /* Clear Transfer Complete bit */
1107 __HAL_QSPI_CLEAR_FLAG(hqspi, QSPI_FLAG_TC);
1108
1109 /* Workaround - Extra data written in the FIFO at the end of a read transfer */
1110 status = HAL_QSPI_Abort(hqspi);
1111 }
1112 }
1113
1114 /* Update QSPI state */
1115 hqspi->State = HAL_QSPI_STATE_READY;
1116 }
1117 else
1118 {
1119 hqspi->ErrorCode |= HAL_QSPI_ERROR_INVALID_PARAM;
1120 status = HAL_ERROR;
1121 }
1122 }
1123 else
1124 {
1125 status = HAL_BUSY;
1126 }
1127
1128 /* Process unlocked */
1129 __HAL_UNLOCK(hqspi);
1130
1131 return status;
1132}
1133
1141HAL_StatusTypeDef HAL_QSPI_Transmit_IT(QSPI_HandleTypeDef *hqspi, uint8_t *pData)
1142{
1143 HAL_StatusTypeDef status = HAL_OK;
1144
1145 /* Process locked */
1146 __HAL_LOCK(hqspi);
1147
1148 if(hqspi->State == HAL_QSPI_STATE_READY)
1149 {
1150 hqspi->ErrorCode = HAL_QSPI_ERROR_NONE;
1151
1152 if(pData != NULL )
1153 {
1154 /* Update state */
1155 hqspi->State = HAL_QSPI_STATE_BUSY_INDIRECT_TX;
1156
1157 /* Configure counters and size of the handle */
1158 hqspi->TxXferCount = READ_REG(hqspi->Instance->DLR) + 1U;
1159 hqspi->TxXferSize = READ_REG(hqspi->Instance->DLR) + 1U;
1160 hqspi->pTxBuffPtr = pData;
1161
1162 /* Clear interrupt */
1163 __HAL_QSPI_CLEAR_FLAG(hqspi, QSPI_FLAG_TE | QSPI_FLAG_TC);
1164
1165 /* Configure QSPI: CCR register with functional as indirect write */
1166 MODIFY_REG(hqspi->Instance->CCR, QUADSPI_CCR_FMODE, QSPI_FUNCTIONAL_MODE_INDIRECT_WRITE);
1167
1168 /* Process unlocked */
1169 __HAL_UNLOCK(hqspi);
1170
1171 /* Enable the QSPI transfer error, FIFO threshold and transfer complete Interrupts */
1172 __HAL_QSPI_ENABLE_IT(hqspi, QSPI_IT_TE | QSPI_IT_FT | QSPI_IT_TC);
1173 }
1174 else
1175 {
1176 hqspi->ErrorCode |= HAL_QSPI_ERROR_INVALID_PARAM;
1177 status = HAL_ERROR;
1178
1179 /* Process unlocked */
1180 __HAL_UNLOCK(hqspi);
1181 }
1182 }
1183 else
1184 {
1185 status = HAL_BUSY;
1186
1187 /* Process unlocked */
1188 __HAL_UNLOCK(hqspi);
1189 }
1190
1191 return status;
1192}
1193
1201HAL_StatusTypeDef HAL_QSPI_Receive_IT(QSPI_HandleTypeDef *hqspi, uint8_t *pData)
1202{
1203 HAL_StatusTypeDef status = HAL_OK;
1204 uint32_t addr_reg = READ_REG(hqspi->Instance->AR);
1205
1206 /* Process locked */
1207 __HAL_LOCK(hqspi);
1208
1209 if(hqspi->State == HAL_QSPI_STATE_READY)
1210 {
1211 hqspi->ErrorCode = HAL_QSPI_ERROR_NONE;
1212
1213 if(pData != NULL )
1214 {
1215 /* Update state */
1216 hqspi->State = HAL_QSPI_STATE_BUSY_INDIRECT_RX;
1217
1218 /* Configure counters and size of the handle */
1219 hqspi->RxXferCount = READ_REG(hqspi->Instance->DLR) + 1U;
1220 hqspi->RxXferSize = READ_REG(hqspi->Instance->DLR) + 1U;
1221 hqspi->pRxBuffPtr = pData;
1222
1223 /* Clear interrupt */
1224 __HAL_QSPI_CLEAR_FLAG(hqspi, QSPI_FLAG_TE | QSPI_FLAG_TC);
1225
1226 /* Configure QSPI: CCR register with functional as indirect read */
1227 MODIFY_REG(hqspi->Instance->CCR, QUADSPI_CCR_FMODE, QSPI_FUNCTIONAL_MODE_INDIRECT_READ);
1228
1229 /* Start the transfer by re-writing the address in AR register */
1230 WRITE_REG(hqspi->Instance->AR, addr_reg);
1231
1232 /* Process unlocked */
1233 __HAL_UNLOCK(hqspi);
1234
1235 /* Enable the QSPI transfer error, FIFO threshold and transfer complete Interrupts */
1236 __HAL_QSPI_ENABLE_IT(hqspi, QSPI_IT_TE | QSPI_IT_FT | QSPI_IT_TC);
1237 }
1238 else
1239 {
1240 hqspi->ErrorCode |= HAL_QSPI_ERROR_INVALID_PARAM;
1241 status = HAL_ERROR;
1242
1243 /* Process unlocked */
1244 __HAL_UNLOCK(hqspi);
1245 }
1246 }
1247 else
1248 {
1249 status = HAL_BUSY;
1250
1251 /* Process unlocked */
1252 __HAL_UNLOCK(hqspi);
1253 }
1254
1255 return status;
1256}
1257
1269HAL_StatusTypeDef HAL_QSPI_Transmit_DMA(QSPI_HandleTypeDef *hqspi, uint8_t *pData)
1270{
1271 HAL_StatusTypeDef status = HAL_OK;
1272 uint32_t data_size = (READ_REG(hqspi->Instance->DLR) + 1U);
1273
1274 /* Process locked */
1275 __HAL_LOCK(hqspi);
1276
1277 if(hqspi->State == HAL_QSPI_STATE_READY)
1278 {
1279 /* Clear the error code */
1280 hqspi->ErrorCode = HAL_QSPI_ERROR_NONE;
1281
1282 if(pData != NULL )
1283 {
1284 /* Configure counters of the handle */
1285 if (hqspi->hdma->Init.PeriphDataAlignment == DMA_PDATAALIGN_BYTE)
1286 {
1287 hqspi->TxXferCount = data_size;
1288 }
1289 else if (hqspi->hdma->Init.PeriphDataAlignment == DMA_PDATAALIGN_HALFWORD)
1290 {
1291 if (((data_size % 2U) != 0U) || ((hqspi->Init.FifoThreshold % 2U) != 0U))
1292 {
1293 /* The number of data or the fifo threshold is not aligned on halfword
1294 => no transfer possible with DMA peripheral access configured as halfword */
1295 hqspi->ErrorCode |= HAL_QSPI_ERROR_INVALID_PARAM;
1296 status = HAL_ERROR;
1297
1298 /* Process unlocked */
1299 __HAL_UNLOCK(hqspi);
1300 }
1301 else
1302 {
1303 hqspi->TxXferCount = (data_size >> 1U);
1304 }
1305 }
1306 else if (hqspi->hdma->Init.PeriphDataAlignment == DMA_PDATAALIGN_WORD)
1307 {
1308 if (((data_size % 4U) != 0U) || ((hqspi->Init.FifoThreshold % 4U) != 0U))
1309 {
1310 /* The number of data or the fifo threshold is not aligned on word
1311 => no transfer possible with DMA peripheral access configured as word */
1312 hqspi->ErrorCode |= HAL_QSPI_ERROR_INVALID_PARAM;
1313 status = HAL_ERROR;
1314
1315 /* Process unlocked */
1316 __HAL_UNLOCK(hqspi);
1317 }
1318 else
1319 {
1320 hqspi->TxXferCount = (data_size >> 2U);
1321 }
1322 }
1323 else
1324 {
1325 /* Nothing to do */
1326 }
1327
1328 if (status == HAL_OK)
1329 {
1330 /* Update state */
1331 hqspi->State = HAL_QSPI_STATE_BUSY_INDIRECT_TX;
1332
1333 /* Clear interrupt */
1334 __HAL_QSPI_CLEAR_FLAG(hqspi, (QSPI_FLAG_TE | QSPI_FLAG_TC));
1335
1336 /* Configure size and pointer of the handle */
1337 hqspi->TxXferSize = hqspi->TxXferCount;
1338 hqspi->pTxBuffPtr = pData;
1339
1340 /* Configure QSPI: CCR register with functional mode as indirect write */
1341 MODIFY_REG(hqspi->Instance->CCR, QUADSPI_CCR_FMODE, QSPI_FUNCTIONAL_MODE_INDIRECT_WRITE);
1342
1343 /* Set the QSPI DMA transfer complete callback */
1344 hqspi->hdma->XferCpltCallback = QSPI_DMATxCplt;
1345
1346 /* Set the QSPI DMA Half transfer complete callback */
1347 hqspi->hdma->XferHalfCpltCallback = QSPI_DMATxHalfCplt;
1348
1349 /* Set the DMA error callback */
1350 hqspi->hdma->XferErrorCallback = QSPI_DMAError;
1351
1352 /* Clear the DMA abort callback */
1353 hqspi->hdma->XferAbortCallback = NULL;
1354
1355#if defined (QSPI1_V2_1L)
1356 /* Bug "ES0305 section 2.1.8 In some specific cases, DMA2 data corruption occurs when managing
1357 AHB and APB2 peripherals in a concurrent way" Workaround Implementation:
1358 Change the following configuration of DMA peripheral
1359 - Enable peripheral increment
1360 - Disable memory increment
1361 - Set DMA direction as peripheral to memory mode */
1362
1363 /* Enable peripheral increment mode of the DMA */
1364 hqspi->hdma->Init.PeriphInc = DMA_PINC_ENABLE;
1365
1366 /* Disable memory increment mode of the DMA */
1367 hqspi->hdma->Init.MemInc = DMA_MINC_DISABLE;
1368
1369 /* Update peripheral/memory increment mode bits */
1370 MODIFY_REG(hqspi->hdma->Instance->CR, (DMA_SxCR_MINC | DMA_SxCR_PINC), (hqspi->hdma->Init.MemInc | hqspi->hdma->Init.PeriphInc));
1371
1372 /* Configure the direction of the DMA */
1373 hqspi->hdma->Init.Direction = DMA_PERIPH_TO_MEMORY;
1374#else
1375 /* Configure the direction of the DMA */
1376 hqspi->hdma->Init.Direction = DMA_MEMORY_TO_PERIPH;
1377#endif /* QSPI1_V2_1L */
1378
1379 /* Update direction mode bit */
1380 MODIFY_REG(hqspi->hdma->Instance->CR, DMA_SxCR_DIR, hqspi->hdma->Init.Direction);
1381
1382 /* Enable the QSPI transmit DMA Channel */
1383 if (HAL_DMA_Start_IT(hqspi->hdma, (uint32_t)pData, (uint32_t)&hqspi->Instance->DR, hqspi->TxXferSize) == HAL_OK)
1384 {
1385 /* Process unlocked */
1386 __HAL_UNLOCK(hqspi);
1387
1388 /* Enable the QSPI transfer error Interrupt */
1389 __HAL_QSPI_ENABLE_IT(hqspi, QSPI_IT_TE);
1390
1391 /* Enable the DMA transfer by setting the DMAEN bit in the QSPI CR register */
1392 SET_BIT(hqspi->Instance->CR, QUADSPI_CR_DMAEN);
1393 }
1394 else
1395 {
1396 status = HAL_ERROR;
1397 hqspi->ErrorCode |= HAL_QSPI_ERROR_DMA;
1398 hqspi->State = HAL_QSPI_STATE_READY;
1399
1400 /* Process unlocked */
1401 __HAL_UNLOCK(hqspi);
1402 }
1403 }
1404 }
1405 else
1406 {
1407 hqspi->ErrorCode |= HAL_QSPI_ERROR_INVALID_PARAM;
1408 status = HAL_ERROR;
1409
1410 /* Process unlocked */
1411 __HAL_UNLOCK(hqspi);
1412 }
1413 }
1414 else
1415 {
1416 status = HAL_BUSY;
1417
1418 /* Process unlocked */
1419 __HAL_UNLOCK(hqspi);
1420 }
1421
1422 return status;
1423}
1424
1436HAL_StatusTypeDef HAL_QSPI_Receive_DMA(QSPI_HandleTypeDef *hqspi, uint8_t *pData)
1437{
1438 HAL_StatusTypeDef status = HAL_OK;
1439 uint32_t addr_reg = READ_REG(hqspi->Instance->AR);
1440 uint32_t data_size = (READ_REG(hqspi->Instance->DLR) + 1U);
1441
1442 /* Process locked */
1443 __HAL_LOCK(hqspi);
1444
1445 if(hqspi->State == HAL_QSPI_STATE_READY)
1446 {
1447 /* Clear the error code */
1448 hqspi->ErrorCode = HAL_QSPI_ERROR_NONE;
1449
1450 if(pData != NULL )
1451 {
1452 /* Configure counters of the handle */
1453 if (hqspi->hdma->Init.PeriphDataAlignment == DMA_PDATAALIGN_BYTE)
1454 {
1455 hqspi->RxXferCount = data_size;
1456 }
1457 else if (hqspi->hdma->Init.PeriphDataAlignment == DMA_PDATAALIGN_HALFWORD)
1458 {
1459 if (((data_size % 2U) != 0U) || ((hqspi->Init.FifoThreshold % 2U) != 0U))
1460 {
1461 /* The number of data or the fifo threshold is not aligned on halfword
1462 => no transfer possible with DMA peripheral access configured as halfword */
1463 hqspi->ErrorCode |= HAL_QSPI_ERROR_INVALID_PARAM;
1464 status = HAL_ERROR;
1465
1466 /* Process unlocked */
1467 __HAL_UNLOCK(hqspi);
1468 }
1469 else
1470 {
1471 hqspi->RxXferCount = (data_size >> 1U);
1472 }
1473 }
1474 else if (hqspi->hdma->Init.PeriphDataAlignment == DMA_PDATAALIGN_WORD)
1475 {
1476 if (((data_size % 4U) != 0U) || ((hqspi->Init.FifoThreshold % 4U) != 0U))
1477 {
1478 /* The number of data or the fifo threshold is not aligned on word
1479 => no transfer possible with DMA peripheral access configured as word */
1480 hqspi->ErrorCode |= HAL_QSPI_ERROR_INVALID_PARAM;
1481 status = HAL_ERROR;
1482
1483 /* Process unlocked */
1484 __HAL_UNLOCK(hqspi);
1485 }
1486 else
1487 {
1488 hqspi->RxXferCount = (data_size >> 2U);
1489 }
1490 }
1491 else
1492 {
1493 /* Nothing to do */
1494 }
1495
1496 if (status == HAL_OK)
1497 {
1498 /* Update state */
1499 hqspi->State = HAL_QSPI_STATE_BUSY_INDIRECT_RX;
1500
1501 /* Clear interrupt */
1502 __HAL_QSPI_CLEAR_FLAG(hqspi, (QSPI_FLAG_TE | QSPI_FLAG_TC));
1503
1504 /* Configure size and pointer of the handle */
1505 hqspi->RxXferSize = hqspi->RxXferCount;
1506 hqspi->pRxBuffPtr = pData;
1507
1508 /* Set the QSPI DMA transfer complete callback */
1509 hqspi->hdma->XferCpltCallback = QSPI_DMARxCplt;
1510
1511 /* Set the QSPI DMA Half transfer complete callback */
1512 hqspi->hdma->XferHalfCpltCallback = QSPI_DMARxHalfCplt;
1513
1514 /* Set the DMA error callback */
1515 hqspi->hdma->XferErrorCallback = QSPI_DMAError;
1516
1517 /* Clear the DMA abort callback */
1518 hqspi->hdma->XferAbortCallback = NULL;
1519
1520#if defined (QSPI1_V2_1L)
1521 /* Bug "ES0305 section 2.1.8 In some specific cases, DMA2 data corruption occurs when managing
1522 AHB and APB2 peripherals in a concurrent way" Workaround Implementation:
1523 Change the following configuration of DMA peripheral
1524 - Enable peripheral increment
1525 - Disable memory increment
1526 - Set DMA direction as memory to peripheral mode
1527 - 4 Extra words (32-bits) are added for read operation to guarantee
1528 the last data is transferred from DMA FIFO to RAM memory */
1529
1530 /* Enable peripheral increment of the DMA */
1531 hqspi->hdma->Init.PeriphInc = DMA_PINC_ENABLE;
1532
1533 /* Disable memory increment of the DMA */
1534 hqspi->hdma->Init.MemInc = DMA_MINC_DISABLE;
1535
1536 /* Update peripheral/memory increment mode bits */
1537 MODIFY_REG(hqspi->hdma->Instance->CR, (DMA_SxCR_MINC | DMA_SxCR_PINC), (hqspi->hdma->Init.MemInc | hqspi->hdma->Init.PeriphInc));
1538
1539 /* Configure the direction of the DMA */
1540 hqspi->hdma->Init.Direction = DMA_MEMORY_TO_PERIPH;
1541
1542 /* 4 Extra words (32-bits) are needed for read operation to guarantee
1543 the last data is transferred from DMA FIFO to RAM memory */
1544 WRITE_REG(hqspi->Instance->DLR, (data_size - 1U + 16U));
1545
1546 /* Update direction mode bit */
1547 MODIFY_REG(hqspi->hdma->Instance->CR, DMA_SxCR_DIR, hqspi->hdma->Init.Direction);
1548
1549 /* Configure QSPI: CCR register with functional as indirect read */
1550 MODIFY_REG(hqspi->Instance->CCR, QUADSPI_CCR_FMODE, QSPI_FUNCTIONAL_MODE_INDIRECT_READ);
1551
1552 /* Start the transfer by re-writing the address in AR register */
1553 WRITE_REG(hqspi->Instance->AR, addr_reg);
1554
1555 /* Enable the DMA Channel */
1556 if(HAL_DMA_Start_IT(hqspi->hdma, (uint32_t)&hqspi->Instance->DR, (uint32_t)pData, hqspi->RxXferSize) == HAL_OK)
1557 {
1558 /* Enable the DMA transfer by setting the DMAEN bit in the QSPI CR register */
1559 SET_BIT(hqspi->Instance->CR, QUADSPI_CR_DMAEN);
1560
1561 /* Process unlocked */
1562 __HAL_UNLOCK(hqspi);
1563
1564 /* Enable the QSPI transfer error Interrupt */
1565 __HAL_QSPI_ENABLE_IT(hqspi, QSPI_IT_TE);
1566 }
1567 else
1568 {
1569 status = HAL_ERROR;
1570 hqspi->ErrorCode |= HAL_QSPI_ERROR_DMA;
1571 hqspi->State = HAL_QSPI_STATE_READY;
1572
1573 /* Process unlocked */
1574 __HAL_UNLOCK(hqspi);
1575 }
1576#else
1577 /* Configure the direction of the DMA */
1578 hqspi->hdma->Init.Direction = DMA_PERIPH_TO_MEMORY;
1579
1580 /* Update direction mode bit */
1581 MODIFY_REG(hqspi->hdma->Instance->CR, DMA_SxCR_DIR, hqspi->hdma->Init.Direction);
1582
1583 /* Enable the DMA Channel */
1584 if(HAL_DMA_Start_IT(hqspi->hdma, (uint32_t)&hqspi->Instance->DR, (uint32_t)pData, hqspi->RxXferSize)== HAL_OK)
1585 {
1586 /* Configure QSPI: CCR register with functional as indirect read */
1587 MODIFY_REG(hqspi->Instance->CCR, QUADSPI_CCR_FMODE, QSPI_FUNCTIONAL_MODE_INDIRECT_READ);
1588
1589 /* Start the transfer by re-writing the address in AR register */
1590 WRITE_REG(hqspi->Instance->AR, addr_reg);
1591
1592 /* Process unlocked */
1593 __HAL_UNLOCK(hqspi);
1594
1595 /* Enable the QSPI transfer error Interrupt */
1596 __HAL_QSPI_ENABLE_IT(hqspi, QSPI_IT_TE);
1597
1598 /* Enable the DMA transfer by setting the DMAEN bit in the QSPI CR register */
1599 SET_BIT(hqspi->Instance->CR, QUADSPI_CR_DMAEN);
1600 }
1601 else
1602 {
1603 status = HAL_ERROR;
1604 hqspi->ErrorCode |= HAL_QSPI_ERROR_DMA;
1605 hqspi->State = HAL_QSPI_STATE_READY;
1606
1607 /* Process unlocked */
1608 __HAL_UNLOCK(hqspi);
1609 }
1610#endif /* QSPI1_V2_1L */
1611 }
1612 }
1613 else
1614 {
1615 hqspi->ErrorCode |= HAL_QSPI_ERROR_INVALID_PARAM;
1616 status = HAL_ERROR;
1617
1618 /* Process unlocked */
1619 __HAL_UNLOCK(hqspi);
1620 }
1621 }
1622 else
1623 {
1624 status = HAL_BUSY;
1625
1626 /* Process unlocked */
1627 __HAL_UNLOCK(hqspi);
1628 }
1629
1630 return status;
1631}
1632
1642HAL_StatusTypeDef HAL_QSPI_AutoPolling(QSPI_HandleTypeDef *hqspi, QSPI_CommandTypeDef *cmd, QSPI_AutoPollingTypeDef *cfg, uint32_t Timeout)
1643{
1644 HAL_StatusTypeDef status;
1645 uint32_t tickstart = HAL_GetTick();
1646
1647 /* Check the parameters */
1648 assert_param(IS_QSPI_INSTRUCTION_MODE(cmd->InstructionMode));
1649 if (cmd->InstructionMode != QSPI_INSTRUCTION_NONE)
1650 {
1651 assert_param(IS_QSPI_INSTRUCTION(cmd->Instruction));
1652 }
1653
1654 assert_param(IS_QSPI_ADDRESS_MODE(cmd->AddressMode));
1655 if (cmd->AddressMode != QSPI_ADDRESS_NONE)
1656 {
1657 assert_param(IS_QSPI_ADDRESS_SIZE(cmd->AddressSize));
1658 }
1659
1660 assert_param(IS_QSPI_ALTERNATE_BYTES_MODE(cmd->AlternateByteMode));
1661 if (cmd->AlternateByteMode != QSPI_ALTERNATE_BYTES_NONE)
1662 {
1663 assert_param(IS_QSPI_ALTERNATE_BYTES_SIZE(cmd->AlternateBytesSize));
1664 }
1665
1666 assert_param(IS_QSPI_DUMMY_CYCLES(cmd->DummyCycles));
1667 assert_param(IS_QSPI_DATA_MODE(cmd->DataMode));
1668
1669 assert_param(IS_QSPI_DDR_MODE(cmd->DdrMode));
1670 assert_param(IS_QSPI_DDR_HHC(cmd->DdrHoldHalfCycle));
1671 assert_param(IS_QSPI_SIOO_MODE(cmd->SIOOMode));
1672
1673 assert_param(IS_QSPI_INTERVAL(cfg->Interval));
1674 assert_param(IS_QSPI_STATUS_BYTES_SIZE(cfg->StatusBytesSize));
1675 assert_param(IS_QSPI_MATCH_MODE(cfg->MatchMode));
1676
1677 /* Process locked */
1678 __HAL_LOCK(hqspi);
1679
1680 if(hqspi->State == HAL_QSPI_STATE_READY)
1681 {
1682 hqspi->ErrorCode = HAL_QSPI_ERROR_NONE;
1683
1684 /* Update state */
1685 hqspi->State = HAL_QSPI_STATE_BUSY_AUTO_POLLING;
1686
1687 /* Wait till BUSY flag reset */
1688 status = QSPI_WaitFlagStateUntilTimeout(hqspi, QSPI_FLAG_BUSY, RESET, tickstart, Timeout);
1689
1690 if (status == HAL_OK)
1691 {
1692 /* Configure QSPI: PSMAR register with the status match value */
1693 WRITE_REG(hqspi->Instance->PSMAR, cfg->Match);
1694
1695 /* Configure QSPI: PSMKR register with the status mask value */
1696 WRITE_REG(hqspi->Instance->PSMKR, cfg->Mask);
1697
1698 /* Configure QSPI: PIR register with the interval value */
1699 WRITE_REG(hqspi->Instance->PIR, cfg->Interval);
1700
1701 /* Configure QSPI: CR register with Match mode and Automatic stop enabled
1702 (otherwise there will be an infinite loop in blocking mode) */
1703 MODIFY_REG(hqspi->Instance->CR, (QUADSPI_CR_PMM | QUADSPI_CR_APMS),
1704 (cfg->MatchMode | QSPI_AUTOMATIC_STOP_ENABLE));
1705
1706 /* Call the configuration function */
1707 cmd->NbData = cfg->StatusBytesSize;
1708 QSPI_Config(hqspi, cmd, QSPI_FUNCTIONAL_MODE_AUTO_POLLING);
1709
1710 /* Wait until SM flag is set to go back in idle state */
1711 status = QSPI_WaitFlagStateUntilTimeout(hqspi, QSPI_FLAG_SM, SET, tickstart, Timeout);
1712
1713 if (status == HAL_OK)
1714 {
1715 __HAL_QSPI_CLEAR_FLAG(hqspi, QSPI_FLAG_SM);
1716
1717 /* Update state */
1718 hqspi->State = HAL_QSPI_STATE_READY;
1719 }
1720 }
1721 }
1722 else
1723 {
1724 status = HAL_BUSY;
1725 }
1726
1727 /* Process unlocked */
1728 __HAL_UNLOCK(hqspi);
1729
1730 /* Return function status */
1731 return status;
1732}
1733
1742HAL_StatusTypeDef HAL_QSPI_AutoPolling_IT(QSPI_HandleTypeDef *hqspi, QSPI_CommandTypeDef *cmd, QSPI_AutoPollingTypeDef *cfg)
1743{
1744 HAL_StatusTypeDef status;
1745
1746 /* Check the parameters */
1747 assert_param(IS_QSPI_INSTRUCTION_MODE(cmd->InstructionMode));
1748 if (cmd->InstructionMode != QSPI_INSTRUCTION_NONE)
1749 {
1750 assert_param(IS_QSPI_INSTRUCTION(cmd->Instruction));
1751 }
1752
1753 assert_param(IS_QSPI_ADDRESS_MODE(cmd->AddressMode));
1754 if (cmd->AddressMode != QSPI_ADDRESS_NONE)
1755 {
1756 assert_param(IS_QSPI_ADDRESS_SIZE(cmd->AddressSize));
1757 }
1758
1759 assert_param(IS_QSPI_ALTERNATE_BYTES_MODE(cmd->AlternateByteMode));
1760 if (cmd->AlternateByteMode != QSPI_ALTERNATE_BYTES_NONE)
1761 {
1762 assert_param(IS_QSPI_ALTERNATE_BYTES_SIZE(cmd->AlternateBytesSize));
1763 }
1764
1765 assert_param(IS_QSPI_DUMMY_CYCLES(cmd->DummyCycles));
1766 assert_param(IS_QSPI_DATA_MODE(cmd->DataMode));
1767
1768 assert_param(IS_QSPI_DDR_MODE(cmd->DdrMode));
1769 assert_param(IS_QSPI_DDR_HHC(cmd->DdrHoldHalfCycle));
1770 assert_param(IS_QSPI_SIOO_MODE(cmd->SIOOMode));
1771
1772 assert_param(IS_QSPI_INTERVAL(cfg->Interval));
1773 assert_param(IS_QSPI_STATUS_BYTES_SIZE(cfg->StatusBytesSize));
1774 assert_param(IS_QSPI_MATCH_MODE(cfg->MatchMode));
1775 assert_param(IS_QSPI_AUTOMATIC_STOP(cfg->AutomaticStop));
1776
1777 /* Process locked */
1778 __HAL_LOCK(hqspi);
1779
1780 if(hqspi->State == HAL_QSPI_STATE_READY)
1781 {
1782 hqspi->ErrorCode = HAL_QSPI_ERROR_NONE;
1783
1784 /* Update state */
1785 hqspi->State = HAL_QSPI_STATE_BUSY_AUTO_POLLING;
1786
1787 /* Wait till BUSY flag reset */
1788 status = QSPI_WaitFlagStateUntilTimeout_CPUCycle(hqspi, QSPI_FLAG_BUSY, RESET, hqspi->Timeout);
1789
1790 if (status == HAL_OK)
1791 {
1792 /* Configure QSPI: PSMAR register with the status match value */
1793 WRITE_REG(hqspi->Instance->PSMAR, cfg->Match);
1794
1795 /* Configure QSPI: PSMKR register with the status mask value */
1796 WRITE_REG(hqspi->Instance->PSMKR, cfg->Mask);
1797
1798 /* Configure QSPI: PIR register with the interval value */
1799 WRITE_REG(hqspi->Instance->PIR, cfg->Interval);
1800
1801 /* Configure QSPI: CR register with Match mode and Automatic stop mode */
1802 MODIFY_REG(hqspi->Instance->CR, (QUADSPI_CR_PMM | QUADSPI_CR_APMS),
1803 (cfg->MatchMode | cfg->AutomaticStop));
1804
1805 /* Clear interrupt */
1806 __HAL_QSPI_CLEAR_FLAG(hqspi, QSPI_FLAG_TE | QSPI_FLAG_SM);
1807
1808 /* Call the configuration function */
1809 cmd->NbData = cfg->StatusBytesSize;
1810 QSPI_Config(hqspi, cmd, QSPI_FUNCTIONAL_MODE_AUTO_POLLING);
1811
1812 /* Process unlocked */
1813 __HAL_UNLOCK(hqspi);
1814
1815 /* Enable the QSPI Transfer Error and status match Interrupt */
1816 __HAL_QSPI_ENABLE_IT(hqspi, (QSPI_IT_SM | QSPI_IT_TE));
1817
1818 }
1819 else
1820 {
1821 /* Process unlocked */
1822 __HAL_UNLOCK(hqspi);
1823 }
1824 }
1825 else
1826 {
1827 status = HAL_BUSY;
1828
1829 /* Process unlocked */
1830 __HAL_UNLOCK(hqspi);
1831 }
1832
1833 /* Return function status */
1834 return status;
1835}
1836
1845HAL_StatusTypeDef HAL_QSPI_MemoryMapped(QSPI_HandleTypeDef *hqspi, QSPI_CommandTypeDef *cmd, QSPI_MemoryMappedTypeDef *cfg)
1846{
1847 HAL_StatusTypeDef status;
1848 uint32_t tickstart = HAL_GetTick();
1849
1850 /* Check the parameters */
1851 assert_param(IS_QSPI_INSTRUCTION_MODE(cmd->InstructionMode));
1852 if (cmd->InstructionMode != QSPI_INSTRUCTION_NONE)
1853 {
1854 assert_param(IS_QSPI_INSTRUCTION(cmd->Instruction));
1855 }
1856
1857 assert_param(IS_QSPI_ADDRESS_MODE(cmd->AddressMode));
1858 if (cmd->AddressMode != QSPI_ADDRESS_NONE)
1859 {
1860 assert_param(IS_QSPI_ADDRESS_SIZE(cmd->AddressSize));
1861 }
1862
1863 assert_param(IS_QSPI_ALTERNATE_BYTES_MODE(cmd->AlternateByteMode));
1864 if (cmd->AlternateByteMode != QSPI_ALTERNATE_BYTES_NONE)
1865 {
1866 assert_param(IS_QSPI_ALTERNATE_BYTES_SIZE(cmd->AlternateBytesSize));
1867 }
1868
1869 assert_param(IS_QSPI_DUMMY_CYCLES(cmd->DummyCycles));
1870 assert_param(IS_QSPI_DATA_MODE(cmd->DataMode));
1871
1872 assert_param(IS_QSPI_DDR_MODE(cmd->DdrMode));
1873 assert_param(IS_QSPI_DDR_HHC(cmd->DdrHoldHalfCycle));
1874 assert_param(IS_QSPI_SIOO_MODE(cmd->SIOOMode));
1875
1876 assert_param(IS_QSPI_TIMEOUT_ACTIVATION(cfg->TimeOutActivation));
1877
1878 /* Process locked */
1879 __HAL_LOCK(hqspi);
1880
1881 if(hqspi->State == HAL_QSPI_STATE_READY)
1882 {
1883 hqspi->ErrorCode = HAL_QSPI_ERROR_NONE;
1884
1885 /* Update state */
1886 hqspi->State = HAL_QSPI_STATE_BUSY_MEM_MAPPED;
1887
1888 /* Wait till BUSY flag reset */
1889 status = QSPI_WaitFlagStateUntilTimeout(hqspi, QSPI_FLAG_BUSY, RESET, tickstart, hqspi->Timeout);
1890
1891 if (status == HAL_OK)
1892 {
1893 /* Configure QSPI: CR register with timeout counter enable */
1894 MODIFY_REG(hqspi->Instance->CR, QUADSPI_CR_TCEN, cfg->TimeOutActivation);
1895
1896 if (cfg->TimeOutActivation == QSPI_TIMEOUT_COUNTER_ENABLE)
1897 {
1898 assert_param(IS_QSPI_TIMEOUT_PERIOD(cfg->TimeOutPeriod));
1899
1900 /* Configure QSPI: LPTR register with the low-power timeout value */
1901 WRITE_REG(hqspi->Instance->LPTR, cfg->TimeOutPeriod);
1902
1903 /* Clear interrupt */
1904 __HAL_QSPI_CLEAR_FLAG(hqspi, QSPI_FLAG_TO);
1905
1906 /* Enable the QSPI TimeOut Interrupt */
1907 __HAL_QSPI_ENABLE_IT(hqspi, QSPI_IT_TO);
1908 }
1909
1910 /* Call the configuration function */
1911 QSPI_Config(hqspi, cmd, QSPI_FUNCTIONAL_MODE_MEMORY_MAPPED);
1912 }
1913 }
1914 else
1915 {
1916 status = HAL_BUSY;
1917 }
1918
1919 /* Process unlocked */
1920 __HAL_UNLOCK(hqspi);
1921
1922 /* Return function status */
1923 return status;
1924}
1925
1931__weak void HAL_QSPI_ErrorCallback(QSPI_HandleTypeDef *hqspi)
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_ErrorCallback could be implemented in the user file
1938 */
1939}
1940
1946__weak void HAL_QSPI_AbortCpltCallback(QSPI_HandleTypeDef *hqspi)
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_AbortCpltCallback could be implemented in the user file
1953 */
1954}
1955
1961__weak void HAL_QSPI_CmdCpltCallback(QSPI_HandleTypeDef *hqspi)
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_CmdCpltCallback could be implemented in the user file
1968 */
1969}
1970
1976__weak void HAL_QSPI_RxCpltCallback(QSPI_HandleTypeDef *hqspi)
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_RxCpltCallback could be implemented in the user file
1983 */
1984}
1985
1991__weak void HAL_QSPI_TxCpltCallback(QSPI_HandleTypeDef *hqspi)
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_TxCpltCallback could be implemented in the user file
1998 */
1999}
2000
2006__weak void HAL_QSPI_RxHalfCpltCallback(QSPI_HandleTypeDef *hqspi)
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_RxHalfCpltCallback could be implemented in the user file
2013 */
2014}
2015
2021__weak void HAL_QSPI_TxHalfCpltCallback(QSPI_HandleTypeDef *hqspi)
2022{
2023 /* Prevent unused argument(s) compilation warning */
2024 UNUSED(hqspi);
2025
2026 /* NOTE: This function should not be modified, when the callback is needed,
2027 the HAL_QSPI_TxHalfCpltCallback could be implemented in the user file
2028 */
2029}
2030
2036__weak void HAL_QSPI_FifoThresholdCallback(QSPI_HandleTypeDef *hqspi)
2037{
2038 /* Prevent unused argument(s) compilation warning */
2039 UNUSED(hqspi);
2040
2041 /* NOTE : This function should not be modified, when the callback is needed,
2042 the HAL_QSPI_FIFOThresholdCallback could be implemented in the user file
2043 */
2044}
2045
2051__weak void HAL_QSPI_StatusMatchCallback(QSPI_HandleTypeDef *hqspi)
2052{
2053 /* Prevent unused argument(s) compilation warning */
2054 UNUSED(hqspi);
2055
2056 /* NOTE : This function should not be modified, when the callback is needed,
2057 the HAL_QSPI_StatusMatchCallback could be implemented in the user file
2058 */
2059}
2060
2066__weak void HAL_QSPI_TimeOutCallback(QSPI_HandleTypeDef *hqspi)
2067{
2068 /* Prevent unused argument(s) compilation warning */
2069 UNUSED(hqspi);
2070
2071 /* NOTE : This function should not be modified, when the callback is needed,
2072 the HAL_QSPI_TimeOutCallback could be implemented in the user file
2073 */
2074}
2075#if (USE_HAL_QSPI_REGISTER_CALLBACKS == 1)
2097HAL_StatusTypeDef HAL_QSPI_RegisterCallback (QSPI_HandleTypeDef *hqspi, HAL_QSPI_CallbackIDTypeDef CallbackId, pQSPI_CallbackTypeDef pCallback)
2098{
2099 HAL_StatusTypeDef status = HAL_OK;
2100
2101 if(pCallback == NULL)
2102 {
2103 /* Update the error code */
2104 hqspi->ErrorCode |= HAL_QSPI_ERROR_INVALID_CALLBACK;
2105 return HAL_ERROR;
2106 }
2107
2108 /* Process locked */
2109 __HAL_LOCK(hqspi);
2110
2111 if(hqspi->State == HAL_QSPI_STATE_READY)
2112 {
2113 switch (CallbackId)
2114 {
2115 case HAL_QSPI_ERROR_CB_ID :
2116 hqspi->ErrorCallback = pCallback;
2117 break;
2118 case HAL_QSPI_ABORT_CB_ID :
2119 hqspi->AbortCpltCallback = pCallback;
2120 break;
2121 case HAL_QSPI_FIFO_THRESHOLD_CB_ID :
2122 hqspi->FifoThresholdCallback = pCallback;
2123 break;
2124 case HAL_QSPI_CMD_CPLT_CB_ID :
2125 hqspi->CmdCpltCallback = pCallback;
2126 break;
2127 case HAL_QSPI_RX_CPLT_CB_ID :
2128 hqspi->RxCpltCallback = pCallback;
2129 break;
2130 case HAL_QSPI_TX_CPLT_CB_ID :
2131 hqspi->TxCpltCallback = pCallback;
2132 break;
2133 case HAL_QSPI_RX_HALF_CPLT_CB_ID :
2134 hqspi->RxHalfCpltCallback = pCallback;
2135 break;
2136 case HAL_QSPI_TX_HALF_CPLT_CB_ID :
2137 hqspi->TxHalfCpltCallback = pCallback;
2138 break;
2139 case HAL_QSPI_STATUS_MATCH_CB_ID :
2140 hqspi->StatusMatchCallback = pCallback;
2141 break;
2142 case HAL_QSPI_TIMEOUT_CB_ID :
2143 hqspi->TimeOutCallback = pCallback;
2144 break;
2145 case HAL_QSPI_MSP_INIT_CB_ID :
2146 hqspi->MspInitCallback = pCallback;
2147 break;
2148 case HAL_QSPI_MSP_DEINIT_CB_ID :
2149 hqspi->MspDeInitCallback = pCallback;
2150 break;
2151 default :
2152 /* Update the error code */
2153 hqspi->ErrorCode |= HAL_QSPI_ERROR_INVALID_CALLBACK;
2154 /* update return status */
2155 status = HAL_ERROR;
2156 break;
2157 }
2158 }
2159 else if (hqspi->State == HAL_QSPI_STATE_RESET)
2160 {
2161 switch (CallbackId)
2162 {
2163 case HAL_QSPI_MSP_INIT_CB_ID :
2164 hqspi->MspInitCallback = pCallback;
2165 break;
2166 case HAL_QSPI_MSP_DEINIT_CB_ID :
2167 hqspi->MspDeInitCallback = pCallback;
2168 break;
2169 default :
2170 /* Update the error code */
2171 hqspi->ErrorCode |= HAL_QSPI_ERROR_INVALID_CALLBACK;
2172 /* update return status */
2173 status = HAL_ERROR;
2174 break;
2175 }
2176 }
2177 else
2178 {
2179 /* Update the error code */
2180 hqspi->ErrorCode |= HAL_QSPI_ERROR_INVALID_CALLBACK;
2181 /* update return status */
2182 status = HAL_ERROR;
2183 }
2184
2185 /* Release Lock */
2186 __HAL_UNLOCK(hqspi);
2187 return status;
2188}
2189
2210HAL_StatusTypeDef HAL_QSPI_UnRegisterCallback (QSPI_HandleTypeDef *hqspi, HAL_QSPI_CallbackIDTypeDef CallbackId)
2211{
2212 HAL_StatusTypeDef status = HAL_OK;
2213
2214 /* Process locked */
2215 __HAL_LOCK(hqspi);
2216
2217 if(hqspi->State == HAL_QSPI_STATE_READY)
2218 {
2219 switch (CallbackId)
2220 {
2221 case HAL_QSPI_ERROR_CB_ID :
2222 hqspi->ErrorCallback = HAL_QSPI_ErrorCallback;
2223 break;
2224 case HAL_QSPI_ABORT_CB_ID :
2225 hqspi->AbortCpltCallback = HAL_QSPI_AbortCpltCallback;
2226 break;
2227 case HAL_QSPI_FIFO_THRESHOLD_CB_ID :
2228 hqspi->FifoThresholdCallback = HAL_QSPI_FifoThresholdCallback;
2229 break;
2230 case HAL_QSPI_CMD_CPLT_CB_ID :
2231 hqspi->CmdCpltCallback = HAL_QSPI_CmdCpltCallback;
2232 break;
2233 case HAL_QSPI_RX_CPLT_CB_ID :
2234 hqspi->RxCpltCallback = HAL_QSPI_RxCpltCallback;
2235 break;
2236 case HAL_QSPI_TX_CPLT_CB_ID :
2237 hqspi->TxCpltCallback = HAL_QSPI_TxCpltCallback;
2238 break;
2239 case HAL_QSPI_RX_HALF_CPLT_CB_ID :
2240 hqspi->RxHalfCpltCallback = HAL_QSPI_RxHalfCpltCallback;
2241 break;
2242 case HAL_QSPI_TX_HALF_CPLT_CB_ID :
2243 hqspi->TxHalfCpltCallback = HAL_QSPI_TxHalfCpltCallback;
2244 break;
2245 case HAL_QSPI_STATUS_MATCH_CB_ID :
2246 hqspi->StatusMatchCallback = HAL_QSPI_StatusMatchCallback;
2247 break;
2248 case HAL_QSPI_TIMEOUT_CB_ID :
2249 hqspi->TimeOutCallback = HAL_QSPI_TimeOutCallback;
2250 break;
2251 case HAL_QSPI_MSP_INIT_CB_ID :
2252 hqspi->MspInitCallback = HAL_QSPI_MspInit;
2253 break;
2254 case HAL_QSPI_MSP_DEINIT_CB_ID :
2255 hqspi->MspDeInitCallback = HAL_QSPI_MspDeInit;
2256 break;
2257 default :
2258 /* Update the error code */
2259 hqspi->ErrorCode |= HAL_QSPI_ERROR_INVALID_CALLBACK;
2260 /* update return status */
2261 status = HAL_ERROR;
2262 break;
2263 }
2264 }
2265 else if (hqspi->State == HAL_QSPI_STATE_RESET)
2266 {
2267 switch (CallbackId)
2268 {
2269 case HAL_QSPI_MSP_INIT_CB_ID :
2270 hqspi->MspInitCallback = HAL_QSPI_MspInit;
2271 break;
2272 case HAL_QSPI_MSP_DEINIT_CB_ID :
2273 hqspi->MspDeInitCallback = HAL_QSPI_MspDeInit;
2274 break;
2275 default :
2276 /* Update the error code */
2277 hqspi->ErrorCode |= HAL_QSPI_ERROR_INVALID_CALLBACK;
2278 /* update return status */
2279 status = HAL_ERROR;
2280 break;
2281 }
2282 }
2283 else
2284 {
2285 /* Update the error code */
2286 hqspi->ErrorCode |= HAL_QSPI_ERROR_INVALID_CALLBACK;
2287 /* update return status */
2288 status = HAL_ERROR;
2289 }
2290
2291 /* Release Lock */
2292 __HAL_UNLOCK(hqspi);
2293 return status;
2294}
2295#endif
2296
2324HAL_QSPI_StateTypeDef HAL_QSPI_GetState(const QSPI_HandleTypeDef *hqspi)
2325{
2326 /* Return QSPI handle state */
2327 return hqspi->State;
2328}
2329
2335uint32_t HAL_QSPI_GetError(const QSPI_HandleTypeDef *hqspi)
2336{
2337 return hqspi->ErrorCode;
2338}
2339
2345HAL_StatusTypeDef HAL_QSPI_Abort(QSPI_HandleTypeDef *hqspi)
2346{
2347 HAL_StatusTypeDef status = HAL_OK;
2348 uint32_t tickstart = HAL_GetTick();
2349
2350 /* Check if the state is in one of the busy states */
2351 if (((uint32_t)hqspi->State & 0x2U) != 0U)
2352 {
2353 /* Process unlocked */
2354 __HAL_UNLOCK(hqspi);
2355
2356 if ((hqspi->Instance->CR & QUADSPI_CR_DMAEN) != 0U)
2357 {
2358 /* Disable the DMA transfer by clearing the DMAEN bit in the QSPI CR register */
2359 CLEAR_BIT(hqspi->Instance->CR, QUADSPI_CR_DMAEN);
2360
2361 /* Abort DMA channel */
2362 status = HAL_DMA_Abort(hqspi->hdma);
2363 if(status != HAL_OK)
2364 {
2365 hqspi->ErrorCode |= HAL_QSPI_ERROR_DMA;
2366 }
2367 }
2368
2369 if (__HAL_QSPI_GET_FLAG(hqspi, QSPI_FLAG_BUSY) != RESET)
2370 {
2371 /* Configure QSPI: CR register with Abort request */
2372 SET_BIT(hqspi->Instance->CR, QUADSPI_CR_ABORT);
2373
2374 /* Wait until TC flag is set to go back in idle state */
2375 status = QSPI_WaitFlagStateUntilTimeout(hqspi, QSPI_FLAG_TC, SET, tickstart, hqspi->Timeout);
2376
2377 if (status == HAL_OK)
2378 {
2379 __HAL_QSPI_CLEAR_FLAG(hqspi, QSPI_FLAG_TC);
2380
2381 /* Wait until BUSY flag is reset */
2382 status = QSPI_WaitFlagStateUntilTimeout(hqspi, QSPI_FLAG_BUSY, RESET, tickstart, hqspi->Timeout);
2383 }
2384
2385 if (status == HAL_OK)
2386 {
2387 /* Reset functional mode configuration to indirect write mode by default */
2388 CLEAR_BIT(hqspi->Instance->CCR, QUADSPI_CCR_FMODE);
2389
2390 /* Update state */
2391 hqspi->State = HAL_QSPI_STATE_READY;
2392 }
2393 }
2394 else
2395 {
2396 /* Update state */
2397 hqspi->State = HAL_QSPI_STATE_READY;
2398 }
2399 }
2400
2401 return status;
2402}
2403
2409HAL_StatusTypeDef HAL_QSPI_Abort_IT(QSPI_HandleTypeDef *hqspi)
2410{
2411 HAL_StatusTypeDef status = HAL_OK;
2412
2413 /* Check if the state is in one of the busy states */
2414 if (((uint32_t)hqspi->State & 0x2U) != 0U)
2415 {
2416 /* Process unlocked */
2417 __HAL_UNLOCK(hqspi);
2418
2419 /* Update QSPI state */
2420 hqspi->State = HAL_QSPI_STATE_ABORT;
2421
2422 /* Disable all interrupts */
2423 __HAL_QSPI_DISABLE_IT(hqspi, (QSPI_IT_TO | QSPI_IT_SM | QSPI_IT_FT | QSPI_IT_TC | QSPI_IT_TE));
2424
2425 if ((hqspi->Instance->CR & QUADSPI_CR_DMAEN) != 0U)
2426 {
2427 /* Disable the DMA transfer by clearing the DMAEN bit in the QSPI CR register */
2428 CLEAR_BIT(hqspi->Instance->CR, QUADSPI_CR_DMAEN);
2429
2430 /* Abort DMA channel */
2431 hqspi->hdma->XferAbortCallback = QSPI_DMAAbortCplt;
2432 if (HAL_DMA_Abort_IT(hqspi->hdma) != HAL_OK)
2433 {
2434 /* Change state of QSPI */
2435 hqspi->State = HAL_QSPI_STATE_READY;
2436
2437 /* Abort Complete callback */
2438#if (USE_HAL_QSPI_REGISTER_CALLBACKS == 1)
2439 hqspi->AbortCpltCallback(hqspi);
2440#else
2441 HAL_QSPI_AbortCpltCallback(hqspi);
2442#endif
2443 }
2444 }
2445 else
2446 {
2447 if (__HAL_QSPI_GET_FLAG(hqspi, QSPI_FLAG_BUSY) != RESET)
2448 {
2449 /* Clear interrupt */
2450 __HAL_QSPI_CLEAR_FLAG(hqspi, QSPI_FLAG_TC);
2451
2452 /* Enable the QSPI Transfer Complete Interrupt */
2453 __HAL_QSPI_ENABLE_IT(hqspi, QSPI_IT_TC);
2454
2455 /* Configure QSPI: CR register with Abort request */
2456 SET_BIT(hqspi->Instance->CR, QUADSPI_CR_ABORT);
2457 }
2458 else
2459 {
2460 /* Change state of QSPI */
2461 hqspi->State = HAL_QSPI_STATE_READY;
2462 }
2463 }
2464 }
2465 return status;
2466}
2467
2473void HAL_QSPI_SetTimeout(QSPI_HandleTypeDef *hqspi, uint32_t Timeout)
2474{
2475 hqspi->Timeout = Timeout;
2476}
2477
2483HAL_StatusTypeDef HAL_QSPI_SetFifoThreshold(QSPI_HandleTypeDef *hqspi, uint32_t Threshold)
2484{
2485 HAL_StatusTypeDef status = HAL_OK;
2486
2487 /* Process locked */
2488 __HAL_LOCK(hqspi);
2489
2490 if(hqspi->State == HAL_QSPI_STATE_READY)
2491 {
2492 /* Synchronize init structure with new FIFO threshold value */
2493 hqspi->Init.FifoThreshold = Threshold;
2494
2495 /* Configure QSPI FIFO Threshold */
2496 MODIFY_REG(hqspi->Instance->CR, QUADSPI_CR_FTHRES,
2497 ((hqspi->Init.FifoThreshold - 1U) << QUADSPI_CR_FTHRES_Pos));
2498 }
2499 else
2500 {
2501 status = HAL_BUSY;
2502 }
2503
2504 /* Process unlocked */
2505 __HAL_UNLOCK(hqspi);
2506
2507 /* Return function status */
2508 return status;
2509}
2510
2515uint32_t HAL_QSPI_GetFifoThreshold(const QSPI_HandleTypeDef *hqspi)
2516{
2517 return ((READ_BIT(hqspi->Instance->CR, QUADSPI_CR_FTHRES) >> QUADSPI_CR_FTHRES_Pos) + 1U);
2518}
2519
2527HAL_StatusTypeDef HAL_QSPI_SetFlashID(QSPI_HandleTypeDef *hqspi, uint32_t FlashID)
2528{
2529 HAL_StatusTypeDef status = HAL_OK;
2530
2531 /* Check the parameter */
2532 assert_param(IS_QSPI_FLASH_ID(FlashID));
2533
2534 /* Process locked */
2535 __HAL_LOCK(hqspi);
2536
2537 if(hqspi->State == HAL_QSPI_STATE_READY)
2538 {
2539 /* Synchronize init structure with new FlashID value */
2540 hqspi->Init.FlashID = FlashID;
2541
2542 /* Configure QSPI FlashID */
2543 MODIFY_REG(hqspi->Instance->CR, QUADSPI_CR_FSEL, FlashID);
2544 }
2545 else
2546 {
2547 status = HAL_BUSY;
2548 }
2549
2550 /* Process unlocked */
2551 __HAL_UNLOCK(hqspi);
2552
2553 /* Return function status */
2554 return status;
2555}
2556
2574static void QSPI_DMARxCplt(DMA_HandleTypeDef *hdma)
2575{
2576 QSPI_HandleTypeDef* hqspi = (QSPI_HandleTypeDef*)(hdma->Parent);
2577 hqspi->RxXferCount = 0U;
2578
2579 /* Enable the QSPI transfer complete Interrupt */
2580 __HAL_QSPI_ENABLE_IT(hqspi, QSPI_IT_TC);
2581}
2582
2588static void QSPI_DMATxCplt(DMA_HandleTypeDef *hdma)
2589{
2590 QSPI_HandleTypeDef* hqspi = (QSPI_HandleTypeDef*)(hdma->Parent);
2591 hqspi->TxXferCount = 0U;
2592
2593 /* Enable the QSPI transfer complete Interrupt */
2594 __HAL_QSPI_ENABLE_IT(hqspi, QSPI_IT_TC);
2595}
2596
2602static void QSPI_DMARxHalfCplt(DMA_HandleTypeDef *hdma)
2603{
2604 QSPI_HandleTypeDef* hqspi = (QSPI_HandleTypeDef*)(hdma->Parent);
2605
2606#if (USE_HAL_QSPI_REGISTER_CALLBACKS == 1)
2607 hqspi->RxHalfCpltCallback(hqspi);
2608#else
2609 HAL_QSPI_RxHalfCpltCallback(hqspi);
2610#endif
2611}
2612
2618static void QSPI_DMATxHalfCplt(DMA_HandleTypeDef *hdma)
2619{
2620 QSPI_HandleTypeDef* hqspi = (QSPI_HandleTypeDef*)(hdma->Parent);
2621
2622#if (USE_HAL_QSPI_REGISTER_CALLBACKS == 1)
2623 hqspi->TxHalfCpltCallback(hqspi);
2624#else
2625 HAL_QSPI_TxHalfCpltCallback(hqspi);
2626#endif
2627}
2628
2634static void QSPI_DMAError(DMA_HandleTypeDef *hdma)
2635{
2636 QSPI_HandleTypeDef* hqspi = ( QSPI_HandleTypeDef* )(hdma->Parent);
2637
2638 /* if DMA error is FIFO error ignore it */
2640 {
2641 hqspi->RxXferCount = 0U;
2642 hqspi->TxXferCount = 0U;
2643 hqspi->ErrorCode |= HAL_QSPI_ERROR_DMA;
2644
2645 /* Disable the DMA transfer by clearing the DMAEN bit in the QSPI CR register */
2646 CLEAR_BIT(hqspi->Instance->CR, QUADSPI_CR_DMAEN);
2647
2648 /* Abort the QSPI */
2649 (void)HAL_QSPI_Abort_IT(hqspi);
2650
2651 }
2652}
2653
2659static void QSPI_DMAAbortCplt(DMA_HandleTypeDef *hdma)
2660{
2661 QSPI_HandleTypeDef* hqspi = ( QSPI_HandleTypeDef* )(hdma->Parent);
2662
2663 hqspi->RxXferCount = 0U;
2664 hqspi->TxXferCount = 0U;
2665
2666 if(hqspi->State == HAL_QSPI_STATE_ABORT)
2667 {
2668 /* DMA Abort called by QSPI abort */
2669 /* Clear interrupt */
2670 __HAL_QSPI_CLEAR_FLAG(hqspi, QSPI_FLAG_TC);
2671
2672 /* Enable the QSPI Transfer Complete Interrupt */
2673 __HAL_QSPI_ENABLE_IT(hqspi, QSPI_IT_TC);
2674
2675 /* Configure QSPI: CR register with Abort request */
2676 SET_BIT(hqspi->Instance->CR, QUADSPI_CR_ABORT);
2677 }
2678 else
2679 {
2680 /* DMA Abort called due to a transfer error interrupt */
2681 /* Change state of QSPI */
2682 hqspi->State = HAL_QSPI_STATE_READY;
2683
2684 /* Error callback */
2685#if (USE_HAL_QSPI_REGISTER_CALLBACKS == 1)
2686 hqspi->ErrorCallback(hqspi);
2687#else
2688 HAL_QSPI_ErrorCallback(hqspi);
2689#endif
2690 }
2691}
2692
2702static HAL_StatusTypeDef QSPI_WaitFlagStateUntilTimeout(QSPI_HandleTypeDef *hqspi, uint32_t Flag,
2703 FlagStatus State, uint32_t Tickstart, uint32_t Timeout)
2704{
2705 /* Wait until flag is in expected state */
2706 while((__HAL_QSPI_GET_FLAG(hqspi, Flag)) != State)
2707 {
2708 /* Check for the Timeout */
2709 if (Timeout != HAL_MAX_DELAY)
2710 {
2711 if(((HAL_GetTick() - Tickstart) > Timeout) || (Timeout == 0U))
2712 {
2713 hqspi->State = HAL_QSPI_STATE_ERROR;
2714 hqspi->ErrorCode |= HAL_QSPI_ERROR_TIMEOUT;
2715
2716 return HAL_ERROR;
2717 }
2718 }
2719 }
2720 return HAL_OK;
2721}
2722
2731static HAL_StatusTypeDef QSPI_WaitFlagStateUntilTimeout_CPUCycle(QSPI_HandleTypeDef *hqspi, uint32_t Flag, FlagStatus State, uint32_t Timeout)
2732{
2733 __IO uint32_t count = Timeout * (SystemCoreClock / 16U / 1000U);
2734 do
2735 {
2736 if (count-- == 0U)
2737 {
2738 hqspi->State = HAL_QSPI_STATE_ERROR;
2739 hqspi->ErrorCode |= HAL_QSPI_ERROR_TIMEOUT;
2740 return HAL_TIMEOUT;
2741 }
2742 }
2743 while ((__HAL_QSPI_GET_FLAG(hqspi, Flag)) != State);
2744
2745 return HAL_OK;
2746}
2747
2760static void QSPI_Config(QSPI_HandleTypeDef *hqspi, QSPI_CommandTypeDef *cmd, uint32_t FunctionalMode)
2761{
2762 assert_param(IS_QSPI_FUNCTIONAL_MODE(FunctionalMode));
2763
2764 if ((cmd->DataMode != QSPI_DATA_NONE) && (FunctionalMode != QSPI_FUNCTIONAL_MODE_MEMORY_MAPPED))
2765 {
2766 /* Configure QSPI: DLR register with the number of data to read or write */
2767 WRITE_REG(hqspi->Instance->DLR, (cmd->NbData - 1U));
2768 }
2769
2770 if (cmd->InstructionMode != QSPI_INSTRUCTION_NONE)
2771 {
2772 if (cmd->AlternateByteMode != QSPI_ALTERNATE_BYTES_NONE)
2773 {
2774 /* Configure QSPI: ABR register with alternate bytes value */
2775 WRITE_REG(hqspi->Instance->ABR, cmd->AlternateBytes);
2776
2777 if (cmd->AddressMode != QSPI_ADDRESS_NONE)
2778 {
2779 /*---- Command with instruction, address and alternate bytes ----*/
2780 /* Configure QSPI: CCR register with all communications parameters */
2781 WRITE_REG(hqspi->Instance->CCR, (cmd->DdrMode | cmd->DdrHoldHalfCycle | cmd->SIOOMode |
2782 cmd->DataMode | (cmd->DummyCycles << QUADSPI_CCR_DCYC_Pos) |
2783 cmd->AlternateBytesSize | cmd->AlternateByteMode |
2784 cmd->AddressSize | cmd->AddressMode | cmd->InstructionMode |
2785 cmd->Instruction | FunctionalMode));
2786
2787 if (FunctionalMode != QSPI_FUNCTIONAL_MODE_MEMORY_MAPPED)
2788 {
2789 /* Configure QSPI: AR register with address value */
2790 WRITE_REG(hqspi->Instance->AR, cmd->Address);
2791 }
2792 }
2793 else
2794 {
2795 /*---- Command with instruction and alternate bytes ----*/
2796 /* Configure QSPI: CCR register with all communications parameters */
2797 WRITE_REG(hqspi->Instance->CCR, (cmd->DdrMode | cmd->DdrHoldHalfCycle | cmd->SIOOMode |
2798 cmd->DataMode | (cmd->DummyCycles << QUADSPI_CCR_DCYC_Pos) |
2799 cmd->AlternateBytesSize | cmd->AlternateByteMode |
2800 cmd->AddressMode | cmd->InstructionMode |
2801 cmd->Instruction | FunctionalMode));
2802
2803 /* Clear AR register */
2804 CLEAR_REG(hqspi->Instance->AR);
2805 }
2806 }
2807 else
2808 {
2809 if (cmd->AddressMode != QSPI_ADDRESS_NONE)
2810 {
2811 /*---- Command with instruction and address ----*/
2812 /* Configure QSPI: CCR register with all communications parameters */
2813 WRITE_REG(hqspi->Instance->CCR, (cmd->DdrMode | cmd->DdrHoldHalfCycle | cmd->SIOOMode |
2814 cmd->DataMode | (cmd->DummyCycles << QUADSPI_CCR_DCYC_Pos) |
2815 cmd->AlternateByteMode | cmd->AddressSize | cmd->AddressMode |
2816 cmd->InstructionMode | cmd->Instruction | FunctionalMode));
2817
2818 if (FunctionalMode != QSPI_FUNCTIONAL_MODE_MEMORY_MAPPED)
2819 {
2820 /* Configure QSPI: AR register with address value */
2821 WRITE_REG(hqspi->Instance->AR, cmd->Address);
2822 }
2823 }
2824 else
2825 {
2826 /*---- Command with only instruction ----*/
2827 /* Configure QSPI: CCR register with all communications parameters */
2828 WRITE_REG(hqspi->Instance->CCR, (cmd->DdrMode | cmd->DdrHoldHalfCycle | cmd->SIOOMode |
2829 cmd->DataMode | (cmd->DummyCycles << QUADSPI_CCR_DCYC_Pos) |
2830 cmd->AlternateByteMode | cmd->AddressMode |
2831 cmd->InstructionMode | cmd->Instruction | FunctionalMode));
2832
2833 /* Clear AR register */
2834 CLEAR_REG(hqspi->Instance->AR);
2835 }
2836 }
2837 }
2838 else
2839 {
2840 if (cmd->AlternateByteMode != QSPI_ALTERNATE_BYTES_NONE)
2841 {
2842 /* Configure QSPI: ABR register with alternate bytes value */
2843 WRITE_REG(hqspi->Instance->ABR, cmd->AlternateBytes);
2844
2845 if (cmd->AddressMode != QSPI_ADDRESS_NONE)
2846 {
2847 /*---- Command with address and alternate bytes ----*/
2848 /* Configure QSPI: CCR register with all communications parameters */
2849 WRITE_REG(hqspi->Instance->CCR, (cmd->DdrMode | cmd->DdrHoldHalfCycle | cmd->SIOOMode |
2850 cmd->DataMode | (cmd->DummyCycles << QUADSPI_CCR_DCYC_Pos) |
2851 cmd->AlternateBytesSize | cmd->AlternateByteMode |
2852 cmd->AddressSize | cmd->AddressMode |
2853 cmd->InstructionMode | FunctionalMode));
2854
2855 if (FunctionalMode != QSPI_FUNCTIONAL_MODE_MEMORY_MAPPED)
2856 {
2857 /* Configure QSPI: AR register with address value */
2858 WRITE_REG(hqspi->Instance->AR, cmd->Address);
2859 }
2860 }
2861 else
2862 {
2863 /*---- Command with only alternate bytes ----*/
2864 /* Configure QSPI: CCR register with all communications parameters */
2865 WRITE_REG(hqspi->Instance->CCR, (cmd->DdrMode | cmd->DdrHoldHalfCycle | cmd->SIOOMode |
2866 cmd->DataMode | (cmd->DummyCycles << QUADSPI_CCR_DCYC_Pos) |
2867 cmd->AlternateBytesSize | cmd->AlternateByteMode |
2868 cmd->AddressMode | cmd->InstructionMode | FunctionalMode));
2869
2870 /* Clear AR register */
2871 CLEAR_REG(hqspi->Instance->AR);
2872 }
2873 }
2874 else
2875 {
2876 if (cmd->AddressMode != QSPI_ADDRESS_NONE)
2877 {
2878 /*---- Command with only address ----*/
2879 /* Configure QSPI: CCR register with all communications parameters */
2880 WRITE_REG(hqspi->Instance->CCR, (cmd->DdrMode | cmd->DdrHoldHalfCycle | cmd->SIOOMode |
2881 cmd->DataMode | (cmd->DummyCycles << QUADSPI_CCR_DCYC_Pos) |
2882 cmd->AlternateByteMode | cmd->AddressSize |
2883 cmd->AddressMode | cmd->InstructionMode | FunctionalMode));
2884
2885 if (FunctionalMode != QSPI_FUNCTIONAL_MODE_MEMORY_MAPPED)
2886 {
2887 /* Configure QSPI: AR register with address value */
2888 WRITE_REG(hqspi->Instance->AR, cmd->Address);
2889 }
2890 }
2891 else
2892 {
2893 /*---- Command with only data phase ----*/
2894 if (cmd->DataMode != QSPI_DATA_NONE)
2895 {
2896 /* Configure QSPI: CCR register with all communications parameters */
2897 WRITE_REG(hqspi->Instance->CCR, (cmd->DdrMode | cmd->DdrHoldHalfCycle | cmd->SIOOMode |
2898 cmd->DataMode | (cmd->DummyCycles << QUADSPI_CCR_DCYC_Pos) |
2899 cmd->AlternateByteMode | cmd->AddressMode |
2900 cmd->InstructionMode | FunctionalMode));
2901
2902 /* Clear AR register */
2903 CLEAR_REG(hqspi->Instance->AR);
2904 }
2905 }
2906 }
2907 }
2908}
2909
2918#endif /* HAL_QSPI_MODULE_ENABLED */
2927#endif /* defined(QUADSPI) */
#define DMA_MEMORY_TO_PERIPH
#define DMA_PERIPH_TO_MEMORY
#define HAL_DMA_ERROR_FE
HAL_StatusTypeDef HAL_DMA_Abort(DMA_HandleTypeDef *hdma)
Aborts the DMA Transfer.
HAL_StatusTypeDef HAL_DMA_Abort_IT(DMA_HandleTypeDef *hdma)
Aborts the DMA Transfer in Interrupt mode.
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.
uint32_t HAL_DMA_GetError(DMA_HandleTypeDef *hdma)
Return the DMA error code.
#define DMA_MINC_DISABLE
#define DMA_PDATAALIGN_BYTE
#define DMA_PDATAALIGN_WORD
#define DMA_PDATAALIGN_HALFWORD
#define DMA_PINC_ENABLE
#define __HAL_DMA_DISABLE(__HANDLE__)
Disable the specified DMA Stream.
uint32_t HAL_GetTick(void)
Provides a tick value in millisecond.
#define assert_param(expr)
This file contains all the functions prototypes for the HAL module driver.
HAL_StatusTypeDef
HAL Status structures definition
@ HAL_TIMEOUT
@ HAL_ERROR
@ HAL_OK
@ HAL_BUSY
#define UNUSED(X)
#define __HAL_UNLOCK(__HANDLE__)
#define HAL_MAX_DELAY
@ HAL_UNLOCKED
#define __HAL_LOCK(__HANDLE__)
DMA handle Structure definition.