OpenEdv-开源电子网

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

adc循环模式,通过dma传输数据,一次传输完成后如何再开始下一次啊

[复制链接]

4

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2015-8-8
在线时间
0 小时
发表于 2015-8-8 16:43:25 | 显示全部楼层 |阅读模式
5金钱

我设置adc通过dma模式传输数据,想通过定时器控制每隔一段时间开启一次传输,但是发现进入debug里面,数组的数据无法刷新,但是adc寄存器的数据一直都在刷新,也就是说adc的数据无法通过dma传输,如何我重新初始化adc,结果就可以了,数组的数字可以刷新了。

总之就是想问在adc循环模式,通过dma传输数据的情况下,一次传输完成后如何再开始下一次啊,都需要配置什么啊,还是需要调用哪个函数。把adc什么的全重新初始化一次太占用资源了。

最佳答案

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

ADC_CR2 DDS置1 0:最后一次传输后不发出新的 DMA 请求(在 DMA 控制器中进行配置) 1:只要发生数据转换且 DMA = 1,便会发出 DAM 请求
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

8

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
432
金钱
432
注册时间
2015-12-1
在线时间
71 小时
发表于 2015-8-8 16:43:26 | 显示全部楼层
ADC_CR2  DDS置1
0:最后一次传输后不发出新的 DMA 请求(在 DMA 控制器中进行配置)
1:只要发生数据转换且 DMA = 1,便会发出 DAM 请求
回复

使用道具 举报

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
发表于 2015-8-8 17:12:12 | 显示全部楼层
你说了定时器控制,那就是单次模式。
在定时器中断里开启一次就行了,每次到了就开起一次。

void TIM3_IRQHandler(void)   //TIM3中断
{
    if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)  //检查TIM3更新中断发生与否
    {
        ADC_SoftwareStartConvCmd(ADC1, ENABLE);
        
        TIM_ClearITPendingBit(TIM3, TIM_IT_Update);  //清除TIMx更新中断标志 
    }
}
小小蜗牛
回复

使用道具 举报

4

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2015-8-8
在线时间
0 小时
 楼主| 发表于 2015-8-8 17:21:10 | 显示全部楼层
回复【2楼】jiutianshenjian:
---------------------------------
不是单次模式,是循环模式,adc一直都在工作,dma设置采样50次(我想的是采样完成后应该是自动停止),然后在定时器中断里将这50个数处理完后,我想要重新开启dma刷新数组的数,而且ADC_SoftwareStartConvCmd(ADC1, ENABLE);这个函数为什么不能用啊。
回复

使用道具 举报

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
发表于 2015-8-10 08:23:00 | 显示全部楼层
1.你定时器用来干嘛,一般用来控制采集间隔时间吧?
   如果是这样,就不能循环,只能单次。不然定时器有什么用,第一次转换完成马上开始另一次转换,定不住啊。
2.dma是随adc完成触发的,处理数据放到dma完成中断里才对。
3.ADC_SoftwareStartConvCmd(ADC1, ENABLE);例程应该有如何使用吧。

你可以把你初始化代码贴出来让论坛的高手给你看看。
小小蜗牛
回复

使用道具 举报

4

主题

58

帖子

0

精华

初级会员

Rank: 2

积分
161
金钱
161
注册时间
2015-7-31
在线时间
19 小时
发表于 2015-8-10 09:34:40 | 显示全部楼层
adc开启扫描模式!关闭连续模式。然后每次用定时器触发,adc设置外部触发,详情可以参考adc的外部触发部分,我有设置源码,需要可以要
本人深山苦练20余年,一天只睡4小时,可连续编程100小时不休息,上至带项目、出方案,下至盗账号,学校不支持编程已辍学,家人不支持编程已断绝关系,老婆不支持编程已离婚,小孩不支持编程已送孤儿院,备用电源万兆光纤永不断电断网,门口已埋雷无人打扰
回复

使用道具 举报

4

主题

58

帖子

0

精华

初级会员

Rank: 2

积分
161
金钱
161
注册时间
2015-7-31
在线时间
19 小时
发表于 2015-8-10 09:45:47 | 显示全部楼层
噗,错了,没注意看你的要求,你需要设置软件触发,只需要在需要ad转换的时候开启,你可以开启扫描和循环模式(此时你的软件触发只需要开启一次),然后注意设置dma的缓存大小,建议设置为n*50(因为你n个通道分别转换50次) 在获取每个ad值赋值给数组,每50个求平均,然后赋给一个一位数组(个数由通道数决定),
本人深山苦练20余年,一天只睡4小时,可连续编程100小时不休息,上至带项目、出方案,下至盗账号,学校不支持编程已辍学,家人不支持编程已断绝关系,老婆不支持编程已离婚,小孩不支持编程已送孤儿院,备用电源万兆光纤永不断电断网,门口已埋雷无人打扰
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
28
金钱
28
注册时间
2015-7-16
在线时间
0 小时
发表于 2015-8-10 11:31:00 | 显示全部楼层
没有具体代码,也不知道你问题出在哪里啊
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2016-10-14
在线时间
0 小时
发表于 2016-10-14 11:48:37 | 显示全部楼层
中二电子测控汪 发表于 2015-8-10 09:45
噗,错了,没注意看你的要求,你需要设置软件触发,只需要在需要ad转换的时候开启,你可以开启扫描和循环模 ...

您好,关于这个问题,我想问您一下,就是我开启扫描和循环模式,设置DMA缓存区为12*50,那么在ADC采集到数据后,是不是会立马将数据传给我定义的变量?(这个地方需要用中断吗?),然后下一次ADC采集数据的时候,也就会直接覆盖之前缓存区的数据?
回复

使用道具 举报

1

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2016-10-28
在线时间
6 小时
发表于 2016-11-18 15:34:04 | 显示全部楼层
中二电子测控汪 发表于 2015-8-10 09:45
噗,错了,没注意看你的要求,你需要设置软件触发,只需要在需要ad转换的时候开启,你可以开启扫描和循环模 ...

dma和adc均设置为循环模式后,也就是adc每完成一次转换,dma采一次数据吗。那为什么我dma和adc设置好后,把dma采集数据个数设置为1000,dma便直接采了1000个数据,然后就不循环覆盖这1000个数据?
回复

使用道具 举报

4

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2013-9-5
在线时间
22 小时
发表于 2017-3-21 23:51:08 | 显示全部楼层
加一句这个
ADC_DMARequestAfterLastTransferCmd(ADC1,ENABLE);
回复

使用道具 举报

1

主题

2

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2021-4-24
在线时间
2 小时
发表于 2021-4-25 16:04:16 | 显示全部楼层
Mr果皮 发表于 2016-11-18 15:34
dma和adc均设置为循环模式后,也就是adc每完成一次转换,dma采一次数据吗。那为什么我dma和adc设置好后, ...

你好,你的问题解决了吗,我也是DMA和ADC都设置为循环模式但存数据的数组不刷新
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-28 00:31

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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