USB HID для микроконтроллеров STM32F103 без использования библиотек

Однажды озадачившись подключением микроконтроллера к ПК через USB, я обнаружил, что это непростая задача. По сравнению с USART, SPI и.т.п., программирование USB оказалось на порядок сложнее. Поиск примеров в интернете практически не дал никаких результатов. Имеющиеся примеры, как правило, основаны на использовании больших и сложных библиотек, которые очень трудно применить, а тем более модифицировать под свои нужды. Также эти примеры обычно состоят из множества файлов, так что даже понять структуру проекта, а не то что принцип работы, USB из них не представляется возможным. Есть неплохие статьи по USB, однако ответа на вопрос, как реализовать обмен данными на конкретном контроллере они не дают. В итоге пришлось самостоятельно, путем длительных экспериментов пытаться запустить USB.
Используемый контроллер STM32F103C8T6. Это наверное самый распространенный и дешевый контроллер с модулем USB. Конкретно использовалась вот такая плата:
ru.aliexpress.com/item/STM32F103C8T6-ARM-STM32-DIY-KIT/32839140960.html?spm=a2g0v.search0104.3.14.1a477b81mKd6hC&ws_ab_test=searchweb0_0%2Csearchweb201602_9_10065_10068_319_317_10696_453_10084_454_10083_10618_10307_10301_537_536_10902_10059_10884_10889_10887_321_322_10915_10103_10914_10911_10910%2Csearchweb201603_58%2CppcSwitch_0&algo_pvid=551618bd-fcbf-49a9-9147-692e88feb8ce&algo_expid=551618bd-fcbf-49a9-9147-692e88feb8ce-5
Цена такой платы практически равна цене микросхемы отдельно. Реализуемый класс устройств HID. Преимущества HID известны. Это отсутствие необходимости использования драйверов на ПК и относительная простота реализации. К недостаткам можно отнести низкую скорость передачи данных. В качестве среды программирования использован CooCox. Программа со стороны ПК компилировалась в Borland C++ 5.5.
Программа для CooCox состоит из одного файла и не использует никаких библиотек (кроме RCC, которая нужна лишь ради функции SystemInit(); в начале программы). Также не используются прерывания, поскольку, на мой взгляд, их использование, затрудняло бы понимание кода и отладку. VID и PID взяты от какого-то STM-овского устройства. При их смене, нужно так-же сменить их и в программе на ПК, поскольку поиск устройства происходит по VID и PID.
Работа рассматриваемой пары программ состоит в следующем. Программа со стороны ПК посылает целое число в контроллер. Контроллер делает инкремент полученного числа и отправляет его назад в ПК. Затем этот цикл повторяется снова и снова. В окне программы выводится полученное число. Дополнительно реализовано управление светодиодом на плате (PC13).
Данная программа не претендует на полное соответствие протоколу USB. В ней реализована обработка ограниченного набора запросов (только тех, что реально попадались при отладке). Как показала практика, набор запросов может различаться на разных компьютерах. Кроме того несмотря на то что удалось добиться работоспособности данной программы, многие вопросы касающиеся USB для меня так и остались непонятными. Этот пример, скорее полуфабрикат, требующий дальнейшей доработки.
Файлы проекта:
drive.google.com/drive/folders/1b3E0YwgRlacK2K2Qykc7OxS11ocNuWig?usp=sharing
  • +8
  • 27 марта 2019, 17:29
  • VVK
  • 1
Файлы в топике: STM103_USB_HID.zip

Комментарии (7)

RSS свернуть / развернуть
Положи архив с проектом в аттачи к посту, а то будет как с топиками dcoder'а.
0
  • avatar
  • Vga
  • 28 марта 2019, 05:01
OK. Положил.
0
  • avatar
  • VVK
  • 28 марта 2019, 08:42
Где в литературе за USB можно шото почитать!?
0
  • avatar
  • Aneg
  • 28 марта 2019, 15:08
1. Наверное, лучшая публикация в интернете: microsin.ru/content/view/1107/44/
2. Книга Агурова «Практика программирования USB». Но там большой объем, и трудно из него вычленять именно нужную информацию.
3. Конечно Reference Manual на используемый контроллер. Там на английском, и опять-таки трудно выделять главное из большого объема информации.
Выделение главного из большого объема информации, вообще, наверное, основная проблема при изучении USB. На каком-то форуме, при обсуждении программирования USB, кто-то умный заявил что-то типа «А в чем проблема? Есть официальная спецификация USB. Там все написано. Лень изучать? Так куда вы тогда лезете?». Как говориться – по форме верно, а по сути издевательство. Спецификация USB занимает около 1000 страниц на английском.
0
Лучшие публикации из всех, что я читал к данному моменту:

www.beyondlogic.org/usbnutshell/usb1.shtml
www.usbmadesimple.co.uk/
0
Давно не видел такого минимализма в программировании. Только то что нужно и ничего лишнего. Ожидал увидеть классическое С++ Builder приложение c Form1, а тут такое. Приятно удивлен.
+1
Спасибо. Я рад такой оценке.
Я как раз и старался сделать все по минимуму, чтобы не затуманивать саму суть, т.е. подключение USB HID.
Да и вообще, мне кажется, что в последнее время слишком сильно идет увлечение разными программными надстройками.
+1
  • avatar
  • VVK
  • 01 апреля 2019, 14:38
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.