求助 关于STM32F302RC ADC2的问题!!!

2019-03-23 17:55发布

本人接触stm32f 时间不长,在一个项目上使用了stm32f302rc这个芯片,初始化代码用的是STM32CubeMX生成的。ADC1、ADC2各有4路模拟输入。目前遇到的问题是ADC1采样正常,但ADC2采样不正常,输入0V时ADC2始终不为零,
大概有0.9V左右(3.3V基准)。这个问题已经困扰了几天了,还没有解决。求各位高人帮忙看看,如何解决。



以下是初始化代码


  1. ADC_HandleTypeDef hadc1;
  2. ADC_HandleTypeDef hadc2;
  3. DMA_HandleTypeDef hdma_adc1;
  4. DMA_HandleTypeDef hdma_adc2;

  5. /* ADC1 init function */
  6. void MX_ADC1_Init(void)
  7. {
  8.   ADC_ChannelConfTypeDef sConfig;
  9.        
  10.         /**Common config */
  11.   hadc1.Instance = ADC1;
  12.   hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV1;
  13.   hadc1.Init.Resolution = ADC_RESOLUTION_12B;
  14.   hadc1.Init.ScanConvMode = ADC_SCAN_ENABLE;
  15.   hadc1.Init.ContinuousConvMode = DISABLE;
  16.   hadc1.Init.DiscontinuousConvMode = DISABLE;
  17.   hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_RISING;
  18.   hadc1.Init.ExternalTrigConv = ADC_EXTERNALTRIGCONV_T4_TRGO;
  19.   hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  20.   hadc1.Init.NbrOfConversion = 4;
  21.   hadc1.Init.DMAContinuousRequests =DISABLE;
  22.   hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
  23.   hadc1.Init.LowPowerAutoWait = DISABLE;
  24.   hadc1.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN;
  25.   if (HAL_ADC_Init(&hadc1) != HAL_OK)
  26.   {
  27.     Error_Handler();
  28.   }
  29.        
  30.         /**Configure Regular Channel */
  31.   
  32.   sConfig.SingleDiff = ADC_SINGLE_ENDED;
  33.   sConfig.SamplingTime = ADC_SAMPLETIME_19CYCLES_5;
  34.   sConfig.OffsetNumber = ADC_OFFSET_NONE;
  35.   sConfig.Offset = 0;

  36.         sConfig.Channel = ADC_CHANNEL_1;
  37.   sConfig.Rank = 1;
  38.   if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  39.   {
  40.     Error_Handler();
  41.   }
  42.                 /**Configure Regular Channel*/
  43.   sConfig.Channel = ADC_CHANNEL_2;
  44.   sConfig.Rank = 2;
  45.   if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  46.   {
  47.     Error_Handler();
  48.   }
  49.                 /**Configure Regular Channel*/
  50.   sConfig.Channel = ADC_CHANNEL_3;
  51.   sConfig.Rank = 3;
  52.   if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  53.   {
  54.     Error_Handler();
  55.   }
  56.                 /**Configure Regular Channel*/
  57.   sConfig.Channel = ADC_CHANNEL_4;
  58.   sConfig.Rank = 4;
  59.   if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  60.   {
  61.     Error_Handler();
  62.   }
  63.        
  64.                 HAL_ADCEx_Calibration_Start(&hadc1, ADC_SINGLE_ENDED);
  65.                
  66.                 HAL_ADC_Start_DMA(&hadc1, (U32*)ADC1_ConvertedValue,ADC_SampleCount);

  67. }

  68. /* ADC2 init function */
  69. void MX_ADC2_Init(void)
  70. {
  71.   ADC_ChannelConfTypeDef sConfig;
  72.        
  73.         /**Common config */
  74.   hadc2.Instance = ADC2;
  75.   hadc2.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV1;
  76.   hadc2.Init.Resolution = ADC_RESOLUTION_12B;
  77.   hadc2.Init.ScanConvMode = ADC_SCAN_ENABLE;
  78.   hadc2.Init.ContinuousConvMode = DISABLE;
  79.   hadc2.Init.DiscontinuousConvMode = DISABLE;
  80.   hadc2.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_RISING;
  81.   hadc2.Init.ExternalTrigConv = ADC_EXTERNALTRIGCONV_T4_TRGO;
  82.   hadc2.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  83.   hadc2.Init.NbrOfConversion = 4;
  84.   hadc2.Init.DMAContinuousRequests = DISABLE;
  85.   hadc2.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
  86.   hadc2.Init.LowPowerAutoWait = DISABLE;
  87.   hadc2.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN;
  88.   if (HAL_ADC_Init(&hadc2) != HAL_OK)
  89.   {
  90.     Error_Handler();
  91.   }

  92.         /**Configure Regular Channel*/
  93.   
  94.   sConfig.SingleDiff = ADC_SINGLE_ENDED;
  95.   sConfig.SamplingTime = ADC_SAMPLETIME_19CYCLES_5;
  96.   sConfig.OffsetNumber = ADC_OFFSET_NONE;
  97.   sConfig.Offset = 0;
  98.        
  99.         sConfig.Channel = ADC_CHANNEL_6;
  100.   sConfig.Rank = 1;
  101.   if (HAL_ADC_ConfigChannel(&hadc2, &sConfig) != HAL_OK)
  102.   {
  103.     Error_Handler();
  104.   }
  105.        
  106.   /**Configure Regular Channel */
  107.   sConfig.Channel = ADC_CHANNEL_7;
  108.   sConfig.Rank = 2;
  109.   if (HAL_ADC_ConfigChannel(&hadc2, &sConfig) != HAL_OK)
  110.   {
  111.     Error_Handler();
  112.   }
  113.     /**Configure Regular Channel*/
  114.   sConfig.Channel = ADC_CHANNEL_8;
  115.   sConfig.Rank = 3;
  116.   if (HAL_ADC_ConfigChannel(&hadc2, &sConfig) != HAL_OK)
  117.   {
  118.     Error_Handler();
  119.   }
  120.     /**Configure Regular Channel*/
  121.    
  122.   sConfig.Channel = ADC_CHANNEL_9;
  123.   sConfig.Rank = 4;
  124.   if (HAL_ADC_ConfigChannel(&hadc2, &sConfig) != HAL_OK)
  125.   {
  126.     Error_Handler();
  127.   }
  128.        
  129.         HAL_ADCEx_Calibration_Start(&hadc2, ADC_SINGLE_ENDED);
  130.        
  131.         HAL_ADC_Start_DMA(&hadc2, (U32*)ADC2_ConvertedValue, ADC_SampleCount);
  132. }

  133. static uint32_t HAL_RCC_ADC12_CLK_ENABLED=0;

  134. void HAL_ADC_MspInit(ADC_HandleTypeDef* adcHandle)
  135. {

  136.   GPIO_InitTypeDef GPIO_InitStruct;
  137.   if(adcHandle->Instance==ADC1)
  138.   {
  139.     /* Peripheral clock enable */
  140.     HAL_RCC_ADC12_CLK_ENABLED++;
  141.     if(HAL_RCC_ADC12_CLK_ENABLED==1){
  142.       __HAL_RCC_ADC12_CLK_ENABLE();
  143.     }
  144.   
  145.     /**ADC1 GPIO Configuration   
  146.     PA0     ------> ADC1_IN1
  147.     PA1     ------> ADC1_IN2
  148.     PA2     ------> ADC1_IN3
  149.     PA3     ------> ADC1_IN4
  150.     */
  151.     GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3;
  152.     GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
  153.     GPIO_InitStruct.Pull = GPIO_NOPULL;
  154.     HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  155.     /* Peripheral DMA init*/
  156.   
  157.     hdma_adc1.Instance = DMA1_Channel1;
  158.     hdma_adc1.Init.Direction = DMA_PERIPH_TO_MEMORY;
  159.     hdma_adc1.Init.PeriphInc = DMA_PINC_DISABLE;
  160.     hdma_adc1.Init.MemInc = DMA_MINC_ENABLE;
  161.     hdma_adc1.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
  162.     hdma_adc1.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
  163.     hdma_adc1.Init.Mode = DMA_CIRCULAR;//DMA_NORMAL;
  164.     hdma_adc1.Init.Priority = DMA_PRIORITY_MEDIUM;
  165.     if (HAL_DMA_Init(&hdma_adc1) != HAL_OK)
  166.     {
  167.       Error_Handler();
  168.     }

  169.     __HAL_LINKDMA(adcHandle,DMA_Handle,hdma_adc1);

  170.     /* Peripheral interrupt init */
  171.     //HAL_NVIC_SetPriority(ADC1_2_IRQn, 0, 0);
  172.     //HAL_NVIC_EnableIRQ(ADC1_2_IRQn);
  173.   }
  174.   else if(adcHandle->Instance==ADC2)
  175.   {
  176.     /* Peripheral clock enable */
  177.     HAL_RCC_ADC12_CLK_ENABLED++;
  178.     if(HAL_RCC_ADC12_CLK_ENABLED==1){
  179.       __HAL_RCC_ADC12_CLK_ENABLE();
  180.     }
  181.   
  182.     /**ADC2 GPIO Configuration   
  183.     PC0     ------> ADC2_IN6
  184.     PC1     ------> ADC2_IN7
  185.     PC2     ------> ADC2_IN8
  186.     PC3     ------> ADC2_IN9
  187.     */
  188.     GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3;
  189.     GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
  190.     GPIO_InitStruct.Pull = GPIO_NOPULL;
  191.     HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
  192.                
  193.     /* Peripheral DMA init*/
  194.   
  195.     hdma_adc2.Instance = DMA2_Channel1;
  196.     hdma_adc2.Init.Direction = DMA_PERIPH_TO_MEMORY;
  197.     hdma_adc2.Init.PeriphInc = DMA_PINC_DISABLE;
  198.     hdma_adc2.Init.MemInc = DMA_MINC_ENABLE;
  199.     hdma_adc2.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
  200.     hdma_adc2.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
  201.     hdma_adc2.Init.Mode = DMA_CIRCULAR;//DMA_NORMAL;
  202.     hdma_adc2.Init.Priority = DMA_PRIORITY_MEDIUM;
  203.     if (HAL_DMA_Init(&hdma_adc2) != HAL_OK)
  204.     {
  205.       Error_Handler();
  206.     }

  207.     __HAL_LINKDMA(adcHandle,DMA_Handle,hdma_adc2);

  208.     /* Peripheral interrupt init */
  209.     //HAL_NVIC_SetPriority(ADC1_2_IRQn, 0, 0);
  210.     //HAL_NVIC_EnableIRQ(ADC1_2_IRQn);
  211.   }
  212. }
复制代码

此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。