OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2564|回复: 2

stm32H7 ADC+DMA 16通道 采集的数据总有个别通道采集的数据为固定值

[复制链接]

1

主题

2

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2019-12-10
在线时间
2 小时
发表于 2019-12-10 11:44:15 | 显示全部楼层 |阅读模式
程序如下:
void ADC1_Sensors_Init(void)
{
        ADC_MultiModeTypeDef multimode;
        HAL_ADC_DeInit(&ADC1_Handler);
        ADC1_Handler.Instance=ADC1;
        ADC1_Handler.Init.ClockPrescaler=ADC_CLOCK_ASYNC_DIV32;         //4·ÖÆμ£¬ADCCLK=PER_CK/4=64/4=16MHZ
        ADC1_Handler.Init.Resolution=ADC_RESOLUTION_16B;                   //16λÄ£ê½
        ADC1_Handler.Init.ScanConvMode=ENABLE;                            //é¨ÃèÄ£ê½
        ADC1_Handler.Init.EOCSelection=ADC_EOC_SINGLE_CONV;               //1رÕEOCÖD¶Ï
        ADC1_Handler.Init.LowPowerAutoWait=DISABLE;                                        //×Ô¶ˉμí1|oÄ1رՠ                              
        ADC1_Handler.Init.ContinuousConvMode=DISABLE;               //1رÕá¬Dø×a»»
        ADC1_Handler.Init.ConversionDataManagement = ADC_CONVERSIONDATA_DMA_CIRCULAR;
        ADC1_Handler.Init.NbrOfConversion=16;                        //16¸ö×a»»Ôú1æÔòDòáDÖD ò2¾íêÇÖ»×a»»1æÔòDòáD1
        ADC1_Handler.Init.DiscontinuousConvMode=DISABLE;            //½ûÖ12»á¬Dø2éÑùÄ£ê½
        ADC1_Handler.Init.NbrOfDiscConversion=0;                    //2»á¬Dø2éÑùí¨μàêyÎa0
        //ADC1_Handler.Init.ExternalTrigConv=ADC_EXTERNALTRIG_T4_TRGO;      //waibu chufa
        ADC1_Handler.Init.ExternalTrigConv=ADC_SOFTWARE_START;
        ADC1_Handler.Init.ExternalTrigConvEdge=ADC_EXTERNALTRIGCONVEDGE_NONE;//
//        ADC1_Handler.Init.BoostMode=ENABLE;                                                        //BOOTÄ£ê½1رÕ
        //ADC1_Handler.Init.Overrun=ADC_OVR_DATA_OVERWRITTEN;                        //óDDÂμÄêy¾YμÄËàoóÖ±½ó¸2¸Çμô¾éêy¾Y
        ADC1_Handler.Init.OversamplingMode=DISABLE;                                        //1y2éÑù1رÕ
          multimode.Mode = ADC_MODE_INDEPENDENT;
        multimode.TwoSamplingDelay = ADC_TWOSAMPLINGDELAY_1CYCLE;
// multimode.TwoSamplingDelay = ADC_TWOSAMPLINGDELAY_1CYCLE;
  if (HAL_ADCEx_MultiModeConfigChannel(&ADC1_Handler, &multimode) != HAL_OK)
  {
   // _Error_Handler(__FILE__, __LINE__);
  }
//        ADC1_Handler.Init.ConversionDataManagement=ADC_CONVERSIONDATA_DR;  //1æÔòí¨μàμÄêy¾Y½ö½ö±£′æÔúDR¼Ä′æÆ÷àïÃæ
        HAL_ADC_Init(&ADC1_Handler);                                 //3õê¼»ˉ
}


void HAL_ADC_GPIOInit()
{
        GPIO_InitTypeDef GPIO_Initure;
        RCC_PeriphCLKInitTypeDef  ADCClkInitStruct;
       
        __HAL_RCC_ADC12_CLK_ENABLE();           //ê1ÄüADC1/2ê±Öó
        //__HAL_RCC_ADC3_CLK_ENABLE();                        //ê1ÄüADC3ê±Öó
        __HAL_RCC_GPIOA_CLK_ENABLE();                        //¿aÆôGPIOAê±Öó
        __HAL_RCC_GPIOB_CLK_ENABLE();
        __HAL_RCC_GPIOC_CLK_ENABLE();

        ADCClkInitStruct.PeriphClockSelection=RCC_PERIPHCLK_ADC;
        ADCClkInitStruct.AdcClockSelection=RCC_ADCCLKSOURCE_CLKP;
        HAL_RCCEx_PeriphCLKConfig(&ADCClkInitStruct);
       
        GPIO_Initure.Pin=GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7;            //PA
        GPIO_Initure.Mode=GPIO_MODE_ANALOG;     //Ä£Äa
        GPIO_Initure.Pull=GPIO_NOPULL;          //2»′øéÏÏÂà-
        HAL_GPIO_Init(GPIOA,&GPIO_Initure);
       
        GPIO_Initure.Pin=GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5;            //PC
        GPIO_Initure.Mode=GPIO_MODE_ANALOG;     //Ä£Äa
        GPIO_Initure.Pull=GPIO_NOPULL;          //2»′øéÏÏÂà-
        HAL_GPIO_Init(GPIOC,&GPIO_Initure);
       
        GPIO_Initure.Pin=GPIO_PIN_0|GPIO_PIN_1;            //PB
        GPIO_Initure.Mode=GPIO_MODE_ANALOG;     //Ä£Äa
        GPIO_Initure.Pull=GPIO_NOPULL;          //2»′øéÏÏÂà-
        HAL_GPIO_Init(GPIOB,&GPIO_Initure);
}


