Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix small endpoint size for USART1 #68

Open
ALTracer opened this issue Jun 15, 2024 · 0 comments
Open

Fix small endpoint size for USART1 #68

ALTracer opened this issue Jun 15, 2024 · 0 comments

Comments

@ALTracer
Copy link

Здравствуйте. Спасибо за прошивку с кастомным 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 бод.
У меня вопрос, почему для первого самого быстрого порта в проекте изначально заложен маленький буфер пакетной памяти?

#define USB_CDC_DATA_ENDPOINT_SIZE_SMALL 32
#define USB_CDC_DATA_ENDPOINT_SIZE_LARGE 64
#define USB_CDC_DATA_0_ENDPOINT_SIZE USB_CDC_DATA_ENDPOINT_SIZE_SMALL
#define USB_CDC_DATA_1_ENDPOINT_SIZE USB_CDC_DATA_ENDPOINT_SIZE_LARGE
#define USB_CDC_DATA_2_ENDPOINT_SIZE USB_CDC_DATA_ENDPOINT_SIZE_LARGE

Когда я гоняю 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, и этот проект отлично подходит.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant