/********************************************************************************
 * @file   DMA_Burst.c
 * @author  SOC AE Team
 * @version V1.1
 * @date    2025-06-27
 * @brief		使用Burst模式，一次触发DMA搬运完成所有CNT次数据。
 *
 *******************************************************************************/
#include "sc32_conf.h"
#include "Function_Init.h"


void DMA_Burst_Function(void)
{
  DMA_InitTypeDef DMA_InitStruct; //定义DMA初始化结构体变量
  uint8_t DMA_Burst_Src[200], DMA_Burst_Dst[200];
	uint8_t i;
	for(i=0;i<200;i++)
	{
	 DMA_Burst_Src[i] = i;//被搬运数组写入数据
	}
	
  /* 使能DMA的时钟 */
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA, ENABLE);

  /* DMA外设配置 */
  DMA_StructInit(&DMA_InitStruct);
  DMA_InitStruct.DMA_BufferSize = 200;	//DMA搬运数量为200个
  DMA_InitStruct.DMA_Burst = DMA_Burst_128B;	//批量传输模式，Brust=128
  DMA_InitStruct.DMA_CircularMode = DMA_CircularMode_Enable;	//开启循环模式
  DMA_InitStruct.DMA_DataSize = DMA_DataSize_Byte;	//传输宽度为1byte
  DMA_InitStruct.DMA_SourceMode = DMA_SourceMode_INC_CIRC;	//源地址循环递增
  DMA_InitStruct.DMA_TargetMode = DMA_TargetMode_INC_CIRC;	//目标地址循环递增
  DMA_InitStruct.DMA_SrcAddress = (uint32_t)&DMA_Burst_Src;	//设置源地址首地址
  DMA_InitStruct.DMA_DstAddress = (uint32_t)&DMA_Burst_Dst;	//设置目标地址首地址
  DMA_InitStruct.DMA_Request = DMA_Request_Null;	//无触发源
  DMA_InitStruct.DMA_Priority = DMA_Priority_HIGH;	//设置优先级为高
  DMA_Init(DMA0, &DMA_InitStruct);

  DMA_Cmd(DMA0, ENABLE);//使能DMA0

  DMA_SoftwareTrigger(DMA0);	//软件触发，一次触发搬运完所有的Cnt

  while(1)
  {
    if(DMA_GetFlagStatus(DMA0, DMA_FLAG_TCIF) == SET)//DMA搬运完成
    {
      DMA_ClearFlag(DMA0, DMA_FLAG_TCIF);//清标志

			printf("Brust搬运成功\r\n");
			printf("被搬运的数组为: \r\n");
			for(i=0;i<200;i++)
	    {
				printf("%d、", DMA_Burst_Src[i]);
			}
			printf("\r\n");
      printf("搬运完成后的数组为: \r\n");
			for(i=0;i<200;i++)
	    {
				printf("%d、", DMA_Burst_Dst[i]);
			}
      printf("\r\n");
    }	
  }
}

