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

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

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

举报

22个回答
vanaua 回答时间:2020-3-5 17:11:55
Paderboy 发表于 2016-2-25 15:21
我这个测试好了。直接用CubeMx 4.13 配置好直接生成后,
HAL_ADC_Start(&hadc2); 初始化好后先启动ADC2 工 ...
  1. static void MX_ADC1_Init(void)
  2. {

  3.   /* USER CODE BEGIN ADC1_Init 0 */

  4.   /* USER CODE END ADC1_Init 0 */

  5.   ADC_MultiModeTypeDef multimode = {0};
  6.   ADC_ChannelConfTypeDef sConfig = {0};

  7.   /* USER CODE BEGIN ADC1_Init 1 */

  8.   /* USER CODE END ADC1_Init 1 */
  9.   /** Common config
  10.   */
  11.   hadc1.Instance = ADC1;
  12.   hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4; ////4分频,ADCCLK=PER_CK/4=64/4=16MHZ
  13.   hadc1.Init.Resolution = ADC_RESOLUTION_16B;
  14.   hadc1.Init.ScanConvMode = ADC_SCAN_ENABLE;
  15.   // hadc1.Init.EOCSelection = ADC_EOC_SEQ_CONV;
  16.         hadc1.Init.EOCSelection = DISABLE;
  17.   hadc1.Init.LowPowerAutoWait = 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.ConversionDataManagement = ADC_CONVERSIONDATA_DMA_CIRCULAR;
  24.   hadc1.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN;
  25.   hadc1.Init.LeftBitShift = ADC_LEFTBITSHIFT_NONE;
  26.   hadc1.Init.OversamplingMode = DISABLE;
  27.   if (HAL_ADC_Init(&hadc1) != HAL_OK)
  28.   {
  29.     Error_Handler();
  30.   }
  31.   /** Configure the ADC multi-mode
  32.   */
  33.   multimode.Mode = ADC_DUALMODE_REGSIMULT;
  34.   multimode.DualModeData = ADC_DUALMODEDATAFORMAT_32_10_BITS;
  35.   multimode.TwoSamplingDelay = ADC_TWOSAMPLINGDELAY_5CYCLES;
  36.   if (HAL_ADCEx_MultiModeConfigChannel(&hadc1, &multimode) != HAL_OK)
  37.   {
  38.     Error_Handler();
  39.   }
  40.   /** Configure Regular Channel
  41.   */
  42.   sConfig.Channel = ADC_CHANNEL_16;
  43.   sConfig.Rank = ADC_REGULAR_RANK_1;
  44.   sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;
  45.   sConfig.SingleDiff = ADC_SINGLE_ENDED;
  46.   sConfig.OffsetNumber = ADC_OFFSET_NONE;
  47.   sConfig.Offset = 0;
  48.   if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  49.   {
  50.     Error_Handler();
  51.   }
  52.   /** Configure Regular Channel
  53.   */
  54.   sConfig.Channel = ADC_CHANNEL_17;
  55.   sConfig.Rank = ADC_REGULAR_RANK_2;
  56.   if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  57.   {
  58.     Error_Handler();
  59.   }
  60.   /* USER CODE BEGIN ADC1_Init 2 */

  61. //        if(HAL_ADCEx_Calibration_Start(&hadc1,ADC_CALIB_OFFSET,ADC_SINGLE_ENDED) != HAL_OK)
  62. //        {
  63. //                Error_Handler();
  64. //        }

  65.   /* USER CODE END ADC1_Init 2 */

  66. }

  67. /**
  68.   * @brief ADC2 Initialization Function
  69.   * @param None
  70.   * @retval None
  71.   */
  72. static void MX_ADC2_Init(void)
  73. {

  74.   /* USER CODE BEGIN ADC2_Init 0 */

  75.   /* USER CODE END ADC2_Init 0 */

  76.   ADC_ChannelConfTypeDef sConfig = {0};

  77.   /* USER CODE BEGIN ADC2_Init 1 */
  78.         ADC_MultiModeTypeDef multimode = {0};
  79.   /* USER CODE END ADC2_Init 1 */
  80.   /** Common config
  81.   */
  82.   hadc2.Instance = ADC2;
  83.   hadc2.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;
  84.   hadc2.Init.Resolution = ADC_RESOLUTION_16B;
  85.   hadc2.Init.ScanConvMode = ADC_SCAN_ENABLE;
  86.         // hadc1.Init.EOCSelection = ADC_EOC_SEQ_CONV;
  87.   hadc2.Init.EOCSelection = DISABLE;
  88.   hadc2.Init.LowPowerAutoWait = DISABLE;
  89.   hadc2.Init.ContinuousConvMode = ENABLE;
  90.   hadc2.Init.NbrOfConversion = 2;
  91.   hadc2.Init.DiscontinuousConvMode = DISABLE;
  92.   hadc2.Init.ConversionDataManagement = ADC_CONVERSIONDATA_DMA_CIRCULAR;
  93.   hadc2.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN;
  94.   hadc2.Init.LeftBitShift = ADC_LEFTBITSHIFT_NONE;
  95.   hadc2.Init.OversamplingMode = DISABLE;
  96.   if (HAL_ADC_Init(&hadc2) != HAL_OK)
  97.   {
  98.     Error_Handler();
  99.   }
  100.         HAL_ADCEx_Calibration_Start(&hadc1,ADC_CALIB_OFFSET,ADC_SINGLE_ENDED);
  101.         multimode.Mode = ADC_DUALMODE_REGSIMULT;
  102.   multimode.DualModeData = ADC_DUALMODEDATAFORMAT_32_10_BITS;
  103.   multimode.TwoSamplingDelay = ADC_TWOSAMPLINGDELAY_5CYCLES;
  104.   if (HAL_ADCEx_MultiModeConfigChannel(&hadc1, &multimode) != HAL_OK)
  105.   {
  106.     Error_Handler();
  107.   }
  108.   /** Configure Regular Channel
  109.   */
  110.   sConfig.Channel = ADC_CHANNEL_4;
  111.   sConfig.Rank = ADC_REGULAR_RANK_1;
  112.   sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;
  113.   sConfig.SingleDiff = ADC_SINGLE_ENDED;
  114.   sConfig.OffsetNumber = ADC_OFFSET_NONE;
  115.   sConfig.Offset = 0;
  116.   if (HAL_ADC_ConfigChannel(&hadc2, &sConfig) != HAL_OK)
  117.   {
  118.     Error_Handler();
  119.   }
  120.   /** Configure Regular Channel
  121.   */
  122.   sConfig.Channel = ADC_CHANNEL_8;
  123.   sConfig.Rank = ADC_REGULAR_RANK_2;
  124.   if (HAL_ADC_ConfigChannel(&hadc2, &sConfig) != HAL_OK)
  125.   {
  126.     Error_Handler();
  127.   }
  128.   /* USER CODE BEGIN ADC2_Init 2 */
  129. //        if(HAL_ADCEx_Calibration_Start(&hadc2,ADC_CALIB_OFFSET,ADC_SINGLE_ENDED) != HAL_OK)
  130. //        {
  131. //                Error_Handler();
  132. //        }
  133.   /* USER CODE END ADC2_Init 2 */

  134. }

  135. /**
  136.   * Enable DMA controller clock
  137.   */
  138. static void MX_DMA_Init(void)
  139. {

  140.   /* DMA controller clock enable */
  141.   __HAL_RCC_DMA1_CLK_ENABLE();
  142.   __HAL_RCC_DMA2_CLK_ENABLE();

  143.   /* DMA interrupt init */
  144.   /* DMA1_Stream1_IRQn interrupt configuration */
  145.   HAL_NVIC_SetPriority(DMA1_Stream1_IRQn, 0, 0);
  146.   HAL_NVIC_EnableIRQ(DMA1_Stream1_IRQn);
  147.   /* DMA2_Stream0_IRQn interrupt configuration */
  148.   HAL_NVIC_SetPriority(DMA2_Stream0_IRQn, 0, 1);
  149.   HAL_NVIC_EnableIRQ(DMA2_Stream0_IRQn);

  150. }
