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

STM32cube库配置双ADC的同步规则采样

[复制链接]
nipenghao 提问时间:2016-2-24 10:35 /
哪位大神能给个使用STM32的HAL库配置双ADC同步规则采样并通过DMA传输的例程,自己利用标准库的试验可以,但是hal库还是不熟,只好来求助了。
收藏 4 评论22 发布时间:2016-2-24 10:35

举报

22个回答
Paderboy 回答时间:2016-2-24 11:12:03
HAL库里有例程的你可要看看。。。
nipenghao 回答时间:2016-2-24 11:33:31
Paderboy 发表于 2016-2-24 11:12
HAL库里有例程的你可要看看。。。

HAL库里有嘛,我找了下没找到,我的库版本是STM32Cube_FW_F4_V1.10.0,里面是有一些ADC的HAL使用例程,只是我想要的是配置两个ADC同时采样的,类似标准库F1系列的RegSimul_DualMode。

回答时间:2016-2-24 16:39:07
楼主看一下这个例程,
ADC_DualModeInterleaved.rar (71.23 KB, 下载次数: 442)
nipenghao 回答时间:2016-2-24 17:10:51
安 发表于 2016-2-24 16:39
楼主看一下这个例程,

嗯,这个看过了,是双ADC的交替模式,只是我想用的是双ADC的同步规则模式,就是在配置时 MultiModeInit.Mode = ADC_DUALMODE_REGSIMULT; 这个例程原来的F1标准库有,而且我用F4时用标准库也行,但是用HAL库配置F4老出错。
Paderboy 回答时间:2016-2-24 19:32:13
本帖最后由 Paderboy 于 2016-2-24 19:34 编辑
nipenghao 发表于 2016-2-24 17:10
嗯,这个看过了,是双ADC的交替模式,只是我想用的是双ADC的同步规则模式,就是在配置时 MultiModeInit.M ...

把你cube配置的发上来看看。。
QQ图片20160224193322.png
回到未来~ 回答时间:2016-2-25 07:02:10
帮顶……
nipenghao 回答时间:2016-2-25 10:11:10
Paderboy 发表于 2016-2-24 19:32
把你cube配置的发上来看看。。

