我正在使用一块stm32f3探索板和来自CubeMX的HAL。 我试图在ADC4上使用2个ADC通道。 我配置了循环模式下的DMA。 在main函数的主循环之前,我调用:
HAL_ADC_Start_DMA(&hadc4, DMA_adc4_buffer, 16);
我实现了函数
HAL_ADC_ConvHalfCpltCallback
和HAL_ADC_ConvCpltCallback
。现在奇怪的部分是:HAL_ADC_ConvHalfCpltCallback
经常被调用,但HAL_ADC_ConvCpltCallback
没有被调用。这告诉我,使用DMA传输的ADC运行良好。但为什么传输完成回调没有被调用呢? 如果我使用
HAL_ADC_Start_IT
启动ADC,则会调用中断函数,但这不是我想要的。在ST HAL中将断点放入
HAL_DMA_IRQHandler
中也表明,回调从未被调用。为了完整起见,在此提供ADC4_Init函数的部分代码:
/**Common config
*/
hadc4.Instance = ADC4;
hadc4.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV1;
hadc4.Init.Resolution = ADC_RESOLUTION_12B;
hadc4.Init.ScanConvMode = ADC_SCAN_ENABLE;
hadc4.Init.ContinuousConvMode = ENABLE;
hadc4.Init.DiscontinuousConvMode = DISABLE;
hadc4.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
hadc4.Init.ExternalTrigConv = ADC_SOFTWARE_START;
hadc4.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc4.Init.NbrOfConversion = 2;
hadc4.Init.DMAContinuousRequests = ENABLE;
hadc4.Init.EOCSelection = ADC_EOC_SEQ_CONV;
hadc4.Init.LowPowerAutoWait = DISABLE;
hadc4.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN;
感谢您的想法。