stm32 ADC DMA工作缺少什么?转让竞争不会发生

stm32 ADC DMA工作缺少什么?转让竞争不会发生,stm32,dma,adc,Stm32,Dma,Adc,我使用的是stm32f3发现板和CubeMX的HAL。我尝试在ADC4使用2个ADC通道。我将DMA配置为循环模式。在main中的main循环之前,我调用: HAL_ADC_Start_DMA(&hadc4, DMA_adc4_buffer, 16); 我实现了函数HAL\u ADC\u ConvHalfCpltCallback和HAL\u ADC\u ConvCpltCallback。现在奇怪的部分:HAL\u ADC\u ConvCpltCallback是定期调用的,而HAL\u

我使用的是stm32f3发现板和CubeMX的HAL。我尝试在ADC4使用2个ADC通道。我将DMA配置为循环模式。在main中的main循环之前,我调用:

HAL_ADC_Start_DMA(&hadc4, DMA_adc4_buffer, 16);
我实现了函数
HAL\u ADC\u ConvHalfCpltCallback
HAL\u ADC\u ConvCpltCallback
。现在奇怪的部分:
HAL\u ADC\u ConvCpltCallback
是定期调用的,而
HAL\u ADC\u ConvCpltCallback
不是

它告诉我,具有DMA传输的ADC运行良好。但为什么不调用调用调用? 如果我用
HAL\u ADC\u start\u启动ADC,就会调用中断函数,但这不是我想要的

在ST HAL中的
HAL\u DMA\u 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;

谢谢你的建议。

问题是ADC的时钟是48 MHz,核心时钟只有12 MHz。函数HAL_DMA_IRQHandler首先检查中断标志是否为半传输完成,然后检查样式中的传输完成

if (half transfer complete){
  HAL_ADC_ConvHalfCpltCallback();
} **ELSE** if (transfer complete){
  HAL_ADC_ConvCpltCallback();
}

由于ADC/DMA总是将半传输中断标志设置得如此之快,而处理器的速度如此之慢,因此内核永远不会到达秒
ìf
分支,因此永远不会调用ConvCpltCallback()。

无通道配置和无DMA配置,那么你认为它将如何工作呢?我刚刚做了一些类似于DMA的事情,但与CRC有关。为中断设置回拨时,必须选择要回拨的事件。对我来说,我想完成,所以在回拨请求中我使用了HAL_DMA_XFER_CPLT_CB_ID。最初我只是在那里放了一个,然后在DMA的中途被回拨!