Сижу, пишу код для "мультиинтерфейсной платы". В качестве МК сдуру взял STM32F303RBT6, а не какой-нибудь RET6. И поплатился: ведь в "младшеньких" F303 дебильная организация доступа к USB btable: 32-битное слово — как одно 16-битное! Т.е. половина памяти впустую.
В даташитах рисуют, что интересно: 512Б (реальных) на буферы в "младших" и 1024 в "старших". При этом есть пометка только к старшим, что верхние 256 байт под CAN уходят.
И таки что бы вы думали? В "младших" тоже под CAN идет 256 байт (ну, хоть не удвоенных)! И остается всего-то 768Б. Делим пополам — 384 реальных байта. Из них вынь, да положь 64 байта на регистры. И сколько-то на EP0.
Ну, отдаем 32Б на EP0 и радостно смотрим: по 40Б на каждую из оставшихся семи точек (по 20 на Rx/Tx). А хренушки! В USB нельзя буферы делать не кратными 8 байтам!
Вот и получается, что и так ОЗУ кот накакал, а еще и округляем. Итого — по несчастных 16Б на конечную точку. Тут особо не разгонишься. Авось, хотя бы по 115200 бод будет при одновременной работе всех семи интерфейсов, а то и того медленней!