OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4385|回复: 13

STM32F103的DMA读IO口问题

[复制链接]

6

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2018-2-23
在线时间
10 小时
发表于 2018-2-23 17:29:34 | 显示全部楼层 |阅读模式
5金钱
之前没接触过DMA这个东西,最近看了下相关资料,也不是很了解整个逻辑过程。

现在需要用STM32F1去读外部ADC,10M~20M,12位并口,信号是2MHz的正选波。需要不间断连续读数据。此阶段MCU可以不做任何事。

1:因为是主动去读IO口,所以没办法用外部中断触发DMA。这样是否就需要用到定时器中断?
2:如果用定时器触发中断,那么中断部分代码的运行时间不就会导致数据的采集率过慢吗?
3:用DMA+中断方式读数据,和直接用MCU调用函数读取数据,具体哪个快些?
4:如果不用定时器中断,还有别的什么方法可以快速读取IO口数据吗?


最佳答案

查看完整内容[请看2#楼]

连续读的意思不是循环循环传送的意思,只要配置好DMA的bufsize,dma就是要连续传送数据的。这么说是为了兼容使用mcu的情况。。 mcu选都选了,也不是不能用。 如果用DMA的话,可以用定时器触发开始转换,也可以用软件控制。选哪个都只是影响开始传送之前的延迟,不会影响采样点之间的精度。 什么时候停止不用主动控制的,传送完数据自动停止。如果配置了相关的中断,停止的时候就会触发一个DMA中断。 现在哪个法案 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

15

主题

184

帖子

0

精华

高级会员

Rank: 4

积分
647
金钱
647
注册时间
2014-4-29
在线时间
299 小时
发表于 2018-2-23 17:29:35 | 显示全部楼层
axjzxc 发表于 2018-2-24 15:21
硬件设计好了,芯片也快到了,过年导致推迟了不少啊。
12个数据线是接到GPIOC的0~11位的,是同一端口。
...

连续读的意思不是循环循环传送的意思,只要配置好DMA的bufsize,dma就是要连续传送数据的。这么说是为了兼容使用mcu的情况。

mcu选都选了,也不是不能用。

如果用DMA的话,可以用定时器触发开始转换,也可以用软件控制。选哪个都只是影响开始传送之前的延迟,不会影响采样点之间的精度。
什么时候停止不用主动控制的,传送完数据自动停止。如果配置了相关的中断,停止的时候就会触发一个DMA中断。

现在哪个法案的速度最快也没法考虑太多了。你画板之前怎么没先搭个工装做个小程序测试一下速度够不够呢?
回复

使用道具 举报

0

主题

64

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
249
金钱
249
注册时间
2018-1-19
在线时间
28 小时
发表于 2018-2-23 17:50:52 | 显示全部楼层
DMA  其实很好理解的   只要配置对了  就行了  找个例子看一下
回复

使用道具 举报

6

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2018-2-23
在线时间
10 小时
 楼主| 发表于 2018-2-24 08:54:34 | 显示全部楼层
一抹残阳 发表于 2018-2-23 17:50
DMA  其实很好理解的   只要配置对了  就行了  找个例子看一下

那么是DMA读IO口快还是MCU直接读IO口快,比如连续读100次。
DMA应该必须配定时器吧?还是说DMA可以一直扫IO口把数据存起来?
回复

使用道具 举报

0

主题

64

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
249
金钱
249
注册时间
2018-1-19
在线时间
28 小时
发表于 2018-2-24 09:04:03 | 显示全部楼层
DMA快吧  可以用定时器去触发DMA采样
回复

使用道具 举报

6

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2018-2-23
在线时间
10 小时
 楼主| 发表于 2018-2-24 09:27:52 | 显示全部楼层
一抹残阳 发表于 2018-2-24 09:04
DMA快吧  可以用定时器去触发DMA采样

用定时器去触发DMA,中断运行也是要时间的吧。时间不会更多的浪费在定时器上吗?
如果MCU直接读GPIOx->IDR不应该更快一些吗?
回复

使用道具 举报

0

主题

64

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
249
金钱
249
注册时间
2018-1-19
在线时间
28 小时
发表于 2018-2-24 11:31:57 | 显示全部楼层
axjzxc 发表于 2018-2-24 09:27
用定时器去触发DMA,中断运行也是要时间的吧。时间不会更多的浪费在定时器上吗?
如果MCU直接读GPIOx->I ...

你是做ADC采集?  还是要用到DMA
回复

使用道具 举报

6

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2018-2-23
在线时间
10 小时
 楼主| 发表于 2018-2-24 13:49:51 | 显示全部楼层
一抹残阳 发表于 2018-2-24 11:31
你是做ADC采集?  还是要用到DMA

ADC采集,外挂的ADC芯片。
1:模拟信号是4MHz等正选波
2:ADC是20Msps,12位并口,用GPIOx去读12位并口数据。
就是不知道是用DMA读IO口数据到内存快,还是MCU直接访问寄存器块。
网上查了不少资料,都说DMA快,有点不是很能理解。
个人理解是MCU直接访问寄存器会快些,不知道是不是我又哪里没搞懂。
3:我只需要在特定条件下触发ADC采集,扫出一个完整的信号波形;而不是无限持续采集。
回复

使用道具 举报

0

主题

64

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
249
金钱
249
注册时间
2018-1-19
在线时间
28 小时
发表于 2018-2-24 14:05:11 | 显示全部楼层
STM32F1  有内部自带的ADC   干嘛还要去读外部的?  有的东西理解不了  可以记着啊   你说的特定条件是什么情况下?
回复

使用道具 举报

6

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2018-2-23
在线时间
10 小时
 楼主| 发表于 2018-2-24 14:35:27 | 显示全部楼层
一抹残阳 发表于 2018-2-24 14:05
STM32F1  有内部自带的ADC   干嘛还要去读外部的?  有的东西理解不了  可以记着啊   你说的特定条件是什么 ...

内部的ADC转换速率不够,无法采集4MHz的信号。
我说的特定条件是上位机通讯,发指令给MCU,高速MCU转换一次波形数据,然后MCU就扫一个周期的波形出来,把采样的数据传给上位机。
回复

使用道具 举报

0

主题

64

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
249
金钱
249
注册时间
2018-1-19
在线时间
28 小时
发表于 2018-2-24 15:01:56 | 显示全部楼层
axjzxc 发表于 2018-2-24 14:35
内部的ADC转换速率不够,无法采集4MHz的信号。
我说的特定条件是上位机通讯,发指令给MCU,高速MCU转换一 ...

http://www.ing10bbs.com/forum.ph ... &extra=page%3D1  希望对你有帮助
回复

使用道具 举报

15

主题

184

帖子

0

精华

高级会员

Rank: 4

积分
647
金钱
647
注册时间
2014-4-29
在线时间
299 小时
发表于 2018-2-24 15:11:33 | 显示全部楼层
肯定是DMA快啊。
比如MCU直接读的时候用for循环,像i++这种语句,再怎么优化也要占用指令周期。DMA是直接用硬件的计数器控制的。
你这个问题和定时器中断什么的一点关系都没有。不是每个中断读一个点,而是一开始读就要屏蔽掉所有中断,连续不停的读完一个信号周期。

不过你这个硬件设计好了没?不管是DMA还是MCU直接读,ADC的12根数据线如果不接在MCU的同一个端口,速度肯定是快不起来的。
另外你都用了这么贵的ADC了,怎么不选个好点的MCU,F1好像有点慢吧
回复

使用道具 举报

6

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2018-2-23
在线时间
10 小时
 楼主| 发表于 2018-2-24 15:21:01 | 显示全部楼层
xianshasaman 发表于 2018-2-24 15:11
肯定是DMA快啊。
比如MCU直接读的时候用for循环,像i++这种语句,再怎么优化也要占用指令周期。DMA是直接 ...

硬件设计好了,芯片也快到了,过年导致推迟了不少啊。
12个数据线是接到GPIOC的0~11位的,是同一端口。
F1慢的话用什么比较合适?F4?

你说的连续读是指DMA开启循环转换的意思吗?由软件触发转换?也由软件控制停止?
回复

使用道具 举报

6

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2018-2-23
在线时间
10 小时
 楼主| 发表于 2018-2-24 16:07:11 | 显示全部楼层
xianshasaman 发表于 2018-2-24 15:49
连续读的意思不是循环循环传送的意思,只要配置好DMA的bufsize,dma就是要连续传送数据的。这么说是为了 ...

现在就是用小测试板测试,在等ADC芯片到货。
硬件是旧的硬件,但是留有扩展口,现在就是需要做个小板子上去测试。
感谢大大解惑,等芯片到了我试下效果。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-8 11:02

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表