视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
DMA双缓冲应用实例
2025-10-02 15:10:13 责编:小OO
文档
不知道有没有人做过F4的DMA的双缓冲模式,帮我看看!

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一样~ 

下载本文
显示全文
专题