下面是配置双ADC的代码,
  1. void Dual_ADC_Config(void)
  2. {
  3.     ADC_ChannelConfTypeDef sConfig_master;
  4.     ADC_ChannelConfTypeDef sConfig_slave;
  5.     ADC_MultiModeTypeDef   MultiModeInit;

  6.    
  7.     //config for adc2
  8.     AdcHandle_slave.Instance = ADCy;
  9.     AdcHandle_slave.Init.ClockPrescaler = ADC_CLOCKPRESCALER_PCLK_DIV4;
  10.     AdcHandle_slave.Init.Resolution = ADC_RESOLUTION_12B;
  11.     AdcHandle_slave.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  12.     AdcHandle_slave.Init.ScanConvMode = DISABLE;
  13.     AdcHandle_slave.Init.EOCSelection = DISABLE;//ADC_EOC_SEQ_CONV;     //ADC_EOC_SINGLE_CONV; 转换序列结束
  14.    
  15.     AdcHandle_slave.Init.ContinuousConvMode = ENABLE;
  16.     AdcHandle_slave.Init.NbrOfConversion = 1;                  //sequencer disable
  17.     AdcHandle_slave.Init.DiscontinuousConvMode = DISABLE;      //sequencer disable
  18.     AdcHandle_slave.Init.NbrOfDiscConversion = 0;                  //sequencer disable
  19.    
  20.     //AdcHandle_slave.Init.ExternalTrigConv = ADC_EXTERNALTRIGCONV_T1_CC1;
  21.     AdcHandle_slave.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
  22.     //AdcHandle_slave.Init.DMAContinuousRequests = ENABLE;
  23.    
  24.    // AdcHandle_slave.Init = AdcHandle_master.Init;
  25.   //配置ADC2由ADC1触发
  26.     if(HAL_ADC_Init(&AdcHandle_slave) != HAL_OK)
  27.     {
  28.       Error_Handler();
  29.     }
  30.    
  31.     sConfig_slave.Channel     = ADCy_CHANNEL;     //adc2 channel1
  32.     sConfig_slave.Rank        = 1;
  33.     sConfig_slave.SamplingTime= ADC_SAMPLETIME_15CYCLES;
  34. //L4中有    sConfig.SingleDiff  = ADC_SINGLE_ENDED;
  35. //L4中有   sConfig.OffsetNumber= 0;
  36.     sConfig_slave.Offset      =0;
  37.     if(HAL_ADC_ConfigChannel(&AdcHandle_slave,&sConfig_slave) !=HAL_OK)
  38.     {
  39.       Error_Handler();
  40.     }
  41.    
  42.     //config for ADC1
  43.     AdcHandle_master.Instance = ADCx;
  44.    
  45.     AdcHandle_master.Init.ClockPrescaler = ADC_CLOCKPRESCALER_PCLK_DIV4;        //L4的时钟跟F4不同
  46.     AdcHandle_master.Init.Resolution = ADC_RESOLUTION_12B;
  47.     AdcHandle_master.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  48.     AdcHandle_master.Init.ScanConvMode = DISABLE;
  49.     AdcHandle_master.Init.EOCSelection = DISABLE;//ADC_EOC_SEQ_CONV;     //ADC_EOC_SINGLE_CONV; 转换序列结束

  50.     AdcHandle_master.Init.ContinuousConvMode = ENABLE;
  51.     AdcHandle_master.Init.NbrOfConversion = 1;                  //sequencer disable
  52.     AdcHandle_master.Init.DiscontinuousConvMode = DISABLE;      //sequencer disable
  53.     AdcHandle_master.Init.NbrOfDiscConversion = 0;                  //sequencer disable               
  54.     //#if defined ADC_TRIGGER_WITH_TIMER
  55.     AdcHandle_master.Init.ExternalTrigConv = ADC_EXTERNALTRIGCONV_T1_CC1;
  56.     AdcHandle_master.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
  57.     AdcHandle_master.Init.DMAContinuousRequests = ENABLE;

  58.     if(HAL_ADC_Init(&AdcHandle_master) != HAL_OK)
  59.     {
  60.       Error_Handler();
  61.     }
  62.     sConfig_master.Channel    = ADCx_CHANNEL;
  63.     sConfig_master.Rank       = 1;
  64.     sConfig_master.SamplingTime = ADC_SAMPLETIME_15CYCLES;
  65.     sConfig_master.Offset     = 0;
  66.     if(HAL_ADC_ConfigChannel(&AdcHandle_master,&sConfig_master) != HAL_OK)
  67.     {
  68.       Error_Handler();
  69.     }
  70.    
  71.   
  72. //configuration of multimode
  73.     MultiModeInit.Mode = ADC_DUALMODE_REGSIMULT;
  74.     MultiModeInit.TwoSamplingDelay = ADC_TWOSAMPLINGDELAY_5CYCLES;
  75.     MultiModeInit.DMAAccessMode = ADC_DMAACCESSMODE_1;
  76.    
  77.     if(HAL_ADCEx_MultiModeConfigChannel(&AdcHandle_master,&MultiModeInit) != HAL_OK)    //配置ADC的MultiMode
  78.     {
  79.       Error_Handler();
  80.     }
  81. //    if(HAL_ADCEx_MultiModeConfigChannel(&AdcHandle_slave,&MultiModeInit) != HAL_OK)
  82. //    {
  83. //      Error_Handler();
  84. //    }

  85. }
复制代码


