2016-12-21 46 views
0

私はSTM32F4Discoveryボード、Cubeからコードを生成、SYSCLKは168MHz、APB1タイマクロックは42MHz、TIM6はプリスケーラ1000、カウントは62までです。以下の実験を行います。DMA動作中にSTM32F4 TIM6割り込みが発生しない

は30-elements配列と通常モードで

__HAL_TIM_ENABLE_IT(&htim6, TIM_IT_UPDATE); 
HAL_NVIC_EnableIRQ(TIM6_DAC_IRQn); 

スタートDAC_DMAによってTIM6の中断を有効にします。

void HAL_DAC_ConvCpltCallbackCh1(DAC_HandleTypeDef *hdac) { 
    conversionCounter++; 
} 

は、私が何を期待:

1)HAL_DAC_ConvCpltCallbackCh1が(原因)非円形モードに一度と呼ばれ、多くのタイマーの中断がこの機能に

void TIM6_DAC_IRQHandler(void) { 

HAL_TIM_IRQHandler(&htim6); 
tim6Counter++; 
} 

セットブレークポイントが起こるのか

カウント。それは本当です。それはtim6Counter呼ばれる

2)に実験tim6Counterで30である1

3)DACが完了した後は、TIM6ハンドラにブレークポイントを設定し、DACデータバッファの長さとして、30等しくなければなりませんメインwhile(1)ループ。問題は、TIM6ハンドラにハングすることです。

質問:

1)DMA TIM6の中断が有効になっていない場合でも動作します。しかし、有効化されている場合、すべてのDMA要求ではなく、なぜ1回だけ発生するのですか?

2)なぜタイマーハンドラでハングするのですか?

3)TIM6 SRレジスタは、HALマクロまたはHAL_TIM_IRQHandlerのいずれによってもクリアされません。私はopenOCDでEclipseを使用しています。それはツールの問題ですか?またはハンドラにぶら下がっているために?

答えて

1

問題は、デバッグの一時停止中にタイマーがカウントされることです。

__HAL_DBGMCU_FREEZE_TIM6(); 

によって、タイマをデバッグモードに切り替えると、正常に動作します。読んでいる間、リファレンスマニュアルのセクション20.3.4が私に見逃されました。

関連する問題