Skip to content
New issue

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

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

Already on GitHub? # 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, и этот проект отлично подходит.

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

No branches or pull requests

1 participant