В режиме отладки при включенных бряках на DMA1_Channel1_IRQHandler (АЦП) и DMA1_Channel1_IRQHandler (UART) этот результат достигается. Но при роботе в реальном времени (ну или без брейкпоинтов) происходит следующее:
- из main запускается HAL_ADC_Start_DMA(&hadc1, (uint32_t *) &adc_buffer, sizeof(adc_buffer));
- при завершении преобразования уходит в прерывание DMA1_Channel1_IRQHandler;
- копирует данные из adc_buffer в uart_buffer[]; запускает посылку по UART: HAL_UART_Transmit_DMA(&huart2, uart_buffer, sizeof(uart_buffer));
- и останавливает АЦП: HAL_ADC_Stop_DMA(&hadc1);
- после этого он должен попасть в обработчик завершения передачи DMA1_Channel7_IRQHandler, но этого не происходит (но происходит только при пошаговой отладке)
В общем не могу понять что мешает ему работать как задумано.
Ниже куски кода, которые наверняка захотят увидеть:
Код
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_DMA_Init();
MX_ADC1_Init();
MX_USART2_UART_Init();
HAL_ADC_Start_DMA(&hadc1, (uint32_t *) &adc_buffer, sizeof(adc_buffer));
while (1) { }
}
void DMA1_Channel1_IRQHandler(void)
{
HAL_DMA_IRQHandler(&hdma_adc1);
uart_buffer[0]=adc_buffer>>8;
uart_buffer[1]=adc_buffer;
HAL_UART_Transmit_DMA(&huart2, uart_buffer, sizeof(uart_buffer));
HAL_ADC_Stop_DMA(&hadc1);
}
void DMA1_Channel7_IRQHandler(void)
{
HAL_DMA_IRQHandler(&hdma_usart2_tx);
HAL_ADC_Start_DMA(&hadc1, (uint32_t *) &adc_buffer, sizeof(adc_buffer)); //заходит сюда только в пошаговом режиме
}
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_DMA_Init();
MX_ADC1_Init();
MX_USART2_UART_Init();
HAL_ADC_Start_DMA(&hadc1, (uint32_t *) &adc_buffer, sizeof(adc_buffer));
while (1) { }
}
void DMA1_Channel1_IRQHandler(void)
{
HAL_DMA_IRQHandler(&hdma_adc1);
uart_buffer[0]=adc_buffer>>8;
uart_buffer[1]=adc_buffer;
HAL_UART_Transmit_DMA(&huart2, uart_buffer, sizeof(uart_buffer));
HAL_ADC_Stop_DMA(&hadc1);
}
void DMA1_Channel7_IRQHandler(void)
{
HAL_DMA_IRQHandler(&hdma_usart2_tx);
HAL_ADC_Start_DMA(&hadc1, (uint32_t *) &adc_buffer, sizeof(adc_buffer)); //заходит сюда только в пошаговом режиме
}