OpenEdv-开源电子网

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

关于DMA+ADC的问题

[复制链接]

3

主题

11

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2016-8-31
在线时间
10 小时
发表于 2017-2-8 18:19:28 | 显示全部楼层 |阅读模式
用DMA+ADC模式采样时,DMA缓存区数据存满之后,取出去进行滤波存储处理,在操作缓存区数组时ADC还是在工作吗?如果还是在工作那么采样数据放到哪里了呢,会在操作数组过程中覆盖原来的值吗,最近才接触到DMA,请多指教
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

9

主题

1385

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
12231
金钱
12231
注册时间
2013-3-8
在线时间
1297 小时
发表于 2017-2-8 19:06:50 | 显示全部楼层
是可以设置的,一般DMA采完后,都会停止,需要重新开启,
回复 支持 反对

使用道具 举报

3

主题

11

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2016-8-31
在线时间
10 小时
 楼主| 发表于 2017-2-9 10:04:23 | 显示全部楼层
augustedward 发表于 2017-2-8 19:06
是可以设置的,一般DMA采完后,都会停止,需要重新开启,

volatile u16 ADCConvertedValue[400];
DMA_csh.DMA_MemoryBaseAddr = (unsigned int)ADCConvertedValue;   //内存地址

这句是我从网上看到的,DMA是循环传输模式

DMA_csh.DMA_Mode = DMA_Mode_Circular;  //循环传输

他在DMA中断程序里关闭了外部触发的定时器,然后对ADCConvertedValue数组进行了存储操作,再打开定时器。
如果我想不关闭定时器连续采样的话,那么在对ADCConvertedValue数组进行存储操作时,会不会因为连续的采样覆盖我正在存储的值,怎么解决这个问题呢
回复 支持 反对

使用道具 举报

34

主题

283

帖子

0

精华

高级会员

Rank: 4

积分
739
金钱
739
注册时间
2015-11-15
在线时间
226 小时
发表于 2017-2-9 10:08:36 | 显示全部楼层
DMA只是把ADC转换的结果搬运出去,如果没有及时读取的话,会覆盖掉吧;---这貌似是循环模式下的情况;
与其感慨路难行,不如马上出发
回复 支持 反对

使用道具 举报

3

主题

11

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2016-8-31
在线时间
10 小时
 楼主| 发表于 2017-2-9 10:21:11 | 显示全部楼层
xueshawu 发表于 2017-2-9 10:08
DMA只是把ADC转换的结果搬运出去,如果没有及时读取的话,会覆盖掉吧;---这貌似是循环模式下的情况;

那怎么解决呢,设置两个缓存区,DMA向其中一个搬运数据,存满之后到主程序里进行处理,这个过程中,DMA向另一个搬运,依次交替进行,这个方案可行吗
回复 支持 反对

使用道具 举报

34

主题

283

帖子

0

精华

高级会员

Rank: 4

积分
739
金钱
739
注册时间
2015-11-15
在线时间
226 小时
发表于 2017-2-9 10:33:24 | 显示全部楼层
你的问题是不是,你ADC转换的数据可能来不及处理;会导致有些数据会被覆盖掉? 间断模式是不是可以试一下
与其感慨路难行,不如马上出发
回复 支持 反对

使用道具 举报

34

主题

283

帖子

0

精华

高级会员

Rank: 4

积分
739
金钱
739
注册时间
2015-11-15
在线时间
226 小时
发表于 2017-2-9 10:45:48 | 显示全部楼层
我先理一下,你的需求
1、ADC要工作在连续采样模式,
2、DMA也在循环模式
3、ADC的数据需要滤波处理(需要一定的时间,可能会导致缓存数组的数据被覆盖)
与其感慨路难行,不如马上出发
回复 支持 反对

使用道具 举报

3

主题

11

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2016-8-31
在线时间
10 小时
 楼主| 发表于 2017-2-9 10:55:26 | 显示全部楼层
xueshawu 发表于 2017-2-9 10:45
我先理一下,你的需求
1、ADC要工作在连续采样模式,
2、DMA也在循环模式

嗯,对的。主要就是1和3,我理解因为ADC要连续采样,所以DMA要工作在循环模式吧
回复 支持 反对

使用道具 举报

34

主题

283

帖子

0

精华

高级会员

Rank: 4

积分
739
金钱
739
注册时间
2015-11-15
在线时间
226 小时
发表于 2017-2-9 11:24:15 | 显示全部楼层
hande 发表于 2017-2-9 10:55
嗯,对的。主要就是1和3,我理解因为ADC要连续采样,所以DMA要工作在循环模式吧

如果,按照你说的用两个数组;这样你DMA就需要把基地址重新初始化,重新映射到第二个数组地址; 或者你还是搞两个数组,第一个用于存放ADC缓存值,第二个用于存放多次采样的平均值;最后用平均值进行滤波
与其感慨路难行,不如马上出发
回复 支持 反对

使用道具 举报

3

主题

11

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2016-8-31
在线时间
10 小时
 楼主| 发表于 2017-2-9 11:51:22 | 显示全部楼层
xueshawu 发表于 2017-2-9 11:24
如果,按照你说的用两个数组;这样你DMA就需要把基地址重新初始化,重新映射到第二个数组地址; 或者你还 ...

你说的第二种方法意思是,在DMA中断函数中对ADC的缓存值取平均存放到另一个数组中,然后再取平均值数组进行操作吗?那在CPU在执行中断函数时,ADC是不是就不会采样了
回复 支持 反对

使用道具 举报

34

主题

283

帖子

0

精华

高级会员

Rank: 4

积分
739
金钱
739
注册时间
2015-11-15
在线时间
226 小时
发表于 2017-2-9 12:10:56 | 显示全部楼层
没有清除EOC标志位,ADC是不会开启下一次转换的
与其感慨路难行,不如马上出发
回复 支持 反对

使用道具 举报

34

主题

283

帖子

0

精华

高级会员

Rank: 4

积分
739
金钱
739
注册时间
2015-11-15
在线时间
226 小时
发表于 2017-2-9 12:12:40 | 显示全部楼层
你这个处理需要在DMA中断中进行;因为DMA读取ADC_DR的值,就会自动清除EOC
与其感慨路难行,不如马上出发
回复 支持 反对

使用道具 举报

3

主题

11

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2016-8-31
在线时间
10 小时
 楼主| 发表于 2017-2-9 13:05:41 | 显示全部楼层
xueshawu 发表于 2017-2-9 12:12
你这个处理需要在DMA中断中进行;因为DMA读取ADC_DR的值,就会自动清除EOC

嗯,我试试看,非常感谢
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-8-24 12:49

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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