Уже чуть ли не волосы на жопе рвал: 4 интерфейса работают, а пятый в blocking_handler уходит. Кинул дипсику, мол, где ошибка. Он и говорит, мол, в ДНК! Я rx и tx каналы DMA для этого интерфейса перепутал, соответственно, ловил несуществующее прерывание TC на rx, а вот на tx — нет. Понятно, что оно и уходило "в себя". И скорость поднять он мне посоветовал как: сделать циркулярный буфер (и объем побольше) на прием. Тогда не нужно во время обработки блокировать прием, соответственно, данные продолжают капать, пока ты часть из них передаешь.
Заодно закинул свой код для кольцевого буфера. Все ОК, говорит, кроме нескольких косяков. Прямо-таки грубых косяков не нашел, но по мелочи кое-что я подправил (где есть потенциальные проблемы). Правда, мы так с ним и не добились консенсуса насчет моего блокирующего флага (который, естественно, не атомарный): дипсик твердит, что херня, и могут быть гонки, а я утверждаю, что гонок быть не может. Потому как после выхода из прерывания, если в нем была работа с буфером, флаг занятости будет опущен. Соответственно, если в суперлупе мы прочитаем, что буфер свободен, а потом выстрелит прерывание, то ничего страшного не будет, когда мы по возврату из прерывания тоже выставим этот флаг.
Остается вроде за малым — CAN и SSI добавить, но, чует мое сердце, на какой-нибудь опять косяк нарвусь. Да и я сдуру развел плату так, что SSI повесил на SPI1, а не SPI3 (у которого как раз свободен DMA rx). В итоге нужно будет DMA с USART'ом делить. И придется в настройки добавить пунктик: кому по DMA, а кому — по прерываниям. В принципе, у SSI посылочки короткие, если не опрашивать энкодеры с килогерцовой частотой (как я на малых телескопах делаю), то по идее и на прерываниях пойдет.
P.S. Тестировал RS-485 на преобразователе на основе CH340, а он быстрей 2Мбод не умеет, надо будет с PL2303 попробовать.
P.P.S. Несмотря на то, что во время тестов 485 у меня 232 вообще не работал, стоящая там MAX3232 прилично раскалилась. Видимо, "паль" какая-то попалась.