Цитата(demiurg_spb @ Jul 9 2014, 14:13)

Всё с точностью до наоборот. Я давно и успешно использую DMA для STM32.
На приём с помощью DMA никаких проблем нет.
Проблема не с DMA, проблема с их количеством. ТС написал про "кучу UART-ов", а кол-во DMA-каналов у нас сильно ограниченно.
И если для передачи ещё можно как-то попытаться расшарить один DMA-канал на неск. UART-ов, то вот для приёма ой....
А ведь в девайсе возможно DMA и для других нужд могут быть нужны.
Цитата(demiurg_spb @ Jul 9 2014, 14:13)

Как передать участок кольцевого буфера перехлёстывающегося через его конец?
ПС: При использовании динамической памяти задача для передачи блоков данных по UART через DMA решается самым элегантным образом, но это не мой метод...
С передачей как раз всё просто.
При перехлёсте очевидно же - передавать в два приёма: до конца и с начала.
В обработчике завершения DMA проверять "имеются-ли ещё символы в TX-буфере?" и стартовать новый блок если да.
Если нет - стоп, сброс флага активности TX.DMA (с опциональным освобождением DMA-канала в пул).
Стартовать сам процесс передачи можно либо в каком-то периодическом процессе (периодически проверяя есть-ли байты в TX-FIFO),
либо в функции, пишущей в TX-FIFO при достижении некоей water mark.
Либо и так и так.
Но это при условии, что флаг активности TX.DMA сброшен.
Недавно когда я переносил некоторый шаблонный проект с LPC на STM32 (там имелся символьный вывод потока в UART), в LPC DMA для этого не использовался (так как там хватало FIFO).
На STM32 пришлось сделать через DMA именно так как и описал.
Заняло это около дня.