1. STM32.HAL. USB custom HID. Часть 1

  Рет қаралды 3,582

Axentfly

Axentfly

Күн бұрын

Пікірлер: 45
@СергейГончаров-э4г
@СергейГончаров-э4г 3 жыл бұрын
Как удачно я на ваши уроки по USB HID вышел, классно все объясняете и материал подготовили старательно, респект...
@TheIvanDM
@TheIvanDM 5 жыл бұрын
Спасибо за такой качественный урок! В русском сегменте и правда по USB мало чего. Очень интересна тема реализации USB Host на STM32
@Morpheus.theDreamlord
@Morpheus.theDreamlord 3 ай бұрын
Отдельный лайк за Death ;) а так тема юсб очень интересна . Еле нашел рабочий вариант как переделать заготовку HID в MIDI Class
@ИгорьСтупин-и4с
@ИгорьСтупин-и4с 4 жыл бұрын
Спасибо за видео, очень полезно! Смотрел так же урок от narodsteam, который обсуждался в вашем видео. По-моему автор этого видео объясняет, что пользуется USB HID Demonstratorom и чтобы показать работу всех 4х Report ID и по нажимать все кнопочки , пишет "такой report" пусть и не практичный.
@Qvantik
@Qvantik 4 жыл бұрын
Видео чуть больше пролило свет на работу с HID. Хочу заметить, что автор, которого вы критикуете, говорил в видео, что он подстроил дескриптор специально под Usb HID Demonstrator.
@ДмитрийСадков-е8ц
@ДмитрийСадков-е8ц 4 жыл бұрын
У вас в функции приема данных CUSTOM_HID_OutEvent_FS есть цикл в котором происходит копирование принятых данных: for (int i = 0; i < 65; i++) { ... USB_RX_Buffer[i] =hhid->Report_buf[i]; ... } Вы пытаетесь скопировать 65 байт. Если посмотреть на определение массива Report_buf (в файле usbd_customhid.h)то можно увидеть следущее: uint8_t Report_buf[USBD_CUSTOMHID_OUTREPORT_BUF_SIZE]; и если посмотреть чему равно значение USBD_CUSTOMHID_OUTREPORT_BUF_SIZE то увидим это: #define USBD_CUSTOMHID_OUTREPORT_BUF_SIZE 64U Это значение устанавливается в CubeMx, в настройках USB-DEVICE, в поле USBD_CUSTOMHID_OUTREPORT_BUF_SIZE. В подсказке Куба к этому параметру видно, что максимальное значение равно 64, а не 65: "USBD_CUSTOMHID_OUTREPORT_BUF_SIZE (Maximum report buffer size (OUT ENDPOINT)) must be between 2 and 64." Возможно это связано с версией куба, я не знаю, со старыми не работал. Спецификацию USB я читал более 10 лет назад, не могу утверждать что я абсолютно прав. Но на последних версиях куба у вас явно возникнут проблемы с размером 65. И кстати нахера делать копирование массива в цикле? Почему нельзя просто использовать стандартные функции, например так: Ведь это гораздо надежнее, безопаснее, и к тому-же вам не надо руками указывать размер. Вероятно после просмотра триллера от народстрима вы всего лишь попытались соблюсти "авторский стиль", ведь ваше видео явно ответ на тот видеоролик. Я правильно понял? // в конкретно данном случае я подразумеваю что размер обоих массивов одинаковый // www.keil.com/support/man/docs/ca/ca_memcpy.htm memcpy(USB_RX_Buffer, hhid->Report_buf, sizeof(hhid->Report_buf)); или memcpy(USB_RX_Buffer, hhid->Report_buf, USBD_CUSTOMHID_OUTREPORT_BUF_SIZE); Еще вымораживают конструкции вида: int USB_Packet_enable = 0; На мой взгляд так было бы более читабельно: /* USER CODE BEGIN Includes */ #include "stdbool.h" /* USER CODE END Includes */ ... bool usb_packet_received = false; ... От себя лично я могу порекомендовать довольно старую книгу (это не реклама!) Павла Агурова www.litres.ru/pavel-agurov/interfeys-usb-praktika-ispolzovaniya-i-programmirovaniya/ Она заточна на довольно старенький контроллер, но в ней есть описание HID протокола, дескрипторов и пр, в том числе есть примеры и исходники софта на стороне хоста (на Pascal/Deplhi) для работы с самодельными HID девайсами. В свое время (2007г) эта книга лично для меня оказалась очень полезной. UPDATE: Вобщем я на практике проверил вашу теорию о том, что первым элементом приемного/передаваемого массивов нужно совать номер репорта. Так вот ваша теория ошибочна. 64 байта это непосредственно сами данные без ID-Report. Не нужно ID-Report пихать в начало массива. Данные прекрасно передаются и принимаются и без этого.
@axentfly5854
@axentfly5854 4 жыл бұрын
Ок. Представим задачу. К контроллеру присоединены несколько устройств, куда нужно записывать по 64 байта. И что вы будете делать? Заводить дополнительный массив для USB на 64 байта чтобы передать номер устройства?? Чтобы этого избежать, как раз и нужны ID репортов. Их не просто так придумали. А то, что их убрали в Кубе вовсе не означает, что это правильно (их не использовать). Там полно косяков, и к HAL не стоит аппелировать как к последней инстанции.
@ДмитрийСадков-е8ц
@ДмитрийСадков-е8ц 4 жыл бұрын
В стандарте USB сказано, что для конечных точек типа Interrupt, максимальный размер передаваемого за раз пакета равен 64 байта.
@axentfly5854
@axentfly5854 4 жыл бұрын
@@ДмитрийСадков-е8ц Речь идет о пакете данных. Report ID это служебный байт, а не данные. И он передается всегда перед данными, нравится это кому то или нет. Можете проверить опытным путем и убедиться, что передается 65 байт, где первый - Report ID. Можете воспользоваться программой Device Monitor Studio (есть крякнутая версия) или демо на 7 дней. Там можно смотреть всё что идет по USB. И цитата: "A Report ID item tag assigns a 1-byte identification prefix to each report transfer."
@JustNick34
@JustNick34 6 жыл бұрын
А когда следующая часть? И листочек в студию пожалуйста! Лайк за видео.
@axentfly8945
@axentfly8945 6 жыл бұрын
На этих выходных обязательно выложу.. А то лето, пора горячая))
@masterkit9517
@masterkit9517 4 жыл бұрын
по миди делаю свой урок для себя) от вас так и не удалось дождаться урока, может подскажете, как сконфигурировать 48мгц, что выбрать в 1й закладке cubemx для MIDI устройства, просто никому нет дела до этого MIDI, так как нет времени ни у кого, каких ошибок следует избегать, может из данного видео для 103й платы есть важная информация? информации много, всё перепутывается, не знаю что важно, а что нет.
@axentfly5854
@axentfly5854 4 жыл бұрын
Здравия. Видео есть, но всё руки не доходят залить. И да. К сожалению доступа к данному каналу у меня нет (нет доступа к старому номеру, пароль Ютуб без СМС восстанавливать не хочет). Пришлось новый аккаунт на Ютубе заводить. Сейчас буду видео с этого канала пытаться перебросить. Не совсем понятен вопрос. Но кратко. Если вам нужен просто Midi, то для этого можно использовать обычный UART. Если же цель стоит сделать конвертер USB-Midi, то тут нужно уже настраивать USB на работу с классом USB Audio Device (это делается в Cube). Потом генерировать код и вносить изменения вручную. (Cube не создает Midi устройства. Только USB Audio. А Midi - это подкласс аудио устройств)
@РусланХайрулин-з6я
@РусланХайрулин-з6я Жыл бұрын
М-да вручную написать стек usb это труд.
@sierradelta7710
@sierradelta7710 6 жыл бұрын
А "портянка" та взята из статьи на хабре. "Залил" код в F103C8. ОС определила HID-устройство без ошибок. В отчете №2 странно, что USAGE используется после определения обьемов отчета, а не до. Как я понял vendor usage - внешаблонный тег, как и USAGE, который ни на что не влияет, но нужен для разработчика ПО, в котором будет исп. устройство, ну и для работы отчета. Осталось проверить передачу данных. Студию скачал, а что и как там - понятия никакого. Ждем следующее видео. Спасибо.
@axentfly8945
@axentfly8945 6 жыл бұрын
по поводу vendor usage и прочего очень хорошо расписано тут: docs.microsoft.com/en-us/windows-hardware/drivers/hid/hid-usages Еще вот: www.usb.org/developers/hidpage/Hut1_12v2.pdf К слову забегая вперед, приложение под Win пишется с использованием пакета разработчика Windows WDK. (с использованием Win API).
@masterkit9517
@masterkit9517 4 жыл бұрын
а встроенный кварц нельзя? F103C8T6 плата, внешних кварцев нет. Миди пытаюсь сделать по вашему уроку, частоту 48mhz не удалось выставить
@axentfly8945
@axentfly8945 4 жыл бұрын
Встроенный к сожалению нельзя. Надо тогда на плате искать, куда припаять внешний кварц.
@axentfly8945
@axentfly8945 4 жыл бұрын
По Миди скоро отдельный урок будет.
@masterkit9517
@masterkit9517 4 жыл бұрын
@@axentfly8945 Спасибо большое!
@backtracklive
@backtracklive 5 жыл бұрын
Здравствуйте! Спасибо за человеческое описание как работать с HID) Хотел уточнить, только ли char можно отправлять в массиве? Нужно отправлять двухбайтовое число. Сейчас я разбиваю его на младший и старший байт и передаю в соседних элементах буфера. Второй вопрос связан с аппаратной частью. Я использую STM32F103C8T6 и USB на нем выведен на GPIOA. На тот же GPIOA я подключил TM1638. Данные с МК на хост идут исправно и индикатор работает исправно. Но стоит отправить что-то с хоста на МК и виснет либо USB и индикатор либо только индикатор, а хост продолжает принимать данные с МК. Можно ли это как-то исправить? Если переношу индикатор на другой порт то все работает. Но в моем проекте свободные пины остались только на GPIOA. Это продиктовано тем, что мне необходимы прерывания от датчиков и эти датчики занимают все толерантные к 5В пины.
@axentfly8945
@axentfly8945 5 жыл бұрын
Вообще тип данных может быть любым однобайтовым. char или uint8_t. По поводу аппаратной части нужно смотреть саму программу. Мне кажется там проблема завязана на софте. Поэтому со вторым вопросом помочь сложно
@ИнженерВася-в3п
@ИнженерВася-в3п 4 жыл бұрын
В файле документа есть цифры 0x64 (16 сс) не равно 64 в десятичной сс
@lqs707
@lqs707 3 жыл бұрын
Разве способ с флагом не может привести к состоянию гонки, когда теоретически следующий пакет, прилетевший по USB во время обработки предыдущего вызовет прерывание, вследствие чего буфер приема будет перезаписан?
@axentfly5854
@axentfly5854 3 жыл бұрын
Может. Но Custom Hid достаточно медленный класс, даже медленнее чем COM порт, а STM32 достаточно быстрый. Поэтому тут еще нужно постараться. Но если и правда имеется большая обработка пакета, то нужно использовать RTOS и буфер для данных
@alexandrijchuck817
@alexandrijchuck817 4 жыл бұрын
#define USBD_CUSTOMHID_OUTREPORT_BUF_SIZE 65 Куб думает иначе. Современный куб. Наверное Вы не правы. Максимальный размер пакета HID Full Speed девайса определяется максимальным размером пакета Interrupt трансфера, а он в свою очередь ограничен 64 байтами. Т.е. Вы ещё байт к нему ни как не прицепите (скорее всего). Видимо, то, что Куб режет значение этой константы в 64 при наборе любого числа больше - правильно. Тот факт, что оно у Вас работает означает, что, во первых - больше не меньше (о буфере), и во вторых - Вы не использовали в примере максимальный размер передачи.
@МаксПро-у3э
@МаксПро-у3э 4 жыл бұрын
А как отправлять данные из проца на комп?
@axentfly8945
@axentfly8945 4 жыл бұрын
Смотрите 2-ю и 3-ю часть. Там всё есть. Отправка из МК на компьютер в третьей части. kzbin.info/www/bejne/pF6kpa1rbJWteck kzbin.info/www/bejne/fGeoe4aXqNt4kLs
@pratikgawde12
@pratikgawde12 5 жыл бұрын
Можете ли вы загрузить файлы Word и поделиться ссылкой? это было бы полезно для нерусских людей, как я (используя Google Translate сейчас) очень трудно найти хороший документ на заказ спрятал
@axentfly8945
@axentfly8945 5 жыл бұрын
Patrik, what language you speak?
@pratikgawde12
@pratikgawde12 5 жыл бұрын
@@axentfly8945 I'm from India. but I'm ok with English
@pratikgawde12
@pratikgawde12 5 жыл бұрын
trying to learn custom usb devices and host drivers
@kalobyte
@kalobyte 6 жыл бұрын
так и не понял, что за инфа содержится в нулевом индексе масиива буфера
@axentfly8945
@axentfly8945 6 жыл бұрын
Там лежит идентификатор репорта (ID репорта). Или если более проще - идентификационный номер передачи/приема. На передачу (IN) он имеет одно значение, на прием (OUT) - другое. Главное значения отличались и не повторялись. Прописываются ID репорта в дескрипторе репорта. Не забываем, что OUT и IN описываются относительно компьютера. Т.е. пакет OUT - это выходные данные от компьютера, а не от платы. Некоторые путают. Для платы пакет OUT - это прием. А IN - передача.
@kalobyte
@kalobyte 6 жыл бұрын
​@@axentfly8945 я постоянно их путаю, а это говорит о том, что названия идиотские, как это было с фьюзами у авр про ид репорта я понял, когда ложился днем спать а конечные точки тогда для чего? в смысле их адрес 81 и 1 обычно бывают по одной а 2 зачем, если можно данные идентифицировать по ид репорта
@axentfly8945
@axentfly8945 6 жыл бұрын
@@kalobyte Так ID репорта и привязан к одной точке. Одна на прием, вторая на передачу
@kalobyte
@kalobyte 6 жыл бұрын
​@@axentfly8945 может быть я тогда чего не понял? 24:59 вот вы видим там несколько репортов типа 1,2,3,4,5 а у конечных точек цифры 1 или 81 в зависимости от направления или это адрес нулевой точки типа control такой? тогда тут 82 на выход будет адрес первой точки 0x02 на вход и через нее передаются все эти репорты?
@axentfly8945
@axentfly8945 6 жыл бұрын
@@kalobyte цифры 1 и 81 - это адреса. А номера ID репортов с номерами адресов никак не связаны. Их можно задавать любыми. Главное, чтобы не повторялись.
@alexandrijchuck817
@alexandrijchuck817 4 жыл бұрын
Почему у Вас дескриптор репортов такой кривой? Наверное нужно было как-то ровнее делать, учитывая, что это обучающее видео.
@axentfly8945
@axentfly8945 4 жыл бұрын
Ок. В чем он кривой? Буду признателен за конструктивную критику.
@axentfly5854
@axentfly5854 4 жыл бұрын
Приветствую, друзья. Этот канал Гугл почему то заблочил. Не дает восстановить доступ пока но буду пытаться. Если не получится, то все видео я перекину на новый канал, с аккаунта которого пишу сейчас
STM32.HAL.USB custom HID. Часть 2
29:32
Axentfly
Рет қаралды 1,7 М.
Лекция-практикум "Аппаратный USB STM32"
22:15
Vladimir Leonidov [BMSTU]
Рет қаралды 4,5 М.
World’s strongest WOMAN vs regular GIRLS
00:56
A4
Рет қаралды 33 МЛН
I tricked MrBeast into giving me his channel
00:58
Jesser
Рет қаралды 30 МЛН
When mom gets home, but you're in rollerblades.
00:40
Daniel LaBelle
Рет қаралды 144 МЛН
МЕНЯ УКУСИЛ ПАУК #shorts
00:23
Паша Осадчий
Рет қаралды 1,4 МЛН
«Осень». Самая большая загадка Windows XP
14:36
Девять десятых
Рет қаралды 1,1 МЛН
STM32 HAL USB: Создание HID мыши
7:57
Sappise
Рет қаралды 6 М.
Что такое UEFI и BIOS?🤔 КОРОТКО и ЯСНО обо всём!✅
10:54
КОМПЬЮТЕРНЫЕ ФИШКИ И НЕ ТОЛЬКО
Рет қаралды 145 М.
World’s strongest WOMAN vs regular GIRLS
00:56
A4
Рет қаралды 33 МЛН