你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F030R8 ADC采样DMA问题

[复制链接]
nothing26-10367 提问时间:2014-6-5 08:54 /
:如何将 在DMA 中多通道采样中准备指定数组中特定位置存ADC值  ? (如:ADC通道1 存放于RegularConvData_Tab[1],ADC通道2存放RegularConvData_Tab【2】,以此类推
程序如下:
 
ADC_InitTypeDef ADC_InitStructure;
DMA_InitTypeDef DMA_InitStructure;
 
INT16U ADC_Raw_Value[ 14*ADC_Converted_len ]; //adc»ñÈ¡µÄԭʼÊý¾Ý
 INT16U ADC_ConvertedValue[14]; //¼ÆËãת»»ºÃµÄ×îÖÕÓû§Êý¾Ý
 
__IO uint16_t RegularConvData_Tab[14];
void InitADC(void)
{
    // configuration ADC  ///////////////////////////////////////////////////////////////
        GPIO_InitTypeDef    GPIO_InitStructure;
        DMA_InitTypeDef     DMA_InitStructure;
        ADC_InitTypeDef     ADC_InitStructure;
        NVIC_InitTypeDef    NVIC_InitStruct;
          
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_3|GPIO_Pin_4
                                                                |GPIO_Pin_5;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
        GPIO_Init(GPIOA, &GPIO_InitStructure);       
       
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE);
        GPIO_InitStructure.GPIO_Pin =GPIO_Pin_0| GPIO_Pin_1| GPIO_Pin_2| 
                                                                GPIO_Pin_4|GPIO_Pin_5;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
        GPIO_Init(GPIOC, &GPIO_InitStructure);       
 
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
        GPIO_Init(GPIOB, &GPIO_InitStructure);       
       
        //NVIC_InitStruct.NVIC_IRQChannel = DMA1_Channel1_IRQn;
      // NVIC_InitStruct.NVIC_IRQChannelPriority = 2;
       //NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
       //NVIC_Init(&NVIC_InitStruct);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 , ENABLE);               
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1 , ENABLE);
        ADC_DeInit(ADC1);//ADC»Ö¸´Ä¬ÈÏÉèÖà              
        DMA_DeInit(DMA1_Channel1);        /* DMA1 Channel1 Config */
        DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ADC1_DR_Address;//ÍâÉèµØÖ·
        DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&ADC_Raw_Value;//ÄÚ´æµØÖ·RegularConvData_Tab
        DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;//ÍâÉè×÷ΪÊý¾Ý´«ÊäµÄÀ´Ô´
        DMA_InitStructure.DMA_BufferSize = 14*ADC_Converted_len;//  12
        DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//ÍâÉèµØÖ·¼Ä´æÆ÷²»±ä
        DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//ÄÚ´æµØÖ·¼Ä´æÆ÷²»±ä
        DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//Êý¾Ý¿í¶ÈΪ16λ
        DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;//Êý¾Ý¿í¶ÈΪ16λ
        DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
        DMA_InitStructure.DMA_Priority = DMA_Priority_High;//DMA_PriorityÉ趨DMAͨµÀxµÄÈí¼þÓÅÏȼ¶
        DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;//DMAͨµÀxûÓÐÉèÖÃΪÄÚ´æµ½ÄÚ´æ´«Êä
       
        DMA_Init(DMA1_Channel1, &DMA_InitStructure);
        DMA_Cmd(DMA1_Channel1, ENABLE);/* DMA1 Channel1 enable */       
          /*Enables the specified DMAy Channelx interrupts */
        //DMA_ITConfig(DMA1_Channel1,DMA_IT_TC,ENABLE);
          /* ADC DMA request in circular mode */ 
        ADC_DMARequestModeConfig(ADC1, ADC_DMAMode_Circular); /* Enable ADC_DMA */       
        ADC_DMACmd(ADC1, ENABLE);  
       
        ADC_StructInit(&ADC_InitStructure);//³õʼ»¯ADC½á¹¹
        ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;//12λ¾«¶È
        ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; //¹æ¶¨Ä£Ê½×°»»¹¤×÷ÔÚÁ¬ÐøÄ£Ê½
        ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None; 
        ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//Êý¾Ý¶ÔÆäΪÓÒ¶ÔÆë
        ADC_InitStructure.ADC_ScanDirection = ADC_ScanDirection_Backward; //ADCµÄɨÃè·½Ïò
        ADC_Init(ADC1, &ADC_InitStructure); 
       
        //ADC_ChannelConfig(ADC1, ADC_Channel_1 , ADC_SampleTime_239_5Cycles); /* Convert the ADC1 Channel 11 with 239.5 Cycles as sampling time */  
        //ADC_ChannelConfig(ADC1, ADC_Channel_Vrefint ,ADC_SampleTime_239_5Cycles); 
        //ADC_VrefintCmd(ENABLE);
        //ADC_ChannelConfig(ADC1, ADC_Channel_TempSensor ,ADC_SampleTime_239_5Cycles);
        //ADC_TempSensorCmd(ENABLE);
        //ADC_ChannelConfig(ADC1, ADC_Channel_Vbat ,ADC_SampleTime_239_5Cycles);
        //ADC_VbatCmd(ENABLE);
        ADC_ChannelConfig(ADC1, ADCGrp1I, ADC_SampleTime_28_5Cycles);   //28.5
        ADC_ChannelConfig(ADC1, ADCGrp1V , ADC_SampleTime_28_5Cycles);   
        ADC_ChannelConfig(ADC1, ADCGrp1T, ADC_SampleTime_28_5Cycles);   
       
        ADC_ChannelConfig(ADC1, ADCGrp2I, ADC_SampleTime_28_5Cycles);   
        ADC_ChannelConfig(ADC1, ADCGrp2V , ADC_SampleTime_28_5Cycles);   
        ADC_ChannelConfig(ADC1, ADCGrp2T, ADC_SampleTime_28_5Cycles); 
 
        ADC_ChannelConfig(ADC1, ADCGrp3I, ADC_SampleTime_28_5Cycles);   
        ADC_ChannelConfig(ADC1, ADCGrp3V , ADC_SampleTime_28_5Cycles);   
        ADC_ChannelConfig(ADC1, ADCGrp3T, ADC_SampleTime_28_5Cycles); 
 
        ADC_ChannelConfig(ADC1, ADCGrp4I, ADC_SampleTime_28_5Cycles);   
        ADC_ChannelConfig(ADC1, ADCGrp4V , ADC_SampleTime_28_5Cycles);   
        ADC_ChannelConfig(ADC1, ADCGrp4T, ADC_SampleTime_28_5Cycles); 
 
        ADC_ChannelConfig(ADC1, ADC_Channel_TempSensor, ADC_SampleTime_28_5Cycles); 
         ADC_TempSensorCmd(ENABLE);
        ADC_ChannelConfig(ADC1, ADC_Channel_Vrefint , ADC_SampleTime_28_5Cycles);
         ADC_VrefintCmd(ENABLE);
        ADC_GetCalibrationFactor(ADC1); /* ADC Calibration */  
        ADC_Cmd(ADC1, ENABLE);  /* Enable ADCperipheral[PerIdx] */          
        while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADEN)); /* Wait the ADCEN falg */
        ADC_StartOfConversion(ADC1); /* ADC1 regular Software Start Conv */ 
}
 
收藏 评论4 发布时间:2014-6-5 08:54

举报

4个回答
废鱼 回答时间:2014-6-5 10:08:55

RE:STM32F030R8 ADC采样DMA问题

用多通道采集,他会按照顺序放到数组中的。
nothing26-10367 回答时间:2014-6-5 10:49:30

RE:STM32F030R8 ADC采样DMA问题

能否告诉是什么顺充,程序中例出通道了,能否告诉我一下,他是如何排的,谢谢
nothing26-10367 回答时间:2014-6-5 10:51:48

RE:STM32F030R8 ADC采样DMA问题

能不能像SMT32F103那种可以指定,谢谢
zykzyk-93033 回答时间:2014-6-5 11:07:14

RE:STM32F030R8 ADC采样DMA问题

仔细研究

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版