Найдено решение:
В обработчике прерывания DMA(UART) было добавлено:
проверку условия срабатывания прерывания: if( HAL_DMA_GetState(&hdma_usart2_tx)==HAL_DMA_STATE_READY) {...}
принудительную остановку передачи в DMA по UART - HAL_UART_DMAStop(&huart2);
запуск АЦП - HAL_ADC_Start_DMA(&hadc1, (uint32_t *) &adc_buffer, sizeof(adc_buffer));
Следует отметить что без принудительной остановки HAL_UART_DMAStop(&huart2) - отказывается работать.
Также следует отметить что условий срабатывания прерывания DMA(UART) уйма, точнее сказать на любое состояние DMA:
typedef enum
{
HAL_DMA_STATE_RESET = 0x00, /*!< DMA not yet initialized or disabled */
HAL_DMA_STATE_READY = 0x01, /*!< DMA initialized and ready for use */
HAL_DMA_STATE_READY_HALF = 0x11, /*!< DMA Half process success */
HAL_DMA_STATE_BUSY = 0x02, /*!< DMA process is ongoing */
HAL_DMA_STATE_TIMEOUT = 0x03, /*!< DMA timeout state */
HAL_DMA_STATE_ERROR = 0x04, /*!< DMA error state */
}HAL_DMA_StateTypeDef;
Поэтому в прерывании DMA(UART) следует выполнять проверку на причину возникновения прерывания.
Листинг основных кусков кода ниже:
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);
if( HAL_DMA_GetState(&hdma_usart2_tx)==HAL_DMA_STATE_READY){
HAL_UART_DMAStop(&huart2);
HAL_ADC_Start_DMA(&hadc1, (uint32_t *) &adc_buffer, sizeof(adc_buffer));
}
}
Думаю такое решение будет кому-то полезным :tongue: