oWart
@oWart
Инженер-конструктор

Почему в половинном прерывании DMA на HAL STM32 кольцевой буфер со значениями АЦП заполнен уже полностью?

Всем привет.
Потихоньку осваиваю STM32F103 и столкнулся с такой бедой. Через Stm32CubeMX настраиваю АЦП на работу в циклическом режиме через DMA по триггеру таймера. Вроде все работает. Но DMA, как известно, генерирует прерывания при заполнении буфера наполовину (регистр настройки проверил, оно включено) и при заполнении целиком. Судя по временным интервалам, так и есть. Далее выдержки из кода, пытаюсь организовать кольцевой буфер:
#define FRAME_SIZE 10
__IO int16_t IN_Buffer[2][FRAME_SIZE];
HAL_ADC_Start_DMA(&hadc1,(uint32_t*)&IN_Buffer[0],FRAME_SIZE*2);

Далее в прерывании ставлю точку останова:
void DMA1_Channel1_IRQHandler(void)
{
  HAL_DMA_IRQHandler(&hdma_adc1);
}

И, по логике, на каждом прерывании IN_Buffer[0] и IN_Buffer[1] должны заполняться по очереди. Для однозначной идентификации во время останова закорачиваю пин АЦП на землю или питание. Но DMA почему-то обновляет весь массив целиком, а не по очереди.

UPD: Более того, в прерывании по таймеру, по триггеру которого работает АЦП, тоже меняется весь буфер целиком, а не по одному элементу, как я этого ожидаю:
void TIM3_IRQHandler(void)
{
  HAL_NVIC_ClearPendingIRQ(TIM3_IRQn);
  HAL_TIM_IRQHandler(&htim3);
}

Или DMA таким образом отлаживать нельзя? Ничего не понимаю, что я делаю не так?
Спасибо.
  • Вопрос задан
  • 2836 просмотров
Решения вопроса 1
AlanDrakes
@AlanDrakes
1. Попробуйте уменьшить скорость выборки данных.
2. Попробуйте увеличить количество выборок в буфере, так как можете просто не успеть среагировать на прерывание при малом размере буфера. Точнее, обработчик запустится, но может уже настать момент прерывания по заполнению буфера.
3. Прерывание дейсвтительно будет генерироваться, когда буфер заполнен на половину.
Попробуйте ещё быстрый вывод в консоль - тогда будет точно понятно, что где произошло.

upd:
Кстати, а точно срабатывают прерывания по половине передачи и полной? Есть подозрение..
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы