搜索
bottom↓
回复: 18

请教:stm32双ADC—同步规则转换+DMA读取 的配置

[复制链接]

出0入0汤圆

发表于 2012-7-30 11:40:10 | 显示全部楼层 |阅读模式
stm32f103c8,同时使用两个ADC模块,使用DMA自动保存结果数据,ADC1和ADC2的工作模式都是“同时规则模式”,分别对两个规则组中的不同通道 进行 同步转换

转换的启动,采用软件控制启动方式

在转换完成时,产生DMA请求后,DMA模块读取 ADC结果寄存器,把那个同时保存有 ADC1、ADC2转换结果的 32位寄存器中的数据 保存到 对应的 32位数组变量中
要问的问题是:
1:转换的启动,是否只需要控制 启动ADC1就可以了?是不是控制ADC1启动后,双ADC的内部同步控制模块 在启动ADC1转换的同时,也同步地触发ADC2也启动转换?
那么在代码里面,是不是在启动ADC转换的时候,
只用写 :      ADC_SoftwareStartConvCmd(ADC1, ENABLE);
不用同时再写 ADC_SoftwareStartConvCmd(ADC2, ENABLE);

2:转换结束时,是只有ADC1产生DMA请求吗?是不是由于ADC1/ADC2同时转换结束,只用ADC1产生DMA请求,就可以通过DMA同时完成对ADC1/ADC2转换结果的读取?
那么,在代码里面,是不是只需要启动ADC1 和DMA通道的连接就可以了?
即只用写       ADC_DMACmd(ADC1, ENABLE);  
不用同时再写 ADC_DMACmd(ADC2, ENABLE);  

求大神指点,我没这么用过,上面是个人理解,不知正确与否。。

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

 楼主| 发表于 2012-8-3 17:18:33 | 显示全部楼层
该结贴了~~
1:关于双ADC同步规则通道转换模式的启动,若设两个ADC均为软件控制启动,则启动ADC时,
只用写           ADC_SoftwareStartConvCmd(ADC1, ENABLE);
不用同时再写 ADC_SoftwareStartConvCmd(ADC2, ENABLE);
不过要注意的一点是: ADC1、ADC2虽然都是设为了 软件控制方式启动,不过需要使能ADC2的外部触发功能
即在配置完ADC2的参数后,需要加上:ADC_ExternalTrigConvCmd(ADC2, ENABLE);  

2:关于双ADC时的DMA请求,数据手册上说明:“多ADC器件,只有主ADC可以发送DMA请求”
在代码里面,只需要启动ADC1和DMA通道的连接即可
即只用写       ADC_DMACmd(ADC1, ENABLE);  
不用同时再写 ADC_DMACmd(ADC2, ENABLE);

出0入0汤圆

 楼主| 发表于 2012-8-31 08:26:30 | 显示全部楼层
上载一个例程,stm32双ADC同步规则组转换+DMA读取

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2013-3-2 10:55:18 | 显示全部楼层
有没有用寄存器控制的例程,我看不懂库文件啊!

出0入0汤圆

发表于 2013-3-29 22:46:33 | 显示全部楼层
很好。。。。。我用那个寄存器的方式照着库函数的方式重新写了下可以用。。。。。。之前我也纠结了好久的。。。。

出0入0汤圆

发表于 2013-4-9 23:32:39 | 显示全部楼层
MARK MARK MARK MARK

出0入0汤圆

发表于 2013-4-10 13:40:03 | 显示全部楼层

出0入0汤圆

发表于 2013-4-11 15:29:46 | 显示全部楼层

出0入0汤圆

发表于 2013-4-11 16:53:46 | 显示全部楼层

出0入0汤圆

发表于 2013-4-27 10:51:21 | 显示全部楼层
125591656 发表于 2012-8-31 08:26
上载一个例程,stm32双ADC同步规则组转换+DMA读取

