-
17.11.2020, 11:23 #1
- Регистрация
- 16.11.2020
- Сообщений
- 14
- Поблагодарили
- 19
- Поблагодарил
- 4
Адаптер USB-Serial с 3 UART портами на STM32 Blue Pill
Доброго времени суток,
хотел поделиться своим проектом 3-x портового USB-Serial адаптера для STM32 Blue Pill (STM32F103C8T6).
Зачем все это, есть же куча USB-Serial преобразователей на любой вкус? Во-первых, это дешево. Плата Blue Pill стоит на али порядка 120 руб. Во-вторых, много портов в одном USB устройстве. Не занимаются лишние USB порты, нет нужды использовать USB-хабы. В-третьих, реализованы управляющие сигналы, не каждый USB-Serial преобразователь это умеет. В-четвертых, это гибко уже сейчас минимальным изменением исходного кода можно переключить тип выхода, полярность сигнала и т. п., а в будущем все это будет еще проще (см. ниже). В-пятых, это предсказуемо, повторяемо и документировано. Лично я не раз натыкался на не определяющиеся и некорректно работающие преобразователи c али.
Самое главное, мне просто самому в какой-то момент понадобилось подобное устройство, я написал прошивку и теперь хочу ей поделиться. Вдруг кому-то тоже будет полезно.
Что реализовано:
- 3 независимых UART;
- поддержка аппаратного флоу контрола (RTS/CTS);
- поддержка DTR/DSR/DCD;
- 7 и 8 бит данных;
- поддержка контроля четности (none, even, odd);
- 1, 1.5, 2 стоповых бита;
- поддержка всех стандартных скоростей;
- поддержка нестандартных скоростей (тестировал до 921600);
- DMA на передачу и прием;
- не требует драйверов, используются CDC Class драйвера встроенные в ОС;
- составное USB устройство, определяется как три COM (tty) порта;
Тестировалось на Win 10, Linux, Mac OS.
Выходные уровни совместимы с TTL 3.3 и 5 вольт. Все входы кроме UART2 RX и CTS толерантны к 5 вольтам.
Маленькая ложка дегтя: по неизвестной причине, на некоторых экземплярах платы Blue Pill установлен некорректный подтягивающий резистор на USB D+. Это приводит к тому, что некоторые компьютеры эту плату не видят. А некоторые другие видят. Лечится заменой подтягивающего резистора на резистор номиналом 1.5 кОм. После этого все прекрасно работает на всех компьютерах.
Проект с открытым исходным кодом, MIT лицензия. Нет зависимостей от HAL или любых других сторонних библиотек кроме CMSIS.
Исходный код и собранная прошивка доступны тут: https://github.com/r2axz/bluepill-serial-monster
Что дальше? В планах добавить возможность конфигурирования типов выходных сигналов (пушпул, открытый сток), типов подтяжки сигнальных линий (floating, up, down) и выбора полярности (active-high / active-low) без пересборки ПО и перепрошивки микроконтроллера. Это позволит более свободно применять устройство с различными схемами развязок, согласования уровней, управления реле, и т.п. Самый простой пример - CI/V интерфейс ICOM. Можно поставить тип выхода TX в открытый сток, соединить TX c RX и напрямую подключиться к CI/V интерфейсу. Все будет работать отлично.
-
17.11.2020, 11:36 #2
- Регистрация
- 08.09.2006
- Адрес
- 52 Регион
- Возраст
- 55
- Сообщений
- 443
- Поблагодарили
- 154
- Поблагодарил
- 999
там есть драйвера которые поддерживают в винде 3 порта? какой VID-PID используется?
Ничто так не портит цель, как прямое попадание
-
17.11.2020, 11:57 #3
- Регистрация
- 16.11.2020
- Сообщений
- 14
- Поблагодарили
- 19
- Поблагодарил
- 4
В Windows 10 все определяется автоматически и не требует установки драйверов, видно три порта. В Windows 7 я именно это устройство не тестировал, но насколько мне известно может потребоваться inf-файл который свяжет VID/PID со стандартным драйвером usbser.sys.
Мне это было не надо, поэтому я этот inf-файл не делал. Если будет запрос в виде Issue на GitHub, то сделаю и добавлю в дистрибутив. Вроде бы это тривиальная задача.
Теперь по VID/PID:
VID: 0x1209
PID: 0xFFFE
Почему именно этот? Есть такой ресурс https://pid.codes Они абсолютно бесплатно дают VID/PID проектам с открытым исходным кодом. Мне не хотелось использовать чужой / тестовый VID/PID и поэтому я остановился на этом.
-
17.11.2020, 12:22 #4
- Регистрация
- 04.12.2009
- Адрес
- Kursk
- Сообщений
- 5,581
- Поблагодарили
- 3653
- Поблагодарил
- 3183
Скорости переключаются ? Для каждого из трех serial порта отдельно ?
Иван
-
17.11.2020, 12:26 #5
- Регистрация
- 08.09.2006
- Адрес
- 52 Регион
- Возраст
- 55
- Сообщений
- 443
- Поблагодарили
- 154
- Поблагодарил
- 999
Cпасибо большое! Вы бы не могли добавить линк где покупать blue-Pill? Думается, что для тех кто не сильно знаком со слова Blue Pill будет полезно
Ничто так не портит цель, как прямое попадание
-
17.11.2020, 13:35 #6
- Регистрация
- 16.11.2020
- Сообщений
- 14
- Поблагодарили
- 19
- Поблагодарил
- 4
Именно так, порты полностью независимы. Можете смело ставить любую скорость на любом порту.
- - - Добавлено - - -
Да, конечно. STM32 Blue Pill - это известная и крайне распространенная отладочная плата на микроконтроллере STM32F103C8T6. Китайские производители научились клонировать и сам STM32F103C8T6, и эту отладочную плату, поэтому она стоит крайне недорого. Продается она очень много где, я для примера приведу пару ссылок, но вообще найти вариант где купить в поисковике - дело двух минут.
Я никаким образом не аффилирован с магазинами по ссылкам ниже:
Купить на AliExpress: https://bit.ly/3lIKxDa
Купить в MCU Store: https://mcustore.ru/store/arm/modul-...stm32f103c8t6/
Существует версия платы с разъёмом USB-C. По идее все должно работать и на ней, но лично я не пробовал, поэтому утверждать не могу.
Кроме того, плату надо прошить. Сделать это можно двумя способами. Первый способ - купить отладчик ST Link (https://bit.ly/2KcAJU1) и прошить с помощью st-flash. Второй способ - прошить с помощью любого другого преобразователя USB-Serial c TTL 3.3 / 5 уровнями. Оба способа кратко описаны в README проекта. Вообще информации по этой плате в интернете море, очень легко можно найти инструкции на русском на любой вкус.
- - - Добавлено - - -
Забыл сказать. Если вдруг кому-то хочется что-нибудь поменять под себя в прошивке вот прям сейчас, есть понимание того как это сделать, но нет под рукой компьютера с установленным ПО для того чтобы собрать бинарник, не отчаивайтесь Достаточно просто сделать форк репозитория в GitHub (для этого, понятно, нужно создать там аккаунт), разрешить в этом форке выполнение GitHub actions (там будет плашка с предупреждением о том, что actions отключены), внести свои изменения (можно прямо в самом GitHub) и после этого все автоматически соберется и новый бинарник будет доступен в разделе Releases.
-
18.11.2020, 12:36 #7
- Регистрация
- 04.02.2016
- Адрес
- Обнинск
- Возраст
- 59
- Сообщений
- 278
- Поблагодарили
- 184
- Поблагодарил
- 205
Отличная работа. Похоже вы не использовали STM32Cube и вся конфигурация была сделана вручную. Какую среду вы использовали, возможно ли вставить проект в Keil без переделок?
73 es DX! Андрей Черный, R3XAW
"В действительности всё не так, как на самом деле." Антуан де Сент-Экзюпери
-
18.11.2020, 13:43 #8
- Регистрация
- 16.11.2020
- Сообщений
- 14
- Поблагодарили
- 19
- Поблагодарил
- 4
Спасибо за отзыв!
Да, действительно, я не использовал STM32Cube и библиотеки HAL и LL, и вся конфигурация сделана вручную. От куба я использовал только CMSIS - это фактически набор определений для регистров периферии. Лично мне так удобнее и я ощущаю больше контроля над происходящим. Кроме того, мне просто стилистически не нравится HAL (но это чистой воды вкусовщина). А периферия у STM32 очень простая и логичная, и работать с ней одно удовольствие и без использования HAL.
Весь проект написан в VSCode. Тут причина в том, что я пишу далеко не только под STM, и мне прям совсем не хочется лишний раз менять привычное окружение. Большая часть моих проектов на С/С++ собираются либо c помощью make, либо с помощью cmake. В VSCode были установлены следующие плагины: ARM, C/C++, Clang-Format, Cortex-Debug, markdownlint. Все это дало мне возможность вполне комфортно разрабатывать код, работало автодополнение, подсветка ошибок, отладка с пошаговым выполнением, интеграция с Git. Почти как настоящая IDE. Сборка проекта сделана с помощью make. В качестве компилятора используется arm-none-eabi-gcc, в качестве статического анализатора - cppcheck. Последний вполне себе небесполезен.
Я почти ничего не знаю про Keil, но если он умеет импортировать makefile-based проекты, то после настройки требуемых переменных окружения все должно заработать. Насколько я нагуглил внутри Keil тоже используется gcc, поэтому он должен проглотить вот эти вот __attribute__ ((packed)) и прочую gcc-шную специфику. Не могу сказать потребуются ли какие-либо переделки. Надо пробовать. А может быть, лучшим вариантом было бы просто затащить исходники в пустой проект Keil, однажды все настроить и пользоваться. В конце-концов ничего сложного в проекте нет. Флаги компиляции можно подсмотреть в Makefile. Пробуйте.
-
18.11.2020, 14:00 #9
- Регистрация
- 04.02.2016
- Адрес
- Обнинск
- Возраст
- 59
- Сообщений
- 278
- Поблагодарили
- 184
- Поблагодарил
- 205
VSCode хороший выбор если нужно писать для Linux или Android. В Keil удобная отладка и сама среда. Ближе к выходным будет время попробую.
73 es DX! Андрей Черный, R3XAW
"В действительности всё не так, как на самом деле." Антуан де Сент-Экзюпери
-
18.11.2020, 14:18 #10
- Регистрация
- 16.11.2020
- Сообщений
- 14
- Поблагодарили
- 19
- Поблагодарил
- 4
А, совсем забыл, тут дело еще в том, что я почти все время работаю под маком. А Keil требует Windows. Ну то есть можно, конечно, поставить parallels, но это не соответствует моим представлениям об удобстве Мне правда хватает тех возможностей которые мне дает отладка в VS Code. Да что там, мне в принципе и в командной строке gdb норм) Я не особо требователен...
-
20.11.2020, 15:04 #11
- Регистрация
- 16.11.2020
- Сообщений
- 14
- Поблагодарили
- 19
- Поблагодарил
- 4
Важно. Тестирование на Windows 7 и Windows 8 действительно показало необходимость создания inf-файла. Без него не работает. Об этом сообщил LY1CE создав Issue на GitHub. За что ему огромное спасибо. В скором времени сделаю inf-файл.
-
21.11.2020, 01:30 #12
- Регистрация
- 16.11.2020
- Сообщений
- 14
- Поблагодарили
- 19
- Поблагодарил
- 4
Для Windows младше Windows 10 все таки пришлось сделать INF файл. C ним вроде как должно все работать на WinXP, Win7 и Win8. Если вдруг есть возможность и желание протестировать, то буду крайне признателен.
Тестовый архив с inf-файлом тут: https://github.com/r2axz/bluepill-se...576273/inf.zip
Сам драйвер пока подписан самоподписанным сертификатом, поэтому винда в общем случае будет немного ругаться. Но по-идее ее можно уговорить.
-
21.11.2020, 06:18 #13
- Регистрация
- 04.12.2009
- Адрес
- Kursk
- Сообщений
- 5,581
- Поблагодарили
- 3653
- Поблагодарил
- 3183
Да, упустил я в свое время STM . Так и остался на AVR, да еще и ассемблер предпочитаю. Теперь читаю про ARM, C/C++, Clang-Format, Cortex-Debug, markdownlint - темный лес, только Keil-ом пользовался, когда для 8051 программы писал.
По мне проще FT232RL и AVR за ним (что я и делаю) http://ra3wdk.qrz.ru/LowBandDX/inject_new.jpg
А если надо несколько портов - ставлю USB HUB to 3 COM от TI - по цене получается дороже, чем STM, но в железе гарантированно без сбоев работает на всех документированных скоростях.
Это я больше для своего оправдвания пишуИван
-
21.11.2020, 08:23 #14
- Регистрация
- 16.11.2020
- Сообщений
- 14
- Поблагодарили
- 19
- Поблагодарил
- 4
Так под STM тоже можно Keil-ом пользоваться. Это просто у меня специфические вкусы по поводу среды разработки. Я далек от мысли что они единственно верные или удобные для всех.
На AVR, кстати, можно вполне себе делать проекты с нативным USB и обойтись без дополнительных преобразователей. Более того, там для этого есть прекрасная LUFA (Four Walled Cubicle - LUFA (Formerly MyUSB)) с отличным API, документацией и примерами.
Про USB HUB to 3 COM от TI не знал. И что-то не смог сходу нагуглить. Но если это преобразователь USB в три COM порта, то и хорошо что не знал. А то этот проект мог бы и не появиться На счет стабильной работы на разных скоростях, то судя по многочисленным тестам, у меня все с этим хорошо.
-
21.11.2020, 09:45 #15
- Регистрация
- 16.11.2020
- Сообщений
- 14
- Поблагодарили
- 19
- Поблагодарил
- 4
Ну и про гибкость не надо забывать. Можно ли покупные USB-Serial преобразователь заставить инвертировать управляющие сигналы на вход и выход? Чаще всего, нет! Можно ли переключить выход в режим открытого стока? Тоже нет. Можно ли изменить тип подтяжки линии (вверх, вниз, или вообще без подтяжки)? Опять нет. А все эти мелочи заметно упрощают использование.
|
Социальные закладки