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を使用しています。ツールの問題でしょうか?またはハンドラーにぶら下がっているためですか?