OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7616|回复: 5

ADC1,ADC2,ADC3,加DMA为什么ADC3回调函数不能正常工作

[复制链接]

32

主题

138

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1757
金钱
1757
注册时间
2018-4-28
在线时间
242 小时
发表于 2021-11-20 11:22:36 | 显示全部楼层 |阅读模式
10金钱
我用了ADC1,ADC2,ADC3,DMA1_Stream0,DMA1_Stream1,BDMA_Channel0,ADC1.ADC2.回调函数都是正常工作,就是ADC3.回调函数不能正常工作。有没有遇到这种情况的
芯片是STM32H750.ADC分频得80MHZ

    __HAL_RCC_DMA1_CLK_ENABLE();
    __HAL_RCC_ADC12_CLK_ENABLE();

  hadc1.Instance                                  = ADC1;
  hadc1.Init.ClockPrescaler                           = ADC_CLOCK_ASYNC_DIV10;         
  hadc1.Init.Resolution                          = ADC_RESOLUTION_16B;            
  hadc1.Init.ScanConvMode                   = ADC_SCAN_ENABLE;               
  hadc1.Init.EOCSelection                      = ADC_EOC_SINGLE_CONV;           
  hadc1.Init.LowPowerAutoWait             = DISABLE;                       
  hadc1.Init.ContinuousConvMode          = ENABLE;                        
  hadc1.Init.NbrOfConversion                 = 0x04U;                        
  hadc1.Init.DiscontinuousConvMode       = ENABLE;                       
  hadc1.Init.ExternalTrigConv                 = ADC_SOFTWARE_START;            
  hadc1.Init.ExternalTrigConvEdge          = ADC_EXTERNALTRIGCONVEDGE_NONE;
  hadc1.Init.ConversionDataManagement = ADC_CONVERSIONDATA_DMA_CIRCULAR;
  hadc1.Init.Overrun                              = ADC_OVR_DATA_PRESERVED;      
  hadc1.Init.LeftBitShift                          = ADC_LEFTBITSHIFT_NONE;         
  hadc1.Init.OversamplingMode              = DISABLE;  


  HAL_ADC_Init(&hadc1) ;

  HAL_ADCEx_Calibration_Start(&hadc1, ADC_CALIB_OFFSET, ADC_SINGLE_ENDED);


  /** Configure the ADC multi-mode
  */
  multimode.Mode = ADC_MODE_INDEPENDENT;
  if (HAL_ADCEx_MultiModeConfigChannel(&hadc1, &multimode) != HAL_OK)
  {
    Error_Handler();
  }


  hadc1.Instance                                  = ADC2;
  hadc1.Init.ClockPrescaler                           = ADC_CLOCK_ASYNC_DIV10;         
  hadc1.Init.Resolution                          = ADC_RESOLUTION_16B;            
  hadc1.Init.ScanConvMode                   = ADC_SCAN_ENABLE;               
  hadc1.Init.EOCSelection                      = ADC_EOC_SINGLE_CONV;           
  hadc1.Init.LowPowerAutoWait             = DISABLE;                       
  hadc1.Init.ContinuousConvMode          = ENABLE;                        
  hadc1.Init.NbrOfConversion                 = 0x04U;                        
  hadc1.Init.DiscontinuousConvMode       = ENABLE;                       
  hadc1.Init.ExternalTrigConv                 = ADC_SOFTWARE_START;            
  hadc1.Init.ExternalTrigConvEdge          = ADC_EXTERNALTRIGCONVEDGE_NONE;
  hadc1.Init.ConversionDataManagement = ADC_CONVERSIONDATA_DMA_CIRCULAR;
  hadc1.Init.Overrun                              = ADC_OVR_DATA_PRESERVED;      
  hadc1.Init.LeftBitShift                          = ADC_LEFTBITSHIFT_NONE;         
  hadc1.Init.OversamplingMode              = DISABLE;  


  HAL_ADC_Init(&hadc2) ;

  HAL_ADCEx_Calibration_Start(&hadc2, ADC_CALIB_OFFSET, ADC_SINGLE_ENDED);



   __HAL_RCC_BDMA_CLK_ENABLE();
        __HAL_RCC_ADC3_CLK_ENABLE();



  hadc3.Instance                                   = ADC3;
  hadc3.Init.ClockPrescaler                           = ADC_CLOCK_ASYNC_DIV10;         
  hadc3.Init.Resolution                          = ADC_RESOLUTION_16B;           
  hadc3.Init.ScanConvMode                    = ADC_SCAN_ENABLE;              
  hadc3.Init.EOCSelection                       = ADC_EOC_SINGLE_CONV;            
  hadc3.Init.LowPowerAutoWait              = DISABLE;                     
  hadc3.Init.ContinuousConvMode           = ENABLE;                     
  hadc3.Init.NbrOfConversion                  = 0x04U;                        
  hadc3.Init.DiscontinuousConvMode       = ENABLE;                        
  hadc3.Init.ExternalTrigConv                 = ADC_SOFTWARE_START;           
  hadc3.Init.ExternalTrigConvEdge          = ADC_EXTERNALTRIGCONVEDGE_NONE;  
  hadc3.Init.ConversionDataManagement = ADC_CONVERSIONDATA_DMA_CIRCULAR;
  hadc3.Init.Overrun                              = ADC_OVR_DATA_PRESERVED;        
  hadc3.Init.LeftBitShift                          = ADC_LEFTBITSHIFT_NONE;         
  hadc3.Init.OversamplingMode              = DISABLE;


  HAL_ADC_Init(&hadc3) ;

  HAL_ADCEx_Calibration_Start(&hadc3, ADC_CALIB_OFFSET, ADC_SINGLE_ENDED);






    hdma_adc1.Instance                 = DMA1_Stream0;
    hdma_adc1.Init.Request             = DMA_REQUEST_ADC1;
    hdma_adc1.Init.Direction           = DMA_PERIPH_TO_MEMORY;
    hdma_adc1.Init.PeriphInc           = DMA_PINC_DISABLE;
    hdma_adc1.Init.MemInc              = DMA_MINC_ENABLE;
    hdma_adc1.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
    hdma_adc1.Init.MemDataAlignment    = DMA_MDATAALIGN_HALFWORD;
    hdma_adc1.Init.Mode                = DMA_CIRCULAR;
    hdma_adc1.Init.Priority            = DMA_PRIORITY_MEDIUM;
    hdma_adc1.Init.FIFOMode            = DMA_FIFOMODE_DISABLE;


