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

STM32F4Cube库调试多通道ADC+DMA问题

[复制链接]
亦轩阁 提问时间:2015-2-5 19:38 /
我定义了个uint32_t ADC_Value_arr[4]={0,0,0,0};接收四个通道的ADC,单通道+DMA读取数据没有问题,多通道读取是只有ADC_Value_arr[0]有数据,并且数据特别大,达到8位,还不断变化,显然错了,不知道是何原因,实在发现不了错在哪里?贴上代码,希望有人能指出错误,非常感谢!!!
void HAL_ADC_MspInit(ADC_HandleTypeDef *hadc)
{
  GPIO_InitTypeDef          GPIO_InitStruct;
  static DMA_HandleTypeDef  hdma_adc;

/*##-1- Enable peripherals and GPIO Clocks #################################*/
  /* Enable GPIO clock */
  ADCx_CHANNEL_GPIO_CLK_ENABLE();
  /* ADC1 Periph clock enable */
  ADCx_CLK_ENABLE();
  /* Enable DMA2 clock */
  DMAx_CLK_ENABLE();

  /*##-2- Configure peripheral GPIO ##########################################*/
  /* ADC1 Channel2,3,6,7 GPIO pin configuration */
  GPIO_InitStruct.Pin = ADCx_CHANNEL_PIN2|ADCx_CHANNEL_PIN3|ADCx_CHANNEL_PIN6|ADCx_CHANNEL_PIN7;
  GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(ADCx_CHANNEL_GPIO_PORT, &GPIO_InitStruct);

  /*##-3- Configure the DMA streams ##########################################*/
  /* Set the parameters to be configured */
  hdma_adc.Instance = ADCx_DMA_STREAM; //选择stream0

  hdma_adc.Init.Channel  = ADCx_DMA_CHANNEL;//通道0
  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_HIGH;
  hdma_adc.Init.FIFOMode = DMA_FIFOMODE_DISABLE;         
  hdma_adc.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_HALFFULL;
  hdma_adc.Init.MemBurst = DMA_MBURST_SINGLE;
  hdma_adc.Init.PeriphBurst = DMA_PBURST_SINGLE;

  HAL_DMA_Init(&hdma_adc);

  /* Associate the initialized DMA handle to the the ADC handle */
  __HAL_LINKDMA(hadc, DMA_Handle, hdma_adc);

  /*##-4- Configure the NVIC for DMA #########################################*/
  /* NVIC configuration for DMA transfer complete interrupt */
  HAL_NVIC_SetPriority(ADCx_DMA_IRQn, 5, 0);   
  HAL_NVIC_EnableIRQ(ADCx_DMA_IRQn);
}

void set_ADC(void)
{
        ADC_ChannelConfTypeDef sConfig;

  /* Configure the ADC peripheral */
  AdcHandle.Instance = ADCx;//ADC1

  AdcHandle.Init.ClockPrescaler = ADC_CLOCKPRESCALER_PCLK_DIV4;//21MHZ
  AdcHandle.Init.Resolution = ADC_RESOLUTION12b; //12位
  //AdcHandle.Init.ScanConvMode = DISABLE;
AdcHandle.Init.ScanConvMode = ENABLE;//扫描模式
  AdcHandle.Init.ContinuousConvMode = ENABLE;//连续模式
  AdcHandle.Init.DiscontinuousConvMode = DISABLE;//
  AdcHandle.Init.NbrOfDiscConversion = 0;
  AdcHandle.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
  AdcHandle.Init.ExternalTrigConv = ADC_EXTERNALTRIGCONV_T1_CC1;
  AdcHandle.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  AdcHandle.Init.NbrOfConversion = 4;
  AdcHandle.Init.DMAContinuousRequests = ENABLE;
  AdcHandle.Init.EOCSelection = DISABLE;
  HAL_ADC_Init(&AdcHandle);

  /* Configure ADC regular channel */  
  sConfig.Channel = ADCx_CHANNEL2;
  sConfig.Rank = 1;
  sConfig.SamplingTime = ADC_SAMPLETIME_480CYCLES;
  sConfig.Offset = 0;
  HAL_ADC_ConfigChannel(&AdcHandle, &sConfig);
       
         sConfig.Channel = ADCx_CHANNEL3;
   sConfig.Rank = 2;
   sConfig.SamplingTime = ADC_SAMPLETIME_480CYCLES;
   sConfig.Offset = 0;
   HAL_ADC_ConfigChannel(&AdcHandle, &sConfig);
       
   sConfig.Channel = ADCx_CHANNEL6;
   sConfig.Rank = 3;
   sConfig.SamplingTime = ADC_SAMPLETIME_480CYCLES;
   sConfig.Offset = 0;
   HAL_ADC_ConfigChannel(&AdcHandle, &sConfig);
       
   sConfig.Channel = ADCx_CHANNEL7;
   sConfig.Rank = 4;
   sConfig.SamplingTime = ADC_SAMPLETIME_480CYCLES;
   sConfig.Offset = 0;
   HAL_ADC_ConfigChannel(&AdcHandle, &sConfig);

  /* Start the conversion process and enable interrupt */  
//  HAL_ADC_Start_DMA(&AdcHandle, (uint32_t*)&ADCConvertedValue, 1);
       
        HAL_ADC_Start_DMA(&AdcHandle, ADC_Value_arr, 4);
}



收藏 1 评论14 发布时间:2015-2-5 19:38

举报

14个回答
左岸右岸 回答时间:2015-3-23 18:42:05
没试过多通道采集呢
feiante 回答时间:2015-2-6 08:42:10
恩,我也是用ADC DMA方式,多通道时有问题,永远都是第一个通道可以采样,好像F4和F1都是这样,F0是可以的
feiante 回答时间:2015-2-6 08:43:54
还有就是
hdma_adc.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD; //
  hdma_adc.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD
感觉应该定义为WORD的,因为HAL_ADC_Start_DMA(&AdcHandle, ADC_Value_arr, 4);中,ADC_Value_arr是uint32
亦轩阁 回答时间:2015-2-9 08:15:49
feiante 发表于 2015-2-6 08:43
还有就是
hdma_adc.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD; //
  hdma_adc.Init.MemDataAlig ...

按你说的我改了,就没问题了,准确度太差了……非常感谢
feiante 回答时间:2015-2-9 09:35:44
亦轩阁 发表于 2015-2-9 08:15
按你说的我改了,就没问题了,准确度太差了……非常感谢

你是说可以采集多路了?能把工程发来看看吗
亦轩阁 回答时间:2015-2-9 19:02:21
ADC的代码,就是我上边贴的代码,我的工程涉及太多文件,太大了,就不上传了……
阿_P 回答时间:2015-3-23 00:32:26
feiante 发表于 2015-2-6 08:42
恩,我也是用ADC DMA方式,多通道时有问题,永远都是第一个通道可以采样,好像F4和F1都是这样,F0是可以的 ...

AdcHandle.Init.ScanConvMode = ENABLE;//扫描模式
请改为
AdcHandle.Init.ScanConvMode = ADC_SCAN_ENABLE;//扫描模式
F1这个库有BUG
feiante 回答时间:2015-3-23 10:21:36
谢谢                          
数码小叶 回答时间:2015-3-23 17:13:08
学习学习
12下一页
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版