打印

STM32H7的MDMA的几个官方实例学习,功能强,但使用也稍复杂

[复制链接]
307|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
电子学长|  楼主 | 2018-8-10 16:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
实例1:MDMA_GPDMA_Triggering


例程说明:


串口的接收采用DMA方式,使用DMA1 stream5,接收到数据后,会有一个DMA1 stream5接收标志用来触发MDMA传输,传输到缓冲aMDMA_RxBuffer里面,然后再将其回传。

这个例子应该是MDMA里面最简单的了。
注:由于这个例子开启Cache了,但是aMDMA_RxBuffer是TCM空间,所以发送前,无需做Cache无效化操作。

配置如下:
  /*##-1- Enable the MDMA clock ###############################################*/  
  __HAL_RCC_MDMA_CLK_ENABLE();  
  
  /*##-2- Select the MDMA instance to be used : MDMA_Channel0 #################*/
  MDMA_Handle.Instance = MDMA_INSTANCE;  
  
  /*##-3- Configure the MDMA for block transfer in HW request mode ############*/  
  /* MDMA HW request is set to DMA1 stream5 Transfer Complete Flag
     i.e The MDMA transfer will be triggered by the DMA1 Stream5 Transfer complete flag */
  MDMA_Handle.Init.Request              = MDMA_HW_REQUEST_TRIGGER;
  MDMA_Handle.Init.TransferTriggerMode  = MDMA_BLOCK_TRANSFER;  
  MDMA_Handle.Init.Priority             = MDMA_PRIORITY_HIGH;
  MDMA_Handle.Init.Endianness           = MDMA_LITTLE_ENDIANNESS_PRESERVE;

  MDMA_Handle.Init.SourceInc            = MDMA_SRC_INC_BYTE;
  MDMA_Handle.Init.DestinationInc       = MDMA_DEST_INC_BYTE;
  MDMA_Handle.Init.SourceDataSize       = MDMA_SRC_DATASIZE_BYTE;
  MDMA_Handle.Init.DestDataSize         = MDMA_DEST_DATASIZE_BYTE;
  MDMA_Handle.Init.DataAlignment        = MDMA_DATAALIGN_PACKENABLE;                           
  MDMA_Handle.Init.SourceBurst          = MDMA_SOURCE_BURST_SINGLE;
  MDMA_Handle.Init.DestBurst            = MDMA_DEST_BURST_SINGLE;
  MDMA_Handle.Init.BufferTransferLength = 128;

  MDMA_Handle.Init.SourceBlockAddressOffset  = 0;
  MDMA_Handle.Init.DestBlockAddressOffset    = 0;

  /*##-4- Initialize the MDMA channel ##########################################*/  
  hal_status = HAL_MDMA_Init(&MDMA_Handle);
  
  if(hal_status != HAL_OK)  
  {
    /* Initialization Error */
    Error_Handler();
  }
  
  /*##-5- Select Callbacks functions called after MDMA Transfer complete and Transfer error */
  HAL_MDMA_RegisterCallback(&MDMA_Handle, HAL_MDMA_XFER_CPLT_CB_ID, MDMA_TransferCompleteCallback);
  HAL_MDMA_RegisterCallback(&MDMA_Handle, HAL_MDMA_XFER_ERROR_CB_ID, MDMA_TransferErrorCallback);
  
  /*##-6- Configure NVIC for MDMA transfer complete/error interrupts ##########*/
  /* Set Interrupt Group Priority */
  HAL_NVIC_SetPriority(MDMA_IRQn, 0, 0);
  
  /* Enable the MDMA channel global Interrupt */
  HAL_NVIC_EnableIRQ(MDMA_IRQn);  
  
  /*##-7- Start the MDMA transfer process #####################################*/
  /* MDMA will transfer content of  "aUART_RxBuffer" buffer to "aMDMA_RxBuffer" buffer
     knowing that MDMA HW trigger is DMA1 stream 5 which is used for UART reception.
     as consequence MDMA transfer will be triggered once the UART received user message to
     "aUART_RxBuffer" buffer and the MDMA will transfer it to the "aMDMA_RxBuffer" buffer
  */  
  hal_status = HAL_MDMA_Start_IT(&MDMA_Handle, (uint32_t)&aUART_RxBuffer,
                                               (uint32_t)&aMDMA_RxBuffer,
                                               RXBUFFERSIZE,
                                               1);

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

424

主题

447

帖子

1

粉丝