vagrantnotes
@vagrantnotes
Embedded-разработчик

Как правильно настроить прерывания DMA на STM32F4?

Новые задачи для STM32F4, а у меня, соответственно, новые вопросы. На этот раз - к библиотеке HAL и логике работы DMA-прерываний. Пытаюсь организовать кольцевой буфер DMA, в который АЦП скидывает информацию по прерываниям от таймера. С этой частью проблем нет, она работает отлично.

Но теперь я пытаюсь по прерываниям DMA поднимать флаги обработки буфера информации с АЦП. Первый поднимается по заполнению половины буфера, второй - по заполнению всего буфера. Казалось бы, код элементарный:
/* Функция обработки прерывания от DMA2 */
void DMA2_Stream0_IRQHandler(void) {
	HAL_DMA_StateTypeDef DMA_State;

	// Заполняем структуру состояния DMA и сбрасываем флаги
	HAL_DMA_IRQHandler(&hDma_MicAdc);

	// Как только заполнена первая половина буфера, поднимаем флаг обработки
	DMA_State = HAL_DMA_GetState(&hDma_MicAdc);
	if (DMA_State == HAL_DMA_STATE_READY_HALF_MEM0) {
		MicData_handle_flag = FIRST_HALF;
	} else if (DMA_State == HAL_DMA_STATE_READY_MEM0) {
		MicData_handle_flag = SECOND_HALF;
	}else {
		MicData_handle_flag = NONE;
	}
}


Проблема в том, что программа, однажды зайдя в прерывание (по заполнению половины DMA-буфера), зацикливается и вновь и вновь заходит в него. Будто флаги прерываний не сбрасываются, хотя в коде библиотечной функции HAL_DMA_IRQHandler я вижу обратное. В чём может быть причина?
  • Вопрос задан
  • 3775 просмотров
Решения вопроса 1
Ocelot
@Ocelot
Half Transfer Interrupt дёргается не один раз по заполнении половины, а каждый раз, когда DMA пишет в буфер, полный более чем наполовину. Вот описано, как с этим жить: we.easyelectronics.ru/STM32/osobennosti-ispolzovan...
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы