代码可以参考一下。
DMA_DeInit(DMA1_Stream4); DMA_StructInit(&DMA_InitStructure); DMA_InitStructure.DMA_Channel = DMA_Channel_7; DMA_InitStructure.DMA_PeripheralbaseAddr = (uint32_t)&USART3->DR; //数据传输的外设首地址 DMA_InitStructure.DMA_Memory0baseAddr = (uint32_t)Buffer0; //自己定义待发送数组的首地址,要强制转换为32位 DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral; //数据传输方向选择为内存->外设 DMA_InitStructure.DMA_BufferSize = 4; //传输数据大小为8,大小要配合定义的数组类型和外设数据类型,否则会丢失或补充数据 DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外设地址寄存器自动增加禁止,因为这里只用到了 DR 数据寄存器 DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //内存地址自增允许,因为要读取一个数组 DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; //外设的数据大小,因为 USART3_DR 数据寄存器为8位,故选Byte DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; //这里也选 Byte DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; //DMA 传输模式为 DMA_Mode_Normal,如果为 DMA_Mode_Circular将会循环传输 DMA_InitStructure.DMA_Priority = DMA_Priority_Low; //优先级为 High DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable; DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_1QuarterFull; DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single; DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; DMA_DoubleBufferModeConfig(DMA1_Stream4 (uint32_t)Buffer1 DMA_Memory_0); DMA_DoubleBufferModeCmd(DMA1_Stream4 ENABLE);