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

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管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版