双ADC同步规则转换问题!!!

jeffer317   2009-1-17 22:02 楼主
此模式有没有人用过?有没有发现过什么问题?

我的程序主要设置内容:
转换通道:IN2(8通道全部由ADC1转换)和IN3(8通道全部由ADC2转换)
转换触发:全设为SWSTART,软件程序出发
间断模式,DISCNUM[15:13]=111(CR1),即8个通道
序列长度,L[3:0]=D[23:20]=7(SQR1),总长度为8
ADC无中断
DMA传输数据 DMA 数据长度,CNDTR=8;数据格式:32位到32位

问题1:实际转换是4个数据(DMA完成传输仅一半,CNDTR余4),why?
问题2:在RVMDK(3.23版)Debug,为何只看到ADC1的数据(低16位),而ADC2没有(ADC2数据寄存器实际有数据,仿真输入),RVMDK的问题?还是程序设置问题?

回复评论 (14)

补充说明

1. ADC2和ADC1的各项设置基本是相同的
2. 按照以上设置,硬件运行是不对的--至少DMA传输未结束

点赞  2009-1-17 22:17

STM32固件库中有双ADC同步规则转换的例子


相关链接:http://www.st.com/mcu/modules.php?name=mcu&file=familiesdocs&FAM=110#Firmware
点赞  2009-1-18 10:15

害死呀人不要钱

根据"xxxmap.h"的ADC定义,见如下,ADC1~ADC3规则转换数据都有独立的地址ADC_TypeDef.DR,ADC DR的偏移地址为4CH,基地址如下:
#define ADC1_BASE             (APB2PERIPH_BASE + 0x2400)
#define ADC2_BASE             (APB2PERIPH_BASE + 0x2800)
#define ADC3_BASE             (APB2PERIPH_BASE + 0x3C00)
按照ST说明,ADC2数据在ADC1.DR的高16位上,可以这么做,但地址差的远呢.仿真是得不到的,实际如何未知.RVMDK按照驱动库做,没有错误.
从(ADC2_BASE+4CH)可以得到ADC2转换的数据,各位可以验证,这也可以解释为何从(ADC1_BASE+4CH)(设置为32位数据)上得不到ADC2的数据.既然如此,ADC2的双ADC同步规则转换与DMA传送功能自然无法实现.




/* Exported types ------------------------------------------------------------*/
/******************************************************************************/
/*                         Peripheral registers structures                    */
/******************************************************************************/

/*------------------------ Analog to Digital Converter -----------------------*/
typedef struct
{
  vu32 SR;
  vu32 CR1;
  vu32 CR2;
  vu32 SMPR1;
  vu32 SMPR2;
  vu32 JOFR1;
  vu32 JOFR2;
  vu32 JOFR3;
  vu32 JOFR4;
  vu32 HTR;
  vu32 LTR;
  vu32 SQR1;
  vu32 SQR2;
  vu32 SQR3;
  vu32 JSQR;
  vu32 JDR1;
  vu32 JDR2;
  vu32 JDR3;
  vu32 JDR4;
  vu32 DR;
} ADC_TypeDef;
点赞  2009-1-21 17:02

同步规则模式原文

同步规则模式
此模式在规则通道组上执行。外部触发源来自ADC1的规则组多路器(由ADC1_CR2寄存器的EXTSEL[2:0]选择)。给ADC2提供同步触发。
注意: 不要在2个ADC上转换相同的通道(如果转换两个ADC的相同通道,不可能提供重叠的采样时间)。
在ADC1或ADC2的转换结束时:

产生一个32位DMA传输请求(如果设置了DMA位),传输到SRAM的32位ADC1_DR寄存器的上半个字包含ADC2的转换数据,低半个字包含ADC1的转换数据。


见参考手册 123/524页

点赞  2009-1-21 17:09

楼主能够说明白一些吗?

                                 请注意手册(下图)中10.9节的最后一句话:
点赞  2009-1-21 17:16

我的简单问题:从ADC1的DR地址上得到ADC2的数据吗?

原文这些说明我已经从多角度试验了n次了,反正从ADC1的DR地址(尾数244CH)上以32位方式得不到ADC2的数据,只有从ADC2的DR地址(尾284CH)可以得到.由于程序仍在调试,实际芯片运行能否得到,待验证.

ADC转换序列长度的定义跟DMA数据传输长度的配合问题,说的也不够清楚,但不是关键所在,可以解决.
点赞  2009-1-21 17:30

你看过STM32固件库里的例程

                                  
点赞  2009-1-21 21:21

ADC数据,矛盾的地址描述

谢谢提醒,ST这个例程看过了,对应控制寄存器查过,没有发现与自己有不同见解的地方.原例程是个扫描连续双ADC模式,我设成这个模式,RVMDK的调试模式,在ADC1的DR上也得不到ADC2数据.实际片上能否得到,不好说.

从ST英文版参考手册 177/679页ADC寄存器地址映像看,ADC2的数据应该在ADC1数据的高一位地址上,但从驱动库的定义看,ADC2的数据地址却是(ADC2_BASE+0x4C),实际在这个地址上也可以得到ADC2的数据,驱动库对ADC2数据地址的定义没错.

这是个矛盾的表述,所以,只有用STM32内部硬件来解释了.
点赞  2009-1-21 22:21

不要纸上谈兵,你可以把提供的例程下载到开发板上试验

                                 如果有什么问题再来谈是否矛盾。
点赞  2009-1-22 20:38

只有用STM32内部硬件来解释ADC

                                 但愿没问题。俺没开发板,没有仿真头,只有一根下载线,一块工程板,底层程序仅用st的影像头库,程序近万行,纸上谈兵又怎样?
点赞  2009-1-22 22:01

多看看例子

                                 例子正确显示如何双ADC情况下,让高16位显示ADC2结果.注意一下DMA设置成32位传输,如果还是按16位传输高位可能没有
点赞  2009-7-3 16:26

STM32外部触发ADC转换的问题

使用TIM1的通道2触发转换ADC规则通道3,对应的管脚为PB14   和  PA3 , 请问硬件上这两个管脚怎么接啊
点赞  2012-5-29 15:30

STM32 同步规则模式

其他都像固件库的程序设置一样的,

关键是最后启动的时候ADC_SoftwareStartConvCmd(ADC1, ENABLE);这条代码设置了CR2的两个位,位22 SWSTART 和 位20 EXTTRIG,

这样直接启动ADC1的规则通道转换   同时会自动触发启动ADC2的转换。
点赞  2012-10-12 20:10

回复 13楼 yuanwei_guo 的帖子

触发用的信号设置好就行了,外部不需要连接
点赞  2012-10-13 20:02
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复