STM32F4xx HAL Driver master
STM32CubeF4 HAL / LL Drivers API Reference
Loading...
Searching...
No Matches
stm32f4xx_hal_qspi.c
Go to the documentation of this file.
1
209
210/* Includes ------------------------------------------------------------------*/
211#include "stm32f4xx_hal.h"
212
213#if defined(QUADSPI)
214
218
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)
238
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))
250
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
269
285
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
462
482
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 (void)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 (void)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 transfer error Interrupt */
1383 __HAL_QSPI_ENABLE_IT(hqspi, QSPI_IT_TE);
1384
1385 /* Enable the DMA transfer by setting the DMAEN bit in the QSPI CR register */
1386 SET_BIT(hqspi->Instance->CR, QUADSPI_CR_DMAEN);
1387
1388
1389 /* Enable the QSPI transmit DMA Channel */
1390 if (HAL_DMA_Start_IT(hqspi->hdma, (uint32_t)pData, (uint32_t)&hqspi->Instance->DR, hqspi->TxXferSize) == HAL_OK)
1391 {
1392 /* Process unlocked */
1393 __HAL_UNLOCK(hqspi);
1394 }
1395 else
1396 {
1397 /* Disable the DMA transfer by clearing the DMAEN bit in the QSPI CR register */
1398 CLEAR_BIT(hqspi->Instance->CR, QUADSPI_CR_DMAEN);
1399
1400 status = HAL_ERROR;
1401 hqspi->ErrorCode |= HAL_QSPI_ERROR_DMA;
1402 hqspi->State = HAL_QSPI_STATE_READY;
1403
1404 /* Process unlocked */
1405 __HAL_UNLOCK(hqspi);
1406 }
1407 }
1408 }
1409 else
1410 {
1411 hqspi->ErrorCode |= HAL_QSPI_ERROR_INVALID_PARAM;
1412 status = HAL_ERROR;
1413
1414 /* Process unlocked */
1415 __HAL_UNLOCK(hqspi);
1416 }
1417 }
1418 else
1419 {
1420 status = HAL_BUSY;
1421
1422 /* Process unlocked */
1423 __HAL_UNLOCK(hqspi);
1424 }
1425
1426 return status;
1427}
1428
1440HAL_StatusTypeDef HAL_QSPI_Receive_DMA(QSPI_HandleTypeDef *hqspi, uint8_t *pData)
1441{
1442 HAL_StatusTypeDef status = HAL_OK;
1443 uint32_t addr_reg = READ_REG(hqspi->Instance->AR);
1444 uint32_t data_size = (READ_REG(hqspi->Instance->DLR) + 1U);
1445
1446 /* Process locked */
1447 __HAL_LOCK(hqspi);
1448
1449 if(hqspi->State == HAL_QSPI_STATE_READY)
1450 {
1451 /* Clear the error code */
1452 hqspi->ErrorCode = HAL_QSPI_ERROR_NONE;
1453
1454 if(pData != NULL )
1455 {
1456 /* Configure counters of the handle */
1457 if (hqspi->hdma->Init.PeriphDataAlignment == DMA_PDATAALIGN_BYTE)
1458 {
1459 hqspi->RxXferCount = data_size;
1460 }
1461 else if (hqspi->hdma->Init.PeriphDataAlignment == DMA_PDATAALIGN_HALFWORD)
1462 {
1463 if (((data_size % 2U) != 0U) || ((hqspi->Init.FifoThreshold % 2U) != 0U))
1464 {
1465 /* The number of data or the fifo threshold is not aligned on halfword
1466 => no transfer possible with DMA peripheral access configured as halfword */
1467 hqspi->ErrorCode |= HAL_QSPI_ERROR_INVALID_PARAM;
1468 status = HAL_ERROR;
1469
1470 /* Process unlocked */
1471 __HAL_UNLOCK(hqspi);
1472 }
1473 else
1474 {
1475 hqspi->RxXferCount = (data_size >> 1U);
1476 }
1477 }
1478 else if (hqspi->hdma->Init.PeriphDataAlignment == DMA_PDATAALIGN_WORD)
1479 {
1480 if (((data_size % 4U) != 0U) || ((hqspi->Init.FifoThreshold % 4U) != 0U))
1481 {
1482 /* The number of data or the fifo threshold is not aligned on word
1483 => no transfer possible with DMA peripheral access configured as word */
1484 hqspi->ErrorCode |= HAL_QSPI_ERROR_INVALID_PARAM;
1485 status = HAL_ERROR;
1486
1487 /* Process unlocked */
1488 __HAL_UNLOCK(hqspi);
1489 }
1490 else
1491 {
1492 hqspi->RxXferCount = (data_size >> 2U);
1493 }
1494 }
1495 else
1496 {
1497 /* Nothing to do */
1498 }
1499
1500 if (status == HAL_OK)
1501 {
1502 /* Update state */
1503 hqspi->State = HAL_QSPI_STATE_BUSY_INDIRECT_RX;
1504
1505 /* Clear interrupt */
1506 __HAL_QSPI_CLEAR_FLAG(hqspi, (QSPI_FLAG_TE | QSPI_FLAG_TC));
1507
1508 /* Configure size and pointer of the handle */
1509 hqspi->RxXferSize = hqspi->RxXferCount;
1510 hqspi->pRxBuffPtr = pData;
1511
1512 /* Set the QSPI DMA transfer complete callback */
1513 hqspi->hdma->XferCpltCallback = QSPI_DMARxCplt;
1514
1515 /* Set the QSPI DMA Half transfer complete callback */
1516 hqspi->hdma->XferHalfCpltCallback = QSPI_DMARxHalfCplt;
1517
1518 /* Set the DMA error callback */
1519 hqspi->hdma->XferErrorCallback = QSPI_DMAError;
1520
1521 /* Clear the DMA abort callback */
1522 hqspi->hdma->XferAbortCallback = NULL;
1523
1524#if defined (QSPI1_V2_1L)
1525 /* Bug "ES0305 section 2.1.8 In some specific cases, DMA2 data corruption occurs when managing
1526 AHB and APB2 peripherals in a concurrent way" Workaround Implementation:
1527 Change the following configuration of DMA peripheral
1528 - Enable peripheral increment
1529 - Disable memory increment
1530 - Set DMA direction as memory to peripheral mode
1531 - 4 Extra words (32-bits) are added for read operation to guarantee
1532 the last data is transferred from DMA FIFO to RAM memory */
1533
1534 /* Enable peripheral increment of the DMA */
1535 hqspi->hdma->Init.PeriphInc = DMA_PINC_ENABLE;
1536
1537 /* Disable memory increment of the DMA */
1538 hqspi->hdma->Init.MemInc = DMA_MINC_DISABLE;
1539
1540 /* Update peripheral/memory increment mode bits */
1541 MODIFY_REG(hqspi->hdma->Instance->CR, (DMA_SxCR_MINC | DMA_SxCR_PINC), (hqspi->hdma->Init.MemInc | hqspi->hdma->Init.PeriphInc));
1542
1543 /* Configure the direction of the DMA */
1544 hqspi->hdma->Init.Direction = DMA_MEMORY_TO_PERIPH;
1545
1546 /* 4 Extra words (32-bits) are needed for read operation to guarantee
1547 the last data is transferred from DMA FIFO to RAM memory */
1548 WRITE_REG(hqspi->Instance->DLR, (data_size - 1U + 16U));
1549
1550 /* Update direction mode bit */
1551 MODIFY_REG(hqspi->hdma->Instance->CR, DMA_SxCR_DIR, hqspi->hdma->Init.Direction);
1552
1553 /* Configure QSPI: CCR register with functional as indirect read */
1554 MODIFY_REG(hqspi->Instance->CCR, QUADSPI_CCR_FMODE, QSPI_FUNCTIONAL_MODE_INDIRECT_READ);
1555
1556 /* Start the transfer by re-writing the address in AR register */
1557 WRITE_REG(hqspi->Instance->AR, addr_reg);
1558
1559 /* Enable the QSPI transfer error Interrupt */
1560 __HAL_QSPI_ENABLE_IT(hqspi, QSPI_IT_TE);
1561
1562 /* Enable the DMA transfer by setting the DMAEN bit in the QSPI CR register */
1563 SET_BIT(hqspi->Instance->CR, QUADSPI_CR_DMAEN);
1564
1565 /* Enable the DMA Channel */
1566 if(HAL_DMA_Start_IT(hqspi->hdma, (uint32_t)&hqspi->Instance->DR, (uint32_t)pData, hqspi->RxXferSize) == HAL_OK)
1567 {
1568 /* Process unlocked */
1569 __HAL_UNLOCK(hqspi);
1570 }
1571 else
1572 {
1573 /* Disable the DMA transfer by clearing the DMAEN bit in the QSPI CR register */
1574 CLEAR_BIT(hqspi->Instance->CR, QUADSPI_CR_DMAEN);
1575
1576 status = HAL_ERROR;
1577 hqspi->ErrorCode |= HAL_QSPI_ERROR_DMA;
1578 hqspi->State = HAL_QSPI_STATE_READY;
1579
1580 /* Process unlocked */
1581 __HAL_UNLOCK(hqspi);
1582 }
1583#else
1584 /* Configure the direction of the DMA */
1585 hqspi->hdma->Init.Direction = DMA_PERIPH_TO_MEMORY;
1586
1587 /* Update direction mode bit */
1588 MODIFY_REG(hqspi->hdma->Instance->CR, DMA_SxCR_DIR, hqspi->hdma->Init.Direction);
1589
1590 /* Configure QSPI: CCR register with functional as indirect read */
1591 MODIFY_REG(hqspi->Instance->CCR, QUADSPI_CCR_FMODE, QSPI_FUNCTIONAL_MODE_INDIRECT_READ);
1592
1593 /* Start the transfer by re-writing the address in AR register */
1594 WRITE_REG(hqspi->Instance->AR, addr_reg);
1595
1596 /* Enable the QSPI transfer error Interrupt */
1597 __HAL_QSPI_ENABLE_IT(hqspi, QSPI_IT_TE);
1598
1599 /* Enable the DMA transfer by setting the DMAEN bit in the QSPI CR register */
1600 SET_BIT(hqspi->Instance->CR, QUADSPI_CR_DMAEN);
1601
1602 /* Enable the DMA Channel */
1603 if(HAL_DMA_Start_IT(hqspi->hdma, (uint32_t)&hqspi->Instance->DR, (uint32_t)pData, hqspi->RxXferSize)== HAL_OK)
1604 {
1605 /* Process unlocked */
1606 __HAL_UNLOCK(hqspi);
1607 }
1608 else
1609 {
1610 /* Disable the DMA transfer by clearing the DMAEN bit in the QSPI CR register */
1611 CLEAR_BIT(hqspi->Instance->CR, QUADSPI_CR_DMAEN);
1612
1613 status = HAL_ERROR;
1614 hqspi->ErrorCode |= HAL_QSPI_ERROR_DMA;
1615 hqspi->State = HAL_QSPI_STATE_READY;
1616
1617 /* Process unlocked */
1618 __HAL_UNLOCK(hqspi);
1619 }
1620#endif /* QSPI1_V2_1L */
1621 }
1622 }
1623 else
1624 {
1625 hqspi->ErrorCode |= HAL_QSPI_ERROR_INVALID_PARAM;
1626 status = HAL_ERROR;
1627
1628 /* Process unlocked */
1629 __HAL_UNLOCK(hqspi);
1630 }
1631 }
1632 else
1633 {
1634 status = HAL_BUSY;
1635
1636 /* Process unlocked */
1637 __HAL_UNLOCK(hqspi);
1638 }
1639
1640 return status;
1641}
1642
1652HAL_StatusTypeDef HAL_QSPI_AutoPolling(QSPI_HandleTypeDef *hqspi, QSPI_CommandTypeDef *cmd, QSPI_AutoPollingTypeDef *cfg, uint32_t Timeout)
1653{
1654 HAL_StatusTypeDef status;
1655 uint32_t tickstart = HAL_GetTick();
1656
1657 /* Check the parameters */
1658 assert_param(IS_QSPI_INSTRUCTION_MODE(cmd->InstructionMode));
1659 if (cmd->InstructionMode != QSPI_INSTRUCTION_NONE)
1660 {
1661 assert_param(IS_QSPI_INSTRUCTION(cmd->Instruction));
1662 }
1663
1664 assert_param(IS_QSPI_ADDRESS_MODE(cmd->AddressMode));
1665 if (cmd->AddressMode != QSPI_ADDRESS_NONE)
1666 {
1667 assert_param(IS_QSPI_ADDRESS_SIZE(cmd->AddressSize));
1668 }
1669
1670 assert_param(IS_QSPI_ALTERNATE_BYTES_MODE(cmd->AlternateByteMode));
1671 if (cmd->AlternateByteMode != QSPI_ALTERNATE_BYTES_NONE)
1672 {
1673 assert_param(IS_QSPI_ALTERNATE_BYTES_SIZE(cmd->AlternateBytesSize));
1674 }
1675
1676 assert_param(IS_QSPI_DUMMY_CYCLES(cmd->DummyCycles));
1677 assert_param(IS_QSPI_DATA_MODE(cmd->DataMode));
1678
1679 assert_param(IS_QSPI_DDR_MODE(cmd->DdrMode));
1680 assert_param(IS_QSPI_DDR_HHC(cmd->DdrHoldHalfCycle));
1681 assert_param(IS_QSPI_SIOO_MODE(cmd->SIOOMode));
1682
1683 assert_param(IS_QSPI_INTERVAL(cfg->Interval));
1684 assert_param(IS_QSPI_STATUS_BYTES_SIZE(cfg->StatusBytesSize));
1685 assert_param(IS_QSPI_MATCH_MODE(cfg->MatchMode));
1686
1687 /* Process locked */
1688 __HAL_LOCK(hqspi);
1689
1690 if(hqspi->State == HAL_QSPI_STATE_READY)
1691 {
1692 hqspi->ErrorCode = HAL_QSPI_ERROR_NONE;
1693
1694 /* Update state */
1695 hqspi->State = HAL_QSPI_STATE_BUSY_AUTO_POLLING;
1696
1697 /* Wait till BUSY flag reset */
1698 status = QSPI_WaitFlagStateUntilTimeout(hqspi, QSPI_FLAG_BUSY, RESET, tickstart, Timeout);
1699
1700 if (status == HAL_OK)
1701 {
1702 /* Configure QSPI: PSMAR register with the status match value */
1703 WRITE_REG(hqspi->Instance->PSMAR, cfg->Match);
1704
1705 /* Configure QSPI: PSMKR register with the status mask value */
1706 WRITE_REG(hqspi->Instance->PSMKR, cfg->Mask);
1707
1708 /* Configure QSPI: PIR register with the interval value */
1709 WRITE_REG(hqspi->Instance->PIR, cfg->Interval);
1710
1711 /* Configure QSPI: CR register with Match mode and Automatic stop enabled
1712 (otherwise there will be an infinite loop in blocking mode) */
1713 MODIFY_REG(hqspi->Instance->CR, (QUADSPI_CR_PMM | QUADSPI_CR_APMS),
1714 (cfg->MatchMode | QSPI_AUTOMATIC_STOP_ENABLE));
1715
1716 /* Call the configuration function */
1717 cmd->NbData = cfg->StatusBytesSize;
1718 QSPI_Config(hqspi, cmd, QSPI_FUNCTIONAL_MODE_AUTO_POLLING);
1719
1720 /* Wait until SM flag is set to go back in idle state */
1721 status = QSPI_WaitFlagStateUntilTimeout(hqspi, QSPI_FLAG_SM, SET, tickstart, Timeout);
1722
1723 if (status == HAL_OK)
1724 {
1725 __HAL_QSPI_CLEAR_FLAG(hqspi, QSPI_FLAG_SM);
1726
1727 /* Update state */
1728 hqspi->State = HAL_QSPI_STATE_READY;
1729 }
1730 }
1731 }
1732 else
1733 {
1734 status = HAL_BUSY;
1735 }
1736
1737 /* Process unlocked */
1738 __HAL_UNLOCK(hqspi);
1739
1740 /* Return function status */
1741 return status;
1742}
1743
1752HAL_StatusTypeDef HAL_QSPI_AutoPolling_IT(QSPI_HandleTypeDef *hqspi, QSPI_CommandTypeDef *cmd, QSPI_AutoPollingTypeDef *cfg)
1753{
1754 HAL_StatusTypeDef status;
1755
1756 /* Check the parameters */
1757 assert_param(IS_QSPI_INSTRUCTION_MODE(cmd->InstructionMode));
1758 if (cmd->InstructionMode != QSPI_INSTRUCTION_NONE)
1759 {
1760 assert_param(IS_QSPI_INSTRUCTION(cmd->Instruction));
1761 }
1762
1763 assert_param(IS_QSPI_ADDRESS_MODE(cmd->AddressMode));
1764 if (cmd->AddressMode != QSPI_ADDRESS_NONE)
1765 {
1766 assert_param(IS_QSPI_ADDRESS_SIZE(cmd->AddressSize));
1767 }
1768
1769 assert_param(IS_QSPI_ALTERNATE_BYTES_MODE(cmd->AlternateByteMode));
1770 if (cmd->AlternateByteMode != QSPI_ALTERNATE_BYTES_NONE)
1771 {
1772 assert_param(IS_QSPI_ALTERNATE_BYTES_SIZE(cmd->AlternateBytesSize));
1773 }
1774
1775 assert_param(IS_QSPI_DUMMY_CYCLES(cmd->DummyCycles));
1776 assert_param(IS_QSPI_DATA_MODE(cmd->DataMode));
1777
1778 assert_param(IS_QSPI_DDR_MODE(cmd->DdrMode));
1779 assert_param(IS_QSPI_DDR_HHC(cmd->DdrHoldHalfCycle));
1780 assert_param(IS_QSPI_SIOO_MODE(cmd->SIOOMode));
1781
1782 assert_param(IS_QSPI_INTERVAL(cfg->Interval));
1783 assert_param(IS_QSPI_STATUS_BYTES_SIZE(cfg->StatusBytesSize));
1784 assert_param(IS_QSPI_MATCH_MODE(cfg->MatchMode));
1785 assert_param(IS_QSPI_AUTOMATIC_STOP(cfg->AutomaticStop));
1786
1787 /* Process locked */
1788 __HAL_LOCK(hqspi);
1789
1790 if(hqspi->State == HAL_QSPI_STATE_READY)
1791 {
1792 hqspi->ErrorCode = HAL_QSPI_ERROR_NONE;
1793
1794 /* Update state */
1795 hqspi->State = HAL_QSPI_STATE_BUSY_AUTO_POLLING;
1796
1797 /* Wait till BUSY flag reset */
1798 status = QSPI_WaitFlagStateUntilTimeout_CPUCycle(hqspi, QSPI_FLAG_BUSY, RESET, hqspi->Timeout);
1799
1800 if (status == HAL_OK)
1801 {
1802 /* Configure QSPI: PSMAR register with the status match value */
1803 WRITE_REG(hqspi->Instance->PSMAR, cfg->Match);
1804
1805 /* Configure QSPI: PSMKR register with the status mask value */
1806 WRITE_REG(hqspi->Instance->PSMKR, cfg->Mask);
1807
1808 /* Configure QSPI: PIR register with the interval value */
1809 WRITE_REG(hqspi->Instance->PIR, cfg->Interval);
1810
1811 /* Configure QSPI: CR register with Match mode and Automatic stop mode */
1812 MODIFY_REG(hqspi->Instance->CR, (QUADSPI_CR_PMM | QUADSPI_CR_APMS),
1813 (cfg->MatchMode | cfg->AutomaticStop));
1814
1815 /* Clear interrupt */
1816 __HAL_QSPI_CLEAR_FLAG(hqspi, QSPI_FLAG_TE | QSPI_FLAG_SM);
1817
1818 /* Call the configuration function */
1819 cmd->NbData = cfg->StatusBytesSize;
1820 QSPI_Config(hqspi, cmd, QSPI_FUNCTIONAL_MODE_AUTO_POLLING);
1821
1822 /* Process unlocked */
1823 __HAL_UNLOCK(hqspi);
1824
1825 /* Enable the QSPI Transfer Error and status match Interrupt */
1826 __HAL_QSPI_ENABLE_IT(hqspi, (QSPI_IT_SM | QSPI_IT_TE));
1827
1828 }
1829 else
1830 {
1831 /* Process unlocked */
1832 __HAL_UNLOCK(hqspi);
1833 }
1834 }
1835 else
1836 {
1837 status = HAL_BUSY;
1838
1839 /* Process unlocked */
1840 __HAL_UNLOCK(hqspi);
1841 }
1842
1843 /* Return function status */
1844 return status;
1845}
1846
1855HAL_StatusTypeDef HAL_QSPI_MemoryMapped(QSPI_HandleTypeDef *hqspi, QSPI_CommandTypeDef *cmd, QSPI_MemoryMappedTypeDef *cfg)
1856{
1857 HAL_StatusTypeDef status;
1858 uint32_t tickstart = HAL_GetTick();
1859
1860 /* Check the parameters */
1861 assert_param(IS_QSPI_INSTRUCTION_MODE(cmd->InstructionMode));
1862 if (cmd->InstructionMode != QSPI_INSTRUCTION_NONE)
1863 {
1864 assert_param(IS_QSPI_INSTRUCTION(cmd->Instruction));
1865 }
1866
1867 assert_param(IS_QSPI_ADDRESS_MODE(cmd->AddressMode));
1868 if (cmd->AddressMode != QSPI_ADDRESS_NONE)
1869 {
1870 assert_param(IS_QSPI_ADDRESS_SIZE(cmd->AddressSize));
1871 }
1872
1873 assert_param(IS_QSPI_ALTERNATE_BYTES_MODE(cmd->AlternateByteMode));
1874 if (cmd->AlternateByteMode != QSPI_ALTERNATE_BYTES_NONE)
1875 {
1876 assert_param(IS_QSPI_ALTERNATE_BYTES_SIZE(cmd->AlternateBytesSize));
1877 }
1878
1879 assert_param(IS_QSPI_DUMMY_CYCLES(cmd->DummyCycles));
1880 assert_param(IS_QSPI_DATA_MODE(cmd->DataMode));
1881
1882 assert_param(IS_QSPI_DDR_MODE(cmd->DdrMode));
1883 assert_param(IS_QSPI_DDR_HHC(cmd->DdrHoldHalfCycle));
1884 assert_param(IS_QSPI_SIOO_MODE(cmd->SIOOMode));
1885
1886 assert_param(IS_QSPI_TIMEOUT_ACTIVATION(cfg->TimeOutActivation));
1887
1888 /* Process locked */
1889 __HAL_LOCK(hqspi);
1890
1891 if(hqspi->State == HAL_QSPI_STATE_READY)
1892 {
1893 hqspi->ErrorCode = HAL_QSPI_ERROR_NONE;
1894
1895 /* Update state */
1896 hqspi->State = HAL_QSPI_STATE_BUSY_MEM_MAPPED;
1897
1898 /* Wait till BUSY flag reset */
1899 status = QSPI_WaitFlagStateUntilTimeout(hqspi, QSPI_FLAG_BUSY, RESET, tickstart, hqspi->Timeout);
1900
1901 if (status == HAL_OK)
1902 {
1903 /* Configure QSPI: CR register with timeout counter enable */
1904 MODIFY_REG(hqspi->Instance->CR, QUADSPI_CR_TCEN, cfg->TimeOutActivation);
1905
1906 if (cfg->TimeOutActivation == QSPI_TIMEOUT_COUNTER_ENABLE)
1907 {
1908 assert_param(IS_QSPI_TIMEOUT_PERIOD(cfg->TimeOutPeriod));
1909
1910 /* Configure QSPI: LPTR register with the low-power timeout value */
1911 WRITE_REG(hqspi->Instance->LPTR, cfg->TimeOutPeriod);
1912
1913 /* Clear interrupt */
1914 __HAL_QSPI_CLEAR_FLAG(hqspi, QSPI_FLAG_TO);
1915
1916 /* Enable the QSPI TimeOut Interrupt */
1917 __HAL_QSPI_ENABLE_IT(hqspi, QSPI_IT_TO);
1918 }
1919
1920 /* Call the configuration function */
1921 QSPI_Config(hqspi, cmd, QSPI_FUNCTIONAL_MODE_MEMORY_MAPPED);
1922 }
1923 }
1924 else
1925 {
1926 status = HAL_BUSY;
1927 }
1928
1929 /* Process unlocked */
1930 __HAL_UNLOCK(hqspi);
1931
1932 /* Return function status */
1933 return status;
1934}
1935
1941__weak void HAL_QSPI_ErrorCallback(QSPI_HandleTypeDef *hqspi)
1942{
1943 /* Prevent unused argument(s) compilation warning */
1944 UNUSED(hqspi);
1945
1946 /* NOTE : This function should not be modified, when the callback is needed,
1947 the HAL_QSPI_ErrorCallback could be implemented in the user file
1948 */
1949}
1950
1956__weak void HAL_QSPI_AbortCpltCallback(QSPI_HandleTypeDef *hqspi)
1957{
1958 /* Prevent unused argument(s) compilation warning */
1959 UNUSED(hqspi);
1960
1961 /* NOTE: This function should not be modified, when the callback is needed,
1962 the HAL_QSPI_AbortCpltCallback could be implemented in the user file
1963 */
1964}
1965
1971__weak void HAL_QSPI_CmdCpltCallback(QSPI_HandleTypeDef *hqspi)
1972{
1973 /* Prevent unused argument(s) compilation warning */
1974 UNUSED(hqspi);
1975
1976 /* NOTE: This function should not be modified, when the callback is needed,
1977 the HAL_QSPI_CmdCpltCallback could be implemented in the user file
1978 */
1979}
1980
1986__weak void HAL_QSPI_RxCpltCallback(QSPI_HandleTypeDef *hqspi)
1987{
1988 /* Prevent unused argument(s) compilation warning */
1989 UNUSED(hqspi);
1990
1991 /* NOTE: This function should not be modified, when the callback is needed,
1992 the HAL_QSPI_RxCpltCallback could be implemented in the user file
1993 */
1994}
1995
2001__weak void HAL_QSPI_TxCpltCallback(QSPI_HandleTypeDef *hqspi)
2002{
2003 /* Prevent unused argument(s) compilation warning */
2004 UNUSED(hqspi);
2005
2006 /* NOTE: This function should not be modified, when the callback is needed,
2007 the HAL_QSPI_TxCpltCallback could be implemented in the user file
2008 */
2009}
2010
2016__weak void HAL_QSPI_RxHalfCpltCallback(QSPI_HandleTypeDef *hqspi)
2017{
2018 /* Prevent unused argument(s) compilation warning */
2019 UNUSED(hqspi);
2020
2021 /* NOTE: This function should not be modified, when the callback is needed,
2022 the HAL_QSPI_RxHalfCpltCallback could be implemented in the user file
2023 */
2024}
2025
2031__weak void HAL_QSPI_TxHalfCpltCallback(QSPI_HandleTypeDef *hqspi)
2032{
2033 /* Prevent unused argument(s) compilation warning */
2034 UNUSED(hqspi);
2035
2036 /* NOTE: This function should not be modified, when the callback is needed,
2037 the HAL_QSPI_TxHalfCpltCallback could be implemented in the user file
2038 */
2039}
2040
2046__weak void HAL_QSPI_FifoThresholdCallback(QSPI_HandleTypeDef *hqspi)
2047{
2048 /* Prevent unused argument(s) compilation warning */
2049 UNUSED(hqspi);
2050
2051 /* NOTE : This function should not be modified, when the callback is needed,
2052 the HAL_QSPI_FIFOThresholdCallback could be implemented in the user file
2053 */
2054}
2055
2061__weak void HAL_QSPI_StatusMatchCallback(QSPI_HandleTypeDef *hqspi)
2062{
2063 /* Prevent unused argument(s) compilation warning */
2064 UNUSED(hqspi);
2065
2066 /* NOTE : This function should not be modified, when the callback is needed,
2067 the HAL_QSPI_StatusMatchCallback could be implemented in the user file
2068 */
2069}
2070
2076__weak void HAL_QSPI_TimeOutCallback(QSPI_HandleTypeDef *hqspi)
2077{
2078 /* Prevent unused argument(s) compilation warning */
2079 UNUSED(hqspi);
2080
2081 /* NOTE : This function should not be modified, when the callback is needed,
2082 the HAL_QSPI_TimeOutCallback could be implemented in the user file
2083 */
2084}
2085#if (USE_HAL_QSPI_REGISTER_CALLBACKS == 1)
2107HAL_StatusTypeDef HAL_QSPI_RegisterCallback (QSPI_HandleTypeDef *hqspi, HAL_QSPI_CallbackIDTypeDef CallbackId, pQSPI_CallbackTypeDef pCallback)
2108{
2109 HAL_StatusTypeDef status = HAL_OK;
2110
2111 if(pCallback == NULL)
2112 {
2113 /* Update the error code */
2114 hqspi->ErrorCode |= HAL_QSPI_ERROR_INVALID_CALLBACK;
2115 return HAL_ERROR;
2116 }
2117
2118 /* Process locked */
2119 __HAL_LOCK(hqspi);
2120
2121 if(hqspi->State == HAL_QSPI_STATE_READY)
2122 {
2123 switch (CallbackId)
2124 {
2125 case HAL_QSPI_ERROR_CB_ID :
2126 hqspi->ErrorCallback = pCallback;
2127 break;
2128 case HAL_QSPI_ABORT_CB_ID :
2129 hqspi->AbortCpltCallback = pCallback;
2130 break;
2131 case HAL_QSPI_FIFO_THRESHOLD_CB_ID :
2132 hqspi->FifoThresholdCallback = pCallback;
2133 break;
2134 case HAL_QSPI_CMD_CPLT_CB_ID :
2135 hqspi->CmdCpltCallback = pCallback;
2136 break;
2137 case HAL_QSPI_RX_CPLT_CB_ID :
2138 hqspi->RxCpltCallback = pCallback;
2139 break;
2140 case HAL_QSPI_TX_CPLT_CB_ID :
2141 hqspi->TxCpltCallback = pCallback;
2142 break;
2143 case HAL_QSPI_RX_HALF_CPLT_CB_ID :
2144 hqspi->RxHalfCpltCallback = pCallback;
2145 break;
2146 case HAL_QSPI_TX_HALF_CPLT_CB_ID :
2147 hqspi->TxHalfCpltCallback = pCallback;
2148 break;
2149 case HAL_QSPI_STATUS_MATCH_CB_ID :
2150 hqspi->StatusMatchCallback = pCallback;
2151 break;
2152 case HAL_QSPI_TIMEOUT_CB_ID :
2153 hqspi->TimeOutCallback = pCallback;
2154 break;
2155 case HAL_QSPI_MSP_INIT_CB_ID :
2156 hqspi->MspInitCallback = pCallback;
2157 break;
2158 case HAL_QSPI_MSP_DEINIT_CB_ID :
2159 hqspi->MspDeInitCallback = pCallback;
2160 break;
2161 default :
2162 /* Update the error code */
2163 hqspi->ErrorCode |= HAL_QSPI_ERROR_INVALID_CALLBACK;
2164 /* update return status */
2165 status = HAL_ERROR;
2166 break;
2167 }
2168 }
2169 else if (hqspi->State == HAL_QSPI_STATE_RESET)
2170 {
2171 switch (CallbackId)
2172 {
2173 case HAL_QSPI_MSP_INIT_CB_ID :
2174 hqspi->MspInitCallback = pCallback;
2175 break;
2176 case HAL_QSPI_MSP_DEINIT_CB_ID :
2177 hqspi->MspDeInitCallback = pCallback;
2178 break;
2179 default :
2180 /* Update the error code */
2181 hqspi->ErrorCode |= HAL_QSPI_ERROR_INVALID_CALLBACK;
2182 /* update return status */
2183 status = HAL_ERROR;
2184 break;
2185 }
2186 }
2187 else
2188 {
2189 /* Update the error code */
2190 hqspi->ErrorCode |= HAL_QSPI_ERROR_INVALID_CALLBACK;
2191 /* update return status */
2192 status = HAL_ERROR;
2193 }
2194
2195 /* Release Lock */
2196 __HAL_UNLOCK(hqspi);
2197 return status;
2198}
2199
2220HAL_StatusTypeDef HAL_QSPI_UnRegisterCallback (QSPI_HandleTypeDef *hqspi, HAL_QSPI_CallbackIDTypeDef CallbackId)
2221{
2222 HAL_StatusTypeDef status = HAL_OK;
2223
2224 /* Process locked */
2225 __HAL_LOCK(hqspi);
2226
2227 if(hqspi->State == HAL_QSPI_STATE_READY)
2228 {
2229 switch (CallbackId)
2230 {
2231 case HAL_QSPI_ERROR_CB_ID :
2232 hqspi->ErrorCallback = HAL_QSPI_ErrorCallback;
2233 break;
2234 case HAL_QSPI_ABORT_CB_ID :
2235 hqspi->AbortCpltCallback = HAL_QSPI_AbortCpltCallback;
2236 break;
2237 case HAL_QSPI_FIFO_THRESHOLD_CB_ID :
2238 hqspi->FifoThresholdCallback = HAL_QSPI_FifoThresholdCallback;
2239 break;
2240 case HAL_QSPI_CMD_CPLT_CB_ID :
2241 hqspi->CmdCpltCallback = HAL_QSPI_CmdCpltCallback;
2242 break;
2243 case HAL_QSPI_RX_CPLT_CB_ID :
2244 hqspi->RxCpltCallback = HAL_QSPI_RxCpltCallback;
2245 break;
2246 case HAL_QSPI_TX_CPLT_CB_ID :
2247 hqspi->TxCpltCallback = HAL_QSPI_TxCpltCallback;
2248 break;
2249 case HAL_QSPI_RX_HALF_CPLT_CB_ID :
2250 hqspi->RxHalfCpltCallback = HAL_QSPI_RxHalfCpltCallback;
2251 break;
2252 case HAL_QSPI_TX_HALF_CPLT_CB_ID :
2253 hqspi->TxHalfCpltCallback = HAL_QSPI_TxHalfCpltCallback;
2254 break;
2255 case HAL_QSPI_STATUS_MATCH_CB_ID :
2256 hqspi->StatusMatchCallback = HAL_QSPI_StatusMatchCallback;
2257 break;
2258 case HAL_QSPI_TIMEOUT_CB_ID :
2259 hqspi->TimeOutCallback = HAL_QSPI_TimeOutCallback;
2260 break;
2261 case HAL_QSPI_MSP_INIT_CB_ID :
2262 hqspi->MspInitCallback = HAL_QSPI_MspInit;
2263 break;
2264 case HAL_QSPI_MSP_DEINIT_CB_ID :
2265 hqspi->MspDeInitCallback = HAL_QSPI_MspDeInit;
2266 break;
2267 default :
2268 /* Update the error code */
2269 hqspi->ErrorCode |= HAL_QSPI_ERROR_INVALID_CALLBACK;
2270 /* update return status */
2271 status = HAL_ERROR;
2272 break;
2273 }
2274 }
2275 else if (hqspi->State == HAL_QSPI_STATE_RESET)
2276 {
2277 switch (CallbackId)
2278 {
2279 case HAL_QSPI_MSP_INIT_CB_ID :
2280 hqspi->MspInitCallback = HAL_QSPI_MspInit;
2281 break;
2282 case HAL_QSPI_MSP_DEINIT_CB_ID :
2283 hqspi->MspDeInitCallback = HAL_QSPI_MspDeInit;
2284 break;
2285 default :
2286 /* Update the error code */
2287 hqspi->ErrorCode |= HAL_QSPI_ERROR_INVALID_CALLBACK;
2288 /* update return status */
2289 status = HAL_ERROR;
2290 break;
2291 }
2292 }
2293 else
2294 {
2295 /* Update the error code */
2296 hqspi->ErrorCode |= HAL_QSPI_ERROR_INVALID_CALLBACK;
2297 /* update return status */
2298 status = HAL_ERROR;
2299 }
2300
2301 /* Release Lock */
2302 __HAL_UNLOCK(hqspi);
2303 return status;
2304}
2305#endif
2306
2310
2328
2334HAL_QSPI_StateTypeDef HAL_QSPI_GetState(const QSPI_HandleTypeDef *hqspi)
2335{
2336 /* Return QSPI handle state */
2337 return hqspi->State;
2338}
2339
2345uint32_t HAL_QSPI_GetError(const QSPI_HandleTypeDef *hqspi)
2346{
2347 return hqspi->ErrorCode;
2348}
2349
2355HAL_StatusTypeDef HAL_QSPI_Abort(QSPI_HandleTypeDef *hqspi)
2356{
2357 HAL_StatusTypeDef status = HAL_OK;
2358 uint32_t tickstart = HAL_GetTick();
2359
2360 /* Check if the state is in one of the busy states */
2361 if (((uint32_t)hqspi->State & 0x2U) != 0U)
2362 {
2363 /* Process unlocked */
2364 __HAL_UNLOCK(hqspi);
2365
2366 if ((hqspi->Instance->CR & QUADSPI_CR_DMAEN) != 0U)
2367 {
2368 /* Disable the DMA transfer by clearing the DMAEN bit in the QSPI CR register */
2369 CLEAR_BIT(hqspi->Instance->CR, QUADSPI_CR_DMAEN);
2370
2371 /* Abort DMA channel */
2372 status = HAL_DMA_Abort(hqspi->hdma);
2373 if(status != HAL_OK)
2374 {
2375 hqspi->ErrorCode |= HAL_QSPI_ERROR_DMA;
2376 }
2377 }
2378
2379 if (__HAL_QSPI_GET_FLAG(hqspi, QSPI_FLAG_BUSY) != RESET)
2380 {
2381 /* Configure QSPI: CR register with Abort request */
2382 SET_BIT(hqspi->Instance->CR, QUADSPI_CR_ABORT);
2383
2384 /* Wait until TC flag is set to go back in idle state */
2385 status = QSPI_WaitFlagStateUntilTimeout(hqspi, QSPI_FLAG_TC, SET, tickstart, hqspi->Timeout);
2386
2387 if (status == HAL_OK)
2388 {
2389 __HAL_QSPI_CLEAR_FLAG(hqspi, QSPI_FLAG_TC);
2390
2391 /* Wait until BUSY flag is reset */
2392 status = QSPI_WaitFlagStateUntilTimeout(hqspi, QSPI_FLAG_BUSY, RESET, tickstart, hqspi->Timeout);
2393 }
2394
2395 if (status == HAL_OK)
2396 {
2397 /* Reset functional mode configuration to indirect write mode by default */
2398 CLEAR_BIT(hqspi->Instance->CCR, QUADSPI_CCR_FMODE);
2399
2400 /* Update state */
2401 hqspi->State = HAL_QSPI_STATE_READY;
2402 }
2403 }
2404 else
2405 {
2406 /* Update state */
2407 hqspi->State = HAL_QSPI_STATE_READY;
2408 }
2409 }
2410
2411 return status;
2412}
2413
2419HAL_StatusTypeDef HAL_QSPI_Abort_IT(QSPI_HandleTypeDef *hqspi)
2420{
2421 HAL_StatusTypeDef status = HAL_OK;
2422
2423 /* Check if the state is in one of the busy states */
2424 if (((uint32_t)hqspi->State & 0x2U) != 0U)
2425 {
2426 /* Process unlocked */
2427 __HAL_UNLOCK(hqspi);
2428
2429 /* Update QSPI state */
2430 hqspi->State = HAL_QSPI_STATE_ABORT;
2431
2432 /* Disable all interrupts */
2433 __HAL_QSPI_DISABLE_IT(hqspi, (QSPI_IT_TO | QSPI_IT_SM | QSPI_IT_FT | QSPI_IT_TC | QSPI_IT_TE));
2434
2435 if ((hqspi->Instance->CR & QUADSPI_CR_DMAEN) != 0U)
2436 {
2437 /* Disable the DMA transfer by clearing the DMAEN bit in the QSPI CR register */
2438 CLEAR_BIT(hqspi->Instance->CR, QUADSPI_CR_DMAEN);
2439
2440 /* Abort DMA channel */
2441 hqspi->hdma->XferAbortCallback = QSPI_DMAAbortCplt;
2442 if (HAL_DMA_Abort_IT(hqspi->hdma) != HAL_OK)
2443 {
2444 /* Change state of QSPI */
2445 hqspi->State = HAL_QSPI_STATE_READY;
2446
2447 /* Abort Complete callback */
2448#if (USE_HAL_QSPI_REGISTER_CALLBACKS == 1)
2449 hqspi->AbortCpltCallback(hqspi);
2450#else
2451 HAL_QSPI_AbortCpltCallback(hqspi);
2452#endif
2453 }
2454 }
2455 else
2456 {
2457 if (__HAL_QSPI_GET_FLAG(hqspi, QSPI_FLAG_BUSY) != RESET)
2458 {
2459 /* Clear interrupt */
2460 __HAL_QSPI_CLEAR_FLAG(hqspi, QSPI_FLAG_TC);
2461
2462 /* Enable the QSPI Transfer Complete Interrupt */
2463 __HAL_QSPI_ENABLE_IT(hqspi, QSPI_IT_TC);
2464
2465 /* Configure QSPI: CR register with Abort request */
2466 SET_BIT(hqspi->Instance->CR, QUADSPI_CR_ABORT);
2467 }
2468 else
2469 {
2470 /* Change state of QSPI */
2471 hqspi->State = HAL_QSPI_STATE_READY;
2472 }
2473 }
2474 }
2475 return status;
2476}
2477
2483void HAL_QSPI_SetTimeout(QSPI_HandleTypeDef *hqspi, uint32_t Timeout)
2484{
2485 hqspi->Timeout = Timeout;
2486}
2487
2493HAL_StatusTypeDef HAL_QSPI_SetFifoThreshold(QSPI_HandleTypeDef *hqspi, uint32_t Threshold)
2494{
2495 HAL_StatusTypeDef status = HAL_OK;
2496
2497 /* Process locked */
2498 __HAL_LOCK(hqspi);
2499
2500 if(hqspi->State == HAL_QSPI_STATE_READY)
2501 {
2502 /* Synchronize init structure with new FIFO threshold value */
2503 hqspi->Init.FifoThreshold = Threshold;
2504
2505 /* Configure QSPI FIFO Threshold */
2506 MODIFY_REG(hqspi->Instance->CR, QUADSPI_CR_FTHRES,
2507 ((hqspi->Init.FifoThreshold - 1U) << QUADSPI_CR_FTHRES_Pos));
2508 }
2509 else
2510 {
2511 status = HAL_BUSY;
2512 }
2513
2514 /* Process unlocked */
2515 __HAL_UNLOCK(hqspi);
2516
2517 /* Return function status */
2518 return status;
2519}
2520
2525uint32_t HAL_QSPI_GetFifoThreshold(const QSPI_HandleTypeDef *hqspi)
2526{
2527 return ((READ_BIT(hqspi->Instance->CR, QUADSPI_CR_FTHRES) >> QUADSPI_CR_FTHRES_Pos) + 1U);
2528}
2529
2537HAL_StatusTypeDef HAL_QSPI_SetFlashID(QSPI_HandleTypeDef *hqspi, uint32_t FlashID)
2538{
2539 HAL_StatusTypeDef status = HAL_OK;
2540
2541 /* Check the parameter */
2542 assert_param(IS_QSPI_FLASH_ID(FlashID));
2543
2544 /* Process locked */
2545 __HAL_LOCK(hqspi);
2546
2547 if(hqspi->State == HAL_QSPI_STATE_READY)
2548 {
2549 /* Synchronize init structure with new FlashID value */
2550 hqspi->Init.FlashID = FlashID;
2551
2552 /* Configure QSPI FlashID */
2553 MODIFY_REG(hqspi->Instance->CR, QUADSPI_CR_FSEL, FlashID);
2554 }
2555 else
2556 {
2557 status = HAL_BUSY;
2558 }
2559
2560 /* Process unlocked */
2561 __HAL_UNLOCK(hqspi);
2562
2563 /* Return function status */
2564 return status;
2565}
2566
2570
2574
2578
2584static void QSPI_DMARxCplt(DMA_HandleTypeDef *hdma)
2585{
2586 QSPI_HandleTypeDef* hqspi = (QSPI_HandleTypeDef*)(hdma->Parent);
2587 hqspi->RxXferCount = 0U;
2588
2589 /* Enable the QSPI transfer complete Interrupt */
2590 __HAL_QSPI_ENABLE_IT(hqspi, QSPI_IT_TC);
2591}
2592
2598static void QSPI_DMATxCplt(DMA_HandleTypeDef *hdma)
2599{
2600 QSPI_HandleTypeDef* hqspi = (QSPI_HandleTypeDef*)(hdma->Parent);
2601 hqspi->TxXferCount = 0U;
2602
2603 /* Enable the QSPI transfer complete Interrupt */
2604 __HAL_QSPI_ENABLE_IT(hqspi, QSPI_IT_TC);
2605}
2606
2612static void QSPI_DMARxHalfCplt(DMA_HandleTypeDef *hdma)
2613{
2614 QSPI_HandleTypeDef* hqspi = (QSPI_HandleTypeDef*)(hdma->Parent);
2615
2616#if (USE_HAL_QSPI_REGISTER_CALLBACKS == 1)
2617 hqspi->RxHalfCpltCallback(hqspi);
2618#else
2619 HAL_QSPI_RxHalfCpltCallback(hqspi);
2620#endif
2621}
2622
2628static void QSPI_DMATxHalfCplt(DMA_HandleTypeDef *hdma)
2629{
2630 QSPI_HandleTypeDef* hqspi = (QSPI_HandleTypeDef*)(hdma->Parent);
2631
2632#if (USE_HAL_QSPI_REGISTER_CALLBACKS == 1)
2633 hqspi->TxHalfCpltCallback(hqspi);
2634#else
2635 HAL_QSPI_TxHalfCpltCallback(hqspi);
2636#endif
2637}
2638
2644static void QSPI_DMAError(DMA_HandleTypeDef *hdma)
2645{
2646 QSPI_HandleTypeDef* hqspi = ( QSPI_HandleTypeDef* )(hdma->Parent);
2647
2648 /* if DMA error is FIFO error ignore it */
2650 {
2651 hqspi->RxXferCount = 0U;
2652 hqspi->TxXferCount = 0U;
2653 hqspi->ErrorCode |= HAL_QSPI_ERROR_DMA;
2654
2655 /* Disable the DMA transfer by clearing the DMAEN bit in the QSPI CR register */
2656 CLEAR_BIT(hqspi->Instance->CR, QUADSPI_CR_DMAEN);
2657
2658 /* Abort the QSPI */
2659 (void)HAL_QSPI_Abort_IT(hqspi);
2660
2661 }
2662}
2663
2669static void QSPI_DMAAbortCplt(DMA_HandleTypeDef *hdma)
2670{
2671 QSPI_HandleTypeDef* hqspi = ( QSPI_HandleTypeDef* )(hdma->Parent);
2672
2673 hqspi->RxXferCount = 0U;
2674 hqspi->TxXferCount = 0U;
2675
2676 if(hqspi->State == HAL_QSPI_STATE_ABORT)
2677 {
2678 /* DMA Abort called by QSPI abort */
2679 /* Clear interrupt */
2680 __HAL_QSPI_CLEAR_FLAG(hqspi, QSPI_FLAG_TC);
2681
2682 /* Enable the QSPI Transfer Complete Interrupt */
2683 __HAL_QSPI_ENABLE_IT(hqspi, QSPI_IT_TC);
2684
2685 /* Configure QSPI: CR register with Abort request */
2686 SET_BIT(hqspi->Instance->CR, QUADSPI_CR_ABORT);
2687 }
2688 else
2689 {
2690 /* DMA Abort called due to a transfer error interrupt */
2691 /* Change state of QSPI */
2692 hqspi->State = HAL_QSPI_STATE_READY;
2693
2694 /* Error callback */
2695#if (USE_HAL_QSPI_REGISTER_CALLBACKS == 1)
2696 hqspi->ErrorCallback(hqspi);
2697#else
2698 HAL_QSPI_ErrorCallback(hqspi);
2699#endif
2700 }
2701}
2702
2712static HAL_StatusTypeDef QSPI_WaitFlagStateUntilTimeout(QSPI_HandleTypeDef *hqspi, uint32_t Flag,
2713 FlagStatus State, uint32_t Tickstart, uint32_t Timeout)
2714{
2715 /* Wait until flag is in expected state */
2716 while((__HAL_QSPI_GET_FLAG(hqspi, Flag)) != State)
2717 {
2718 /* Check for the Timeout */
2719 if (Timeout != HAL_MAX_DELAY)
2720 {
2721 if(((HAL_GetTick() - Tickstart) > Timeout) || (Timeout == 0U))
2722 {
2723 hqspi->State = HAL_QSPI_STATE_ERROR;
2724 hqspi->ErrorCode |= HAL_QSPI_ERROR_TIMEOUT;
2725
2726 return HAL_ERROR;
2727 }
2728 }
2729 }
2730 return HAL_OK;
2731}
2732
2741static HAL_StatusTypeDef QSPI_WaitFlagStateUntilTimeout_CPUCycle(QSPI_HandleTypeDef *hqspi, uint32_t Flag, FlagStatus State, uint32_t Timeout)
2742{
2743 __IO uint32_t count = Timeout * (SystemCoreClock / 16U / 1000U);
2744 do
2745 {
2746 if (count-- == 0U)
2747 {
2748 hqspi->State = HAL_QSPI_STATE_ERROR;
2749 hqspi->ErrorCode |= HAL_QSPI_ERROR_TIMEOUT;
2750 return HAL_TIMEOUT;
2751 }
2752 }
2753 while ((__HAL_QSPI_GET_FLAG(hqspi, Flag)) != State);
2754
2755 return HAL_OK;
2756}
2757
2770static void QSPI_Config(QSPI_HandleTypeDef *hqspi, QSPI_CommandTypeDef *cmd, uint32_t FunctionalMode)
2771{
2772 assert_param(IS_QSPI_FUNCTIONAL_MODE(FunctionalMode));
2773
2774 if ((cmd->DataMode != QSPI_DATA_NONE) && (FunctionalMode != QSPI_FUNCTIONAL_MODE_MEMORY_MAPPED))
2775 {
2776 /* Configure QSPI: DLR register with the number of data to read or write */
2777 WRITE_REG(hqspi->Instance->DLR, (cmd->NbData - 1U));
2778 }
2779
2780 if (cmd->InstructionMode != QSPI_INSTRUCTION_NONE)
2781 {
2782 if (cmd->AlternateByteMode != QSPI_ALTERNATE_BYTES_NONE)
2783 {
2784 /* Configure QSPI: ABR register with alternate bytes value */
2785 WRITE_REG(hqspi->Instance->ABR, cmd->AlternateBytes);
2786
2787 if (cmd->AddressMode != QSPI_ADDRESS_NONE)
2788 {
2789 /*---- Command with instruction, address and alternate bytes ----*/
2790 /* Configure QSPI: CCR register with all communications parameters */
2791 WRITE_REG(hqspi->Instance->CCR, (cmd->DdrMode | cmd->DdrHoldHalfCycle | cmd->SIOOMode |
2792 cmd->DataMode | (cmd->DummyCycles << QUADSPI_CCR_DCYC_Pos) |
2793 cmd->AlternateBytesSize | cmd->AlternateByteMode |
2794 cmd->AddressSize | cmd->AddressMode | cmd->InstructionMode |
2795 cmd->Instruction | FunctionalMode));
2796
2797 if (FunctionalMode != QSPI_FUNCTIONAL_MODE_MEMORY_MAPPED)
2798 {
2799 /* Configure QSPI: AR register with address value */
2800 WRITE_REG(hqspi->Instance->AR, cmd->Address);
2801 }
2802 }
2803 else
2804 {
2805 /*---- Command with instruction and alternate bytes ----*/
2806 /* Configure QSPI: CCR register with all communications parameters */
2807 WRITE_REG(hqspi->Instance->CCR, (cmd->DdrMode | cmd->DdrHoldHalfCycle | cmd->SIOOMode |
2808 cmd->DataMode | (cmd->DummyCycles << QUADSPI_CCR_DCYC_Pos) |
2809 cmd->AlternateBytesSize | cmd->AlternateByteMode |
2810 cmd->AddressMode | cmd->InstructionMode |
2811 cmd->Instruction | FunctionalMode));
2812
2813 /* Clear AR register */
2814 CLEAR_REG(hqspi->Instance->AR);
2815 }
2816 }
2817 else
2818 {
2819 if (cmd->AddressMode != QSPI_ADDRESS_NONE)
2820 {
2821 /*---- Command with instruction and address ----*/
2822 /* Configure QSPI: CCR register with all communications parameters */
2823 WRITE_REG(hqspi->Instance->CCR, (cmd->DdrMode | cmd->DdrHoldHalfCycle | cmd->SIOOMode |
2824 cmd->DataMode | (cmd->DummyCycles << QUADSPI_CCR_DCYC_Pos) |
2825 cmd->AlternateByteMode | cmd->AddressSize | cmd->AddressMode |
2826 cmd->InstructionMode | cmd->Instruction | FunctionalMode));
2827
2828 if (FunctionalMode != QSPI_FUNCTIONAL_MODE_MEMORY_MAPPED)
2829 {
2830 /* Configure QSPI: AR register with address value */
2831 WRITE_REG(hqspi->Instance->AR, cmd->Address);
2832 }
2833 }
2834 else
2835 {
2836 /*---- Command with only instruction ----*/
2837 /* Configure QSPI: CCR register with all communications parameters */
2838 WRITE_REG(hqspi->Instance->CCR, (cmd->DdrMode | cmd->DdrHoldHalfCycle | cmd->SIOOMode |
2839 cmd->DataMode | (cmd->DummyCycles << QUADSPI_CCR_DCYC_Pos) |
2840 cmd->AlternateByteMode | cmd->AddressMode |
2841 cmd->InstructionMode | cmd->Instruction | FunctionalMode));
2842
2843 /* Clear AR register */
2844 CLEAR_REG(hqspi->Instance->AR);
2845 }
2846 }
2847 }
2848 else
2849 {
2850 if (cmd->AlternateByteMode != QSPI_ALTERNATE_BYTES_NONE)
2851 {
2852 /* Configure QSPI: ABR register with alternate bytes value */
2853 WRITE_REG(hqspi->Instance->ABR, cmd->AlternateBytes);
2854
2855 if (cmd->AddressMode != QSPI_ADDRESS_NONE)
2856 {
2857 /*---- Command with address and alternate bytes ----*/
2858 /* Configure QSPI: CCR register with all communications parameters */
2859 WRITE_REG(hqspi->Instance->CCR, (cmd->DdrMode | cmd->DdrHoldHalfCycle | cmd->SIOOMode |
2860 cmd->DataMode | (cmd->DummyCycles << QUADSPI_CCR_DCYC_Pos) |
2861 cmd->AlternateBytesSize | cmd->AlternateByteMode |
2862 cmd->AddressSize | cmd->AddressMode |
2863 cmd->InstructionMode | FunctionalMode));
2864
2865 if (FunctionalMode != QSPI_FUNCTIONAL_MODE_MEMORY_MAPPED)
2866 {
2867 /* Configure QSPI: AR register with address value */
2868 WRITE_REG(hqspi->Instance->AR, cmd->Address);
2869 }
2870 }
2871 else
2872 {
2873 /*---- Command with only alternate bytes ----*/
2874 /* Configure QSPI: CCR register with all communications parameters */
2875 WRITE_REG(hqspi->Instance->CCR, (cmd->DdrMode | cmd->DdrHoldHalfCycle | cmd->SIOOMode |
2876 cmd->DataMode | (cmd->DummyCycles << QUADSPI_CCR_DCYC_Pos) |
2877 cmd->AlternateBytesSize | cmd->AlternateByteMode |
2878 cmd->AddressMode | cmd->InstructionMode | FunctionalMode));
2879
2880 /* Clear AR register */
2881 CLEAR_REG(hqspi->Instance->AR);
2882 }
2883 }
2884 else
2885 {
2886 if (cmd->AddressMode != QSPI_ADDRESS_NONE)
2887 {
2888 /*---- Command with only address ----*/
2889 /* Configure QSPI: CCR register with all communications parameters */
2890 WRITE_REG(hqspi->Instance->CCR, (cmd->DdrMode | cmd->DdrHoldHalfCycle | cmd->SIOOMode |
2891 cmd->DataMode | (cmd->DummyCycles << QUADSPI_CCR_DCYC_Pos) |
2892 cmd->AlternateByteMode | cmd->AddressSize |
2893 cmd->AddressMode | cmd->InstructionMode | FunctionalMode));
2894
2895 if (FunctionalMode != QSPI_FUNCTIONAL_MODE_MEMORY_MAPPED)
2896 {
2897 /* Configure QSPI: AR register with address value */
2898 WRITE_REG(hqspi->Instance->AR, cmd->Address);
2899 }
2900 }
2901 else
2902 {
2903 /*---- Command with only data phase ----*/
2904 if (cmd->DataMode != QSPI_DATA_NONE)
2905 {
2906 /* Configure QSPI: CCR register with all communications parameters */
2907 WRITE_REG(hqspi->Instance->CCR, (cmd->DdrMode | cmd->DdrHoldHalfCycle | cmd->SIOOMode |
2908 cmd->DataMode | (cmd->DummyCycles << QUADSPI_CCR_DCYC_Pos) |
2909 cmd->AlternateByteMode | cmd->AddressMode |
2910 cmd->InstructionMode | FunctionalMode));
2911
2912 /* Clear AR register */
2913 CLEAR_REG(hqspi->Instance->AR);
2914 }
2915 }
2916 }
2917 }
2918}
2919
2923
2927
2928#endif /* HAL_QSPI_MODULE_ENABLED */
2932
2936
2937#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)
HAL_StatusTypeDef HAL_DMA_Abort_IT(DMA_HandleTypeDef *hdma)
HAL_StatusTypeDef HAL_DMA_Start_IT(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength)
uint32_t HAL_DMA_GetError(DMA_HandleTypeDef *hdma)
struct __DMA_HandleTypeDef DMA_HandleTypeDef
DMA handle Structure definition.
#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 __HAL_UNLOCK(__HANDLE__)
#define HAL_MAX_DELAY
@ HAL_UNLOCKED
#define __HAL_LOCK(__HANDLE__)