У меня критичные действия выполняются по регулярному таймеру и UARTы обслуживаются в пулинговом режиме. Приём через кольцевой DMA - что пришло, то вычитываю, и передача через разовый DMA, что успел в буфер набить то выплёвываю и переключаюсь на другой буфер.
доп действий на отправку минимум - забил адрес + счётчик + скинул флаги и пнул DMA.
3 канала 2.5mbs, таймер 20-25kHz