r2axz / bluepill-serial-monster

USB to 3 Port Serial (UART) adapter firmware for STM32 Blue Pill.
MIT License
323 stars 76 forks source link

Fix small endpoint size for USART1 #68

Open ALTracer opened 2 months ago

ALTracer commented 2 months ago

Здравствуйте. Спасибо за прошивку с кастомным USB стеком. Докачал частично STM32CubeF1 для CMSIS/Core/Include и Device/ST и собрал бинарник в 20 КиБ, который шьётся и работает на bluepill с загрузчиком BMPBootloader (смещение 0x08002000). Максимальная скорость передачи данных обусловлена ограничениями APB1 36MHz, на которой висят USART2, USART3, и 36M/16=2250000 бод. Однако есть же ещё и APB2 72MHz с USART1 (и SPI1), так что 72M/16=4500000 бод. У меня вопрос, почему для первого самого быстрого порта в проекте изначально заложен маленький буфер пакетной памяти? https://github.com/r2axz/bluepill-serial-monster/blob/7ca8ddbdf43d4e1b849ba11d797daba839ecbd61/usb_descriptors.c#L14-L19

Когда я гоняю loopback тесты через cbrake/linux-serial-test, да или даже rx-only, tx-only, то по осциллографу на USB FS D+/D- (и USART Tx/Rx) видно, что прошивка справляется без пропусков. При этом, как только открываю второй порт на прослушивание тишины (да и третий тоже), хост начинает опрашивать несколько эндпоинтов, и по Nak вставляет паузу в 20 микросекунд. Это снижает скорость передачи данных с 450000 Байт/с чуть ли не в два раза. 12MHz/8*0.000020s=30 байт (без учёта служебных бит формата пакетов Bulk).

Окей, поменял размеры местами, с 32-64-64 на 64-64-32, пересобрал и залил через dfu-util, стало работать без заиканий даже с занятым USART1 и прослушиваемыми USART2,3. Также потом проверил external loopback с перемычкой между контактами USART2_RX <=>USART3_TX, гоняет данные на 2250000 нормально. Все три порта на максимальной частоте одновременно, конечно, не работают.

Прошу пересмотреть выделенные размеры wMaxPacketSize и bEndpointSize. Я заметил по прошлым Issue, что USB FSDEV PMA пакетная память практически вся уже занята, но я не предлагаю 64-64-64. Также я не предлагаю делать несимметричные буферы, как это сделано в других проектах, то есть USART Rx (DMA) 64 для непрерывного приёма, но USART Tx 32 или даже 16 (без DMA?) для медленного интерактивного ввода с клавиатуры -- пускай пока работает как есть.

Вопрос вдогонку, а что если прошить это на GD32F103CB, которая может работать на 108 96 MHz с делителем USB48 DIV2, предварительно подкрутив настройки PLL? Будет ли max baudrate APB2 96M/16=6000000 baud? Мой случай применения примерно такой, что мне нужны нескольно медленных UART портов (два) в одном флаконе, но ещё я веду захват трассировки TraceSWO NRZ-encoded, и этот проект отлично подходит.