- PVSM.RU - https://www.pvsm.ru -
Дата появления микроконтроллеров STM32, судя по datasheet, 2007 год, и с тех пор они признаны как очень успешным и популярный чип. Поэтому для них уже написано множество готовых примеров с поддержкой почти всех технологий как самим вендором так и комьюнити. Это и всевозможные USB устройства включая флешку и звуковую карту, и целочисленные варианты кодеков (WMA, Speex), и даже готовые сборки под ethernet с lwip стеком так же в наличии. В это время комьюнити пытается догнать вендора и написало библиотеку libopencm3, уже в отличии от оригинала, основанную на make, а не привязанную к среде. И в ней есть так же примеры с USB. И вот, на фоне всего этого я представил что STM32 ничем не сложнее меги, вооружившись таблицей разметки памяти с адресами регистров начинаю писать еще один вариант стандартной библиотеки для STM32. Гораздо более наивный, но зато компактный. Смыл был однозначно, я вообще считаю что если не понравился любой стандартный продукт, то это повод переписать его полностью, хотя вы можете со мной не согласиться.
Вот прям так с нуля, в руках текстовый редактор (Kate), компилятор и собственно сам камень. Чем то напоминает прошлое, какие нибудь 70е, никаких тебе лабораторий с кучей цифровых осциллографов отладочных плат и мониторов, сходил на базар (алик) за камушком расположился в гараже или уютненькой комнатке и вот он билет в IT. Весь тулчейн уже появился в репозиториях Ubuntu, пакеты: gcc-arm-none-eabi libnewlib-arm-none-eabi gdb-multiarch build-essential stlink-tools. Из самого необходимого для сборки:
startup файл [1] (тот что вызывает main)
файл компоновщика [2](gnu linker, разметка памяти)
makefile [3]
system file [4](запускает тактирование контроллера)
Насчет стартапов и компоновщика помогли комментарии в коде библиотеки CMSIS (позиционируется как стандарт взаимодействия с ядром ARM), для make помог хелп на сайте ARM. По итогу получился 50~100 строчный мейк, гораздо компактнее чем все примеры на гитхабе, в который вполне можно добавить и стандартный STM32 HAL (проверял, собиралось). В startup нужно добавить адреса векторов прерываний из datasheet, в system написать функцию включения кварцевого генератора, в компоновщике заполнить адреса памяти, в мейке все это собрать. А также на первое время, пока не написан API (HAL) понадобятся регистры это почти весь datasheet, 5к+ строчек [6]. И вот уже можно хеллоувордить и мигать диодиком, но мы пойдем дальше.
Программатор [7]
Готовая китайская отладочная плата категории за 300
Одна платка [8] (контроллер для советского геймпада)
Вторая платка [9] (переходник пульт-клавиатура)
st-link так же можно заказать на алике, но я паял сам, схема взята с документации по отладочным платам discovery. Не сбоящая на клонах прошивка скачана с форума ST. Все исходники для повторения на github [7]. Помните шутку про драйвера дисковода на диске, так вот плата адаптирована под начальную прошивку через UART.

В остальных платах ничего примечательного нету, стандартная обвязка контроллера, одна плата однослойная вторая двухслойная, изготовлены в домашних условиях пленочным фоторезистом и трафаретом распечатанном на принтере. С применением 0,8 мм заклепок в качестве переходных отверстий. По разводке примечательно то что можно не брезговать выводить контакты из под чипа через неиспользуемые порты, главное не подать на них случайно единицу в коде, в остальном такой грязный хак помогает получить очень компактные платы. Схемы лежат в папке result [10] в репозитории проекта.




