Я работаю с платой STM32F4Discovery, генерирую код из Cube, SYSCLK - 168 МГц, APB1 Timer Clock 42 МГц, TIM6 имеет предварительный делитель 1000 и считается до 62. Я делаю следующий эксперимент.STM32F4 прерывание TIM6 не происходит во время работы DMA
Включить прерывание TIM6 по
__HAL_TIM_ENABLE_IT(&htim6, TIM_IT_UPDATE);
HAL_NVIC_EnableIRQ(TIM6_DAC_IRQn);
Start 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 вызывается один раз (из-за некруглым режим) , Это правда.
2) Когда это называется tim6Counter должен быть равен 30, а длина буфера данных ЦАП 30. В эксперименте tim6Counter является 1.
3) После того, как ЦАП завершена, установить точки останова в обработчик TIM6 и основной (1). Проблема в том, что он зависает в обработчике TIM6.
Вопросы:
1) DMA работает, даже если TIM6 прерывания не разрешены. Но если включено, почему это происходит только один раз, вместо каждого запроса DMA?
2) Почему он висит в обработчике таймера?
3) Регистр TIM6 SR не очищается ни макросами HAL, ни HAL_TIM_IRQHandler. Я использую eclipse с openOCD. Это проблема инструментов? Или из-за повешения в обработчике?