谢谢您的无私共享!我看了您的程序,有几个疑问:
1.您的ADC1和ADC2是同步规则组模式,ADC1和ADC2的外部触发功能都关闭了。ADC1的外部触发关闭我可以理解,但是ADC2的外部触发也要关闭吗?那为什么ADC2的设置时又有一句:ADC_ExternalTrigConvCmd(ADC2, ENABLE);   呢?

2.ADC1怎么没有使能?我没看到ADC_Cmd(ADC1, ENABLE);  只有ADC_Cmd(ADC2, ENABLE); ?那这样ADC1会工作吗?

3./* Test on DMA1 channel1 transfer complete flag */                          //等待一组DMA存储转换完成
  while(!DMA_GetFlagStatus(DMA1_FLAG_TC1));
  /* Clear DMA1 channel1 transfer complete flag */
  DMA_ClearFlag(DMA1_FLAG_TC1);
这段程序的作用是干啥的?是不是只要用到DMA就要有这段程序呀?

谢谢啊,您的回复对我很有帮助,等您的回复!

出0入0汤圆

发表于 2013-4-28 12:02:32 | 显示全部楼层
125591656 发表于 2012-8-3 17:18
该结贴了~~
1:关于双ADC同步规则通道转换模式的启动,若设两个ADC均为软件控制启动,则启动ADC时,
只用写 ...

你的程序里ADC1是由软件触发的?我问下:可以把ADC1的触发方式设置成外部触发吧?
我使能了ADC1外部触发,由T2_CC2来触发ADC1,进而ADC2自动触发,但是实时仿真效果不对啊。。。效果是好像只运行一次,自动停了,,而TIMER2一直在运行。。。

为什么??

出0入0汤圆

发表于 2013-8-28 21:15:17 | 显示全部楼层
谢谢楼主的分享

出0入0汤圆

发表于 2013-11-22 10:35:32 | 显示全部楼层
中文参考手册中,
同步规则模式
外部触发来自ADC1 的规则组多路开关( 由ADC1_CR2寄存器的EXTSEL[2:0] 选择),它同时给ADC2提供同步触发。
也就是ADC1的触发信号同时触发2个ADC同时转换。

出0入0汤圆

发表于 2014-9-26 20:54:26 | 显示全部楼层
学习一下。

出0入0汤圆

发表于 2014-10-13 20:55:52 | 显示全部楼层
正好配到这一步,自己很捉急了。。感谢楼主分享啊!连片子用的都是同一款。。。

出0入0汤圆

发表于 2014-12-12 11:05:32 | 显示全部楼层
请问是不是只有ADC采集完,DMA才会传输数据呢?比如ADC设置为单次转换模式,采集完一次未启动下一次时,DMA是否会继续传输数据呢?如果会的话,那DMA传送到内存的数据就会重复了吧

出0入0汤圆

发表于 2014-12-13 17:45:30 | 显示全部楼层
125591656 发表于 2012-8-3 17:18
该结贴了~~
1:关于双ADC同步规则通道转换模式的启动,若设两个ADC均为软件控制启动,则启动ADC时,
只用写 ...

2:关于双ADC时的DMA请求,数据手册上说明:“多ADC器件,只有主ADC可以发送DMA请求”
在代码里面,只需要启动ADC1和DMA通道的连接即可


只有ADC1可以请求DMA,  那么ADC2数据是跟着ADC1的触发一起被DMA转走了么?

出0入10汤圆

发表于 2015-1-31 12:51:11 | 显示全部楼层
huangqi412 发表于 2014-12-13 17:45
2:关于双ADC时的DMA请求,数据手册上说明:“多ADC器件,只有主ADC可以发送DMA请求”
在代码里面,只需 ...

这里DMA传输的是32位,16位放ADC1,另外的16位放ADC2的

出0入0汤圆

发表于 2017-11-13 19:57:46 | 显示全部楼层
非常感谢楼主的代码,省了我不少功夫
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-25 21:03

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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