Как приятно жить во времена международных стандартов, никаких коммерческих тайн и прочей копирастии. Можно просто пойти на USB Implementers Forum и скачать там первоисточник стандарта. Пока писал ядро USB, с одной стороны могу сказать что понадобился весь томик стандарта, с другой только 9 раздел (конфигурационные запросы драйвера). В общем тут как и со всеми новыми концептуальными навороченными абстракциями: уровней вложенности, блок схем, новых терминов на увесистый том размером с аналоговую энциклопедию, а кода на пять килобайт. Все равно по итогу шина, либо пихаешь туда данные, либо забираешь из буфера по прерыванию. А все остальное как то пишется один раз, лишь бы система подхватила, а потом забывается и просто подключается в виде библиотечки. Хотя местами не хватило стандарта, понадобился ещё хелп ядра linux и хелп microsoft, нужно же понимать как понимают тот же самый стандарт программисты ОС. По итогу удалось реализовать следующие типы стандартных USB устройств:
геймпад
клавиатура (на самом деле USB ИК приемник, но драйвер от клавиатуры)
переходник USB-UART
Программатор флешек BIOS [11] (работает поверх USB-UART)
Остальные устройства на очереди (в процессе разработки) это веб камера, флешка, звуковая карта, тыльная подсветка монитора, руль для гоночек и мышь.
Многие любители мощных сред (Keil, ST Cube) и готовых комплектов отладочных плат считают главным преимуществом наличие отладчика. Но отладка возможна и в консоли по трем проводкам. Например для выяснения ошибок в момент инициализации USB. Я пользовался консольным GDB. Сложив весь поток данных в глобальный массив я считал его с помощью gdb. Так же и прослеживал за регистрами складывая их в цикле в переменные.
В тему документации все pdfки лежат в репозитории [12]. Для написания дескрипторов USB HID устройств понадобилась стандартная утилита [13], раньше работала под вайном теперь в виртуальной XP.
Геймпад вполне играбелен, прошел на нем одну трассу в NFS, пультом удобно слушать музыку с youtube пока делаешь дела по дому. Программатором зашил таблетку от жадности для принтера. Демонстрацию работы всех устройств вы можете наблюдать на видео, расположены в соответствии со списком.
Очень приятно хотя бы чуть чуть дотянуться до текущего уровня технологий, а не оставаться ретро технарем поневоле, хорошо понимающим в параллельных шинах, мигалках на сдвиговых регистрах, но неспособным сделать ничего полезного в быту, работающего в современной экосистеме без плясок с бубном. Я даже настолько обнаглел что могу советовать вам свои разработки как example для быстрого старта ваших проектов. А вы какие бы еще посоветовали мне устройства для реализации, к тем что уже в разработке.
Автор:
dltex
Источник [14]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/programmirovanie-mikrokontrollerov/383684
Ссылки в тексте:
[1] startup файл: https://github.com/dltech/usb_device3/blob/main/lib/STM32F103_CMSIS/startup_stm32f103.c
[2] файл компоновщика : https://github.com/dltech/usb_device3/blob/main/lib/STM32F103_CMSIS/gcc_arm.ld
[3] makefile: https://github.com/dltech/usb_device3/blob/main/gamepad/Makefile
[4] system file : https://github.com/dltech/usb_device3/blob/main/lib/STM32F103_CMSIS/system_stm32f103.c
[5] макросы регистров : https://github.com/dltech/usb_device3/tree/main/lib/regs
[6] 5к+ строчек: https://github.com/dltech/usb_player/tree/main/lib/stm/stm_regs
[7] Программатор: https://github.com/dltech/stlinkv2
[8] Одна платка: https://github.com/dltech/usb_device3/tree/main/sch
[9] Вторая платка: https://github.com/dltech/usb_device3/tree/main/sch/remote
[10] result: https://github.com/dltech/usb_device3/tree/main/result
[11] Программатор флешек BIOS: https://github.com/dltech/gazelle
[12] репозитории: https://github.com/dltech/usb_device3/tree/main/datasheet
[13] стандартная утилита: https://github.com/dltech/usb_device3/tree/main/datasheet/descriptorUtility
[14] Источник: https://habr.com/ru/post/724800/?utm_source=habrahabr&utm_medium=rss&utm_campaign=724800
Нажмите здесь для печати.