Доброго времени суток,
хотел поделиться своим проектом 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 интерфейсу. Все будет работать отлично.