14088|11

146

帖子

0

TA的资源

一粒金砂(高级)

楼主
 

STM32F4双ADC采样ADC2无数据 [复制链接]

2芯积分
最近在调STM32F439的板子,想用双ADC同时采样,发现ADC1数据正常,ADC2无数据,求大神指点。
下边是程序代码:
uint16_t ADC_Value[8];
#define ADC1_DR_ADDR  0x4001204C      //ADC1_DR 地址
static void Init_ADC_GPIO(void)
{
    GPIO_InitTypeDef  GPIO_InitStructure;
    /**************************************************
                ADC1-8个通道  ADC2-8个通道
                   ADC1_IN0~IN7--PA0~PA7
                   ADC2_IN8~IN9--PB0~PB1
                   ADC2_IN10~IN15--PC0~PC5
    *************************************************/
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
   
    GPIO_InitStructure.GPIO_Pin = (uint16_t)0x00ff;//PA0~PA7
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
   
    GPIO_InitStructure.GPIO_Pin = (uint16_t)0x0003;//PB0~PB1
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
   
    GPIO_InitStructure.GPIO_Pin = (uint16_t)0x003f;//PC0~PC5
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_Init(GPIOC, &GPIO_InitStructure);
}
//DMA2
static void Init_DMA2_Channel0_Stream0(void)
{
    DMA_InitTypeDef DMA_InitStructure;
   
    int i = 0;   
    for(i=0;i<8;i++)   //初始化ADC_Value
        ADC_Value = 0;
   
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);
    DMA_DeInit(DMA2_Stream0);
   
    DMA_InitStructure.DMA_Channel = DMA_Channel_0;
    DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_ADDR;
    DMA_InitStructure.DMA_Memory0BaseAddr = (unsigned int)ADC_Value;
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
    DMA_InitStructure.DMA_BufferSize = 8;
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
    DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
    DMA_InitStructure.DMA_Priority = DMA_Priority_High;   
    DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;
    DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
    DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
    DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;   
    DMA_Init(DMA2_Stream0, &DMA_InitStructure);
    DMA_Cmd(DMA2_Stream0, ENABLE);
}
void Init_ADC(void)
{
    ADC_InitTypeDef ADC_InitStructure;
    ADC_CommonInitTypeDef ADC_CommonInitStructure;
   
    Init_ADC_GPIO();
    Init_DMA2_Channel0_Stream0();
   
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC2, ENABLE);
    ADC_DeInit();
    //初始化ADC Common
    ADC_CommonInitStructure.ADC_Mode = ADC_DualMode_RegSimult;
    ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div2;
    ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_3;
    ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;
    ADC_CommonInit(&ADC_CommonInitStructure);
   
    ADC_InitStructure.ADC_Resolution = ADC_Resolution_8b;
    ADC_InitStructure.ADC_ScanConvMode = ENABLE;
    ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
    ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
    //ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;
    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
    ADC_InitStructure.ADC_NbrOfConversion = 8;
   
    ADC_Init(ADC1, &ADC_InitStructure);
   
    ADC_InitStructure.ADC_Resolution = ADC_Resolution_8b;
    ADC_InitStructure.ADC_ScanConvMode = ENABLE;
    ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
    ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
    //ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;
    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
    ADC_InitStructure.ADC_NbrOfConversion = 8;
    ADC_Init(ADC2, &ADC_InitStructure);   
   
    ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_15Cycles);
    ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 2, ADC_SampleTime_15Cycles);
    ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 3, ADC_SampleTime_15Cycles);
    ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 4, ADC_SampleTime_15Cycles);
    ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 5, ADC_SampleTime_15Cycles);
    ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 6, ADC_SampleTime_15Cycles);
    ADC_RegularChannelConfig(ADC1, ADC_Channel_6, 7, ADC_SampleTime_15Cycles);
    ADC_RegularChannelConfig(ADC1, ADC_Channel_7, 8, ADC_SampleTime_15Cycles);
   
    ADC_RegularChannelConfig(ADC2, ADC_Channel_8, 1, ADC_SampleTime_15Cycles);
    ADC_RegularChannelConfig(ADC2, ADC_Channel_9, 2, ADC_SampleTime_15Cycles);
    ADC_RegularChannelConfig(ADC2, ADC_Channel_10, 3, ADC_SampleTime_15Cycles);
    ADC_RegularChannelConfig(ADC2, ADC_Channel_11, 4, ADC_SampleTime_15Cycles);
    ADC_RegularChannelConfig(ADC2, ADC_Channel_12, 5, ADC_SampleTime_15Cycles);
    ADC_RegularChannelConfig(ADC2, ADC_Channel_13, 6, ADC_SampleTime_15Cycles);
    ADC_RegularChannelConfig(ADC2, ADC_Channel_14, 7, ADC_SampleTime_15Cycles);
    ADC_RegularChannelConfig(ADC2, ADC_Channel_15, 8, ADC_SampleTime_15Cycles);
   
    ADC_MultiModeDMARequestAfterLastTransferCmd(ENABLE);
    ADC_DMARequestAfterLastTransferCmd(ADC1, ENABLE);
    ADC_DMARequestAfterLastTransferCmd(ADC2, ENABLE);
   
    ADC_DMACmd(ADC1, ENABLE);//使能ADC1_DMA
    ADC_DMACmd(ADC2, ENABLE);
   
    ADC_Cmd(ADC1, ENABLE);  
    ADC_Cmd(ADC2, ENABLE);
}

st.JPG (26.59 KB, 下载次数: 1)

st.JPG

最佳答案

查看完整内容

DMA2_Stream0的定义怎么没看到? 这两句都应该是32位,低16位是ADC1的结果,高16位是ADC2的结果 DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word; 你的dma通道用的也不对啊,DMA2_Stream0这个定义也没看到,应该用DMA1_Channel1 还有 ADC_ExternalTrigConvCmd(ADC2, ENABLE); //adc2外触发,这句 ...
此帖出自stm32/stm8论坛

最新回复

没看明白  详情 回复 发表于 2016-10-6 10:06
点赞 关注
 

回复
举报

4996

帖子

19

TA的资源

裸片初长成(初级)

沙发
 
看代码很累。。。
此帖出自stm32/stm8论坛
 
个人签名我的博客
 

回复

2606

帖子

0

TA的资源

五彩晶圆(初级)

板凳
 
In dual mode, two ADCs are used: an ADC master and an ADC slave. The beginning of
conversion is triggered by the ADC master to the ADC slave. The converted data of both
master and slave can be read in parallel by reading the multi-mode data register ADC_CDR.
The status bits can be also read in parallel by reading the multi-mode status register
ADC_CSR.
The STM32F30x ADC family presents several dual modes, each of which is explained
independently in this document:
• Injected simultaneous mode: the master and slave injected channel groups are
converted simultaneously after receiving an external trigger.
• Regular simultaneous mode: the master and slave regular channels are converted
simultaneously.
• Interleaved mode: the master ADC starts immediately; then, after a programmed
delay, the slave ADC starts.
• Alternate trigger mode: when the first trigger occurs, all injected master ADC
channels in the group are converted; when the second trigger occurs, all injected slave
ADC channels in the group are converted
此帖出自stm32/stm8论坛
 
个人签名工程 = 数学+物理+经济
 

回复

1803

帖子

0

TA的资源

五彩晶圆(高级)

4
 
我看你的 ADC 部分是没有问题的.
楼主检查一下你的 DMA 配置是不是有问题呢.
此帖出自stm32/stm8论坛
 
 
 

回复

4008

帖子

0

TA的资源

版主

5
 
DMA2_Stream0的定义怎么没看到?

这两句都应该是32位,低16位是ADC1的结果,高16位是ADC2的结果
   DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;
   DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;

你的dma通道用的也不对啊,DMA2_Stream0这个定义也没看到,应该用DMA1_Channel1

还有        ADC_ExternalTrigConvCmd(ADC2, ENABLE);                   //adc2外触发,这句不能少,它会把ADC2与ADC1联系在一起.

你先找个内用的改改吧.

[ 本帖最后由 huo_hu 于 2013-8-19 20:35 编辑 ]
此帖出自stm32/stm8论坛
 
 
 

回复

608

帖子

4

TA的资源

纯净的硅(初级)

6
 
同意楼上的分析,虽然我好几个月没碰STM32了。
此帖出自stm32/stm8论坛
 
 
 

回复

146

帖子

0

TA的资源

一粒金砂(高级)

7
 
回复4L

DMA2_Stream0库函数里边有定义。
至于这两句都应该是32位,低16位是ADC1的结果,高16位是ADC2的结果
       DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;
       DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;
我ADC的分辨率采用的是8位,采用DMA mode3模式,高8位为ADC2 的值,低8位为ADC1的数据


至于 ADC_ExternalTrigConvCmd(ADC2, ENABLE);
这一句研究一下先。

file:///C:\Users\WUU\AppData\Roaming\Tencent\Users\594597399\QQ\WinTemp\RichOle\MCKW{AU}CXK`T{`7BS))QBM.jpg
此帖出自stm32/stm8论坛
 
 
 

回复

146

帖子

0

TA的资源

一粒金砂(高级)

8
 

回复4L

DMA2_Stream0的定义库函数里边是有的,而且F4里边现在也用的Stream

   DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;
   DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;
这两句为什么用半字传输不对。我采用的是DMA mode3,ADC分辨率为8位

ADC_ExternalTrigConvCmd(ADC2, ENABLE); 研究一下先。
此帖出自stm32/stm8论坛
 
 
 

回复

1803

帖子

0

TA的资源

五彩晶圆(高级)

9
 
DMA_PeripheralDataSize_Word
这个数据大小应该没影响,不过按理你应该用 Half_World 才对呀,因为你的数据总共是 16 bit 的.
检查一下,看 DMA 是否正常读到了数据.
我用的标准库是 3.5 的没看到有 stream 什么的.
  1.     DMA_DeInit(DMA2_Stream0);
  2.    
  3.     DMA_InitStructure.DMA_Channel = DMA_Channel_0;
  4.     DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_ADDR;
  5.     DMA_InitStructure.DMA_Memory0BaseAddr = (unsigned int)ADC_Value;
  6.     DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
  7.     DMA_InitStructure.DMA_BufferSize = 8;
复制代码
DMA_InitStructure.DMA_Channel = DMA_Channel_0;
DMA2 可以读取 DMA_Channel_0 的数据吗?确认一下.我用 STM32 用的是 DAM1
    DMA_InitStructure.DMA_BufferSize = 8;
怎么是 8 呢?不是应该是 16 吗?

[ 本帖最后由 Study_Stellaris 于 2013-8-20 11:19 编辑 ]
此帖出自stm32/stm8论坛
 
 
 

回复

4008

帖子

0

TA的资源

版主

10
 
是32位,这是ADC2使用DMA的要求.
此帖出自stm32/stm8论坛
 
 
 

回复

146

帖子

0

TA的资源

一粒金砂(高级)

11
 
原来是DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_ADDR;这里出错了
不应该是ADC1_DR的地址,应该是ADC1_CDR的地址
此帖出自stm32/stm8论坛
 
 
 

回复

26

帖子

0

TA的资源

一粒金砂(初级)

12
 
没看明白
此帖出自stm32/stm8论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表