这下面的是配置底层和DMA的代码
  1. void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc)
  2. {
  3.   GPIO_InitTypeDef          GPIO_InitStruct;
  4.   static DMA_HandleTypeDef  hdma_adc;
  5.   
  6.   /*##-1- Enable peripherals and GPIO Clocks #################################*/
  7.   /* Enable GPIO clock */
  8.   ADCxy_CHANNEL_GPIO_CLK_ENABLE();
  9.   /* ADC Periph clock enable */
  10.   ADCx_CLK_ENABLE();
  11.   ADCy_CLK_ENABLE();
  12.   
  13.   /* Enable DMA2 clock */
  14.   DMAxy_CLK_ENABLE();
  15.   
  16.   /*##-2- Configure peripheral GPIO ##########################################*/
  17.   /* ADC1 Channel8 GPIO pin configuration */
  18.   GPIO_InitStruct.Pin = ADCx_CHANNEL_PIN;                       //ADC1_6
  19.   GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
  20.   GPIO_InitStruct.Pull = GPIO_NOPULL;
  21.   HAL_GPIO_Init(ADCx_CHANNEL_GPIO_PORT, &GPIO_InitStruct);
  22.   
  23.   GPIO_InitStruct.Pin = ADCy_CHANNEL_PIN;                       //ADC2_1
  24.   GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
  25.   GPIO_InitStruct.Pull = GPIO_NOPULL;
  26.   HAL_GPIO_Init(ADCy_CHANNEL_GPIO_PORT, &GPIO_InitStruct);
  27.   

  28.   /*##-3- Configure the DMA streams ##########################################*/
  29.   /* Set the parameters to be configured */
  30.   hdma_adc.Instance = ADCxy_DMA_STREAM;
  31.   
  32.   hdma_adc.Init.Channel  = ADCxy_DMA_CHANNEL;
  33.   hdma_adc.Init.Direction = DMA_PERIPH_TO_MEMORY;
  34.   hdma_adc.Init.PeriphInc = DMA_PINC_DISABLE;
  35.   hdma_adc.Init.MemInc = DMA_MINC_ENABLE;
  36.   hdma_adc.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
  37.   hdma_adc.Init.MemDataAlignment = DMA_PDATAALIGN_HALFWORD;
  38.   hdma_adc.Init.Mode = DMA_CIRCULAR;    //original was DMA_CIRCULAR
  39.   hdma_adc.Init.Priority = DMA_PRIORITY_HIGH;
  40.   hdma_adc.Init.FIFOMode = DMA_FIFOMODE_DISABLE;         
  41.   hdma_adc.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_HALFFULL;
  42.   hdma_adc.Init.MemBurst = DMA_MBURST_SINGLE;
  43.   hdma_adc.Init.PeriphBurst = DMA_PBURST_SINGLE;

  44.   HAL_DMA_Init(&hdma_adc);
  45.    
  46.   /* Associate the initialized DMA handle to the the ADC handle */
  47.   __HAL_LINKDMA(hadc, DMA_Handle, hdma_adc);

  48.   /*##-4- Configure the NVIC for DMA #########################################*/
  49.   /* NVIC configuration for DMA transfer complete interrupt */
  50.   HAL_NVIC_SetPriority(ADCxy_DMA_IRQn, 0, 0);   
  51.   HAL_NVIC_EnableIRQ(ADCxy_DMA_IRQn);
  52. }
复制代码

然后参照原来函数中的HAL_StatusTypeDef HAL_ADCEx_MultiModeStart_DMA(ADC_HandleTypeDef* hadc, uint32_t* pData, uint32_t Length)函数,重写了个函数,主要是增加了使能DMA mode 和 开启定时器2.  
Paderboy 回答时间:2016-2-25 15:21:27
我这个测试好了。直接用CubeMx 4.13 配置好直接生成后,
HAL_ADC_Start(&hadc2); 初始化好后先启动ADC2 工作。

HAL_ADCEx_MultiModeStart_DMA(&hadc1, ADCvaule, 1);然后启动ADC 多通道 DMA读取CDR里的数据。。


好了,上整个流程图吧。。

STM32F446RET-DUAL-ADC01.png

STM32F446RET-DUAL-ADC02.png

STM32F446RET-DUAL-ADC03.png

STM32F446RET-DUAL-ADC04.png

STM32F446RET-DUAL-ADC05.png

STM32F446RET-DUAL-ADC06.png

STM32F446RET-DUAL-ADC10.png

STM32F446RET-DUAL-ADC11.png

STM32F446RET-DUAL-ADC12.png

STM32F446RET-DUAL-ADC15.png

STM32F446RET-DUAL-ADC14.png

STM32F446RET-DUAL-ADC13.png


STM32F446RET-DUAL-ADC07.png

STM32F446RET-DUAL-ADC08.png

STM32F446RET-DUAL-ADC09.png





nipenghao 回答时间:2016-2-25 21:37:56
Paderboy 发表于 2016-2-25 15:21
我这个测试好了。直接用CubeMx 4.13 配置好直接生成后,
HAL_ADC_Start(&hadc2); 初始化好后先启动ADC2 工 ...

非常感谢,看了下你用cubemx生成的代码和我的作了下对比,感觉cubemx挺方便的,但是我还不太会用,以后得好好学学。顺便问下如果配置成用定时器触发两个定时器同步规则采样的话生成的代码是怎样的,是否两个定时器的触发模式都要配置。
123下一页
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版