2016-12-21 13 views
0

Я работаю с платой 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. Это проблема инструментов? Или из-за повешения в обработчике?

ответ

1

Проблема в том, что таймер по-прежнему учитывается во время паузы отладки. После включения таймера в режим отладки на

__HAL_DBGMCU_FREEZE_TIM6(); 

он работает правильно. Раздел 20.3.4 справочного руководства был пропущен мной во время чтения.

 Смежные вопросы

  • Нет связанных вопросов^_^