搜索
bottom↓
回复: 9

STM32F303同时使用ADC1,ADC2DMA模式的配置分享

[复制链接]

出0入0汤圆

发表于 2015-2-11 08:23:34 | 显示全部楼层 |阅读模式
最近搞STM32F303的ADC1,ADC2使用DMA传输。发现只能单独使用一个,怎么配置都不对。查了手册发现ADC1ADC2其实是使用同一个32位寄存器,高半字ADC2,低半字ADC1。在这里分享下配置。
static void ADCGPIO_Config(void)
{  
        GPIO_InitTypeDef GPIO_ADCInitTypeDef;


        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);

  
      GPIO_ADCInitTypeDef.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
      GPIO_ADCInitTypeDef.GPIO_Mode = GPIO_Mode_AN;
      GPIO_ADCInitTypeDef.GPIO_Speed= GPIO_Speed_50MHz;
      GPIO_ADCInitTypeDef.GPIO_PuPd = GPIO_PuPd_NOPULL;
      GPIO_Init(GPIOA, &GPIO_ADCInitTypeDef);

      GPIO_ADCInitTypeDef.GPIO_Pin = GPIO_Pin_14|GPIO_Pin_15;
      GPIO_ADCInitTypeDef.GPIO_Mode = GPIO_Mode_AN;
      GPIO_ADCInitTypeDef.GPIO_Speed= GPIO_Speed_50MHz;
      GPIO_ADCInitTypeDef.GPIO_PuPd = GPIO_PuPd_NOPULL;
      GPIO_Init(GPIOB, &GPIO_ADCInitTypeDef);
   

}
/******************************************************************************
* Function Name: ADC_DMA_Config
* Description: DMAÅäÖÃ
* Input:
* Output:
* Return:
******************************************************************************/
void ADC_DMA_Config1(void)
{
//                DMA_InitTypeDef DMA_InitStructure;
                RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);

                DMA_DeInit(DMA1_Channel1);
        DMA_StructInit(&DMA_InitStructure_ADC1);
                DMA_InitStructure_ADC1.DMA_PeripheralBaseAddr = (uint32_t)&ADC1_2->CDR; //外设地址
                DMA_InitStructure_ADC1.DMA_MemoryBaseAddr = (uint32_t)&ADC_ConvertedValue_NO1;  //自定义存储区,因为要存储两个AD数据,所以要定义为32位
                DMA_InitStructure_ADC1.DMA_DIR = DMA_DIR_PeripheralSRC;    //外设到内存
                DMA_InitStructure_ADC1.DMA_BufferSize = ADCOUTNBUFFLENGTH;        //缓存长度
                DMA_InitStructure_ADC1.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外设地址禁止自动增加
                DMA_InitStructure_ADC1.DMA_MemoryInc = DMA_MemoryInc_Enable;    //内存地址自动增加

                DMA_InitStructure_ADC1.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word; //外设数据大小,一个字

                DMA_InitStructure_ADC1.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;  //内存数据打下,一个字
                DMA_InitStructure_ADC1.DMA_Mode = DMA_Mode_Circular;       //DMAÑ循环
                DMA_InitStructure_ADC1.DMA_Priority = DMA_Priority_High; //高优先级
                DMA_InitStructure_ADC1.DMA_M2M =DMA_M2M_Disable;

        DMA_Init(DMA1_Channel1, &DMA_InitStructure_ADC1);
               
                DMA_ITConfig(DMA1_Channel1, DMA_IT_TC, ENABLE);
        DMA_Cmd(DMA1_Channel1, ENABLE);           
        
}
/******************************************************************************
* Function Name: ADC_Config
* Description:   ADCÅäÖÃ
* Input:
* Output:
* Return:
******************************************************************************/
void ADC_Config2(void)
{
   ADC_InitTypeDef   ADC_InitStructure;
   ADC_CommonInitTypeDef ADC_CommonInitStructure;
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_ADC12, ENABLE);


    ADC_InitStructure.ADC_ContinuousConvMode      = ADC_ContinuousConvMode_Disable;//Á¬Ðøģʽ
    ADC_InitStructure.ADC_DataAlign               = ADC_DataAlign_Right;           //ÓÒ¶ÔÆëÊý¾Ý
    ADC_InitStructure.ADC_ExternalTrigConvEvent   = ADC_ExternalTrigConvEvent_0;    //´¥·¢Ê¼þ
    ADC_InitStructure.ADC_ExternalTrigEventEdge   = ADC_ExternalTrigEventEdge_None;//²»Ê¹ÓÃÈí¼þ´¥·¢
    ADC_InitStructure.ADC_NbrOfRegChannel         = 4;                              //ͨµÀÊý
    ADC_InitStructure.ADC_OverrunMode             =   ADC_OverrunMode_Disable;        
     ADC_InitStructure.ADC_AutoInjMode             = ADC_AutoInjec_Disable;
    ADC_InitStructure.ADC_Resolution              = ADC_Resolution_12b;               
    ADC_Init(ADC2, &ADC_InitStructure);
   
    ADC_CommonInitStructure.ADC_Clock             = ADC_Clock_AsynClkMode;
    ADC_CommonInitStructure.ADC_DMAAccessMode     = ADC_DMAAccessMode_Disabled;
    ADC_CommonInitStructure.ADC_DMAMode           = ADC_DMAMode_Circular;
    ADC_CommonInitStructure.ADC_Mode              = ADC_Mode_RegSimul;
    ADC_CommonInitStructure.ADC_TwoSamplingDelay  = 1;
    ADC_CommonInit(ADC2,&ADC_CommonInitStructure);
        /* ADC2 Regular Channel1 Configuration */
        ADC_RegularChannelConfig(ADC2, ADC_Channel_1, 1, ADC_SampleTime_1Cycles5);//ADC_SampleTime_55Cycles5);
        ADC_RegularChannelConfig(ADC2, ADC_Channel_2, 2,  ADC_SampleTime_1Cycles5);//ADC_SampleTime_55Cycles5);
    ADC_RegularChannelConfig(ADC2, ADC_Channel_3, 3,  ADC_SampleTime_1Cycles5);//ADC_SampleTime_55Cycles5);
        ADC_RegularChannelConfig(ADC2, ADC_Channel_4, 4,  ADC_SampleTime_1Cycles5);//ADC_SampleTime_55Cycles5);

       
//    ADC_DMA_Config2();
//    ADC_DMAConfig(ADC2,ADC_DMAMode_Circular);
//    ADC_DMACmd(ADC2, ENABLE);             /* Enable ADC2's DMA interface        */
       
        ADC_Cmd(ADC2, ENABLE);             /* Enable ADC2                        */



}
/******************************************************************************
* Function Name: ADC_Config
* Description:   ADCÅäÖÃ
* Input:
* Output:
* Return:
******************************************************************************/
void ADC_Config1(void)
{
   ADC_InitTypeDef   ADC_InitStructure;
   ADC_CommonInitTypeDef ADC_CommonInitStructure;
   RCC_AHBPeriphClockCmd(RCC_AHBPeriph_ADC12, ENABLE);
    //Ìí¼ÓÒ»²½³õʼ»¯        
        ADC_DeInit(ADC1);
//        ADC_StructInit(&ADC_InitStructure);
//    ADC_CommonStructInit(&ADC_CommonInitStructure);
   
       /* Calibration procedure */  
  ADC_VoltageRegulatorCmd(ADC1, ENABLE);
  
  /* Insert delay equal to 10 */
  DelayUS(10);
  
  ADC_SelectCalibrationMode(ADC1, ADC_CalibrationMode_Single);
  ADC_StartCalibration(ADC1);
  
  while(ADC_GetCalibrationStatus(ADC1) != RESET );
  calibration_value = ADC_GetCalibrationValue(ADC1);
   
//        ADC_InitStructure.ADC_AutoInjMode             =
    ADC_InitStructure.ADC_ContinuousConvMode      = ADC_ContinuousConvMode_Disable;
    ADC_InitStructure.ADC_DataAlign               = ADC_DataAlign_Right;
    ADC_InitStructure.ADC_ExternalTrigConvEvent   = ADC_ExternalTrigConvEvent_0;
    ADC_InitStructure.ADC_ExternalTrigEventEdge   = ADC_ExternalTrigEventEdge_None;
    ADC_InitStructure.ADC_NbrOfRegChannel         = 4;
    ADC_InitStructure.ADC_OverrunMode             = ADC_OverrunMode_Disable;
    ADC_InitStructure.ADC_AutoInjMode            = ADC_AutoInjec_Disable;
    ADC_InitStructure.ADC_Resolution              = ADC_Resolution_12b;
    ADC_Init(ADC1, &ADC_InitStructure);
   
    ADC_CommonInitStructure.ADC_Clock             = ADC_Clock_AsynClkMode;
    ADC_CommonInitStructure.ADC_DMAAccessMode     = ADC_DMAAccessMode_Disabled;
    ADC_CommonInitStructure.ADC_DMAMode           = ADC_DMAMode_Circular;
    ADC_CommonInitStructure.ADC_Mode              = ADC_Mode_RegSimul;
    ADC_CommonInitStructure.ADC_TwoSamplingDelay  = 1;
    ADC_CommonInit(ADC1,&ADC_CommonInitStructure);
        /* ADC1 Regular Channel1 Configuration */
        ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1,  ADC_SampleTime_1Cycles5);//ADC_SampleTime_55Cycles5);
        ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 2,  ADC_SampleTime_1Cycles5);//ADC_SampleTime_55Cycles5);
    ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 3,  ADC_SampleTime_1Cycles5);//ADC_SampleTime_55Cycles5);
        ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 4,  ADC_SampleTime_1Cycles5);//ADC_SampleTime_55Cycles5);
