打印
[STM32F4]

STM32F4系列的DMA能否实现从GPIO口到内存的传输

[复制链接]
8175|36
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lixiaoxu186|  楼主 | 2017-6-12 09:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我想使用STM32F407 与FPGA相连接,FPGA采集AD采样值,16位数据与STM32F4的GPIOD端口相连,当FPGA每采集完成一个信号后,生成一个触发信号,通知STM32F4的定时器触发引脚上,我使用TIM5的CH1通道即(PA0).目前测试发现捕获好使,但是DMA不好使,在论坛上也发帖了,有的网友说 TIM5的DMA支持TIM5的相关寄存器,不可以设置为GPIO。但是 我之前 在网上看见过可以使用的 **
http://www.cnblogs.com/shangdawei/p/4748426.html

还有版主回到其他坛友的**
https://bbs.21ic.com/icview-110100-1-1.html

都说是可以的?


但是这两篇**都只是针对STM32F1系列的?难道F4系列不可以?



刚刚自己又测试了下,将DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t) &GPIOD->IDR;

更改为                        DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&TIM5->CCR1);

确实可以进入DMA中断了?
难道真的是想坛友说的 TIM5的MDA的地址只能设置TIM5相关的寄存器地址?


沙发
sonicll| | 2017-6-12 09:36 | 只看该作者
你的DMA是怎么配的,能把DMA的配置代码贴出来吗?按照你提到的这个帖子http://www.cnblogs.com/shangdawei/p/4748426.html应该是没有问题的,看看是不是DMA通道配错了?

使用特权

评论回复
板凳
lixiaoxu186|  楼主 | 2017-6-12 09:38 | 只看该作者
本帖最后由 lixiaoxu186 于 2017-6-12 09:41 编辑
sonicll 发表于 2017-6-12 09:36
你的DMA是怎么配的,能把DMA的配置代码贴出来吗?按照你提到的这个帖子http://www.cnblogs.com/shangdawei/ ...

你好 我之前发过帖子 代码在这里 https://bbs.21ic.com/icview-1723058-1-1.html
通道没有错
我觉得 好像是  更改下 将外设到内存 更改为 内存到内存
但是   简单的将外设到内存 更改为内存到内存还是不好使  

使用特权

评论回复
地板
lixiaoxu186|  楼主 | 2017-6-12 10:32 | 只看该作者
刚才看了下数据手册,只有 DMA1 控制器 AHB 外设端口与 DMA2 控制器的情况不同,不连接到总线矩阵,因此,仅 DMA2 数据流能够执行存储器到存储器的传输。
但是内存到内存模式 不支持双缓冲也不支持循环模式。

http://www.cnblogs.com/shangdawei/p/4748426.html 这个帖子里的应用也没有使用内存到内存?

使用特权

评论回复
5
sonicll| | 2017-6-12 14:47 | 只看该作者
我测试了你的代码,TIM5_CH1对应的DMA1_Stream2确实不能搬运GPIO的寄存器,在你的代码里加入 DMA_GetFlagStatus(DMA1_Stream2, DMA_FLAG_TEIF2); 能够检测到传输错误。
然后我换用TIM8来替代你的TIM5,TIM8_CH1对应的DMA是DMA2_Stream2,这样是可以搬运GPIO寄存器的值的,楼主你可以测试看看。
这样看来,数据手册里的那句“The DMA1 controller AHB peripheral port is not connected to the bus matrix like DMA2 controller.”意思就是说DMA1不能搬运AHB上的外设,但是DMA2可以。而STM32F103系列似乎没有这个限制。不知道我理解的对不对,召唤一下版主@香水城

使用特权

评论回复
6
zhuomuniao110| | 2017-6-12 15:46 | 只看该作者
应该可以,学习学习。。。

使用特权

评论回复
7
zhuomuniao110| | 2017-6-12 15:48 | 只看该作者
可以的。
设置源地址为IO口的ODR寄存器,目的地址为I内存地址,然后用软件触发的方式。 就可以了。 触发一次,传输一次。

——————————————————————论坛查到的人家的回复。

使用特权

评论回复
8
sonicll| | 2017-6-12 15:57 | 只看该作者
本帖最后由 sonicll 于 2017-6-12 16:03 编辑
zhuomuniao110 发表于 2017-6-12 15:48
可以的。
设置源地址为IO口的ODR寄存器,目的地址为I内存地址,然后用软件触发的方式。 就可以了。 触发一 ...

