1

我正在尝试在 STM32F031K6 上使用 ADC,而不使用 HAL(设置中除外),使用 cubeIDE。我在不连续模式下使用 ADC - 据我所知,事件的顺序应该是

  • ADC 已设置,然后使用 ADEN 启用
  • ADC 通过设置 ADSTART 开始转换
  • 检查 EOC 标志以查看转换何时完成
  • 当从 DR 寄存器读取数据时,EOC 标志清零

这就是我感到困惑的地方 - 然后我必须再次设置 ADSTART 吗?在连续模式下,参考手册似乎表明下一次转换将自动发生,但在不连续模式下,下一次转换需要手动启动 - 我假设这是由 ADSTART 完成的?在模拟中,这似乎不起作用。数据表上说ADSTART是软件设置的,是不是不能直接写?

我的代码如下,如果我一步一步点击它似乎无法正常工作,如果我将其设置为运行,我可以看到 ADC1_data 变量在我更换板上的锅时发生变化,但它间歇性地工作,在0 和正确的值

HAL 设置是

static void MX_ADC_Init(void)
{
  ADC_ChannelConfTypeDef sConfig = {0};
 
  hadc.Instance = ADC1;
  hadc.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV1;
  hadc.Init.Resolution = ADC_RESOLUTION_12B;
  hadc.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  hadc.Init.ScanConvMode = ADC_SCAN_DIRECTION_FORWARD;
  hadc.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
  hadc.Init.LowPowerAutoWait = DISABLE;
  hadc.Init.LowPowerAutoPowerOff = DISABLE;
  hadc.Init.ContinuousConvMode = DISABLE;
  hadc.Init.DiscontinuousConvMode = DISABLE;
  hadc.Init.ExternalTrigConv = ADC_SOFTWARE_START;
  hadc.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
  hadc.Init.DMAContinuousRequests = DISABLE;
  hadc.Init.Overrun = ADC_OVR_DATA_PRESERVED;     
  if (HAL_ADC_Init(&hadc) != HAL_OK)
  {
    Error_Handler();
  }
 
  /** Configure for the selected ADC regular channel to be converted. */
  sConfig.Channel = ADC_CHANNEL_0;
  sConfig.Rank = ADC_RANK_CHANNEL_NUMBER;
  sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;
  if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK)
  {
    Error_Handler();
  }
 
  /** Configure for the selected ADC regular channel to be converted. */
  sConfig.Channel = ADC_CHANNEL_1;
  if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK)
  {
    Error_Handler();
  }
}

程序中的代码读取

ADC1->CR |= ADC_CR_ADEN; // enable ADC
ADC1 ->SMPR = 0b11;// speed divider select
ADC1 ->CHSELR |= 1<<0 | 1<<1; // set sequence to adc0, adc1
ADC1 ->CFGR1 |= ADC_CFGR1_DISCEN; //discontinuous mode
ADC1 ->CR |= 1<<2; // start conversion

while (1)
{
  if((ADC1->ISR) & 0b00000100) //if EOC flag is on
  {
    ADC1_data = ADC1->DR;
    ADC1 ->CR |= 1<<2; // start conversion
  }
}

谁能确认我是否犯了错误?非常感谢任何帮助

4

0 回答 0