ST意法半导体
直播中

王岩

7年用户 828经验值
私信 关注
[问答]

stm32f0 adc dma多通道问题求解

1.ADC设置
  hadc.Instance = ADC1;
  hadc.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;
  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 = 禁用;
  hadc.Init.LowPowerAutoPowerOff = 禁用;
  hadc.Init.ContinuousConvMode = ENABLE;
  hadc.Init.DiscontinuousConvMode = 禁用;
  hadc.Init.ExternalTrigConv = ADC_SOFTWARE_START;
  hadc.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
  hadc.Init.DMAContinuousRequests = ENABLE;
  hadc.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN;
  如果(HAL_ADC_Init(&hadc)!= HAL_OK)
  {
    错误处理程序();
  }

  /** 配置要转换的选定 ADC 常规通道。
  */
  sConfig.Channel = ADC_CHANNEL_4;
  sConfig.Rank = ADC_RANK_CHANNEL_NUMBER;
  sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;
  如果 (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK)
  {
    错误处理程序();
  }

  /** 配置要转换的选定 ADC 常规通道。
  */
  sConfig.Channel = ADC_CHANNEL_5;
  如果 (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK)
  {
    错误处理程序();
  }

  /** 配置要转换的选定 ADC 常规通道。
  */
  sConfig.Channel = ADC_CHANNEL_6;
  如果 (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK)
  {
    错误处理程序();
  }

  /** 配置要转换的选定 ADC 常规通道。
  */
  sConfig.Channel = ADC_CHANNEL_7;
  如果 (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK)
  {
    错误处理程序();
  }

  /** 配置要转换的选定 ADC 常规通道。
  */
  sConfig.Channel = ADC_CHANNEL_8;
  如果 (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK)
  {
    错误处理程序();
  }

  /** 配置要转换的选定 ADC 常规通道。
  */
  sConfig.Channel = ADC_CHANNEL_9;
  如果 (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK)
  {
    错误处理程序();
  }
//////////////////////////////////////////////// /////////////////////////////////////
2.DMA设置
hdma_adc.Instance = DMA1_Channel1;
    hdma_adc.Init.Direction = DMA_PERIPH_TO_MEMORY;
    hdma_adc.Init.PeriphInc = DMA_PINC_DISABLE;
    hdma_adc.Init.MemInc = DMA_MINC_ENABLE;
    hdma_adc.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
    hdma_adc.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
    hdma_adc.Init.Mode = DMA_CIRCULAR;
    hdma_adc.Init.Priority = DMA_PRIORITY_VERY_HIGH;
    如果(HAL_DMA_Init(&hdma_adc)!= HAL_OK)
    {
      错误处理程序();
    }

3. DMA 启动
无符号短 Test_adc[6];
HAL_ADC_Start_DMA(&hadc,(uint32_t *)Test_adc,6);
在 Cube IDE 中配置的 ADC DMA 的测试结果
只有第一个值被采样和输入。
请告诉我应该更正哪些内容才能正确转换。







回帖(1)

杨华

2022-12-9 14:24:35
“您的 ADC 和 DMA 配置良好。请确保 MX_DMA_Init(); 在 MX_ADC_Init(); 之前被调用;
它应该像那样工作。”
在我的代码中,dma 在 adc 之前定义,但仍然从 dma adc 采样一次,我设置 dma 循环模式,我没有设置 dma 正常模式
举报

更多回帖

发帖
×
20
完善资料,
赚取积分