STM32L4xx_HAL_Driver  1.14.0
Perioheral Abort management

Functions

HAL_StatusTypeDef HAL_SD_Abort (SD_HandleTypeDef *hsd)
 Abort the current transfer and disable the SD. More...
 
HAL_StatusTypeDef HAL_SD_Abort_IT (SD_HandleTypeDef *hsd)
 Abort the current transfer and disable the SD (IT mode). More...
 

Detailed Description

Function Documentation

◆ HAL_SD_Abort()

HAL_StatusTypeDef HAL_SD_Abort ( SD_HandleTypeDef hsd)

Abort the current transfer and disable the SD.

Parameters
hsdpointer to a SD_HandleTypeDef structure that contains the configuration information for SD module.
Return values
HALstatus

Definition at line 2973 of file stm32l4xx_hal_sd.c.

2974 {
2975  HAL_SD_CardStateTypeDef CardState;
2976 #if !defined(STM32L4R5xx) && !defined(STM32L4R7xx) && !defined(STM32L4R9xx) && !defined(STM32L4S5xx) && !defined(STM32L4S7xx) && !defined(STM32L4S9xx)
2977  uint32_t context = hsd->Context;
2978 #endif
2979 
2980  /* DIsable All interrupts */
2981  __HAL_SD_DISABLE_IT(hsd, SDMMC_IT_DATAEND | SDMMC_IT_DCRCFAIL | SDMMC_IT_DTIMEOUT|\
2982  SDMMC_IT_TXUNDERR| SDMMC_IT_RXOVERR);
2983 
2984  /* Clear All flags */
2985  __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_DATA_FLAGS);
2986 
2987 #if defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx)
2988  /* If IDMA Context, disable Internal DMA */
2989  hsd->Instance->IDMACTRL = SDMMC_DISABLE_IDMA;
2990 #else
2991  CLEAR_BIT(hsd->Instance->DCTRL, SDMMC_DCTRL_DTEN);
2992 
2993  if ((context & SD_CONTEXT_DMA) != 0U)
2994  {
2995  /* Disable the SD DMA request */
2996  hsd->Instance->DCTRL &= (uint32_t)~((uint32_t)SDMMC_DCTRL_DMAEN);
2997 
2998  /* Abort the SD DMA Tx channel */
2999  if (((context & SD_CONTEXT_WRITE_SINGLE_BLOCK) != 0U) || ((context & SD_CONTEXT_WRITE_MULTIPLE_BLOCK) != 0U))
3000  {
3001  if(HAL_DMA_Abort(hsd->hdmatx) != HAL_OK)
3002  {
3003  hsd->ErrorCode |= HAL_SD_ERROR_DMA;
3004  }
3005  }
3006  /* Abort the SD DMA Rx channel */
3007  else if (((context & SD_CONTEXT_READ_SINGLE_BLOCK) != 0U) || ((context & SD_CONTEXT_READ_MULTIPLE_BLOCK) != 0U))
3008  {
3009  if(HAL_DMA_Abort(hsd->hdmarx) != HAL_OK)
3010  {
3011  hsd->ErrorCode |= HAL_SD_ERROR_DMA;
3012  }
3013  }
3014  else
3015  {
3016  /* Nothing to do */
3017  }
3018  }
3019 #endif /* STM32L4R5xx || STM32L4R7xx || STM32L4R9xx || STM32L4S5xx || STM32L4S7xx || STM32L4S9xx */
3020 
3021  hsd->State = HAL_SD_STATE_READY;
3022 
3023  /* Initialize the SD operation */
3024  hsd->Context = SD_CONTEXT_NONE;
3025 
3026  CardState = HAL_SD_GetCardState(hsd);
3027  if((CardState == HAL_SD_CARD_RECEIVING) || (CardState == HAL_SD_CARD_SENDING))
3028  {
3029  hsd->ErrorCode = SDMMC_CmdStopTransfer(hsd->Instance);
3030  }
3031  if(hsd->ErrorCode != HAL_SD_ERROR_NONE)
3032  {
3033  return HAL_ERROR;
3034  }
3035  return HAL_OK;
3036 }
HAL_SD_CardStateTypeDef HAL_SD_GetCardState(SD_HandleTypeDef *hsd)
Gets the current sd card data state.
CLEAR_BIT(hrtc->Instance->CR, RTC_CR_WUTE)
return HAL_OK
HAL_StatusTypeDef HAL_DMA_Abort(DMA_HandleTypeDef *hdma)
Abort the DMA Transfer.
uint32_t HAL_SD_CardStateTypeDef
uint32_t SDMMC_CmdStopTransfer(SDMMC_TypeDef *SDMMCx)
Send the Stop Transfer command and check the response.

◆ HAL_SD_Abort_IT()

HAL_StatusTypeDef HAL_SD_Abort_IT ( SD_HandleTypeDef hsd)

Abort the current transfer and disable the SD (IT mode).

Parameters
hsdpointer to a SD_HandleTypeDef structure that contains the configuration information for SD module.
Return values
HALstatus

Definition at line 3044 of file stm32l4xx_hal_sd.c.

