2017-06-14 72 views
2

私はstm32f3ディスカバリーボードとCubeMXのHALを使用しています。私はADC4で2つのADCチャンネルを使用しようとしています。循環モードでDMAを構成しました。メインのメインループBefor、私が呼ん:stm32 ADC DMAを動作させるには何が欠けていますか?転送競合は発生しません

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のクロックが48MHzで、コアクロックが12MHzであることでした。完全半分転送する割り込みフラグのFRSTチェックHAL_DMA_IRQHandler機能は、スタイル

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

に転送完了のためにハーフ転送割り込みフラグは常にADC/DMAによって非常に速く設定され、プロセッサはとても遅いされているので、コアは秒のìfブランチには決して来ないので、ConvCpltCallback()を呼び出すことはありません。

関連する問題