你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

关于DMA双缓冲,DMA_DoubleBufferModeConfig()

[复制链接]
wz002 提问时间:2015-12-25 19:40 /
有谁用过DMA的双缓冲区模式吗?请教一下应该怎么配置,也帮我看看以下问题!

1.当我还没有配置双缓冲模式的时候,也就是没有DMA_DoubleBufferModeConfig()和DMA_DoubleBufferModeCmd()这两句的时候,Buffer1和Buffer2的内容就已经在循环发送到串口,然而我并没有让他发送Buffer2的内容,配置如下,这一点我不明白。结果如图一。

图一

图一

2.当我按自己的理解添加了 DMA_DoubleBufferModeConfig(DMA2_Stream7,(uint32_t)Buffer2,DMA_Memory_0);
DMA_DoubleBufferModeCmd(DMA2_Stream7,ENABLE);之后,我观察发送的数据发现,在发送了Buffer1和Buffer2的数据之后,又发送了同样数量的00,为什么会有这些00,这里我也不太明白。结果如图二。
2.png
void USART_DMA_Config(void)
{
DMA_InitTypeDef   DMA_InitStructure;
/* DMA2_Stream7 channel4 configuration ---------------------------------------------*/
DMA_DeInit(DMA2_Stream7);
DMA_InitStructure.DMA_PeripheralBaseAddr = USART1_DR_Address;
DMA_InitStructure.DMA_Channel = DMA_Channel_4;
DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)Buffer1;
DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;
DMA_InitStructure.DMA_BufferSize = 80;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;
DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
//DMA_DoubleBufferModeConfig(DMA2_Stream7,(uint32_t)Buffer2,DMA_Memory_0);
//DMA_DoubleBufferModeCmd(DMA2_Stream7,ENABLE);
DMA_Init(DMA2_Stream7, &DMA_InitStructure);
DMA_Cmd(DMA2_Stream7, ENABLE);
}
另附上
const uint16_t Buffer1[20] =
{
0x1234, 0x5678, 0x1ABC, 0xDEF0, 0x5555,
0x1748, 0x9027, 0x4424, 0x9623, 0x0932,
0x9744, 0x7845, 0x0912, 0x1111, 0x1772,
0x9736, 0x0933, 0x0187, 0x9567, 0x9977
};
const uint16_t Buffer2[20] =
{
0x1111, 0x7845, 0x0912, 0xDEF0, 0x9977,
0x0187, 0x9736, 0x9567, 0xDEF0, 0x1772,
0x5555, 0x1111, 0x0933, 0x1234, 0x9567,
0x9736, 0x4444, 0x9ABC, 0x1111, 0x4424
};


收藏 1 评论2 发布时间:2015-12-25 19:40

举报

2个回答
venus5712 回答时间:2015-12-25 20:24:32
01、DMA_Cmd(DMA2_Stream7, ENABLE); //设置了DMA后 ,DMA就开始工作了 。这就导致问题一的出现

02、传输的方式是字节流(byte)方向从内存到外设,所以buffer1和buffer2的实际内存大小各为20*2 = 40 bytes ,DMA设置传输长度是80,模式是 DMA_Mode_Circular 。这个现象是 每次传送都是80个字节长度且循环往复的发送。这就导致现象2发生 。如果传入的是buffer2的地址而其内容就40个字节大小,那结果你晓得。
wz002 回答时间:2015-12-25 21:58:14
疯狂的指头 发表于 2015-12-25 20:24
01、DMA_Cmd(DMA2_Stream7, ENABLE); //设置了DMA后 ,DMA就开始工作了 。这就导致问题一的出现

02、传输 ...

感谢你的回答,我现在是明白了,现在仔细想想还我自己理解不到位导致的,忽视了一些细节

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版