2

STM32F4Discovery ボードで作業し、Cube からコードを生成します。SYSCLK は 168MHz、APB1 タイマー クロックは 42MHz、TIM6 にはプリスケーラ 1000 があり、62 までカウントします。次の実験を行います。

TIM6 割り込みを有効にする

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

DAC_DMA を 30 要素配列の通常モードで開始します。

タイマー割り込みが発生した回数を数える

void TIM6_DAC_IRQHandler(void) {

HAL_TIM_IRQHandler(&htim6);
tim6Counter++;
}

この関数にブレークポイントを設定します。

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

私が期待するもの:

1) HAL_DAC_ConvCpltCallbackCh1 が 1 回呼び出されます (非循環モードのため)。それは本当です。

2) DAC データ バッファの長さが 30 であるため、tim6Counter は 30 に等しくなければなりません。実験では、tim6Counter は 1 です。

3) DAC が完了したら、ブレークポイントを TIM6 ハンドラに設定し、main while(1) ループに設定します。問題は、TIM6 ハンドラーでハングすることです。

質問:

1) TIM6 割り込みが有効になっていない場合でも、DMA は機能します。しかし、有効にした場合、すべての DMA 要求ではなく、1 回だけ発生するのはなぜですか?

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

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

4

1 に答える 1