uint8_t Buffer0[4] = {0x11,0x22,0x33,0x44};
uint8_t Buffer1[4] = {0x55,0x66,0x77,0x88};
DMA_DeInit(DMA1_Stream3); DMA_StructInit( &DMA_InitStructure); DMA_InitStructure.DMA_Channel = DMA_Channel_4; //选择 Channel_5 DMA_InitStructure.DMA_PeripheralBaseAddr = USART3_DR_Addr; //数据传输的外设首地址,详解见上 DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)Buffer2; //自己定义待发送数组的首地址,要强制转换为32位 DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral; //数据传输方向选择为内存->外设 DMA_InitStructure.DMA_BufferSize = 10; //传输数据大小为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_Normal; //DMA 传输模式为 DMA_Mode_Normal,如果为 DMA_Mode_Circular,将会循环传输 DMA_InitStructure.DMA_Priority = DMA_Priority_High; //优先级为 High /*双缓冲模式,在 DMA_Init 之前调用在 Circular 模式有效,会强制 Circular, *不支持 Memory to Memory,(uint32_t)Buffer2为 DMA_Memory_1,DMA 先将 Buffer *中的数据发送完毕后在发送 Buffer2的数据,当然顺序可以改变*/ DMA_DoubleBufferModeConfig(DMA1_Stream3, (uint32_t)Buffer1, DMA_Memory_1); DMA_DoubleBufferModeCmd(DMA1_Stream3, ENABLE); 我配置了F4的DMA双缓冲模式(库函数版本的)! 在DMA的配置里加了这么两句话(含自己理解) DMA_DoubleBufferModeConfig(DMA1_Stream3, (uint32_t)Buffer1/*Memory1BaseAddr*/, DMA_Memory_1/*Memory x is the current buffer,当前第一个开始传输的memory 不使用DoubleBuffer模式的时候,默认当前的memory是第一个*/); DMA_DoubleBufferModeCmd(DMA1_Stream3, ENABLE); 补充:前面memory0的时候设置了Buffer0 DMA_BufferSize设置为8 同时中断里只是清除标志位 但是如果memory0设置为buffer1,而memory1设置为buffer0的话,打印出来就是11 ...88 但是如果memory0设置为buffer0,而memory1设置为buffer1的话,打印出来就是55 66 77 88 15 00 08 52 我分析了下,后面的四个和我不使用双缓存模式,将DMA_BufferSize设置的长度大于数组长度时候的一样! 感觉就和找不到buffer1一样~ |