void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc)
{
        if(hadc==(&ADC1_Handler))
        {
                HAL_ADC_GPIOInit();
                ADC1_Chnnel_Init();
                __HAL_RCC_DMA1_CLK_ENABLE();//DMA1ê±Öóê1Äü
   HAL_ADCEx_Calibration_Start(&ADC1_Handler,ADC_CALIB_OFFSET,ADC_SINGLE_ENDED); //ADCD£×¼       
    //__HAL_LINKDMA(hadc,DMA_Handle,ADC1DMA_Handler);    //½«DMAóëUSART1áaÏμÆeà′(·¢ËíDMA)
   // HAL_DMA_DeInit(&ADC1DMA_Handler);   
    //Tx DMAÅäÖÃ
    ADC1DMA_Handler.Instance=DMA1_Stream0;                            //êy¾Yá÷Ñ¡Ôñ  
                //ADC1DMA_Handler.Init.Channel  =DMA_CHANNEL_0       
                ADC1DMA_Handler.Init.Request=DMA_REQUEST_ADC1;                                                                                //
    ADC1DMA_Handler.Init.Direction=DMA_PERIPH_TO_MEMORY;             //′æ′¢Æ÷μ½íaéè
    ADC1DMA_Handler.Init.PeriphInc=DMA_PINC_DISABLE;                 //íaéè·ÇÔöá¿Ä£ê½
    ADC1DMA_Handler.Init.MemInc=DMA_MINC_ENABLE;                     //′æ′¢Æ÷Ôöá¿Ä£ê½
    ADC1DMA_Handler.Init.PeriphDataAlignment=DMA_PDATAALIGN_HALFWORD;    //íaéèêy¾Y3¤¶è:16λ
    ADC1DMA_Handler.Init.MemDataAlignment=DMA_MDATAALIGN_HALFWORD;       //′æ′¢Æ÷êy¾Y3¤¶è:16λ
    ADC1DMA_Handler.Init.Mode=DMA_CIRCULAR;                            //íaéè
    ADC1DMA_Handler.Init.Priority=DMA_PRIORITY_HIGH;               //ÖDμèóÅÏè¼¶
    ADC1DMA_Handler.Init.FIFOMode=DMA_FIFOMODE_DISABLE;              
   // ADC1DMA_Handler.Init.FIFOThreshold=DMA_FIFO_THRESHOLD_FULL;
                //hdma_adc1.Init.Mode = DMA_CIRCULAR;
   // hdma_adc1.Init.Priority = DMA_PRIORITY_HIGH;
   // hdma_adc1.Init.FIFOMode = DMA_FIFOMODE_DISABLE;               
   // ADC1DMA_Handler.Init.MemBurst=DMA_MBURST_SINGLE;                 //′æ′¢Æ÷í»·¢μ¥′Î′«êä
   // ADC1DMA_Handler.Init.PeriphBurst=DMA_PBURST_SINGLE;              //íaéèí»·¢μ¥′Î′«êä
       
                ADC1DMA_Handler.XferCpltCallback = HAL_DMA_IRQHandler;

    HAL_DMA_DeInit(&ADC1DMA_Handler);   
    HAL_DMA_Init(&ADC1DMA_Handler);
               
                __HAL_LINKDMA(&ADC1_Handler,DMA_Handle,ADC1DMA_Handler);          //?DMA?ADC????(??DMA)
               
                HAL_NVIC_SetPriority(DMA1_Stream0_IRQn, 2, 1);
                HAL_NVIC_EnableIRQ(DMA1_Stream0_IRQn);  
        //        HAL_ADC_DeInit(&ADC1_Handler);
                ADC1_Handler.Init.ScanConvMode=ENABLE;   
        //        HAL_ADC_Init(&ADC1_Handler);
        }

}
每次都有个别通道值为0x81ff,有时会改变,导致采样波形失真
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

5

主题

424

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1020
金钱
1020
注册时间
2014-9-4
在线时间
199 小时
发表于 2019-12-10 16:57:48 | 显示全部楼层
回复 支持 反对

使用道具 举报

1

主题

2

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2019-12-10
在线时间
2 小时
 楼主| 发表于 2019-12-10 21:41:16 | 显示全部楼层
自己顶
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-5 21:34

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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