108 #ifdef HAL_DMA_MODULE_ENABLED
114 __IO uint32_t Reserved0;
116 } DMA_Base_Registers;
123 #define HAL_TIMEOUT_DMA_ABORT 5U
132 static void DMA_SetConfig(
DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength);
174 DMA_Base_Registers *regs;
183 assert_param(IS_DMA_STREAM_ALL_INSTANCE(hdma->
Instance));
184 assert_param(IS_DMA_CHANNEL(hdma->
Init.Channel));
185 assert_param(IS_DMA_DIRECTION(hdma->
Init.Direction));
186 assert_param(IS_DMA_PERIPHERAL_INC_STATE(hdma->
Init.PeriphInc));
187 assert_param(IS_DMA_MEMORY_INC_STATE(hdma->
Init.MemInc));
188 assert_param(IS_DMA_PERIPHERAL_DATA_SIZE(hdma->
Init.PeriphDataAlignment));
189 assert_param(IS_DMA_MEMORY_DATA_SIZE(hdma->
Init.MemDataAlignment));
190 assert_param(IS_DMA_MODE(hdma->
Init.Mode));
191 assert_param(IS_DMA_PRIORITY(hdma->
Init.Priority));
192 assert_param(IS_DMA_FIFO_MODE_STATE(hdma->
Init.FIFOMode));
195 if(hdma->
Init.FIFOMode != DMA_FIFOMODE_DISABLE)
197 assert_param(IS_DMA_FIFO_THRESHOLD(hdma->
Init.FIFOThreshold));
198 assert_param(IS_DMA_MEMORY_BURST(hdma->
Init.MemBurst));
199 assert_param(IS_DMA_PERIPHERAL_BURST(hdma->
Init.PeriphBurst));
209 __HAL_DMA_DISABLE(hdma);
212 while((hdma->
Instance->CR & DMA_SxCR_EN) != RESET)
215 if((
HAL_GetTick() - tickstart ) > HAL_TIMEOUT_DMA_ABORT)
231 tmp &= ((uint32_t)~(DMA_SxCR_CHSEL | DMA_SxCR_MBURST | DMA_SxCR_PBURST | \
232 DMA_SxCR_PL | DMA_SxCR_MSIZE | DMA_SxCR_PSIZE | \
233 DMA_SxCR_MINC | DMA_SxCR_PINC | DMA_SxCR_CIRC | \
234 DMA_SxCR_DIR | DMA_SxCR_CT | DMA_SxCR_DBM));
237 tmp |= hdma->
Init.Channel | hdma->
Init.Direction |
238 hdma->
Init.PeriphInc | hdma->
Init.MemInc |
239 hdma->
Init.PeriphDataAlignment | hdma->
Init.MemDataAlignment |
240 hdma->
Init.Mode | hdma->
Init.Priority;
243 if(hdma->
Init.FIFOMode == DMA_FIFOMODE_ENABLE)
246 tmp |= hdma->
Init.MemBurst | hdma->
Init.PeriphBurst;
256 tmp &= (uint32_t)~(DMA_SxFCR_DMDIS | DMA_SxFCR_FTH);
259 tmp |= hdma->
Init.FIFOMode;
262 if(hdma->
Init.FIFOMode == DMA_FIFOMODE_ENABLE)
265 tmp |= hdma->
Init.FIFOThreshold;
269 if (hdma->
Init.MemBurst != DMA_MBURST_SINGLE)
271 if (DMA_CheckFifoParam(hdma) != HAL_OK)
289 regs = (DMA_Base_Registers *)DMA_CalcBaseAndBitshift(hdma);
311 DMA_Base_Registers *regs;
327 assert_param(IS_DMA_STREAM_ALL_INSTANCE(hdma->
Instance));
330 __HAL_DMA_DISABLE(hdma);
351 regs = (DMA_Base_Registers *)DMA_CalcBaseAndBitshift(hdma);
409 HAL_StatusTypeDef status = HAL_OK;
412 assert_param(IS_DMA_BUFFER_SIZE(DataLength));
426 DMA_SetConfig(hdma, SrcAddress, DstAddress, DataLength);
429 __HAL_DMA_ENABLE(hdma);
453 HAL_StatusTypeDef status = HAL_OK;
459 assert_param(IS_DMA_BUFFER_SIZE(DataLength));
473 DMA_SetConfig(hdma, SrcAddress, DstAddress, DataLength);
479 hdma->
Instance->CR |= DMA_IT_TC | DMA_IT_TE | DMA_IT_DME;
487 __HAL_DMA_ENABLE(hdma);
532 hdma->
Instance->CR &= ~(DMA_IT_TC | DMA_IT_TE | DMA_IT_DME);
533 hdma->
Instance->FCR &= ~(DMA_IT_FE);
541 __HAL_DMA_DISABLE(hdma);
544 while((hdma->
Instance->CR & DMA_SxCR_EN) != RESET)
547 if((
HAL_GetTick() - tickstart ) > HAL_TIMEOUT_DMA_ABORT)
593 __HAL_DMA_DISABLE(hdma);
612 HAL_StatusTypeDef status = HAL_OK;
613 uint32_t mask_cpltlevel;
618 DMA_Base_Registers *regs;
629 if ((hdma->
Instance->CR & DMA_SxCR_CIRC) != RESET)
631 hdma->
ErrorCode = HAL_DMA_ERROR_NOT_SUPPORTED;
639 mask_cpltlevel = DMA_FLAG_TCIF0_4 << hdma->
StreamIndex;
644 mask_cpltlevel = DMA_FLAG_HTIF0_4 << hdma->
StreamIndex;
650 while(((tmpisr & mask_cpltlevel) == RESET) && ((hdma->
ErrorCode & HAL_DMA_ERROR_TE) == RESET))
653 if(Timeout != HAL_MAX_DELAY)
655 if((Timeout == 0U)||((
HAL_GetTick() - tickstart ) > Timeout))
673 if((tmpisr & (DMA_FLAG_TEIF0_4 << hdma->
StreamIndex)) != RESET)
679 regs->IFCR = DMA_FLAG_TEIF0_4 << hdma->
StreamIndex;
682 if((tmpisr & (DMA_FLAG_FEIF0_4 << hdma->
StreamIndex)) != RESET)
688 regs->IFCR = DMA_FLAG_FEIF0_4 << hdma->
StreamIndex;
691 if((tmpisr & (DMA_FLAG_DMEIF0_4 << hdma->
StreamIndex)) != RESET)
697 regs->IFCR = DMA_FLAG_DMEIF0_4 << hdma->
StreamIndex;
701 if(hdma->
ErrorCode != HAL_DMA_ERROR_NONE)
703 if((hdma->
ErrorCode & HAL_DMA_ERROR_TE) != RESET)
708 regs->IFCR = (DMA_FLAG_HTIF0_4 | DMA_FLAG_TCIF0_4) << hdma->
StreamIndex;
724 regs->IFCR = (DMA_FLAG_HTIF0_4 | DMA_FLAG_TCIF0_4) << hdma->
StreamIndex;
734 regs->IFCR = (DMA_FLAG_HTIF0_4) << hdma->
StreamIndex;
749 __IO uint32_t count = 0U;
750 uint32_t timeout = SystemCoreClock / 9600U;
758 if ((tmpisr & (DMA_FLAG_TEIF0_4 << hdma->
StreamIndex)) != RESET)
760 if(__HAL_DMA_GET_IT_SOURCE(hdma, DMA_IT_TE) != RESET)
766 regs->IFCR = DMA_FLAG_TEIF0_4 << hdma->
StreamIndex;
773 if ((tmpisr & (DMA_FLAG_FEIF0_4 << hdma->
StreamIndex)) != RESET)
775 if(__HAL_DMA_GET_IT_SOURCE(hdma, DMA_IT_FE) != RESET)
778 regs->IFCR = DMA_FLAG_FEIF0_4 << hdma->
StreamIndex;
785 if ((tmpisr & (DMA_FLAG_DMEIF0_4 << hdma->
StreamIndex)) != RESET)
787 if(__HAL_DMA_GET_IT_SOURCE(hdma, DMA_IT_DME) != RESET)
790 regs->IFCR = DMA_FLAG_DMEIF0_4 << hdma->
StreamIndex;
797 if ((tmpisr & (DMA_FLAG_HTIF0_4 << hdma->
StreamIndex)) != RESET)
799 if(__HAL_DMA_GET_IT_SOURCE(hdma, DMA_IT_HT) != RESET)
802 regs->IFCR = DMA_FLAG_HTIF0_4 << hdma->
StreamIndex;
805 if(((hdma->
Instance->CR) & (uint32_t)(DMA_SxCR_DBM)) != RESET)
808 if((hdma->
Instance->CR & DMA_SxCR_CT) == RESET)
829 if((hdma->
Instance->CR & DMA_SxCR_CIRC) == RESET)
844 if ((tmpisr & (DMA_FLAG_TCIF0_4 << hdma->
StreamIndex)) != RESET)
846 if(__HAL_DMA_GET_IT_SOURCE(hdma, DMA_IT_TC) != RESET)
849 regs->IFCR = DMA_FLAG_TCIF0_4 << hdma->
StreamIndex;
854 hdma->
Instance->CR &= ~(DMA_IT_TC | DMA_IT_TE | DMA_IT_DME);
855 hdma->
Instance->FCR &= ~(DMA_IT_FE);
878 if(((hdma->
Instance->CR) & (uint32_t)(DMA_SxCR_DBM)) != RESET)
881 if((hdma->
Instance->CR & DMA_SxCR_CT) == RESET)
902 if((hdma->
Instance->CR & DMA_SxCR_CIRC) == RESET)
924 if(hdma->
ErrorCode != HAL_DMA_ERROR_NONE)
926 if((hdma->
ErrorCode & HAL_DMA_ERROR_TE) != RESET)
931 __HAL_DMA_DISABLE(hdma);
935 if (++count > timeout)
940 while((hdma->
Instance->CR & DMA_SxCR_EN) != RESET);
970 HAL_StatusTypeDef status = HAL_OK;
1031 HAL_StatusTypeDef status = HAL_OK;
1151 static void DMA_SetConfig(
DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength)
1154 hdma->
Instance->CR &= (uint32_t)(~DMA_SxCR_DBM);
1160 if((hdma->
Init.Direction) == DMA_MEMORY_TO_PERIPH)
1187 uint32_t stream_number = (((uint32_t)hdma->
Instance & 0xFFU) - 16U) / 24U;
1190 static const uint8_t flagBitshiftOffset[8U] = {0U, 6U, 16U, 22U, 0U, 6U, 16U, 22U};
1191 hdma->
StreamIndex = flagBitshiftOffset[stream_number];
1193 if (stream_number > 3U)
1215 HAL_StatusTypeDef status = HAL_OK;
1216 uint32_t tmp = hdma->
Init.FIFOThreshold;
1219 if(hdma->
Init.MemDataAlignment == DMA_MDATAALIGN_BYTE)
1223 case DMA_FIFO_THRESHOLD_1QUARTERFULL:
1224 case DMA_FIFO_THRESHOLD_3QUARTERSFULL:
1225 if ((hdma->
Init.MemBurst & DMA_SxCR_MBURST_1) == DMA_SxCR_MBURST_1)
1230 case DMA_FIFO_THRESHOLD_HALFFULL:
1231 if (hdma->
Init.MemBurst == DMA_MBURST_INC16)
1236 case DMA_FIFO_THRESHOLD_FULL:
1244 else if (hdma->
Init.MemDataAlignment == DMA_MDATAALIGN_HALFWORD)
1248 case DMA_FIFO_THRESHOLD_1QUARTERFULL:
1249 case DMA_FIFO_THRESHOLD_3QUARTERSFULL:
1252 case DMA_FIFO_THRESHOLD_HALFFULL:
1253 if ((hdma->
Init.MemBurst & DMA_SxCR_MBURST_1) == DMA_SxCR_MBURST_1)
1258 case DMA_FIFO_THRESHOLD_FULL:
1259 if (hdma->
Init.MemBurst == DMA_MBURST_INC16)
1274 case DMA_FIFO_THRESHOLD_1QUARTERFULL:
1275 case DMA_FIFO_THRESHOLD_HALFFULL:
1276 case DMA_FIFO_THRESHOLD_3QUARTERSFULL:
1279 case DMA_FIFO_THRESHOLD_FULL:
1280 if ((hdma->
Init.MemBurst & DMA_SxCR_MBURST_1) == DMA_SxCR_MBURST_1)
HAL_StatusTypeDef HAL_DMA_Init(DMA_HandleTypeDef *hdma)
Initialize the DMA according to the specified parameters in the DMA_InitTypeDef and create the associ...
HAL_StatusTypeDef HAL_DMA_DeInit(DMA_HandleTypeDef *hdma)
DeInitializes the DMA peripheral.
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.
HAL_StatusTypeDef HAL_DMA_UnRegisterCallback(DMA_HandleTypeDef *hdma, HAL_DMA_CallbackIDTypeDef CallbackID)
UnRegister callbacks.
void HAL_DMA_IRQHandler(DMA_HandleTypeDef *hdma)
Handles DMA interrupt request.
HAL_StatusTypeDef HAL_DMA_Start(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength)
Starts the DMA Transfer.
HAL_StatusTypeDef HAL_DMA_PollForTransfer(DMA_HandleTypeDef *hdma, HAL_DMA_LevelCompleteTypeDef CompleteLevel, uint32_t Timeout)
Polling for transfer complete.
HAL_StatusTypeDef HAL_DMA_RegisterCallback(DMA_HandleTypeDef *hdma, HAL_DMA_CallbackIDTypeDef CallbackID, void(*pCallback)(DMA_HandleTypeDef *_hdma))
Register callbacks.
uint32_t HAL_DMA_GetError(DMA_HandleTypeDef *hdma)
Return the DMA error code.
HAL_DMA_StateTypeDef HAL_DMA_GetState(DMA_HandleTypeDef *hdma)
Returns the DMA state.
uint32_t HAL_GetTick(void)
Provides a tick value in millisecond.
This file contains all the functions prototypes for the HAL module driver.
HAL_DMA_StateTypeDef
HAL DMA State structures definition.
HAL_DMA_LevelCompleteTypeDef
HAL DMA Error Code structure definition.
HAL_DMA_CallbackIDTypeDef
HAL DMA Error Code structure definition.
@ HAL_DMA_XFER_M1CPLT_CB_ID
@ HAL_DMA_XFER_ABORT_CB_ID
@ HAL_DMA_XFER_ERROR_CB_ID
@ HAL_DMA_XFER_HALFCPLT_CB_ID
@ HAL_DMA_XFER_CPLT_CB_ID
@ HAL_DMA_XFER_M1HALFCPLT_CB_ID
DMA handle Structure definition.
void(* XferAbortCallback)(struct __DMA_HandleTypeDef *hdma)
void(* XferCpltCallback)(struct __DMA_HandleTypeDef *hdma)
void(* XferErrorCallback)(struct __DMA_HandleTypeDef *hdma)
__IO HAL_DMA_StateTypeDef State
void(* XferHalfCpltCallback)(struct __DMA_HandleTypeDef *hdma)
uint32_t StreamBaseAddress
DMA_Stream_TypeDef * Instance
void(* XferM1HalfCpltCallback)(struct __DMA_HandleTypeDef *hdma)
void(* XferM1CpltCallback)(struct __DMA_HandleTypeDef *hdma)