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

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

[复制链接]
nipenghao 提问时间:2016-2-24 10:35 /
阅读主题, 点击返回1楼
收藏 4 评论22 发布时间:2016-2-24 10:35
22个回答
vanaua 回答时间:2020-3-5 17:08:14
Paderboy 发表于 2016-2-25 15:21
我这个测试好了。直接用CubeMx 4.13 配置好直接生成后,
HAL_ADC_Start(&hadc2); 初始化好后先启动ADC2 工 ...

兄弟,你好,最近我也在做h7系列的adc同步采样问题,但跟你不同的是,我的是两路adc,每路adc下面还各有两个通道,这我就不明白该怎么设置了,可以把你这个工程代码让我参考一下吗?万分感谢了。邮箱:vanaua@163.com
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. }
复制代码
vanaua 回答时间:2020-3-5 17:13:06
最后在main函数中,使用
  1.         //HAL_ADC_Start(&hadc2);
  2.         ADC_Enable(&hadc2);
  3.         ADC12_COMMON->CCR|=0x10<<14;
  4.         HAL_ADCEx_MultiModeStart_DMA(&hadc1, (uint32_t *)g_usADC1_Data, 200);
复制代码


但是,我在接收数据的时候总是失败,这是怎么回事呀
123
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版