HAL_DMA_Init(&hdma_adc1);

    __HAL_LINKDMA(adcHandle,DMA_Handle,hdma_adc1);

  /* DMA1_Stream0_IRQn interrupt configuration */
    HAL_NVIC_SetPriority(DMA1_Stream0_IRQn, 4, 0);
    HAL_NVIC_EnableIRQ(DMA1_Stream0_IRQn);


    hdma_adc1.Instance                 = DMA1_Stream1;
    hdma_adc1.Init.Request             = DMA_REQUEST_ADC2;
    hdma_adc1.Init.Direction           = DMA_PERIPH_TO_MEMORY;
    hdma_adc1.Init.PeriphInc           = DMA_PINC_DISABLE;
    hdma_adc1.Init.MemInc              = DMA_MINC_ENABLE;
    hdma_adc1.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
    hdma_adc1.Init.MemDataAlignment    = DMA_MDATAALIGN_HALFWORD;
    hdma_adc1.Init.Mode                = DMA_CIRCULAR;
    hdma_adc1.Init.Priority            = DMA_PRIORITY_MEDIUM;
    hdma_adc1.Init.FIFOMode            = DMA_FIFOMODE_DISABLE;


HAL_DMA_Init(&hdma_adc2);

    __HAL_LINKDMA(adcHandle,DMA_Handle,hdma_adc2);

  /* DMA1_Stream1_IRQn interrupt configuration */
    HAL_NVIC_SetPriority(DMA1_Stream1_IRQn, 4, 1);
    HAL_NVIC_EnableIRQ(DMA1_Stream1_IRQn);





    hdma_adc3.Instance                 = BDMA_Channel0;
    hdma_adc3.Init.Request             = BDMA_REQUEST_ADC3;
    hdma_adc3.Init.Direction           = DMA_PERIPH_TO_MEMORY;
    hdma_adc3.Init.PeriphInc           = DMA_PINC_DISABLE;
    hdma_adc3.Init.MemInc              = DMA_MINC_ENABLE;
    hdma_adc3.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
    hdma_adc3.Init.MemDataAlignment    = DMA_MDATAALIGN_HALFWORD;
    hdma_adc3.Init.Mode                = DMA_CIRCULAR;
    hdma_adc3.Init.Priority            = DMA_PRIORITY_MEDIUM;
    hdma_adc3.Init.FIFOMode            = DMA_FIFOMODE_DISABLE;


        HAL_DMA_Init(&hdma_adc3) ;

    __HAL_LINKDMA(adcHandle,DMA_Handle,hdma_adc3);

   /* DMA interrupt init */
   /* BDMA_Channel0_IRQn interrupt configuration */
    HAL_NVIC_SetPriority(BDMA_Channel0_IRQn, 4, 2);
    HAL_NVIC_EnableIRQ(BDMA_Channel0_IRQn);



