DMA传输数据(M->P)

发布时间 2023-12-04 21:03:02作者: 京多安

前言

  上文讨论了利用DMA将数据从一个存储器搬运到另一个存储器,本文讨论将数据从M->P。将数据从数组转移到串口外设并发送出去。

代码

void MYDMA_Init(DMA_Stream_TypeDef *DMA_Streamx,u32 chx,uint32_t par,u32 mar,u16 ndtr)
{
    DMA_InitTypeDef  DMA_InitStructure;

    if((u32)DMA_Streamx>(u32)DMA2)//得到当前stream是属于DMA2还是DMA1
    {
      RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2,ENABLE);//DMA2时钟使能 

    }else 
    {
      RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1,ENABLE);//DMA1时钟使能 
    }

    DMA_DeInit(DMA_Streamx); 
    while (DMA_GetCmdStatus(DMA_Streamx) != DISABLE){}//等待 DMA 可配置

    /* 配置 DMA Stream */
    DMA_InitStructure.DMA_Channel = chx;  //通道选择
    DMA_InitStructure.DMA_PeripheralBaseAddr = par;//DMA外设地址,其实就是传输起始地址
    DMA_InitStructure.DMA_Memory0BaseAddr = mar;//DMA 存储器0地址,数据接收地址
    DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;//存储器到外设模式
    DMA_InitStructure.DMA_BufferSize = ndtr;//数据传输量 
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable ;//外设增量模式
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//存储器增量模式
    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;//外设数据长度:8位
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;//存储器数据长度:8位
    DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;// 使用普通模式,一次传输,存储器到存储器只能一次模式 
    DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;//中等优先级
    DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable; //不用FIFO        
    DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
    DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;//存储器突发单次传输
    DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;//外设突发单次传输
    DMA_Init(DMA_Streamx, &DMA_InitStructure);//初始化DMA Stream,初始化数据流
		
    DMA_Cmd(DMA_Streamx, ENABLE); //开启 DMA 传输
	
}
uint8_t DataA[] = {0x01, 0x02, 0x03, 0x04};
int main(void)
{
    uart_init(115200);
    delay_init(84);
    MYDMA_Init(DMA2_Stream7,DMA_Channel_4,USART_DR_BASE,(uint32_t) DataA,4);//串口1数据流是7.通道4,DMA2
	
    USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE);//硬件触发DMA传输信号
	
  while(1){

	}
}

现象

image