четверг, 28 июля 2016 г.

Победил cвязку stm32f103 + mbed + USBSerial

Ура. После суточной секасы победил-таки....


Собственно, удалось заставить работать виртуальный ком-порт (последовательную консоль) на платах с микроконтроллерами stm32F103c8t6 и cBt6. Это самые дешевые платы с 64 и 128 килобайтами флэша соответственно.

Это пока что предварительный радости пост. Детали по подключению и файлы проекта будут позже. Но пока что/как/зачем (вкратце).



Что заработало

Заработала связка mbed + форк драйверов USBSerial с сайта mbed'а. Теперь можно подключать USB шнурок к разъему на плате и ОСь видит устройство, можно подключаться к нему с помощью screen в UNIX-образных системах или через hyperterminal в вениках. С точки зрения этих устройств мы подключили некий COM порт, через который можно посылать и получать данные.

Как заработало

Хотя на сайте mbed и заявлена поддержка USB Serial виртуального порта для платы NUCLEO-F103RB, на основе софта которой я собрал  комплектик для работы с дешевенькими китайскими платами (уже описывал), но на деле поддержки этого дела в библиотеке USBDevice,  которая является драйвером для USB устройств, нет.

Умельцами допилена библиотека для работы в том числе и с этим Нюклео. Так что осталось уговорить её заработать...

Пришлось разбираться где там чего глючит. Оказалось, там при глюках USB банально крашится прошивка и все проблемы идут по кругу. Плюс что-то там автор в последних версиях перемудрил, надо было взять более древнюю версию.

Самый цимес был с дешевой платой на F103cBt6, которую зовут Maple Mini. Вроде изменений минимум в коде - подключение другого описателя разметки памяти и другого адреса для "моргалки" светодиода. А не работает. Оказалось, для работы USB нужна подтяжка одной из ноги данных к плюсу питания, а там это включалось как-то извращенно. Решил не разбираться с особенностями этого изврата, да и просто выдрал транзистор и подключил питание как положено.

Печальное

Заподло всего этого в том, что минимальная прошивка, включающая мигалку светодиодом, USB консольку и "отвечатор", отсылающий присланный байт обратно, занимает порядка 40 килобайт, то есть для f103c8t6 данная фича не очень подходит, так как на всякие извращения уйдёт шибко много памяти. Буду ковырять, может где удастся сэкономить, есть у меня подозрения...

При этом, под такой же чип программа в Keil на чистом C - считыватель touch button далласовских ключиков, эмулятор на 4 таких touch button'а, с режимом замка и интерактивной консолью занимает 13 килобайт...

Нафига вообще нужна такая консоль

Такая консоль позволяет резко упростить:

  • отладку, т.к. можно в процессе работы выводить через консоль отладочные данные и сообщения;
  • конфигурирование, т.к. можно сделать разбор команд, передаваемых через консоль. Это даёт возможность легко, просто, интерактивно настраивать устройства. Причём, программы для визуальной настройки также пишутся элементарно - поддержка последовательного порта есть везде, например в том же Qt это легче лёгкого;
  • статистика и её обработка, т.к. можно "сливать" через это соединение статистику, накопленную устройством;
  • управляющая связь с ПК, то есть можно давать через этот интерфейс кодированные команды.

Альтернативы

В микроконтроллере есть такая классная штука, как последовательный порт (USART), который можно подключить к конвертеру COM->TTL. Получим абсолютно такой же функционал, но без использования USB порта микроконтроллера.

Это позволит серьезно сэкономить память, так как реализация всяких тонкостей общения с USB будет уже "втиснуто" в конвертер.

Однако, это сразу же требует наличия этого самого конвертера, а он денег стоит (100р минимум, плюс время на пересылку из китая).

Итог

Рад, что победил эту заразу.

Завтра продолжу написание костяка проекта универсального страйкбольного таймера, где как раз эта фича - USB консоль - будет весьма кстати.