打印

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

[复制链接]
4851|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
蒸钱会|  楼主 | 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的问题?还是程序设置问题?
沙发
蒸钱会|  楼主 | 2009-1-17 22:17 | 只看该作者

补充说明

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

使用特权

评论回复
板凳
香水城| | 2009-1-18 10:15 | 只看该作者

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

使用特权

评论回复
地板
蒸钱会|  楼主 | 2009-1-21 17:02 | 只看该作者

害死呀人不要钱

根据"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;

使用特权

评论回复
5
蒸钱会|  楼主 | 2009-1-21 17:09 | 只看该作者

同步规则模式原文

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

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


见参考手册 123/524页

使用特权

评论回复
6
香水城| | 2009-1-21 17:16 | 只看该作者

楼主能够说明白一些吗?

请注意手册(下图)中10.9节的最后一句话:

使用特权

评论回复
7
蒸钱会|  楼主 | 2009-1-21 17:30 | 只看该作者

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

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

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

使用特权

评论回复
8
香水城| | 2009-1-21 21:21 | 只看该作者

你看过STM32固件库里的例程

使用特权

评论回复
9
蒸钱会|  楼主 | 2009-1-21 22:21 | 只看该作者

ADC数据,矛盾的地址描述

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

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

这是个矛盾的表述,所以,只有用STM32内部硬件来解释了.

使用特权

评论回复
10
香水城| | 2009-1-22 20:38 | 只看该作者

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

如果有什么问题再来谈是否矛盾。

使用特权

评论回复
11
蒸钱会|  楼主 | 2009-1-22 22:01 | 只看该作者

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

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

使用特权

评论回复
12
wwin2000| | 2009-7-3 16:26 | 只看该作者

多看看例子

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

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

12

主题

54

帖子

0

粉丝