请教: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);
求大神指点,我没这么用过,上面是个人理解,不知正确与否。。 该结贴了~~
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);
上载一个例程,stm32双ADC同步规则组转换+DMA读取 有没有用寄存器控制的例程,我看不懂库文件啊! 很好。。。。。我用那个寄存器的方式照着库函数的方式重新写了下可以用。。。。。。之前我也纠结了好久的。。。。 MARK MARK MARK MARK {:titter:}{:titter:}{:titter:} {:funk:}{:funk:}{:funk:} {:titter:}{:titter:}{:titter:} 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就要有这段程序呀?
谢谢啊,您的回复对我很有帮助,等您的回复! 125591656 发表于 2012-8-3 17:18 static/image/common/back.gif
该结贴了~~
1:关于双ADC同步规则通道转换模式的启动,若设两个ADC均为软件控制启动,则启动ADC时,
只用写 ...
你的程序里ADC1是由软件触发的?我问下:可以把ADC1的触发方式设置成外部触发吧?
我使能了ADC1外部触发,由T2_CC2来触发ADC1,进而ADC2自动触发,但是实时仿真效果不对啊。。。效果是好像只运行一次,自动停了,,而TIMER2一直在运行。。。
为什么?? 谢谢楼主的分享 中文参考手册中,
同步规则模式
外部触发来自ADC1 的规则组多路开关( 由ADC1_CR2寄存器的EXTSEL 选择),它同时给ADC2提供同步触发。
也就是ADC1的触发信号同时触发2个ADC同时转换。 学习一下。{:lol:}{:smile:} 正好配到这一步,自己很捉急了。。感谢楼主分享啊!连片子用的都是同一款。。。 请问是不是只有ADC采集完,DMA才会传输数据呢?比如ADC设置为单次转换模式,采集完一次未启动下一次时,DMA是否会继续传输数据呢?如果会的话,那DMA传送到内存的数据就会重复了吧 125591656 发表于 2012-8-3 17:18
该结贴了~~
1:关于双ADC同步规则通道转换模式的启动,若设两个ADC均为软件控制启动,则启动ADC时,
只用写 ...
2:关于双ADC时的DMA请求,数据手册上说明:“多ADC器件,只有主ADC可以发送DMA请求”
在代码里面,只需要启动ADC1和DMA通道的连接即可
只有ADC1可以请求DMA,那么ADC2数据是跟着ADC1的触发一起被DMA转走了么? huangqi412 发表于 2014-12-13 17:45
2:关于双ADC时的DMA请求,数据手册上说明:“多ADC器件,只有主ADC可以发送DMA请求”
在代码里面,只需 ...
这里DMA传输的是32位,16位放ADC1,另外的16位放ADC2的 非常感谢楼主的代码,省了我不少功夫{:victory:}
页:
[1]