/**
  * @brief  Conversion complete callback in non blocking mode
  * @param  hadc ADC handle
  * @retval None
  */

void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{

                if(hadc->Instance == ADC1)
                {

                        SCB_InvalidateDCache_by_Addr(Adc1Value,ADC_AVERAGE_SIZE);
                        printf(" ADC00000: \r\n");
                }
                else if(hadc->Instance == ADC2)
                {
                        SCB_InvalidateDCache_by_Addr(Adc2Value,ADC_AVERAGE_SIZE);
       
                        printf(" ADC11111: \r\n");
                }
                else if(hadc->Instance == ADC3)
           {
                        SCB_InvalidateDCache_by_Addr(Adc3Value,ADC_AVERAGE_SIZE);

                        printf(" ADC22222: \r\n");

                }       

}      




void DMA1_Stream0_IRQHandler(void)
{
  HAL_DMA_IRQHandler(&hdma_adc1);
}


void DMA1_Stream1_IRQHandler(void)
{
  HAL_DMA_IRQHandler(&hdma_adc2);
}


/**
  * @brief This function handles BDMA channel0 global interrupt.
  */
void BDMA_Channel0_IRQHandler(void)
{

  HAL_DMA_IRQHandler(&hdma_adc3);

}






正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

668

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1926
金钱
1926
注册时间
2021-8-13
在线时间
262 小时
发表于 2021-11-20 11:38:03 | 显示全部楼层
没有用过,帮顶一下   
可以看看大佬分享的3路ADC的使用:https://blog.csdn.net/qq_4142159 ... 1018.2226.3001.4187
回复

使用道具 举报

32

主题

138

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1757
金钱
1757
注册时间
2018-4-28
在线时间
242 小时
 楼主| 发表于 2021-11-21 09:16:04 | 显示全部楼层
谢谢
回复

使用道具 举报

85

主题

249

帖子

0

精华

高级会员

Rank: 4

积分
674
金钱
674
注册时间
2020-12-5
在线时间
202 小时
发表于 2021-11-21 09:56:30 | 显示全部楼层
请问 HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)这个回调函数是完成哪个步骤之后调用的?是ADC转换完成调用还是DMA将ADC的数据全部传输完以后调用
回复

使用道具 举报

32

主题

138

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1757
金钱
1757
注册时间
2018-4-28
在线时间
242 小时
 楼主| 发表于 2021-11-21 13:44:03 | 显示全部楼层
数值更新
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
17
金钱
17
注册时间
2022-11-23
在线时间
4 小时
发表于 2022-11-25 16:33:41 | 显示全部楼层
请问解决了吗,我也遇到相同的问题了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-24 23:36

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表