//  ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 5,  ADC_SampleTime_1Cycles5);//ADC_SampleTime_55Cycles5);
//        ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 6,  ADC_SampleTime_1Cycles5);//ADC_SampleTime_55Cycles5);
        ADC_Config2();

    ADC_DMA_Config1();
    ADC_DMAConfig(ADC1,ADC_DMAMode_Circular);
    ADC_DMACmd(ADC1, ENABLE);             /* Enable ADC1's DMA interface        */
       
       
    ADC_Cmd(ADC1, ENABLE);             /* Enable ADC1                        */
        DelayUS(20);
    /* Start ADC1 calibaration */
//        ADC_StartCalibration(ADC1);
        /* Check the end of ADC1 calibration */
        //while(ADC_GetCalibrationStatus(ADC1));
    while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_RDY));       
    DelayUS(10);
        //ADC_StartConversion(ADC1);/* Start ADC1 Software Conversion*/

}

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2015-2-11 08:27:17 | 显示全部楼层
顶楼主

出0入0汤圆

发表于 2015-2-11 09:47:40 | 显示全部楼层
可以参考一下

出0入0汤圆

发表于 2015-2-11 10:19:59 | 显示全部楼层
试试。谢谢。。。

出0入0汤圆

发表于 2015-2-11 10:22:46 | 显示全部楼层
一定要顶 不错

出0入0汤圆

发表于 2015-2-11 11:16:29 | 显示全部楼层
收藏了,偶也准备用303的双AD

出0入0汤圆

发表于 2015-2-11 13:44:01 来自手机 | 显示全部楼层
最近才在103用過雙adc

出0入0汤圆

发表于 2015-3-25 18:06:54 | 显示全部楼层
准备用STM32F303,感谢楼主。

出0入0汤圆

发表于 2015-11-10 09:40:11 | 显示全部楼层
DMA_InitStructure_ADC1.DMA_PeripheralBaseAddr = (uint32_t)&ADC1_2->CDR; //外设地址

你说的同一个地址是指这个地址吗

出0入0汤圆

发表于 2017-8-3 21:20:56 | 显示全部楼层
303的ADC比103快5倍!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-21 14:36

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表