原理上都是可行的,但是现在F4系列似乎对DMA有要求,只有DMA2才能实现GPIO向内存搬运,DMA1是不行的。看手册里这个图,画红圈的部分没有连线,和其他的不一样


无标题.jpg (328.94 KB )

DMA

DMA

使用特权

评论回复
9
zhuomuniao110| | 2017-6-12 16:01 | 只看该作者
sonicll 发表于 2017-6-12 15:57
原理上都是可行的,但是现在F4系列似乎对DMA有要求,只有DMA2才能实现GPIO向内存搬运,DMA1是不行的 ...

如果要求不高就用IO中断传送。。。应该可以达到类似的效果。

使用特权

评论回复
10
feelhyq| | 2017-6-12 17:44 | 只看该作者
楼主请看图片中红色线,如果DMA1 加了这条红色线,说明DMA1外设寄存器可以设置GPIO地址(因为GPIO是挂在AHB1总线上面的),但是DMA1实际上是没有这条红线的,因此DMA1外设寄存器不能设置为挂在AHB1总线上的任何一个地址,当然就包括GPIO有关寄存器啦),之所以 更改为                        DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&TIM5->CCR1); 这个可以,是因为TIM5挂在APB1外设上面,也就是图片中的绿线啦!!!C:\Users\yongqiang.hu\Desktop

QQ截图20170612173432.png (321.44 KB )

QQ截图20170612173432.png

使用特权

评论回复
11
feelhyq| | 2017-6-12 17:46 | 只看该作者
DMA2就不存在这个问题,因此DMA2是可以的

使用特权

评论回复
12
mmuuss586| | 2017-6-12 18:22 | 只看该作者
F1都可以,F4当然可以;

使用特权

评论回复
13
wangguanfu| | 2017-6-13 10:38 | 只看该作者
为什么不搞一个普通io脚触发dma的通道。。。。哎呦喂

使用特权

评论回复
14
sonicll| | 2017-6-13 11:08 | 只看该作者
wangguanfu 发表于 2017-6-13 10:38
为什么不搞一个普通io脚触发dma的通道。。。。哎呦喂

现在这个问题不在触发源上,上面那个例子不管用TIM5还是TIM8都是能触发DMA的,只是DMA的数据源地址有限制,DMA1的数据源不能是AHB上的外设。即使你用普通IO脚来触发,也必须使用DMA2才能行,这是F4系列的限制

使用特权

评论回复
15
lixiaoxu186|  楼主 | 2017-6-13 13:09 | 只看该作者
sonicll 发表于 2017-6-12 14:47
我测试了你的代码,TIM5_CH1对应的DMA1_Stream2确实不能搬运GPIO的寄存器,在你的代码里加入 DMA_GetFlagSt ...

恩 我做我看了下数据手册 也发现了您说的问题 现已更改给TIM1的ch1引脚 已实现  非常感谢您的指导

使用特权

评论回复
16
lixiaoxu186|  楼主 | 2017-6-13 13:10 | 只看该作者
zhuomuniao110 发表于 2017-6-12 16:01
如果要求不高就用IO中断传送。。。应该可以达到类似的效果。

因为传输的数据多  不想使用IO口中断  浪费cup时间

使用特权

评论回复
17
lixiaoxu186|  楼主 | 2017-6-13 13:10 | 只看该作者
mmuuss586 发表于 2017-6-12 18:22
F1都可以,F4当然可以;

恩 是可以的

使用特权

评论回复
18
大秦正声| | 2017-6-13 16:19 | 只看该作者
不错

使用特权

评论回复
19
lyn3210| | 2017-6-13 17:28 | 只看该作者
有触发方式吗?靠什么起动一次传输。

使用特权

评论回复
20
sonicll| | 2017-6-13 17:39 | 只看该作者
lyn3210 发表于 2017-6-13 17:28
有触发方式吗?靠什么起动一次传输。

你可以看另一个帖子的代码
TIM_DMACmd(TIM5,TIM_DMA_CC1,ENABLE );
定时器通道1的输入捕获事件触发DMA

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

68

帖子

1

粉丝