复制代码

  1. void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc)
  2. {
  3.   GPIO_InitTypeDef GPIO_InitStruct = {0};
  4.   if(hadc->Instance==ADC1)
  5.   {
  6.   /* USER CODE BEGIN ADC1_MspInit 0 */

  7.   /* USER CODE END ADC1_MspInit 0 */
  8.     /* Peripheral clock enable */
  9.     HAL_RCC_ADC12_CLK_ENABLED++;
  10.     if(HAL_RCC_ADC12_CLK_ENABLED==1){
  11.       __HAL_RCC_ADC12_CLK_ENABLE();
  12.     }
  13.   
  14.     __HAL_RCC_GPIOA_CLK_ENABLE();
  15.     /**ADC1 GPIO Configuration   
  16.     PA1     ------> ADC1_INP17
  17.     PA0     ------> ADC1_INP16
  18.     */
  19.     GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_0;
  20.     GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
  21.     GPIO_InitStruct.Pull = GPIO_NOPULL;
  22.     HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  23.     /* ADC1 DMA Init */
  24.     /* ADC1 Init */
  25.     hdma_adc1.Instance = DMA1_Stream1;
  26.     hdma_adc1.Init.Request = DMA_REQUEST_ADC1;
  27.     hdma_adc1.Init.Direction = DMA_PERIPH_TO_MEMORY;
  28.     hdma_adc1.Init.PeriphInc = DMA_PINC_DISABLE;
  29.     hdma_adc1.Init.MemInc = DMA_MINC_ENABLE;
  30.     hdma_adc1.Init.PeriphDataAlignment = DMA_MDATAALIGN_WORD;
  31.     hdma_adc1.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;
  32.     hdma_adc1.Init.Mode = DMA_CIRCULAR;
  33.     hdma_adc1.Init.Priority = DMA_PRIORITY_HIGH;
  34.     hdma_adc1.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
  35.     if (HAL_DMA_Init(&hdma_adc1) != HAL_OK)
  36.     {
  37.       Error_Handler();
  38.     }

  39.     __HAL_LINKDMA(hadc,DMA_Handle,hdma_adc1);

  40.   /* USER CODE BEGIN ADC1_MspInit 1 */

  41.   /* USER CODE END ADC1_MspInit 1 */
  42.   }
  43.   else if(hadc->Instance==ADC2)
  44.   {
  45.   /* USER CODE BEGIN ADC2_MspInit 0 */

  46.   /* USER CODE END ADC2_MspInit 0 */
  47.     /* Peripheral clock enable */
  48.     HAL_RCC_ADC12_CLK_ENABLED++;
  49.     if(HAL_RCC_ADC12_CLK_ENABLED==1){
  50.       __HAL_RCC_ADC12_CLK_ENABLE();
  51.     }
  52.   
  53.     __HAL_RCC_GPIOC_CLK_ENABLE();
  54.     /**ADC2 GPIO Configuration   
  55.     PC4     ------> ADC2_INP4
  56.     PC5     ------> ADC2_INP8
  57.     */
  58.     GPIO_InitStruct.Pin = GPIO_PIN_4|GPIO_PIN_5;
  59.     GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
  60.     GPIO_InitStruct.Pull = GPIO_NOPULL;
  61.     HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

  62.     /* ADC2 DMA Init */
  63.     /* ADC2 Init */
  64.     hdma_adc2.Instance = DMA2_Stream0;
  65.     hdma_adc2.Init.Request = DMA_REQUEST_ADC2;
  66.     hdma_adc2.Init.Direction = DMA_PERIPH_TO_MEMORY;
  67.     hdma_adc2.Init.PeriphInc = DMA_PINC_DISABLE;
  68.     hdma_adc2.Init.MemInc = DMA_MINC_ENABLE;
  69.     hdma_adc2.Init.PeriphDataAlignment = DMA_MDATAALIGN_WORD;
  70.     hdma_adc2.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;
  71.     hdma_adc2.Init.Mode = DMA_CIRCULAR;
  72.     hdma_adc2.Init.Priority = DMA_PRIORITY_HIGH;
  73.     hdma_adc2.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
  74.     if (HAL_DMA_Init(&hdma_adc2) != HAL_OK)
  75.     {
  76.       Error_Handler();
  77.     }

  78.     __HAL_LINKDMA(hadc,DMA_Handle,hdma_adc2);

  79.   /* USER CODE BEGIN ADC2_MspInit 1 */

  80.   /* USER CODE END ADC2_MspInit 1 */
  81.   }

  82. }
复制代码

  1. void DMA1_Stream1_IRQHandler(void)
  2. {
  3.   /* USER CODE BEGIN DMA1_Stream1_IRQn 0 */

  4.   /* USER CODE END DMA1_Stream1_IRQn 0 */
  5.   HAL_DMA_IRQHandler(&hdma_adc1);
  6.   /* USER CODE BEGIN DMA1_Stream1_IRQn 1 */
  7.   /* USER CODE END DMA1_Stream1_IRQn 1 */
  8. }
复制代码

  1. //dma中断adc进行取数据,该函数会被DMA1_Stream1_IRQHandler调用
  2. void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
  3. {
  4.         uint16_t i,j=0;
  5.         //SCB_DisableDCache();
  6.         //对于F7带Cache需要注意,读取DMA前先关闭

  7.         flag=1;
  8.         if(flag)
  9.         {
  10.                 /* USER CODE END WHILE */
  11.                  //SCB_InvalidateDCache_by_Addr((uint32_t *)g_usADC1_Data,  sizeof(g_usADC1_Data));
  12.                  SCB_DisableDCache();
  13.                  for(i=0;i<200;)
  14.                  {
  15.                                 adc1_rx1[j] = g_usADC1_Data[i]&0xffff;     
  16.                                 adc1_rx2[j] = g_usADC1_Data[i+1]&0xffff;
  17.                                 adc2_rx1[j] = g_usADC1_Data[i]>>16;
  18.                                 adc2_rx2[j] = g_usADC1_Data[i+1]>>16;
  19.                                 j++;
  20.                                 i+=2;
  21.                  }
  22.         }
  23.         flag =0;
  24.                 SCB_EnableDCache();       
  25.          //对于F7带Cache需要注意,读取DMA完成后再打开
  26. }
