Вариант
USART и DMA инициализированы и запущены заранее,
первичный запуск на передачу допустим 4 байт:
FIFO_Out.Read( UART_TX_Data, 4); // вычитываем из fifo
USART1_DMA_Restart( 4); // запускам эту передачу
далее в теле функции, которая принимает решение на отправку данных:
if( DMA_GetFlagStatus(DMA2_Stream7, DMA_FLAG_TCIF7) == SET) // заполняем буфер и запускаем DMA, если ДМА свободен, если UART свободен
{
if(USART_GetFlagStatus(USART1, USART_FLAG_TC) == SET)
{
N = FIFO_Out.GetOutQueue();
if( N ) // отправка имеет смысл только если что-то есть в буфере
{
if( N>16 ) N = 16; // ограничение на длину UART_TX_Data (допустим 16 байт)
FIFO_Out.Read( UART_TX_Data, N);
USART1_DMA_Restart( N);
}
}
}
void USART1_DMA_Restart(unsigned char Nom)
{
DMA_Cmd(DMA2_Stream7, DISABLE);
DMA_ClearFlag(DMA2_Stream7, DMA_FLAG_TCIF7);
DMA2_Stream7->NDTR = Nom; // NDTR - для STM32F205, для других смотрите регистры и их хедер
DMA_Cmd(DMA2_Stream7, ENABLE);
}