125591656 发表于 2012-7-30 11:40:10

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

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);

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

125591656 发表于 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);

125591656 发表于 2012-8-31 08:26:30

上载一个例程,stm32双ADC同步规则组转换+DMA读取

guwu454 发表于 2013-3-2 10:55:18

有没有用寄存器控制的例程,我看不懂库文件啊!

446978997 发表于 2013-3-29 22:46:33

很好。。。。。我用那个寄存器的方式照着库函数的方式重新写了下可以用。。。。。。之前我也纠结了好久的。。。。

zhtj 发表于 2013-4-9 23:32:39

MARK MARK MARK MARK

gbhgbh 发表于 2013-4-10 13:40:03

{:titter:}{:titter:}{:titter:}

gbhgbh 发表于 2013-4-11 15:29:46

{:funk:}{:funk:}{:funk:}

gbhgbh 发表于 2013-4-11 16:53:46

{:titter:}{:titter:}{:titter:}

Kidult 发表于 2013-4-27 10:51:21

125591656 发表于 2012-8-31 08:26 static/image/common/back.gif
上载一个例程,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就要有这段程序呀?

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

Kidult 发表于 2013-4-28 12:02:32

125591656 发表于 2012-8-3 17:18 static/image/common/back.gif
该结贴了~~
1:关于双ADC同步规则通道转换模式的启动,若设两个ADC均为软件控制启动,则启动ADC时,
只用写 ...

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

为什么??

大家觉 发表于 2013-8-28 21:15:17

谢谢楼主的分享

回头是岸 发表于 2013-11-22 10:35:32

中文参考手册中,
同步规则模式
外部触发来自ADC1 的规则组多路开关( 由ADC1_CR2寄存器的EXTSEL 选择),它同时给ADC2提供同步触发。
也就是ADC1的触发信号同时触发2个ADC同时转换。

ace2050 发表于 2014-9-26 20:54:26

学习一下。{:lol:}{:smile:}

wanstrive 发表于 2014-10-13 20:55:52

正好配到这一步,自己很捉急了。。感谢楼主分享啊!连片子用的都是同一款。。。

Z_Jian 发表于 2014-12-12 11:05:32

请问是不是只有ADC采集完,DMA才会传输数据呢?比如ADC设置为单次转换模式,采集完一次未启动下一次时,DMA是否会继续传输数据呢?如果会的话,那DMA传送到内存的数据就会重复了吧

huangqi412 发表于 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转走了么?

10xjzheng 发表于 2015-1-31 12:51:11

huangqi412 发表于 2014-12-13 17:45
2:关于双ADC时的DMA请求,数据手册上说明:“多ADC器件,只有主ADC可以发送DMA请求”
在代码里面,只需 ...

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

KNL 发表于 2017-11-13 19:57:46

非常感谢楼主的代码,省了我不少功夫{:victory:}
页: [1]
查看完整版本: 请教:stm32双ADC—同步规则转换+DMA读取 的配置