Всем привет.
Потихоньку осваиваю 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 таким образом отлаживать нельзя? Ничего не понимаю, что я делаю не так?
Спасибо.