8-900-374-94-44
[email protected]
Slide Image
Меню

Stm32 hid usb: STM32 и USB-HID — это просто / Хабр

Содержание

LinkedIn

選擇語言Bahasa Indonesia (Bahasa Indonesia)Bahasa Malaysia (Malay)Čeština (Czech)Dansk (Danish)Deutsch (German)English (English)Español (Spanish)繁體中文 (Chinese (Traditional))Français (French)한국어 (Korean)Italiano (Italian)简体中文 (Chinese (Simplified))Nederlands (Dutch)日本語 (Japanese)Norsk (Norwegian)Polski (Polish)Português (Portuguese)Română (Romanian)Русский (Russian)Svenska (Swedish)Tagalog (Tagalog)ภาษาไทย (Thai)Türkçe (Turkish)العربية (Arabic)

عفواً، لم نتمكن من العثور على الصفحة التي تبحث عنها. برجاء المحاولة مرة أخرى للصفحة السابقة أو الانتقال لـمركز المساعدة للمزيد من المعلومات

الإنتقال لموجزك الرئيسي

Omlouváme se, nemůžeme najít stránku, kterou hledáte. Zkuste se vrátit zpátky na předchozí stránku, nebo se podívejte do našeho Centra nápovědy pro více informací

Přejít do informačního kanálu

Vi kan desværre ikke finde den side, du leder efter.

Gå tilbage til den forrige side, eller besøg Hjælp for at få flere oplysninger Gå til dit feed

Die gewünschte Seite konnte leider nicht gefunden werden. Versuchen Sie, zur vorherigen Seite zurückzukehren, oder besuchen Sie unseren Hilfebereich, um mehr zu erfahren.

Zu Ihrem Feed

Uh oh, we can’t seem to find the page you’re looking for. Try going back to the previous page or see our Help Center for more information

Go to your feed

Vaya, parece que no podemos encontrar la página que buscas. Intenta volver a la página anterior o visita nuestro Centro de ayuda para más información.

Ir a tu feed

Nous ne trouvons pas la page que vous recherchez. Essayez de retourner à la page précédente ou consultez notre assistance clientèle pour plus d’informations

Ouvrez votre fil

Maaf, sepertinya kami tidak dapat menemukan halaman yang Anda cari.

Coba kembali ke halaman sebelumnya atau lihat Pusat Bantuan kami untuk informasi lebih lanjut Buka feed Anda

Non abbiamo trovato la pagina che stai cercando. Prova a tornare alla pagina precedente o visita il nostro Centro assistenza per saperne di più.

Vai al tuo feed

申し訳ありません。お探しのページが見つかりません。前のページに戻るか、ヘルプセンターで詳細をご確認ください

フィードに移動

원하시는 페이지를 찾을 수 없습니다. 이전 페이지로 돌아가거나 고객센터에서 자세히 알아보세요.

홈으로 가기

Harap maaf, kami tidak dapat menemui laman yang ingin anda cari. Cuba kembali ke laman sebelumnya atau lihat Pusat Bantuan kami untuk maklumat lanjut

Pergi ke suapan

De pagina waar u naar op zoek bent, kan niet worden gevonden. Probeer terug te gaan naar de vorige pagina of bezoek het Help Center voor meer informatie

Ga naar uw feed

Vi finner ikke siden du leter etter.

Gå tilbake til forrige side eller besøk vår brukerstøtte for mer informasjon Gå til din feed

Nie możemy znaleźć strony, której szukasz. Spróbuj wrócić do poprzedniej strony lub nasze Centrum pomocy, aby uzyskać więcej informacji

Przejdź do swojego kanału

A página que você está procurando não foi encontrada. Volte para a página anterior ou visite nossa Central de Ajuda para mais informações

Voltar para seu feed

Ne pare rău, nu găsim pagina pe care o căutaţi. Reveniţi la pagina anterioară sau consultaţi Centrul nostru de asistenţă pentru mai multe informaţii

Accesaţi fluxul dvs.

Не удаётся найти искомую вами страницу. Вернитесь на предыдущую страницу или посетите страницу нашего справочного центра для получения дополнительной информации.

Перейти к ленте

Sidan du letar efter hittades inte.

Gå tillbaka till föregående sida eller besök vårt Hjälpcenter för mer information Gå till ditt nyhetsflöde

ขออภัย ดูเหมือนเราไม่พบหน้าที่คุณกำลังมองหาอยู่ ลองกลับไปที่หน้าเพจก่อน หรือดู ศูนย์ความช่วยเหลือ ของเราสำหรับข้อมูลเพิ่มเติม

ไปที่ฟีดของคุณ

Naku, mukhang hindi namin mahanap ang pahina na hinahanap mo. Subukang bumalik sa nakaraang pahina o tingnan ang aming Help Center para sa higit pang impormasyon

Pumunta sa iyong feed

Aradığınız sayfa bulunamadı. Önceki sayfaya geri dönün veya daha fazla bilgi için Yardım Merkezimizi görüntüleyin

Haber akışınıza gidin

抱歉,无法找到页面。试试返回到前一页,或前往帮助中心了解更多信息

前往动态汇总

我們好像找不到該頁面。請回到上一頁或前往說明中心來進一步瞭解

前往首頁動態

ARM Cortex STM32: STM32F USB

/* USB Standard Device Descriptor */ const uint8_t RHID_DeviceDescriptor[RHID_SIZ_DEVICE_DESC] = { RHID_SIZ_DEVICE_DESC, // общая длина дескриптора устройства в байтах USB_DEVICE_DESCRIPTOR_TYPE, // bDescriptorType — показывает, что это за дескриптор. В данном случае — Device descriptor 0x00, 0x02, // bcdUSB — какую версию стандарта USB поддерживает устройство. 2.0 // класс, подкласс устройства и протокол, по стандарту USB. У нас нули, означает каждый интерфейс сам за себя 0x00, //bDeviceClass 0x00, //bDeviceSubClass 0x00, //bDeviceProtocol 0x40, //bMaxPacketSize — максимальный размер пакетов для Endpoint 0 (при конфигурировании) // те самые пресловутые VID и PID, по которым и определяется, что же это за устройство. 0x83, 0x04, //idVendor (0x0483) 0x11, 0x57, //idProduct (0x5711) DEVICE_VER_L, DEVICE_VER_H, // bcdDevice rel. DEVICE_VER_H.DEVICE_VER_L номер релиза устройства // дальше идут индексы строк, описывающих производителя, устройство и серийный номер. // Отображаются в свойствах устройства в диспетчере устройств // А по серийному номеру подключенные устройства с одинаковым VID/PID различаются системой.

1, //Index of string descriptor describing manufacturer 2, //Index of string descriptor describing product 3, //Index of string descriptor describing the device serial number 0x01 // bNumConfigurations — количество возможных конфигураций. У нас одна. } ; /* CustomHID_DeviceDescriptor */

/* USB Configuration Descriptor */ /* All Descriptors (Configuration, Interface, Endpoint, Class, Vendor */ const uint8_t RHID_ConfigDescriptor[RHID_SIZ_CONFIG_DESC] = { 0x09, // bLength: длина дескриптора конфигурации USB_CONFIGURATION_DESCRIPTOR_TYPE, // bDescriptorType: тип дескриптора — конфигурация RHID_SIZ_CONFIG_DESC, 0x00, // wTotalLength: общий размер всего дерева под данной конфигурацией в байтах 0x01, // bNumInterfaces: в конфигурации всего один интерфейс 0x01, // bConfigurationValue: индекс данной конфигурации 0x00, // iConfiguration: индекс строки, которая описывает эту конфигурацию 0xE0, // bmAttributes: признак того, что устройство будет питаться от шины USB 0x32, // MaxPower 100 mA: и ему хватит 100 мА /************** Дескриптор интерфейса ****************/ 0x09, // bLength: размер дескриптора интерфейса USB_INTERFACE_DESCRIPTOR_TYPE, // bDescriptorType: тип дескриптора — интерфейс 0x00, // bInterfaceNumber: порядковый номер интерфейса — 0 0x00, // bAlternateSetting: признак альтернативного интерфейса, у нас не используется 0x02, // bNumEndpoints — количество эндпоинтов.

0x03, // bInterfaceClass: класс интерфеса — HID // если бы мы косили под стандартное устройство, например клавиатуру или мышь, то надо было бы указать правильно класс и подкласс // а так у нас общее HID-устройство 0x00, // bInterfaceSubClass : подкласс интерфейса. 0x00, // nInterfaceProtocol : протокол интерфейса 0, // iInterface: индекс строки, описывающей интерфейс // теперь отдельный дескриптор для уточнения того, что данный интерфейс — это HID устройство /******************** HID дескриптор ********************/ 0x09, // bLength: длина HID-дескриптора HID_DESCRIPTOR_TYPE, // bDescriptorType: тип дескриптора — HID 0x01, 0x01, // bcdHID: номер версии HID 1.1 0x00, // bCountryCode: код страны (если нужен) 0x01, // bNumDescriptors: Сколько дальше будет report дескрипторов HID_REPORT_DESCRIPTOR_TYPE, // bDescriptorType: Тип дескриптора — report RHID_SIZ_REPORT_DESC, 0x00, // wItemLength: длина report-дескриптора /******************** дескриптор конечных точек (endpoints) ********************/ 0x07, // bLength: длина дескриптора USB_ENDPOINT_DESCRIPTOR_TYPE, // тип дескриптора — endpoints 0x81, // bEndpointAddress: адрес конечной точки и направление 1(IN) 0x03, // bmAttributes: тип конечной точки — Interrupt endpoint wMaxPacketSize, 0x00, // wMaxPacketSize: Bytes max 0x20, // bInterval: Polling Interval (32 ms) 0x07, /* bLength: Endpoint Descriptor size */ USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: */ /* Endpoint descriptor type */ 0x01, /* bEndpointAddress: */ /* Endpoint Address (OUT) */ 0x03, /* bmAttributes: Interrupt endpoint */ wMaxPacketSize, /* wMaxPacketSize: Bytes max */ 0x00, 0x20, /* bInterval: Polling Interval (32 ms) */ } ; /* RHID_ConfigDescriptor */

const uint8_t RHID_ReportDescriptor[RHID_SIZ_REPORT_DESC] = { 0x06, 0x00, 0xff, // USAGE_PAGE (Generic Desktop) 0x09, 0x01, // USAGE (Vendor Usage 1) 0xa1, 0x01, // COLLECTION (Application) 0x85, 0x01, // REPORT_ID (1) 0x09, 0x01, // USAGE (Vendor Usage 1) 0x15, 0x00, // LOGICAL_MINIMUM (0) 0x25, 0x01, // LOGICAL_MAXIMUM (1) 0x75, 0x08, // REPORT_SIZE (8) 0x95, 0x01, // REPORT_COUNT (1) 0xb1, 0x82, // FEATURE (Data,Var,Abs,Vol) 0x85, 0x01, // REPORT_ID (1) 0x09, 0x01, // USAGE (Vendor Usage 1) 0x91, 0x82, // OUTPUT (Data,Var,Abs,Vol) 0x85, 0x02, // REPORT_ID (2) 0x09, 0x02, // USAGE (Vendor Usage 2) 0x15, 0x00, // LOGICAL_MINIMUM (0) 0x25, 0x01, // LOGICAL_MAXIMUM (1) 0x75, 0x08, // REPORT_SIZE (8) 0x95, 0x01, // REPORT_COUNT (1) 0xb1, 0x82, // FEATURE (Data,Var,Abs,Vol) 0x85, 0x02, // REPORT_ID (2) 0x09, 0x02, // USAGE (Vendor Usage 2) 0x91, 0x82, // OUTPUT (Data,Var,Abs,Vol) 0x85, 0x03, // REPORT_ID (3) 0x09, 0x03, // USAGE (Vendor Usage 3) 0x15, 0x00, // LOGICAL_MINIMUM (0) 0x26, 0xff, 0x00, // LOGICAL_MAXIMUM (255) 0x75, 0x08, // REPORT_SIZE (8) 0x95, RPT3_COUNT, // REPORT_COUNT (N) 0xb1, 0x82, // FEATURE (Data,Var,Abs,Vol) 0x85, 0x03, // REPORT_ID (3) 0x09, 0x03, // USAGE (Vendor Usage 3) 0x91, 0x82, // OUTPUT (Data,Var,Abs,Vol) 0x85, 0x04, // REPORT_ID (4) 0x09, 0x04, // USAGE (Vendor Usage 4) 0x75, 0x08, // REPORT_SIZE (8) 0x95, RPT4_COUNT, // REPORT_COUNT (N) 0x81, 0x82, // INPUT (Data,Var,Abs,Vol) 0xc0 // END_COLLECTION }

Описывает протокол обмена и функционал устройства.


HID Description tool
Файл «RHID.hid» с описанным выше дескриптором для редактирования в этой утилите. 

RPT3_COUNT — размер OUTPUT буфера в байтах для передачи пакета в МК
RPT4_COUNT — размер INPUT буфера в байтах для передачи пакета в ПК

Размер любого из этих буферов не должен превышать wMaxPacketSize. Меньше — можно.
Кстати, превратить Custom HID в другой HID девайс, например, клавиатуру или джойстик можно фактически только переписав ReportDescriptor и изменив класс и подкласс устройства в дескрипторе конфигурации.

Report

Хост (ПК) и девайс (МК) обмениваются пакетами данных заранее оговоренной структуры — report. Пакетов может быть весьма много, их можно предусмотреть на все случаи жизни — например пакет с данными о каких-то событиях в устройстве, пакет с данными, которые запрашивал ПК, пакет с командой для МК. Все, что угодно. Но структура всех пакетов должна быть описана в структуре RHID_ReportDescriptor. 

ПК и МК различают репорты по ID, который идет первым байтом в пакете.

  • REPORT_ID = 1 и 2 — команда МК включить/выключить LED1/LED2. Содержит поле размером 1 бит с желаемым состоянием светодиода и поддерживает отправку как методом SET_REPORT так и методом SET_FEATURE (об этом чуть позже).
  • REPORT_ID = 3 — передает один байт в МК. Просто, чтобы показать, как передать данные МК. Мы будем передавать положение ползунка.
  • REPORT_ID = 4 — это репорт для передачи данных ПК. Возвращает информацию о текущем состоянии светодиодов, кнопок (если они есть) и возвращает переданный в репорте с ID=3 байт, чтобы показать, что данные приняты.

Если вы не до конца разобрались в том, как формировать дескриптор репортов, то просто меняйте константы RPT3_COUNT и RPT4_COUNT, устанавливая нужный размер исходящих и входящих (с точки зрения ПК) пакетов. Остальные репорты можно просто не трогать, они не помешают. Не забывайте, что первым байтом должен быть ID репорта.

https://habrahabr.ru/post/208026/

Спецификации и инструменты устройств интерфейса пользователя (HID)

Определение класса USB-устройств HID

Определение класса устройств для HID 1. 11 предназначено для дополнения спецификации USB и предоставления производителям HID информации, необходимой для создания USB-совместимых устройств. Он также указывает, как драйвер класса HID должен извлекать данные с USB-устройств. Основными и основными целями определения класса HID являются:

  • быть как можно более компактным для экономии места для данных устройства
  • разрешить программному приложению пропускать неизвестную информацию
  • быть расширяемым и надежным
  • поддержка вложенности и коллекций
  • быть самоописываемым, чтобы разрешить общие программные приложения

Таблицы использования HID

В документе Таблицы использования HID 1.4 определяются константы (использования), которые могут интерпретироваться приложением для определения цели и значения поля данных в отчете HID. Использование также используется для определения значения групп связанных элементов данных. Это достигается путем иерархического присвоения информации об использовании коллекциям.

Использование определяет цель коллекции и элементы, которые она содержит. Каждому элементу данных Input, Output, Feature и/или Collection в элементе Collection может быть назначена цель с собственным элементом Usage. Использование, назначенное коллекции, применяется к элементам в коллекции.

Документы с интегрированной таблицей использования

Документ HID Usage Tables 1.4 также включает все определения использования в виде файла JSON в виде приложения к PDF. PDF служит «единственным» источником правды.

Утвержденные HUTRR

Следующие запросы на пересмотр таблицы использования HID (HUTRR) были одобрены для реализации Комитетом HID рабочей группы USB-устройств (HID-WG). HUTRR присваивают идентификаторы и рекомендуемое значение новым использованиям, выделенным после публикации последних таблиц использования HID (в настоящее время версии 1.4). Все HUTRR будут включены в пересмотренный документ HUT в начале следующего года. Запросы на проверку интегрированной таблицы использования.

Примечание:   Создание нового варианта использования не подразумевает поддержку этого варианта использования каким-либо поставщиком хоста USB HID.

Создание новых HUTRR

Члены HID-WG могут запросить внесение изменений в таблицы использования HID (HUT), заполнив и отправив форму HUTRR ниже. Пожалуйста, обратите внимание на правила голосования и подачи заявок в конце документа.

HUTRRXXX-Template.docx28,06 КБ

HUTRRXXX-Template.txt2,15 КБ

Определение класса USB-устройств PID

Определение класса устройств для PID 1.0 предоставляет информацию для разработки устройств физического интерфейса. К таким устройствам относятся джойстики с обратной связью по усилию, рулевые колеса и т. д. Это позволяет разработчикам периферийных устройств и драйверов использовать общий набор дескрипторов отчетов HID, использования устройств и отчетов для описания характеристик устройств класса PID.

Инструменты

Waratah

Waratah — это инструмент для составления дескрипторов HID. Он предлагает высокий уровень абстракции, устраняет распространенные ошибки (по задумке) и оптимизирует дескриптор для уменьшения размера байта. Он реализует спецификацию HID 1.11, поэтому разработчикам не нужно этого делать.

Автор Microsoft, выпущен под лицензией MIT OSS.

Пакеты Nuget

Microsoft.HidTools.HidSpecification — Справочник по константам, единицам измерения и общедоступным использованиям спецификации HID

Microsoft.HidTools.HidEngine — Механизм дескриптора отчетов HID. Основной корпус Waratah.

 

Устаревшие ссылки и инструменты ư chuột máy tính, bàn phím, звуковая карта… Vi điều khiển STM32 hỗ trợ giao thức HID Device giúp chung ta có thể lập trình tạo ra các sản phẩm giong như những thiết bị đó. Bài hôm nay minh sẽ nói đến USB HID Mouse, lam thế nào để nó có thể truyền nhận dữ liu với máy tính, hay cung tìm hiểu nhéu!

Bài 17 trong Serie Học lập trình STM32 từ A tới Z

Mục Lục

USB HID là gì?

HID (viết tắt của Human Interface Device) là một tiêu chuẩn cho các thiết bị may tính được vận hanh bởi con người. Tiêu chuẩn này cho phép dễ dàng sử dụng các thiết bị này mà không cần bất kỳ phần mềm hoặc trình điều khiển bổ sung nao.

HID là một tiêu chuẩn được tạo ra nhằm đơn giản hóa qua trình cài đặt cac thiết bᩋ đầu vào thong qua tng ể cho từng thiết bị như chuột, bàn phím,… Một thiết bị tuân thủ HID bao gồm “ гои ду лью» có thể chứa tất cả cac hành động của thiết bị.

Ví dụ: Bàn phím có thể có một phím để điều chỉnh am lượng. Khi nhấn phím đó, «bộ mô tả HID» sẽ cho máy tính biết mục đích của hành động đó được lưu trữ trong các goi tin ở Ļđau và lụl ợc thực thi.

Cách giao tiếp với tất cả cac thiết bị USB HID набережная lại Bài 16 để đọc bài viết và  tài liệu USB в двух словах để có cái nhìn tổng quat nhất.

Thiet bị HID và Host (may chủ) giao tiếp với nhau qua kiểu Передача управления (до конечной точки 0). Sử dụng Ngắt tại chiều IN và tùy chọn ở chiều Out. Đặc tả của lớp HID cho phép chung có thể truyền dữ liệu ở cả tốc dộ низкая скорость, полная скорость và высокая скорость.

Класс устройства интерфейса пользователя hoạt động như thế nào?

Trước khi máy chủ có thể nói chuyện với thiết bị, nó cần biết cách sử dụng hoặc ứng dụng của thiẬnàt bị? Dữ liệu của nó được tổ chức như thế nào? và Dữ liệu thực sự đo lường điều gì?

Lấy ví dụ: Nếu thiết bị của bạn la một con chuột máy tính, cac nút bấm và tọa độ sẽ niu khiển Pointer me trìn. Sự kiện нажмите hoặc правой кнопкой мыши sẽ лам ги, прокрутите sẽ лам ги. Để tất cả cac sự kiện đó được sảy ra, trình điều khiển lớp HID phải biết rõ:

  • Тхьет бо HID kết nối sẽ điều khiển Pointer của máy tính
  • Có 3 nút trên thiết bị và khi nhong cong tưưn tưưn m của Pointer
  • Có 2 байта dữ liệu tọa độ sẽ thay đổi tọa độ của Pointer

Tất cả cac thông tin này sẽ được mô tả trong phần Дескриптор отчета. Khi trình điều khiển phân tích cú pháp của Report Descriptor nó sẽ hiểu được khi thiết bị chuột máy tính truyền dữ liệu lênà, ữữnlià ộc ứng dụng nào của máy tính. (Tương tự bạn phân luồng dữ liệu UART vậy).

Khi một thiết bị HID được kết nối, Host sẽ tạo ra 1 Request GET_DESCRIPTOR, sau khi hoàn tất qua trình. Chuột может tính và может tính sẽ giao tiep với nhau mà ko cần thêm водитель gì cả.

Cấu trúc của Дескриптор отчета

Bộ Дескриптор отчета t bị USB HID устройства Truyền hoặc nhận. Mỗi mục bắt đầu bằng tiền tố là 1 Byte quy định vai trò của mục và độ dài dữ liệu của nó.

Mỗi mục чиа лам 3 loại thẻ chính:

  • Основной : Mô tả thực tế dữ liệu truyền đi và nơi dữ liệu được sử dụng. Các thẻ Global và Local có chức năng bổ nghĩa cho Main
  • Global : Mô tả thuộc tính của tất cả cac thẻ Main phía sau nó nó, 1 hi đẻ ac xuất hiện
  • Местный : Thẻ này mô thả thuộc tính của thẻ Main phía sau nó.

Mỗi loại thẻ bao gồm một số loại chính như:

Với Основной предмет:

  • ền từ thiết bị lên host như sự kiện nhấn nút, dữ liu cảm bien, dữ liệu của nhà phát hành muốn gửi
  • Выход : Mô tả dữ liệu từ Host truyền về thiết bị như điều khiển led, động cơ ….
  • Характеристика : Mô tả  dữ liệu được truyền đi được sử đụng để cấu hình cài đặt thiết bợết tốc độ nháy của led, tốc độ động cơ …
  • Collection và End Collection : Mỗi thiết bị HID phải có 1 bộ sưu tập ứng dụng (сбор приложений), để trình xử lý có thể biết được dữ liệu đang sử dụng trong ứng dụng nà. Ví dụ: 1 thiết bị có 3 tín năng chuột, bàn phím và nút nguồn thì phai có 3 Application Collection để phân biệt du liu gửi đi và trả về.

Với Global Item:

  • Страница использования : Mô tả danh mục cao nhất của thiết bị như Общие элементы управления рабочим столом bàn), контроль игры, điện thoại ….
  • Логический минимум : Giá trị số nguyên nhỏ nhất của Основной элемент
  • Логический максимум : Giá trị số 0007 Размер отчета: Kích thước của Main Item (tính theo Bit)
  • Количество отчетов : Số lượng Основной элемент

Với Local Item:

  • Usage : Mô tả nhỏ hơn về lớp Usage Page: Ví dụ: như Usage Page là Универсальные элементы управления рабочим столом thì Usage control có th017 .

Mỗi thẻ mục sẽ được phân loại tương ứng với 1 mã từ 0–255 (1 байт).

Cấu trúc của Дескриптор отчета như sau:

Lấy ví dụ về đỏ cấu hình 3 nút nhấn của chuột, phần khoanh xanh cấu hình tọa độ của чут.

Phần Usage Page và Usage xác định kiểu thiết bị đó là Mouse và thuộc may tính để bàn (Generic Desktop).

Cac bạn có thể tham khảo link này để phân tích 1 RD: https://www.crifan.com/files/doc/docbook/usb_hid/release/webhelp/hid_report_example_analysis.html USB HID

Phần mềm gửi và nhận dữ liệu HID-терминал:

Ссылка для загрузки: HID-терминал

Инструменты giải mã дескриптор отчета.

http://eleccelerator.com/usbdescreqparser/

Cách biến Kit Bluepill thành chuột may tính với USB HID

Để sử dụng kit stm32f103c8t6 Bluepill thành chuột may tính chung phant ta cần ệu truyền lên máy tính của 1 con chuột.

Cấu trúc dữ liệu truyền lên bao gồm:

  • 3 phím bấm: Right, Left, Scroll với 2 mức logic 0 và 1
  • 2 bien ới mức logic từ -127 đến 127

Chung ta sẽ sử dụng Joystick đọc ADC 2 kenh X Y và nút nhấn trên nó sẽ tương ứng với phím Щелкните левой кнопкой мыши.

Mỗi khi có sử kiện nhấn nut hoặc di chuyển, chung ta sử gửi dữ liệu theo goi thong qua USB HID.

Lập trình STM32 USB HID như 1 con chuột (Mouse) điều khiển con trỏ may tính

Trong bài này này mình sẽ sử dụng AgiDC Joystick đểụng thị trục X, Y. Và nút nhấn trên Джойстик biểu thị cho Left_Button трен чуут может быть.

Cấu hình STM32 USB HID trên Cube MX

Mở CubeMx, чип STM32f103C8T6, trong System Core

SYS chọn Debug Serial Wire: cho phép debug qua stlink

 

RCC chọn HSE: Thạch anh ngoạiGPIO chọn PA2 là nút nhấn Pull Up

 

Trong Tab Analog ta sẽ cẽu hình ADC1 để 0 đọc giá n 2 kenh In1 và In2. Bật chế độ сканирование và cont. Nhớ chọn Num of Con là 2 và chỉnh cac chanel về đúng 0 và 1Add DMA từ ADC về Memory, chế độ Circular và Width là Half Word

Thiet lập USB

Chộđchn USB Device (Full Speed) ọn HID trong Class của Middleware

Thiet lập Clock cho USB là 48Mhz (Bắt buộc)

Đặt tên bài học rồi Gen code như tất cả các bài trước

Lập trình STM32 Open 900 USB HID trên ằng Keil C.

Đầu tiên chung ta sẽ thêm thư viện Hid vào main để dễ dàng thao tác bằng lệnh #include «usbd_hid.h»

Sau đó extern biến chứa giá trị cài đặt của USB vào main

4 hiểu HID_MOUSE_ReportDesc

Khi chọn chế độ USB HID, CubeMX đã mặc định chọn thiet bị HID đó là chuột может быть. Chúng ta cùng phân tích Дескриптор отчета mà CubeMx đã cho sẵn nhé. Các bạn vào USBD_HID.c và tìm dòng code như sau:

Копировать đoạn dữ liệu và paste vào công cụ phân tích minh vừa mới nêu trên: http://eleccelerator.com/usbdescreqparser/

Kảph phât ph ан тик сэ нхо сау:

 0x05, 0x01, / / Страница использования (общие элементы управления рабочего стола)
0x09, 0x02, // Использование (мышь)
0xA1, 0x01, // Коллекция (приложение)
0x09, 0x01, // Использование (указатель)
0xA1, 0x00, // Коллекция (физическая)
0x05, 0x09, // Страница использования (кнопка)
0x19, 0x01, // Минимум использования (0x01)
0x29, 0x03, // Максимальное использование (0x03)
0x15, 0x00, // Логический минимум (0)
0x25, 0x01, // Логический максимум (1)
0x95, 0x03, // Количество отчетов (3)
0x75, 0x01, // Размер отчета (1)
0x81, 0x02, // Ввод (данные, переменная, абс, без переноса, линейный, предпочтительное состояние, без нулевой позиции)
0x95, 0x01, // Количество отчетов (1)
0x75, 0x05, // Размер отчета (5)
0x81, 0x01, // Ввод (Const, Array, Abs, No Wrap, Linear, Preferred State, No Null Position)
0x05, 0x01, // Страница использования (общие элементы управления рабочего стола)
0x09, 0x30, // Использование (X)
0x09, 0x31, // Использование (Y)
0x09, 0x38, // Использование (Колесо)
0x15, 0x81, // Логический минимум (-127)
0x25, 0x7F, // Логический максимум (127)
0x75, 0x08, // Размер отчета (8)
0x95, 0x03, // Количество отчетов (3)
0x81, 0x06, // Ввод (данные, переменная, относительная, без переноса, линейный, предпочтительное состояние, без нулевой позиции)
0xC0, // Конец коллекции
0x09, 0x3C, // Использование (Пробуждение движением)
0x05, 0xFF, // страница использования (зарезервировано 0xFF)
0x09, 0x01, // Использование (0x01)
0x15, 0x00, // Логический минимум (0)
0x25, 0x01, // Логический максимум (1)
0x75, 0x01, // Размер отчета (1)
0x95, 0x02, // Количество отчетов (2)
0xB1, 0x22, // Функция (данные, переменная, абс, без переноса, линейная, без предпочтительного состояния, без нулевой позиции, энергонезависимая)
0x75, 0x06, // Размер отчета (6)
0x95, 0x01, // Количество отчетов (1)
0xB1, 0x01, // Функция (Const, Array, Abs, No Wrap, Linear, Preferred State, No Null Position, энергонезависимая)
0xC0, // Конец коллекции
// 74 байта
 

Ta thấy rằng trình tự cac byte gửi như sau:

1 байт nút nhấn -> 3 байта X, Y, Whell -> 2 байта Wakeup -> 1 байт kết thúc

ốốốyốy byte chỉ cần đếm trong các oạn Количество отчетов theo thứ tự từ trên xuống dưới. Còn ý nghĩa của cac từ mình đã giải thích ben trên rồi nhé.

Vậy nên chúng ta sẽ tạo 1 mảng chứa giá trị của cac byte gửi lên với 1byte kết thúc là mặc định nênà ko cần th. Минь то монг mouse_report[5], và mảng lưu 2 giá trị ADC1 truyền qua DMA

Trước Main ta sẽlập trình như sau

Tạo một ham tên là map để chuyển đổi giá trì như 9, thị tị 6 tị tị 127

 

Tạo ham đọc giá trị nút nhấn, thực hiện chuyển đổi và ghi vào mảng mouse_report

Trước While cho bắt đầu chuyển đổi ADC DMA, Trong While ta đọc giá trị của mouse và gửi qua cổng USB HID

Kết nối và chạy thử USB HID

Nhấn F7 để Build và F8 để nạp Code vào Kit.

Kết nối Джойстик vào Kit theo hướng dẫn:

5V —> 3.3V

GND —> GND

300-

9003> 0005

VRY —> PA1

SW —> PA2

Каждый день Micro USB vào mạch và cắm đầu còn lại vào may tính. Mở Manager ra xem bạn sẽ thấy thêm 1 thiết bị Мышь

Mở Paint Sử dụng Джойстик điều khiển thử.

Ta thấy rằng chuột chạy qua nhanh, không thể kiem xoát và khi khong di chuyển chuột cung vẫn tự chạy. Lý do đó là điểm cân bằng của Joystick không giung lý thuyết đó la giá trị 2048.

Và chuột chạy qua nhanh do mạch sẽ gủi cac giá trị từ -127 đến 127 cực nhanh khi giu Джойстик, cac tọa độ này khiẙt chun chu нханх. Vậy làm ntn để hiệu chỉnh hai thứ đó

Tinh chỉnh code (Calibration)

Rút dây cắm HID từ chuột ra, chạy chu debug.

Trong debug ta add giá trị ADC_Val vào Watch 1 và nhấn chạy chương trình. Chung ta thấy rằng: giá trị can bằng khac nhau dẫn tới chuột luôn luon di chuyển.

Sửa lại trong ham Get Action, như sau:

Sửa -127, 127 thành -10 và 10 sẽ giúp chuột di chuyển chậm hơn.

Nạp và chạy thử kết quả

Kết

STM32 USB HID điện thoi, геймпад một cách đơn giản nhất. Về cơ bản tất cả các device sử dụng USB HID đều làm việc giống nhau, sự khác nhau của chúng là cấu trúc gói tin truyền và đích đến sẽ được định nghĩa hết trong Report Descriptor.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *