×
单片机 > 单片机程序设计 > 详情

STM32 DMA发送完成标志位的查询

发布时间:2020-05-18 发布时间:
|


void HAL_DMA_IRQHandler(DMA_HandleTypeDef *hdma)

{

uint32_t flag_it = hdma->DmaBaseAddress->ISR;

  uint32_t source_it = hdma->Instance->CCR;

 

  /* Half Transfer Complete Interrupt management ******************************/

  if ((RESET != (flag_it & (DMA_FLAG_HT1 << hdma->ChannelIndex))) && (RESET != (source_it & DMA_IT_HT)))

  {

  /* Disable the half transfer interrupt if the DMA mode is not CIRCULAR */

  if((hdma->Instance->CCR & DMA_CCR_CIRC) == 0U)

  {

  /* Disable the half transfer interrupt */

  hdma->Instance->CCR &= ~DMA_IT_HT;

  }

 

  /* Clear the half transfer complete flag */

  hdma->DmaBaseAddress->IFCR = DMA_FLAG_HT1 << hdma->ChannelIndex;

 

  /* DMA peripheral state is not updated in Half Transfer */

  /* State is updated only in Transfer Complete case */

 

  if(hdma->XferHalfCpltCallback != NULL)

  {

  /* Half transfer callback */

  hdma->XferHalfCpltCallback(hdma);

  }

  }

 

  /* Transfer Complete Interrupt management ***********************************/

  else if ((RESET != (flag_it & (DMA_FLAG_TC1 << hdma->ChannelIndex))) && (RESET != (source_it & DMA_IT_TC)))

  {

  if((hdma->Instance->CCR & DMA_CCR_CIRC) == 0U)

  {

  /* Disable the transfer complete  & transfer error interrupts */

  /* if the DMA mode is not CIRCULAR */

  hdma->Instance->CCR &= ~(DMA_IT_TC | DMA_IT_TE);

 

  /* Change the DMA state */

  hdma->State = HAL_DMA_STATE_READY;

  }

 

  /* Clear the transfer complete flag */

  hdma->DmaBaseAddress->IFCR = DMA_FLAG_TC1 << hdma->ChannelIndex;

 

  /* Process Unlocked */

  __HAL_UNLOCK(hdma);

 

  if(hdma->XferCpltCallback != NULL)

  {

  /* Transfer complete callback */

  hdma->XferCpltCallback(hdma);

  if (hdma == huart2.hdmatx)

      {

            dma_finish_flag = 1;

  }

  }

  }

 

  /* Transfer Error Interrupt management ***************************************/

  else if (( RESET != (flag_it & (DMA_FLAG_TE1 << hdma->ChannelIndex))) && (RESET != (source_it & DMA_IT_TE)))

  {

  /* When a DMA transfer error occurs */

    /* A hardware clear of its EN bits is performed */

    /* Then, disable all DMA interrupts */

    hdma->Instance->CCR &= ~(DMA_IT_TC | DMA_IT_HT | DMA_IT_TE);

 

    /* Clear all flags */

    hdma->DmaBaseAddress->IFCR = DMA_FLAG_GL1 << hdma->ChannelIndex;

 

    /* Update error code */

    hdma->ErrorCode = HAL_DMA_ERROR_TE;

 

    /* Change the DMA state */

    hdma->State = HAL_DMA_STATE_READY;

 

    /* Process Unlocked */

    __HAL_UNLOCK(hdma);

 

    if(hdma->XferErrorCallback != NULL)

    {

    /* Transfer error callback */

    hdma->XferErrorCallback(hdma);

    }

   }

}



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
Keil(MDK-ARM)系列教程(七)_菜单