Новые задачи для 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 я вижу обратное. В чём может быть причина?