3045 {
3046  HAL_SD_CardStateTypeDef CardState;
3047 #if !defined(STM32L4R5xx) && !defined(STM32L4R7xx) && !defined(STM32L4R9xx) && !defined(STM32L4S5xx) && !defined(STM32L4S7xx) && !defined(STM32L4S9xx)
3048  uint32_t context = hsd->Context;
3049 #endif
3050 
3051  /* Disable All interrupts */
3052  __HAL_SD_DISABLE_IT(hsd, SDMMC_IT_DATAEND | SDMMC_IT_DCRCFAIL | SDMMC_IT_DTIMEOUT|\
3053  SDMMC_IT_TXUNDERR| SDMMC_IT_RXOVERR);
3054 
3055 #if defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx)
3056  /* If IDMA Context, disable Internal DMA */
3057  hsd->Instance->IDMACTRL = SDMMC_DISABLE_IDMA;
3058 
3059  /* Clear All flags */
3060  __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_DATA_FLAGS);
3061 
3062  CardState = HAL_SD_GetCardState(hsd);
3063  hsd->State = HAL_SD_STATE_READY;
3064 
3065  if((CardState == HAL_SD_CARD_RECEIVING) || (CardState == HAL_SD_CARD_SENDING))
3066  {
3067  hsd->ErrorCode = SDMMC_CmdStopTransfer(hsd->Instance);
3068  }
3069 
3070  if(hsd->ErrorCode != HAL_SD_ERROR_NONE)
3071  {
3072  return HAL_ERROR;
3073  }
3074  else
3075  {
3076 #if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U)
3077  hsd->AbortCpltCallback(hsd);
3078 #else
3079  HAL_SD_AbortCallback(hsd);
3080 #endif /* USE_HAL_SD_REGISTER_CALLBACKS */
3081  }
3082 #else
3083  CLEAR_BIT(hsd->Instance->DCTRL, SDMMC_DCTRL_DTEN);
3084 
3085  if ((context & SD_CONTEXT_DMA) != 0U)
3086  {
3087  /* Disable the SD DMA request */
3088  hsd->Instance->DCTRL &= (uint32_t)~((uint32_t)SDMMC_DCTRL_DMAEN);
3089 
3090  /* Abort the SD DMA Tx channel */
3091  if (((context & SD_CONTEXT_WRITE_SINGLE_BLOCK) != 0U) || ((context & SD_CONTEXT_WRITE_MULTIPLE_BLOCK) != 0U))
3092  {
3093  hsd->hdmatx->XferAbortCallback = SD_DMATxAbort;
3094  if(HAL_DMA_Abort_IT(hsd->hdmatx) != HAL_OK)
3095  {
3096  hsd->hdmatx = NULL;
3097  }
3098  }
3099  /* Abort the SD DMA Rx channel */
3100  else if (((context & SD_CONTEXT_READ_SINGLE_BLOCK) != 0U) || ((context & SD_CONTEXT_READ_MULTIPLE_BLOCK) != 0U))
3101  {
3102  hsd->hdmarx->XferAbortCallback = SD_DMARxAbort;
3103  if(HAL_DMA_Abort_IT(hsd->hdmarx) != HAL_OK)
3104  {
3105  hsd->hdmarx = NULL;
3106  }
3107  }
3108  else
3109  {
3110  /* Nothing to do */
3111  }
3112  }
3113  /* No transfer ongoing on both DMA channels*/
3114  else
3115  {
3116  /* Clear All flags */
3117  __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_DATA_FLAGS);
3118 
3119  CardState = HAL_SD_GetCardState(hsd);
3120  hsd->State = HAL_SD_STATE_READY;
3121  hsd->Context = SD_CONTEXT_NONE;
3122  if((CardState == HAL_SD_CARD_RECEIVING) || (CardState == HAL_SD_CARD_SENDING))
3123  {
3124  hsd->ErrorCode = SDMMC_CmdStopTransfer(hsd->Instance);
3125  }
3126  if(hsd->ErrorCode != HAL_SD_ERROR_NONE)
3127  {
3128  return HAL_ERROR;
3129  }
3130  else
3131  {
3132 #if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U)
3133  hsd->AbortCpltCallback(hsd);
3134 #else
3135  HAL_SD_AbortCallback(hsd);
3136 #endif /* USE_HAL_SD_REGISTER_CALLBACKS */
3137  }
3138  }
3139 #endif /* STM32L4R5xx || STM32L4R7xx || STM32L4R9xx || STM32L4S5xx || STM32L4S7xx || STM32L4S9xx */
3140 
3141  return HAL_OK;
3142 }
HAL_SD_CardStateTypeDef HAL_SD_GetCardState(SD_HandleTypeDef *hsd)
Gets the current sd card data state.
HAL_StatusTypeDef HAL_DMA_Abort_IT(DMA_HandleTypeDef *hdma)
Aborts the DMA Transfer in Interrupt mode.
static void SD_DMARxAbort(DMA_HandleTypeDef *hdma)
DMA SD Rx Abort callback.
static void SD_DMATxAbort(DMA_HandleTypeDef *hdma)
DMA SD Tx Abort callback.
CLEAR_BIT(hrtc->Instance->CR, RTC_CR_WUTE)
return HAL_OK
uint32_t HAL_SD_CardStateTypeDef
uint32_t SDMMC_CmdStopTransfer(SDMMC_TypeDef *SDMMCx)
Send the Stop Transfer command and check the response.
void HAL_SD_AbortCallback(SD_HandleTypeDef *hsd)
SD Abort callbacks.