复制代码
penghao 回答时间: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





Paderboy 回答时间:2016-2-24 11:12:03
HAL库里有例程的你可要看看。。。
penghao 回答时间: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, 下载次数: 485)
penghao 回答时间: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
帮顶……
penghao 回答时间:2016-2-25 21:37:56
Paderboy 发表于 2016-2-25 15:21
我这个测试好了。直接用CubeMx 4.13 配置好直接生成后,
HAL_ADC_Start(&hadc2); 初始化好后先启动ADC2 工 ...

非常感谢,看了下你用cubemx生成的代码和我的作了下对比,感觉cubemx挺方便的,但是我还不太会用,以后得好好学学。顺便问下如果配置成用定时器触发两个定时器同步规则采样的话生成的代码是怎样的,是否两个定时器的触发模式都要配置。
Paderboy 回答时间:2016-2-25 21:59:57
nipenghao 发表于 2016-2-25 21:37
非常感谢,看了下你用cubemx生成的代码和我的作了下对比,感觉cubemx挺方便的,但是我还不太会用,以后得 ...

cube配置定时器,先确定ADC触发都支持哪些定时器。然后配置定时器去触发。。。你可以借鉴下HAL库里的例程去调试。。。
Ysheng169 回答时间:2016-10-11 15:21:42
Paderboy 发表于 2016-2-25 15:21
我这个测试好了。直接用CubeMx 4.13 配置好直接生成后,
HAL_ADC_Start(&hadc2); 初始化好后先启动ADC2 工 ...

请问ADC使用过内部基准电压么
Paderboy 回答时间:2016-10-11 19:52:32
Ysheng169 发表于 2016-10-11 15:21
请问ADC使用过内部基准电压么

只是内部参考电压,你直接用cubemx配置到内部vrefint的通道就可以获取。。内部参考电压。。
zbber 回答时间:2016-10-11 20:41:19
帮顶……
Ysheng169 回答时间:2016-10-11 22:00:11
Paderboy 发表于 2016-10-11 19:52
只是内部参考电压,你直接用cubemx配置到内部vrefint的通道就可以获取。。内部参考电压。。 ...

我也是这样配置的,但是遇到问题:电压增大时,读出来的数据是变小的,电压调小,读出来的却是变大。
我使用稳压源供电,如果5V,AD转换后是1.5V,3.3V时AD读出2.8V,请问有遇到这情况没
12下一页

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版