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

[复制链接]
 楼主| hfaouhfoa 发表于 2022-7-26 18:39 | 显示全部楼层 |阅读模式
我用了ADC1,ADC2,ADC3,DMA1_Stream0,DMA1_Stream1,BDMA_Channel0,ADC1.ADC2.回调函数都是正常工作,就是ADC3.回调函数不能正常工作。有没有遇到这种情况的
芯片是STM32H750.ADC分频得80MHZ
  1. __HAL_RCC_DMA1_CLK_ENABLE();
  2. __HAL_RCC_ADC12_CLK_ENABLE();
  3. hadc1.Instance                                  = ADC1;
  4. hadc1.Init.ClockPrescaler                           = ADC_CLOCK_ASYNC_DIV10;
  5. hadc1.Init.Resolution                          = ADC_RESOLUTION_16B;
  6. hadc1.Init.ScanConvMode                   = ADC_SCAN_ENABLE;
  7. hadc1.Init.EOCSelection                      = ADC_EOC_SINGLE_CONV;
  8. hadc1.Init.LowPowerAutoWait             = DISABLE;
  9. hadc1.Init.ContinuousConvMode          = ENABLE;
  10. hadc1.Init.NbrOfConversion                 = 0x04U;
  11. hadc1.Init.DiscontinuousConvMode       = ENABLE;
  12. hadc1.Init.ExternalTrigConv                 = ADC_SOFTWARE_START;
  13. hadc1.Init.ExternalTrigConvEdge          = ADC_EXTERNALTRIGCONVEDGE_NONE;
  14. hadc1.Init.ConversionDataManagement = ADC_CONVERSIONDATA_DMA_CIRCULAR;
  15. hadc1.Init.Overrun                              = ADC_OVR_DATA_PRESERVED;
  16. hadc1.Init.LeftBitShift                          = ADC_LEFTBITSHIFT_NONE;
  17. hadc1.Init.OversamplingMode              = DISABLE;

  18. HAL_ADC_Init(&hadc1) ;

  19. HAL_ADCEx_Calibration_Start(&hadc1, ADC_CALIB_OFFSET, ADC_SINGLE_ENDED);

  20. /** Configure the ADC multi-mode
  21. */
  22. multimode.Mode = ADC_MODE_INDEPENDENT;
  23. if (HAL_ADCEx_MultiModeConfigChannel(&hadc1, &multimode) != HAL_OK)
  24. {
  25. Error_Handler();
  26. }

  27. hadc1.Instance                                  = ADC2;
  28. hadc1.Init.ClockPrescaler                           = ADC_CLOCK_ASYNC_DIV10;
  29. hadc1.Init.Resolution                          = ADC_RESOLUTION_16B;
  30. hadc1.Init.ScanConvMode                   = ADC_SCAN_ENABLE;
  31. hadc1.Init.EOCSelection                      = ADC_EOC_SINGLE_CONV;
  32. hadc1.Init.LowPowerAutoWait             = DISABLE;
  33. hadc1.Init.ContinuousConvMode          = ENABLE;
  34. hadc1.Init.NbrOfConversion                 = 0x04U;
  35. hadc1.Init.DiscontinuousConvMode       = ENABLE;
  36. hadc1.Init.ExternalTrigConv                 = ADC_SOFTWARE_START;
  37. hadc1.Init.ExternalTrigConvEdge          = ADC_EXTERNALTRIGCONVEDGE_NONE;
  38. hadc1.Init.ConversionDataManagement = ADC_CONVERSIONDATA_DMA_CIRCULAR;
  39. hadc1.Init.Overrun                              = ADC_OVR_DATA_PRESERVED;
  40. hadc1.Init.LeftBitShift                          = ADC_LEFTBITSHIFT_NONE;
  41. hadc1.Init.OversamplingMode              = DISABLE;

  42. HAL_ADC_Init(&hadc2) ;

  43. HAL_ADCEx_Calibration_Start(&hadc2, ADC_CALIB_OFFSET, ADC_SINGLE_ENDED);

  44. __HAL_RCC_BDMA_CLK_ENABLE();
  45. __HAL_RCC_ADC3_CLK_ENABLE();

  46. hadc3.Instance                                   = ADC3;
  47. hadc3.Init.ClockPrescaler                           = ADC_CLOCK_ASYNC_DIV10;
  48. hadc3.Init.Resolution                          = ADC_RESOLUTION_16B;
  49. hadc3.Init.ScanConvMode                    = ADC_SCAN_ENABLE;
  50. hadc3.Init.EOCSelection                       = ADC_EOC_SINGLE_CONV;
  51. hadc3.Init.LowPowerAutoWait              = DISABLE;
  52. hadc3.Init.ContinuousConvMode           = ENABLE;
  53. hadc3.Init.NbrOfConversion                  = 0x04U;
  54. hadc3.Init.DiscontinuousConvMode       = ENABLE;
  55. hadc3.Init.ExternalTrigConv                 = ADC_SOFTWARE_START;
  56. hadc3.Init.ExternalTrigConvEdge          = ADC_EXTERNALTRIGCONVEDGE_NONE;
  57. hadc3.Init.ConversionDataManagement = ADC_CONVERSIONDATA_DMA_CIRCULAR;
  58. hadc3.Init.Overrun                              = ADC_OVR_DATA_PRESERVED;
  59. hadc3.Init.LeftBitShift                          = ADC_LEFTBITSHIFT_NONE;
  60. hadc3.Init.OversamplingMode              = DISABLE;

  61. HAL_ADC_Init(&hadc3) ;

  62. HAL_ADCEx_Calibration_Start(&hadc3, ADC_CALIB_OFFSET, ADC_SINGLE_ENDED);

  63. hdma_adc1.Instance                 = DMA1_Stream0;
  64. hdma_adc1.Init.Request             = DMA_REQUEST_ADC1;
  65. hdma_adc1.Init.Direction           = DMA_PERIPH_TO_MEMORY;
  66. hdma_adc1.Init.PeriphInc           = DMA_PINC_DISABLE;
  67. hdma_adc1.Init.MemInc              = DMA_MINC_ENABLE;
  68. hdma_adc1.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
  69. hdma_adc1.Init.MemDataAlignment    = DMA_MDATAALIGN_HALFWORD;
  70. hdma_adc1.Init.Mode                = DMA_CIRCULAR;
  71. hdma_adc1.Init.Priority            = DMA_PRIORITY_MEDIUM;
  72. hdma_adc1.Init.FIFOMode            = DMA_FIFOMODE_DISABLE;
  73. HAL_DMA_Init(&hdma_adc1);

  74. __HAL_LINKDMA(adcHandle,DMA_Handle,hdma_adc1);
  75. /* DMA1_Stream0_IRQn interrupt configuration */
  76. HAL_NVIC_SetPriority(DMA1_Stream0_IRQn, 4, 0);
  77. HAL_NVIC_EnableIRQ(DMA1_Stream0_IRQn);

  78. hdma_adc1.Instance                 = DMA1_Stream1;
  79. hdma_adc1.Init.Request             = DMA_REQUEST_ADC2;
  80. hdma_adc1.Init.Direction           = DMA_PERIPH_TO_MEMORY;
  81. hdma_adc1.Init.PeriphInc           = DMA_PINC_DISABLE;
  82. hdma_adc1.Init.MemInc              = DMA_MINC_ENABLE;
  83. hdma_adc1.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
  84. hdma_adc1.Init.MemDataAlignment    = DMA_MDATAALIGN_HALFWORD;
  85. hdma_adc1.Init.Mode                = DMA_CIRCULAR;
  86. hdma_adc1.Init.Priority            = DMA_PRIORITY_MEDIUM;
  87. hdma_adc1.Init.FIFOMode            = DMA_FIFOMODE_DISABLE;
  88. HAL_DMA_Init(&hdma_adc2);

  89. __HAL_LINKDMA(adcHandle,DMA_Handle,hdma_adc2);
  90. /* DMA1_Stream1_IRQn interrupt configuration */
  91. HAL_NVIC_SetPriority(DMA1_Stream1_IRQn, 4, 1);
  92. HAL_NVIC_EnableIRQ(DMA1_Stream1_IRQn);

  93. hdma_adc3.Instance                 = BDMA_Channel0;
  94. hdma_adc3.Init.Request             = BDMA_REQUEST_ADC3;
  95. hdma_adc3.Init.Direction           = DMA_PERIPH_TO_MEMORY;
  96. hdma_adc3.Init.PeriphInc           = DMA_PINC_DISABLE;
  97. hdma_adc3.Init.MemInc              = DMA_MINC_ENABLE;
  98. hdma_adc3.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
  99. hdma_adc3.Init.MemDataAlignment    = DMA_MDATAALIGN_HALFWORD;
  100. hdma_adc3.Init.Mode                = DMA_CIRCULAR;
  101. hdma_adc3.Init.Priority            = DMA_PRIORITY_MEDIUM;
  102. hdma_adc3.Init.FIFOMode            = DMA_FIFOMODE_DISABLE;


  103.     HAL_DMA_Init(&hdma_adc3) ;

  104. __HAL_LINKDMA(adcHandle,DMA_Handle,hdma_adc3);
  105. /* DMA interrupt init */
  106. /* BDMA_Channel0_IRQn interrupt configuration */
  107. HAL_NVIC_SetPriority(BDMA_Channel0_IRQn, 4, 2);
  108. HAL_NVIC_EnableIRQ(BDMA_Channel0_IRQn);

  109. /**

  110. * [url=home.php?mod=space&uid=247401]@brief[/url]  Conversion complete callback in non blocking mode
  111. * [@param](http://www.openedv.com/home.php?mod=space&uid=271674)  hadc ADC handle
  112. * @retval None
  113.   */

  114. void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
  115. {

  116.             if(hadc->Instance == ADC1)
  117.             {

  118.                     SCB_InvalidateDCache_by_Addr(Adc1Value,ADC_AVERAGE_SIZE);
  119.                     printf(" ADC00000: \r\n");
  120.             }
  121.             else if(hadc->Instance == ADC2)
  122.             {
  123.                     SCB_InvalidateDCache_by_Addr(Adc2Value,ADC_AVERAGE_SIZE);
  124.   
  125.                     printf(" ADC11111: \r\n");
  126.             }
  127.             else if(hadc->Instance == ADC3)
  128.        {
  129.                     SCB_InvalidateDCache_by_Addr(Adc3Value,ADC_AVERAGE_SIZE);

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

  131.             }      
  132. }

  133. void DMA1_Stream0_IRQHandler(void)
  134. {
  135. HAL_DMA_IRQHandler(&hdma_adc1);
  136. }

  137. void DMA1_Stream1_IRQHandler(void)
  138. {
  139. HAL_DMA_IRQHandler(&hdma_adc2);
  140. }

  141. /**

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

  146. HAL_DMA_IRQHandler(&hdma_adc3);

  147. }




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

本版积分规则

22

主题

80

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部