2017-06-14 421 views
2

我正在使用stm32f3發現板和來自CubeMX的HAL。我想在ADC4上使用2個ADC通道。我以循環模式配置DMA。 Befor在主主循環,我稱之爲:使stm32 ADC DMA工作缺少什麼? Transfer Compete不會發生

HAL_ADC_Start_DMA(&hadc4, DMA_adc4_buffer, 16); 

我實現的功能HAL_ADC_ConvHalfCpltCallbackHAL_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; 

感謝您的想法。

+0

沒有通道配置和沒有DMA配置,所以你認爲它會工作。 –

回答

1

問題是ADC的時鐘頻率爲48 MHz,核心時鐘只有12 MHz。 FRST的中斷標誌功能HAL_DMA_IRQHandler檢查半段轉移完成,然後在樣式

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

由於半段轉移中斷標誌由ADC/DMA始終設置這麼快,該處理器是如此慢傳輸完成,核心永遠不會到達ìf分支,因此永遠不會調用ConvCpltCallback()。