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

【经验分享】STM32G031 ADC采集数值为0问题

[复制链接]
STMCU小助手 发布时间:2021-11-12 23:01
开发平台:KEIL5

芯片:STM32G031

描述:近日使用STM32G031给客户做一款产品,在使用ADC时出现,采集的数值一直为0的情况。分享给大家。

使用STM32CubeMX生成代码。配置ADC引脚,PB0为ADC1_8,PA11[PA9]为ADC1_15.

20210109140154535.png


生成代码如下:

  1. int main(void)
  2. {
  3.     HAL_Init();
  4.     SystemClock_Config();
  5.     MX_DMA_Init();
  6.     MX_ADC1_Init();
  7.     MX_NVIC_Init();
  8.     HAL_ADCEx_Calibration_Start(&hadc1);
  9.     HAL_ADC_Start_DMA(&hadc1,(uint32_t *)&adcbuf,2);
  10.     while (1)
  11.     {
  12.           if(get_sys_time_us() % 1000 == 0)
  13.         {   
  14.             printf("adc1 = %d\r\n", adcbuf[0]);
  15.             printf("adc1 = %d\r\n", adcbuf[1]);
  16.         }

  17.     }
复制代码
  1. ADC_HandleTypeDef hadc1;
  2. DMA_HandleTypeDef hdma_adc1;

  3. /* ADC1 init function */
  4. void MX_ADC1_Init(void)
  5. {
  6.   ADC_AnalogWDGConfTypeDef AnalogWDGConfig = {0};
  7.   ADC_ChannelConfTypeDef sConfig = {0};

  8.   /** Configure the global features of the ADC (Clock, Resolution, Data Alignment and number of conversion)
  9.   */
  10.   hadc1.Instance = ADC1;
  11.   hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;
  12.   hadc1.Init.Resolution = ADC_RESOLUTION_12B;
  13.   hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  14.   hadc1.Init.ScanConvMode = ADC_SCAN_ENABLE;
  15.   hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
  16.   hadc1.Init.LowPowerAutoWait = DISABLE;
  17.   hadc1.Init.LowPowerAutoPowerOff = DISABLE;
  18.   hadc1.Init.ContinuousConvMode = ENABLE;
  19.   hadc1.Init.NbrOfConversion = 2;
  20.   hadc1.Init.DiscontinuousConvMode = DISABLE;
  21.   hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
  22.   hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
  23.   hadc1.Init.DMAContinuousRequests = ENABLE;
  24.   hadc1.Init.Overrun = ADC_OVR_DATA_PRESERVED;
  25.   hadc1.Init.SamplingTimeCommon1 = ADC_SAMPLETIME_160CYCLES_5;
  26.   hadc1.Init.SamplingTimeCommon2 = ADC_SAMPLETIME_160CYCLES_5;
  27.   hadc1.Init.OversamplingMode = DISABLE;
  28.   hadc1.Init.TriggerFrequencyMode = ADC_TRIGGER_FREQ_HIGH;
  29.   if (HAL_ADC_Init(&hadc1) != HAL_OK)
  30.   {
  31.     Error_Handler();
  32.   }
  33.   /** Configure Analog WatchDog 2
  34.   */
  35.   AnalogWDGConfig.WatchdogMode = ADC_ANALOGWATCHDOG_SINGLE_REG;
  36.   if (HAL_ADC_AnalogWDGConfig(&hadc1, &AnalogWDGConfig) != HAL_OK)
  37.   {
  38.     Error_Handler();
  39.   }
  40.   /** Configure Regular Channel
  41.   */
  42.   sConfig.Channel = ADC_CHANNEL_15;
  43.   sConfig.Rank = ADC_REGULAR_RANK_1;
  44.   sConfig.SamplingTime = ADC_SAMPLINGTIME_COMMON_1;
  45.   if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  46.   {
  47.     Error_Handler();
  48.   }
  49.   /** Configure Regular Channel
  50.   */
  51.   sConfig.Channel = ADC_CHANNEL_8;
  52.   sConfig.Rank = ADC_REGULAR_RANK_2;
  53.   sConfig.SamplingTime = ADC_SAMPLINGTIME_COMMON_2;
  54.   if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  55.   {
  56.     Error_Handler();
  57.   }

  58. }

  59. void HAL_ADC_MspInit(ADC_HandleTypeDef* adcHandle)
  60. {

  61.   GPIO_InitTypeDef GPIO_InitStruct = {0};
  62.   if(adcHandle->Instance==ADC1)
  63.   {
  64.   /* USER CODE BEGIN ADC1_MspInit 0 */

  65.   /* USER CODE END ADC1_MspInit 0 */
  66.     /* ADC1 clock enable */
  67.     __HAL_RCC_ADC_CLK_ENABLE();

  68.     __HAL_RCC_GPIOB_CLK_ENABLE();
  69.     __HAL_RCC_GPIOA_CLK_ENABLE();
  70.     /**ADC1 GPIO Configuration   
  71.     PB0     ------> ADC1_IN8
  72.     PA11 [PA9]     ------> ADC1_IN15
  73.     */
  74.     GPIO_InitStruct.Pin = GPIO_PIN_0;
  75.     GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
  76.     GPIO_InitStruct.Pull = GPIO_NOPULL;
  77.     HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

  78.     GPIO_InitStruct.Pin = GPIO_PIN_11;
  79.     GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
  80.     GPIO_InitStruct.Pull = GPIO_NOPULL;
  81.     HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  82.     /* ADC1 DMA Init */
  83.     /* ADC1 Init */
  84.     hdma_adc1.Instance = DMA1_Channel1;
  85.     hdma_adc1.Init.Request = DMA_REQUEST_ADC1;
  86.     hdma_adc1.Init.Direction = DMA_PERIPH_TO_MEMORY;
  87.     hdma_adc1.Init.PeriphInc = DMA_PINC_DISABLE;
  88.     hdma_adc1.Init.MemInc = DMA_MINC_ENABLE;
  89.     hdma_adc1.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
  90.     hdma_adc1.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
  91.     hdma_adc1.Init.Mode = DMA_CIRCULAR;
  92.     hdma_adc1.Init.Priority = DMA_PRIORITY_HIGH;
  93.     if (HAL_DMA_Init(&hdma_adc1) != HAL_OK)
  94.     {
  95.       Error_Handler();
  96.     }

  97.     __HAL_LINKDMA(adcHandle,DMA_Handle,hdma_adc1);

  98.   /* USER CODE BEGIN ADC1_MspInit 1 */

  99.   /* USER CODE END ADC1_MspInit 1 */
  100.   }
  101. }
复制代码

把STM32CubeMX生成的代码下载到芯片中运行,结果ADC1_8的值可以读到,但是ADC1_15的值却一直为0.

出现上述问题的原因是因为STM32G031的 ADC 序列器配置成完全可配置时,只能使用通
道 0-14,不能使用通道 15,16,17,18;所以在有使用到通道 15,16,17,18 的情况下,ADC 序列
器要配置成不完全可配置。Sequencer 选项选择为:Sequencer not fully configurable
如果是多通道则 Discontinuous Conversion Mode 要使能


收藏 评论0 发布时间:2021-11-12 23:01

举报

0个回答

所属标签

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