/********************************************************************************
 * @file   DMA_Pause.c
 * @author  SOC AE Team
 * @version V1.1
 * @date    2025-06-27
 * @brief		DMA Pause暂停功能使用示例。
 *
 *******************************************************************************/
#include "sc32_conf.h"
#include "Function_Init.h"

void DMA_Pause_Function(void)
{
  DMA_InitTypeDef DMA_InitStruct; //定义DMA初始化结构体变量
  uint8_t DMA_Pause_Src[200], DMA_Pause_Dst[200];
  uint8_t DMA_Pause_Num = 0;
  uint8_t i;
  for(i = 0; i < 200; i++)
  {
    DMA_Pause_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_Disable;	//Brust模式关闭
  DMA_InitStruct.DMA_CircularMode = DMA_CircularMode_Enable;	//开启循环模式
  DMA_InitStruct.DMA_DataSize = DMA_DataSize_Byte;	//传输宽度为Byte
  DMA_InitStruct.DMA_SourceMode = DMA_SourceMode_INC_CIRC;	//源地址循环递增
  DMA_InitStruct.DMA_TargetMode = DMA_TargetMode_INC_CIRC;	//目标地址循环递增
  DMA_InitStruct.DMA_SrcAddress = (uint32_t)&DMA_Pause_Src;	//设置源地址首地址
  DMA_InitStruct.DMA_DstAddress = (uint32_t)&DMA_Pause_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

  /* 先搬运一半 */
  for(DMA_Pause_Num = 0; DMA_Pause_Num < 100; DMA_Pause_Num++)
  {
    DMA_SoftwareTrigger(DMA0);	//软件触发DMA
  }

  /* 开启DMA暂停*/
  DMA_PauseCmd(DMA0, ENABLE);//通道暂停后，DMA失能，内部寄存器的值处于保持状态

  /* 搬运后一半 */
  for(DMA_Pause_Num = 0; DMA_Pause_Num < 100; DMA_Pause_Num++)
  {
    DMA_SoftwareTrigger(DMA0);	//软件触发DMA
  }

  if(DMA_GetFlagStatus(DMA0, DMA_FLAG_TCIF) == SET)//若此刻DMA搬运完成标志置起，则说明通道暂停失败
  {
    DMA_ClearFlag(DMA0, DMA_FLAG_TCIF);

    printf("搬运完成后的数组为: \r\n");
    for(i = 0; i < 200; i++)
    {
      printf("%d、", DMA_Pause_Dst[i]);
    }
    printf("\r\n");
    printf("DMA暂停失败\r\n");
  }
  else
  {
    /* 关闭DMA暂停*/
    DMA_PauseCmd(DMA0, DISABLE);//关闭通道暂停，DMA使能

    /* 搬运后一半 */
    for(DMA_Pause_Num = 0; DMA_Pause_Num < 100; DMA_Pause_Num++)
    {
      DMA_SoftwareTrigger(DMA0);	//软件触发DMA
    }

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

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

  while(1);
}

