{"id":335240,"date":"2022-07-02T03:00:06","date_gmt":"2022-07-02T03:00:06","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=335240"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=335240","title":{"rendered":"<span>STM32 Modular USB Composite device<\/span>"},"content":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/f6c\/b21\/f4c\/f6cb21f4c086b6de685292bc2025740b.png\" width=\"1252\" height=\"396\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/f6c\/b21\/f4c\/f6cb21f4c086b6de685292bc2025740b.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u041f\u0440\u043e\u0435\u043a\u0442 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435\u043c \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043d\u0430 \u0425\u0430\u0431\u0440\u0435 &#8212; <a href=\"https:\/\/habr.com\/ru\/post\/335018\/\" rel=\"noopener noreferrer nofollow\">CDC+MSC USB Composite Device \u043d\u0430 STM32 HAL<\/a> \u0438 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0442 \u043a\u0430\u043a \u043d\u0430 STM32 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442 \u0441 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 USB \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438, \u0441 \u0447\u0438\u0442\u0430\u0435\u043c\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0442\u0438\u043f\u043e\u0432\u044b\u0435 \u043c\u043e\u0434\u0443\u043b\u0438. \u041a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d \u043f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u0438 <strong>HID<\/strong> + <strong>CDC UART<\/strong> + <strong>CDC<\/strong>, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u043d\u043e \u043a\u0430\u043a \u044d\u0442\u043e\u0442 \u043f\u0440\u043e\u0435\u043a\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u0438\u0442\u044c \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430\u043c\u0438.<\/p>\n<h2>\u041c\u043e\u0442\u0438\u0432\u0430\u0446\u0438\u044f<\/h2>\n<p>Once upon a time\u2026 \u041f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u0437\u0430\u0434\u0430\u0447\u0430 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u043e\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0441 USB Serial \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0435\u0440\u043e\u043c \u043d\u0430 \u0431\u043e\u0440\u0442\u0443 \u043f\u043b\u044e\u0441 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u0444-\u0446\u0438\u0439. \u041e\u043a, \u0435\u0441\u0442\u044c \u0433\u043e\u0442\u043e\u0432\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0434\u043b\u044f STM32. \u0417\u0430\u0442\u0435\u043c \u0430\u043f\u043f\u0435\u0442\u0438\u0442\u044b \u0441\u0442\u0430\u043b\u0438 \u0440\u0430\u0441\u0442\u0438 \u0438 \u00ab\u043d\u0435\u043c\u043d\u043e\u0433\u043e\u00bb \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u0444-\u0446\u0438\u0439 \u043f\u0435\u0440\u0435\u0440\u0430\u0441\u043b\u043e \u0432 \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u043e\u0435 USB HID \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e. \u041e\u043a, \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 HID \u0442\u043e\u0436\u0435 \u0435\u0441\u0442\u044c, \u043d\u043e \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u044d\u0442\u043e \u043d\u0435 \u0442\u0430\u043a\u0430\u044f \u0443\u0436 \u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u0434\u0432\u0430 USB \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u043d\u0430 \u043e\u0434\u043d\u043e\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0435. \u041d\u0430 \u0443\u0434\u0430\u0447\u0443, \u043d\u0430 \u0425\u0430\u0431\u0440\u0435 \u043d\u0430\u0448\u043b\u0430\u0441\u044c \u0441\u0442\u0430\u0442\u044c\u044f \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043a\u0430\u043a \u0440\u0430\u0437 \u0438 \u0440\u0435\u0448\u0430\u043b\u0430 \u043f\u043e\u0434\u043e\u0431\u043d\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443 &#8212; CDC+MSC USB Composite Device \u043d\u0430 STM32 HAL (\u0441\u0441\u044b\u043b\u043a\u0430 \u0432\u044b\u0448\u0435).\u00a0\u0421\u043f\u0430\u0441\u0438\u0431\u043e \u0430\u0432\u0442\u043e\u0440\u0443 \u0437\u0430 \u0435\u0433\u043e \u0442\u0440\u0443\u0434! \u0412\u0441\u0435 \u0437\u0430\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e. \u041e\u0434\u043d\u0430\u043a\u043e, \u0430\u043f\u043f\u0435\u0442\u0438\u0442\u044b \u0432\u0441\u0435 \u0440\u043e\u0441\u043b\u0438 \u0438 \u0440\u043e\u0441\u043b\u0438 \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432 \u0432 \u0442\u043e\u043c \u0436\u0435 \u0441\u0442\u0438\u043b\u0435 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u043b\u043e \u043a\u043e\u0434 \u0432 \u043d\u0435\u0447\u0442\u043e \u0443\u0436\u0430\u0441\u043d\u043e\u0435 \u0438 \u043d\u0435 \u0447\u0438\u0442\u0430\u0435\u043c\u043e\u0435. \u0422\u043e, \u0447\u0442\u043e \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e \u0441\u043c\u043e\u0442\u0440\u0435\u043b\u043e\u0441\u044c \u0434\u043b\u044f \u0434\u0432\u0443\u0445 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432 \u0443\u0436\u0435 \u0434\u043b\u044f \u0442\u0440\u0435\u0445, \u043f\u0440\u0438\u0447\u0435\u043c \u0434\u0432\u0430 \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0431\u044b\u043b\u0438 \u043e\u0434\u043d\u043e\u0442\u0438\u043f\u043d\u044b\u043c\u0438, \u0441\u043c\u043e\u0442\u0440\u0435\u043b\u043e\u0441\u044c \u0441\u043e\u0432\u0441\u0435\u043c \u043f\u043b\u043e\u0445\u043e. \u0410 \u043d\u0430 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0435 \u0443 \u0448\u0435\u0444\u0430 \u043f\u043e\u044f\u0432\u043b\u044f\u043b\u0438\u0441\u044c \u0432\u0441\u0435 \u043d\u043e\u0432\u044b\u0435 \u0438 \u043d\u043e\u0432\u044b\u0435 \u0444\u0430\u043d\u0442\u0430\u0437\u0438\u0438 \u043d\u0430 \u0442\u0435\u043c\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u0430 \u00ab\u0441\u0442\u043c\u043a\u0438\u00bb. \u0422\u0430\u043a\u0436\u0435, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b \u0432\u0441\u0435 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u043b\u0441\u044f \u0438 \u0435\u0433\u043e \u043e\u0442\u043b\u0430\u0434\u043a\u0430 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b\u0430\u0441\u044c \u0441\u043b\u043e\u0436\u043d\u0435\u0435 \u0438 \u0441\u043b\u043e\u0436\u043d\u0435\u0435, \u0442\u043e \u043d\u0430\u0437\u0440\u0435\u043b \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u0442\u0438\u043f USB Serial \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0434\u043b\u044f \u0432\u044b\u0432\u043e\u0434\u0430 \u043f\u0435\u0447\u0430\u0442\u0438 \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0445 \u043a\u043e\u043c\u0430\u043d\u0434 \u0441 \u043a\u043e\u043d\u0441\u043e\u043b\u0438 \u043d\u0430 \u0441\u0430\u043c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440. \u0422\u0430\u043a \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f Internal Control (ICTRL). \u0412 \u043e\u0431\u0449\u0435\u043c &#8212; \u043d\u0430\u0431\u043e\u043b\u0435\u043b\u043e \u0438 \u0431\u044b\u043b\u0430 \u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430 \u043d\u043e\u0432\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430&#8230;<\/p>\n<h2>\u0417\u0430\u0434\u0430\u0447\u0430<\/h2>\n<p>\u041d\u0430 \u0431\u0430\u0437\u0435 ST \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043a\u0430\u0440\u043a\u0430\u0441 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 USB HAL, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u0431\u043b\u043e\u043a\u0430\u043c\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438\/\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u043f\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438, \u0431\u0435\u0437 \u043e\u0441\u043e\u0431\u044b\u0445 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0432 \u043a\u043e\u0434\u0435 \u0441\u0430\u043c\u043e\u0433\u043e HAL. \u0412 \u0438\u0434\u0435\u0430\u043b\u0435, \u0434\u043b\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u0430 \u0432 \u043f\u0440\u043e\u0435\u043a\u0442 \u0434\u043e\u043b\u0436\u0435\u043d \u043b\u0438\u043d\u043a\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u043c\u043e\u0434\u0443\u043b\u044c, \u043f\u043b\u044e\u0441 \u043f\u0430\u0440\u0430 \u0441\u0442\u0440\u043e\u043a \u0432 main \u2013 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0438 \u0432\u044b\u0437\u043e\u0432\u044b \u0432 \u0433\u043b\u0430\u0432\u043d\u043e\u043c \u0446\u0438\u043a\u043b\u0435.<\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430, \u0442\u0430\u043a\u0438\u043c\u0438 \u0431\u043b\u043e\u043a\u0430\u043c\u0438 \u0431\u044b\u043b\u0438 \u0432\u044b\u0431\u0440\u0430\u043d\u044b \u0434\u0432\u0430 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0447\u0430\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445 \u0442\u0438\u043f\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 \u2013 HID \u0438 USB Serial \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0435\u0440. \u041f\u0440\u0438\u0447\u0435\u043c \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0435\u0440 \u043c\u043e\u0433 \u0431\u044b\u0442\u044c \u043a\u0430\u043a UART, \u0442\u0430\u043a \u0438 I2C, SPI, 1Wire. ICTRL \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u043b\u0441\u044f \u0432\u043e \u0432\u0441\u0435\u0445 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u0445 \u0443\u0436\u0435 \u043f\u043e-\u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e.<\/p>\n<h2>\u0414\u043b\u044f \u043a\u043e\u0433\u043e \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d \u043f\u0440\u043e\u0435\u043a\u0442<\/h2>\n<p>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043d\u0438\u0436\u0435 \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0435\u0442, \u0447\u0442\u043e \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u043b \u0438 \u043e\u0441\u043e\u0437\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u044e \u00abCDC+MSC USB Composite Device \u043d\u0430 STM32 HAL\u00bb, \u0433\u0434\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 USB HAL \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043e\u0442 ST \u043e\u043f\u0438\u0441\u0430\u043d\u0430 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e. \u0414\u0430\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u043f\u043e\u0441\u0432\u044f\u0449\u0435\u043d \u0438\u043c\u0435\u043d\u043d\u043e \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0443 \u043e\u0442 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0439 ST \u043a \u0431\u043e\u043b\u0435\u0435 \u043c\u043e\u0434\u0443\u043b\u044c\u043d\u043e\u043c\u0443 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0443 \u0431\u0435\u0437 \u0440\u0430\u0437\u0431\u043e\u0440\u0430 \u043e\u0441\u043d\u043e\u0432 \u0440\u0430\u0431\u043e\u0442\u044b USB. \u0422\u0430\u043a\u0436\u0435 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0443 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044f \u0440\u043e\u0434\u043d\u043e\u0439 \u044f\u0437\u044b\u043a \u0421 \u0438\u043b\u0438 Assembler \u0438 \u0432 \u0441\u0442\u0440\u043e\u043a\u0430\u0445 \u043a\u043e\u0434\u0430 \u0447\u0438\u0442\u0430\u044e\u0442\u0441\u044f \u043d\u0435 \u0431\u0443\u043a\u0432\u044b, \u0430 \u0431\u043b\u043e\u043a\u0438 \u0438\u0445 \u0441\u0432\u044f\u0437\u0438 \u0438 \u0432\u0437\u0430\u0438\u043c\u043e\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438. \u0414\u043b\u044f \u0442\u0435\u0445 \u0443 \u043a\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043d\u0430 \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0435 \u044d\u0442\u043e \u0433\u0430\u043b\u043e\u0447\u043a\u0438 \u0432 \u0430\u0432\u0442\u043e\u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0435 \u0438\u043b\u0438 \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u043f\u0438\u0441\u044c\/\u0447\u0442\u0435\u043d\u0438\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432, \u0442\u0435\u043c \u0431\u0443\u0434\u0435\u0442 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e. \u041d\u043e, \u043a\u0430\u043a \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u0441\u044f, \u0447\u0442\u043e \u043d\u0430\u0441 \u043d\u0435 \u0443\u0431\u0438\u0432\u0430\u0435\u0442, \u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 \u0441\u0438\u043b\u044c\u043d\u0435\u0435.<\/p>\n<h2>\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435<\/h2>\n<p>\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0431\u044b\u043b\u0430 \u0432\u044b\u0431\u0440\u0430\u043d\u0430 \u043e\u0434\u043d\u0430 \u0438\u0437 \u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0439 \u2013 USB UART \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0435\u0440 + HID \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0438 \u0435\u0449\u0435 \u043e\u0434\u043d\u043e USB Serial \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u0430\u043c\u0438\u043c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u043e\u043c \u0438 \u043e\u0442\u043b\u0430\u0434\u043e\u0447\u043d\u043e\u0439 \u043f\u0435\u0447\u0430\u0442\u0438. \u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430 HID \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0438 ICTRL \u0431\u044b\u043b\u0430 \u0441\u043e\u0437\u043d\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u043f\u0443\u0449\u0435\u043d\u0430 \u0438 \u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u0442\u043e\u043b\u044c\u043a\u043e \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b, \u0442\u0430\u043a \u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043d\u0430 \u0440\u0430\u0441\u0441\u0430\u0434\u0443 \u0438 \u0447\u0442\u043e\u0431 \u043d\u0435 \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u043a\u043e\u0434 \u043f\u0440\u0438 \u0447\u0442\u0435\u043d\u0438\u0438.<\/p>\n<h2>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 &#8212; USB Composite<\/h2>\n<p>UBS Composite \u2013 USB \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 3 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432, \u0433\u0434\u0435 \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441, \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043d\u0430 \u0445\u043e\u0441\u0442 \u0441\u0438\u0441\u0442\u0435\u043c\u0435, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e\u043c.<\/p>\n<p>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u044b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430:<\/p>\n<ol>\n<li>\n<p>CDC UART<\/p>\n<\/li>\n<li>\n<p>CDC ICTRL <\/p>\n<\/li>\n<li>\n<p>HID<\/p>\n<\/li>\n<\/ol>\n<h3>CDC <\/h3>\n<p>CDC (Communication Device Class) \u2013 \u044d\u0442\u043e \u043a\u043b\u0430\u0441\u0441 USB \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 \u043e\u0431\u0449\u0438\u0439 \u0434\u043b\u044f CDC UART \u0438 CDC ICTRL. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f PSTN120 \u043f\u0440\u043e\u0444\u0438\u043b\u044c \u043a\u043b\u0430\u0441\u0441\u0430 USB CDC. \u0415\u0441\u043b\u0438 \u043f\u043e-\u043f\u0440\u043e\u0441\u0442\u043e\u043c\u0443, \u0442\u043e \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u0445\u043e\u0441\u0442 \u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u044d\u0442\u043e \u043e\u0431\u044b\u0447\u043d\u044b\u0439 USB Serial \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0435\u0440 \u0438 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u043e\u0432. \u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 CDC \u043d\u0430 usb.org:<br \/><a href=\"https:\/\/www.usb.org\/document-library\/class-definitions-communication-devices-12\" rel=\"noopener noreferrer nofollow\">https:\/\/www.usb.org\/document-library\/class-definitions-communication-devices-12<\/a><br \/>\u0423\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u0438 \u0444\u043e\u0440\u043c\u0430\u0442\u0430 \u043f\u043e\u0441\u044b\u043b\u043a\u0438 (\u0441\u0442\u0430\u0440\u0442, \u0441\u0442\u043e\u043f \u0431\u0438\u0442\u044b, \u0431\u0438\u0442\u044b \u0447\u0435\u0442\u043d\u043e\u0441\u0442\u0438 \u0438 \u0442.\u0434.). \u0412 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0442\u0438\u043f\u0430 \u043d\u0438\u0436\u0435\u0441\u0442\u043e\u044f\u0449\u0435\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 (downward facing interface, aka DFI) \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c  \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0444-\u0446\u0438\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0442\u0430\u043a\u0438\u0435 \u043a\u0430\u043a UART, SPI \u0438\u043b\u0438 I2C \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0435\u0440. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043e \u0434\u0432\u0435 \u0440\u0430\u0437\u043d\u043e\u0432\u0438\u0434\u043d\u043e\u0441\u0442\u0438 CDC \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 \u2013 CDC UART \u0438 CDC ICTRL.<\/p>\n<h4>CDC UART   <\/h4>\n<p>\u0422\u0440\u0430\u043d\u0441\u043b\u0438\u0440\u0443\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0447\u0435\u0440\u0435\u0437 \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u044b\u0439 UART \u043f\u043e\u0440\u0442 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430 \u0432 USB CDC \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0438 \u043e\u0431\u0440\u0430\u0442\u043d\u043e. \u0422.\u0435. \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043a\u0430\u043a \u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u044b\u0439 USB UART \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0435\u0440.<\/p>\n<h4>CDC ICTRL<\/h4>\n<p>\u0423\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u043d\u0435 \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0441 \u0432\u043d\u0435\u0448\u043d\u0438\u043c\u0438 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430\u043c\u0438, \u0430 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0438 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e. \u041c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u043b\u044f \u0432\u044b\u0432\u043e\u0434\u0430 \u043e\u0442\u043b\u0430\u0434\u043e\u0447\u043d\u043e\u0439 \u043f\u0435\u0447\u0430\u0442\u0438 \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0445 \u043a\u043e\u043c\u0430\u043d\u0434 \u043d\u0430 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440.<\/p>\n<h3>HID <\/h3>\n<p>\u041d\u0435 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0435 (vendor specific) USB HID \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442 \u043d\u0430 \u0445\u043e\u0441\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0441\u043e \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0433\u043e \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u043d\u043e\u0433\u043e \u0434\u0430\u0442\u0447\u0438\u043a\u0430 \u0438 \u043d\u0430\u043f\u0440\u044f\u0436\u0435\u043d\u0438\u0435 \u043f\u0438\u0442\u0430\u043d\u0438\u044f \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430. \u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 HID \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430: <br \/><a href=\"https:\/\/usb.org\/sites\/default\/files\/hid1_11.pdf\" rel=\"noopener noreferrer nofollow\">usb.org\/sites\/default\/files\/hid1_11.pdf<\/a><\/p>\n<p>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b HID \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 (<code>USBD_HidDesc<\/code>) \u0438 \u0444\u043e\u0440\u043c\u0430\u0442\u0430 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 (<code>Dev0_HID_ReportDesc<\/code> hid report descriptor) \u043e\u0442\u0441\u044b\u043b\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0445\u043e\u0441\u0442 \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 HID \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430.<\/p>\n<h2>\u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u0434\u0430\u043d\u043d\u044b\u0445, \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0438 \u0438\u0445 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438  <\/h2>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/3bd\/1aa\/091\/3bd1aa09116350855557744c426edc7f.png\" alt=\"\u0421\u0432\u044f\u0437\u044c \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0438 \u0438\u0445 \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u044f\" title=\"\u0421\u0432\u044f\u0437\u044c \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0438 \u0438\u0445 \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u044f\" width=\"2466\" height=\"2140\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/3bd\/1aa\/091\/3bd1aa09116350855557744c426edc7f.png\"\/><figcaption>\u0421\u0432\u044f\u0437\u044c \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0438 \u0438\u0445 \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u044f<\/figcaption><\/figure>\n<hr\/>\n<p><code>USBD_Handle hUsbDevice<\/code> &#8212; USB \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0432\u0435\u0440\u0445\u043d\u0435\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f (aka Middleware)   <\/p>\n<p>\u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043e\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0445 \u0442\u043e\u0447\u0435\u043a (end points ep_in\/ep_out), \u0441\u0442\u0430\u0442\u0443\u0441\u0430, \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 (<code>pDesc<\/code>), \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u043d\u0430 \u0444-\u0446\u0438\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 (<code>pClass<\/code>), \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 USB \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e HAL \u0443\u0440\u043e\u0432\u043d\u044f (<code>pPCDHandle<\/code>), \u0430 \u0442\u0430\u043a\u0436\u0435 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u043d\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b (<code>intf<\/code>).<\/p>\n<details class=\"spoiler\">\n<summary>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0442\u0438\u043f\u0430 USBD_Handle<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">typedef struct _USBD_Handle {   uint8_t              id;   uint32_t             dev_config;   uint32_t             dev_default_config;   uint32_t             dev_config_status;    USBD_Speed           dev_speed;   USBD_Endpoint        ep_in[16];   USBD_Endpoint        ep_out[16];   __IO uint32_t        ep0_state;   uint32_t             ep0_data_len;   __IO uint8_t         dev_state;   __IO uint8_t         dev_old_state;   uint8_t              dev_address;   uint8_t              dev_connection_status;   uint8_t              dev_test_mode;   uint32_t             dev_remote_wakeup;   USBD_SetupReq        request;   USBD_Descriptors     *pDesc;   USBD_Class           *pClass;   uint8_t              ConfIdx;      USBD_ConfigDesc      *config_desc;   usbd_intf_t          intf[COMPOSITE_INTF_NUM];      PCD_HandleTypeDef    *pPCDHandle;    } USBD_Handle; <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0430 \u043d\u0430 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u043a\u043e\u0434\u0435 CubeIDE, \u043e\u0434\u043d\u0430\u043a\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f. \u041f\u0435\u0440\u0432\u043e\u0435 &#8212; \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0438 \u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440\u044b \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430, \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432, \u043e\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0445 \u0442\u043e\u0447\u0435\u043a \u0438 \u0442.\u043f. \u0412 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u043c \u043a\u043e\u0434\u0435 \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u044d\u0442\u043e \u0431\u0430\u0439\u0442\u043e\u0432\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 (\u0441\u043f\u0430\u0441\u0438\u0431\u043e \u0445\u043e\u0442\u044c \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u044b \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043f\u043e\u043b\u0435\u0439 \u0432\u0441\u0442\u0430\u0432\u0438\u043b\u0438), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0438 \u043b\u044e\u0431\u043e\u043c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u043d\u0430\u0434\u043e \u0437\u0430\u043d\u043e\u0432\u043e \u0440\u0443\u043a\u0430\u043c\u0438 \u043f\u0435\u0440\u0435\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u0438 \u043f\u043e \u0441\u0442\u043e \u0440\u0430\u0437 \u043f\u0435\u0440\u0435\u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c. \u0412 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u043c \u043a\u043e\u0434\u0435 \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0445 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043e\u043c \u043f\u043e\u043b\u0435\u0439 \u0438 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u043c \u043d\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439, \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u0434\u043e\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440\u0430\u043c\u0438 \u043f\u043e \u043c\u0435\u0440\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u043d\u0438\u0436\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0441 \u043f\u043e\u043b\u044f\u043c\u0438 \u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438 \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043e\u043c USB.<\/p>\n<details class=\"spoiler\">\n<summary>\u0422\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 (USBD_ConfigDesc)<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">typedef struct {     uint8_t   bLength;              \/* Size of this descriptor in bytes. 0x09 *\/     uint8_t   bDescriptorType;      \/* Configuration (assigned by USB). 0x02 *\/     uint16_t  wTotalLength;         \/* Total length of data returned for this configuration. *\/     uint8_t   bNumInterfaces;       \/* Number of interfaces supported by this configuration. *\/     uint8_t   bConfigurationValue;  \/* Value to use as an argument to Set Configuration to                                        select this configuration.*\/     uint8_t   iConfiguration;       \/* Index of string descriptor describing this configuration.                                        In this case there is none*\/     uint8_t   bmAttributes;         \/* Configuration characteristics *\/     uint8_t   bMaxPower;            \/* Maximum power consumption of USB device from bus                                        in this specific configuration when the device is fully                                        operational. Expressed in 2 mA units *\/     uint8_t   data[0];              \/* Place holder for other descriptors *\/ } USBD_ConfigDesc; <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u0410 \u0442\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f HID \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440\u0430 \u0441 \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438 \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440\u0430\u043c\u0438.<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">\/************** Descriptor of CUSTOM HID interface ****************\/ USBD_Dev0_HID_ConfigDesc dev0_hid_config_desc_template = {      .interface_desc = {         .bLength            = sizeof(USBD_InterfaceDesc),         .bDescriptorType    = USB_DESC_TYPE_INTERFACE,         .bInterfaceNumber   = TBD,                      \/* Initialized at HID_Register() *\/         .bAlternateSetting  = 0x00,         .bNumEndpoints      = 0x02,         .bInterfaceClass    = 0x03,                     \/* USB Class HID = 3 *\/         .bInterfaceSubClass = 0x00,                     \/* bInterfaceSubClass : 1=BOOT, 0=no boot*\/         .nInterfaceProtocol = 0x00,                     \/* nInterfaceProtocol : 0=none, 1=keyb, 2=mouse*\/         .iInterface         = 0x00,     },      .hid_desc = {         .bLength              = sizeof(USBD_HidDesc),         .bDescriptorType      = HID_DESCRIPTOR_TYPE,    \/* bDescriptorType: HID                     *\/         .bcdHID               = 0x0111,                 \/* HID Class Spec release number 1.11       *\/         .bCountryCode         = 0x00,                   \/* 0x17 *\/         .bNumDescriptors      = 0x01,                   \/* Number of class descriptors to follow    *\/         .bRepDescriptorType   = HID_REPORT_DESC,        \/* bDescriptorType                          *\/         .wRepDescriptorLength = host2usb_u16(sizeof(Dev0_HID_ReportDesc)),                                                          \/* wItemLength: Tot len of Report descriptor*\/     },      .ep_in = {         .bLength             = sizeof(USBD_EpDesc),      \/* bLength: Endpoint Descriptor size *\/         .bDescriptorType     = USB_DESC_TYPE_ENDPOINT,   \/* bDescriptorType:                  *\/         .bEndpointAddress    = TBD,                      \/* Initialized at HID_Register       *\/         .bmAttributes        = 0x03,                     \/* bmAttributes: Interrupt endpoint  *\/         .wMaxPacketSize      = host2usb_u16(sizeof(dev0_in_report_t)), \/* wMaxPacketSize: 2 Byte max *\/         .bInterval           = DEV0_HID_FS_BINTERVAL,    \/* bInterval: Polling Interval       *\/     },      .ep_out = {         .bLength             = sizeof(USBD_EpDesc),      \/* bLength: Endpoint Descriptor size *\/         .bDescriptorType     = USB_DESC_TYPE_ENDPOINT,   \/* bDescriptorType:                  *\/         .bEndpointAddress    = TBD,                      \/* Initialized at HID_Register       *\/         .bmAttributes        = 0x03,                     \/* bmAttributes: Interrupt endpoint  *\/         .wMaxPacketSize      = host2usb_u16(sizeof(dev0_out_report_t)), \/* wMaxPacketSize: 2 Byte max *\/         .bInterval           = DEV0_HID_FS_BINTERVAL,    \/* bInterval: Polling Interval       *\/     } }; <\/code><\/pre>\n<p>\u0413\u0434\u0435 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u043e\u043b\u044f \u0432 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u201cTBD\u201d \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u043e\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0433\u043e \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440\u0430 \u0432 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435 \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430.<\/p>\n<\/div>\n<\/details>\n<p>\u0412\u0442\u043e\u0440\u043e\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u043e\u0442\u043b\u0438\u0447\u0438\u0435, \u0440\u0430\u0434\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0432\u0441\u0451 \u0438 \u0437\u0430\u0442\u0435\u0432\u0430\u043b\u043e\u0441\u044c &#8212; \u044d\u0442\u043e \u043c\u0430\u0441\u0441\u0438\u0432 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432 \u0432 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435 USBD_Handle: <\/p>\n<pre><code class=\"cpp\">usbd_intf_t        intf[COMPOSITE_INTF_NUM];<\/code><\/pre>\n<p>\u0413\u0434\u0435 \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u044d\u0442\u043e \u043e\u0434\u043d\u043e \u0438\u0437 \u043f\u043e\u0434\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 \u2013 CDC UART, CDC ICTRL \u0438\u043b\u0438 HID. <\/p>\n<p>\u041a\u0430\u0436\u0434\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0432 \u0441\u0435\u0431\u0435 \u043d\u0430\u0431\u043e\u0440 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439 \u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0445 USB \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 (callbacks), \u0430 \u0442\u0430\u043a\u0436\u0435 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0439 \u0434\u043b\u044f \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430. \u0412 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u043c \u043a\u043e\u0434\u0435 \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0438 \u0435\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0431\u044b\u043b\u0438 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u043f\u043e\u043b\u044f\u043c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b, \u0447\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u0441\u043b\u043e\u0436\u043d\u044f\u043b\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043d\u043e\u0432\u044b\u0445 \u0438\u043b\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432. \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u043a \u0443\u043d\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c\u0443 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432 \u0443\u0431\u0438\u0440\u0430\u0435\u0442 \u044d\u0442\u043e\u0442 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u043a.<\/p>\n<details class=\"spoiler\">\n<summary>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 usbd_intf_t<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">typedef struct usbd_intf_s {      \/* Interface\u2019s context *\/     union intf_dev_handle_u {         void *ctx;         struct _USBD_HID_Handle *hid;         struct _USBD_CDC_Handle *cdc;     } h;      void (*Init)(union intf_dev_handle_u h, struct _USBD_Handle *pdev, uint8_t cfgidx);     void (*DeInit)(union intf_dev_handle_u h, uint8_t cfgidx);     uint8_t (*EP0_RxReady)(union intf_dev_handle_u h);     uint8_t (*Setup)(union intf_dev_handle_u h, enum setup_recp_e, uint8_t recp_idx, USBD_SetupReq  *req);     uint8_t (*DataIn)(union intf_dev_handle_u h, uint8_t epnum);     uint8_t (*DataOut)(union intf_dev_handle_u h, uint8_t epnum);  } usbd_intf_t; <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u041f\u043e \u043f\u0440\u0438\u0445\u043e\u0434\u0443 USB \u043f\u0430\u043a\u0435\u0442\u0430 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0438\u0437 \u043d\u0430\u0431\u043e\u0440\u0430 USBD_Class \u0438 \u0435\u0441\u043b\u0438 \u043f\u0430\u043a\u0435\u0442 \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d \u0438\u043d\u0434\u0438\u0432\u0438\u0434\u0443\u0430\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u043a\u0430\u043a\u043e\u0433\u043e-\u043b\u0438\u0431\u043e \u0438\u0437 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432, \u0442\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u0441 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0435\u0439 \u0435\u0433\u043e \u043b\u0438\u0447\u043d\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430.<\/p>\n<hr\/>\n<p><code>USBD_xxx_Handle<\/code> &#8212; \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u044b\u00a0 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432.<\/p>\n<p>\u0412 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u044b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u044d\u0442\u043e\u0433\u043e \u0442\u0438\u043f\u0430 (\u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441):<\/p>\n<ul>\n<li>\n<p><code>USBD_CDC_Handle g_cdc0;<\/code><\/p>\n<\/li>\n<li>\n<p><code>USBD_CDC_Handle g_cdc1;<\/code><\/p>\n<\/li>\n<li>\n<p><code>USBD_HID_Handle g_hid0;<\/code><\/p>\n<\/li>\n<\/ul>\n<p><code>USBD_CDC_Handle<\/code>\u00a0\u00a0\u00a0\u00a0 &#8212;\u00a0\u00a0\u00a0\u00a0 <code>g_cdc0, g_cdc1<\/code><\/p>\n<details class=\"spoiler\">\n<summary>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0442\u0438\u043f\u0430 USBD_CDC_Handle<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">typedef struct _USBD_CDC_Handle {     \/* Initialized @ USBD_Composite_Init -> USBD_CDC_Init *\/     uint8_t ifnum_cmd;     uint8_t epnum_cmd;     uint8_t ifnum_data;     uint8_t epnum_data;     struct _USBD_Handle *pdev;      \/* Initialized @ cdc_uart_init *\/     cdc_dfi_t *dfi;      uint8_t  data[CDC_DATA_MAX_PACKET_SIZE] __attribute__ ((aligned (4)));     uint8_t  CmdOpCode;     uint8_t  CmdLength;      __IO uint32_t TxState;     __IO uint32_t RxState;      USBD_CDC_ConfigDesc    *cfg_desc;  } USBD_CDC_Handle;<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0421 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f USB, \u043e\u0431\u0430 CDC \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438 \u0442\u0438\u043f \u0443 \u043d\u0438\u0445 \u043e\u0434\u0438\u043d\u00a0 &#8212; <code>USBD_CDC_Handle<\/code>. \u041e\u0442\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f \u043e\u043d\u0438 \u0432\u043d\u0438\u0437 \u0441\u043c\u043e\u0442\u0440\u044f\u0449\u0438\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u043c (DFI) \u2013 UART \u0438\u043b\u0438 ICTRL, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0438\u043b\u0438\u043d\u043a\u043e\u0432\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043a CDC \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0443 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438. <\/p>\n<p>DFI (downward facing interface) \u2013 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0434\u043b\u044f \u0441\u0432\u044f\u0437\u0438 CDC \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0441 \u0435\u0433\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u043e\u043c. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u044d\u0442\u043e UART \u0438 ICTRL.<\/p>\n<details class=\"spoiler\">\n<summary>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 DFI \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b cdc_dfi_t<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">\/* CDC downward facing interface - DFI *\/ typedef struct cdc_dfi_s {     \/* Functional specific part \u2013 individual for each DFI type *\/     union {         struct cdc_ictrl_s *cdc_ictrl;         struct cdc_uart_s *cdc_uart;     } ctx;      \/* USB specific part common for all CDC interfaces *\/     void (*start_rx) (struct cdc_dfi_s *dfi);     void (*stop_rx) (struct cdc_dfi_s *dfi);     void (*on_idle) (struct cdc_dfi_s *dfi);     void (*on_control) (struct cdc_dfi_s *dfi, uint8_t cmd, uint8_t* buf, uint16_t len);     void (*on_rx) (struct cdc_dfi_s *dfi, uint32_t len);     uint8_t *(*get_ds_buffer) (struct cdc_dfi_s *dfi); } cdc_dfi_t; <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u041e\u0431\u044a\u0435\u043a\u0442\u044b \u0442\u0438\u043f\u0430 <code>cdc_dfi_t<\/code> \u0441\u0430\u043c\u0438 \u043f\u043e \u0441\u0435\u0431\u0435 \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442, \u0430 \u0432\u0441\u0435\u0433\u0434\u0430 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0441\u043e\u0441\u0442\u0430\u0432\u043d\u043e\u0439 \u0447\u0430\u0441\u0442\u044c\u044e \u043a\u0430\u043a\u043e\u0433\u043e-\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u0430 &#8212; <code>cdc_uart_t<\/code> \u0438\u043b\u0438 <code>cdc_ictrl_t<\/code>, \u0441\u043c. \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043d\u0438\u0436\u0435. <\/p>\n<details class=\"spoiler\">\n<summary>cdc_uart_t- g_cdc_uart;<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">typedef struct cdc_uart_s {     uart_cdc_upstream_tus;     uart_cdc_downstream_tds;     cdc_dfi_t dfi; } cdc_uart_t; <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p><code>cdc_uart_t<\/code> &#8212; \u041c\u043e\u0434\u0443\u043b\u044c UART \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u043d\u044b\u0439 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 CDC \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u043c. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 CDC \u043d\u0435 \u0437\u0430\u0431\u043e\u0442\u0438\u0442 \u043a\u0430\u043a\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b \u043a \u043d\u0435\u043c\u0443 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d, \u0442\u043e \u043e\u043d \u043d\u0435 \u0441\u0432\u044f\u0437\u0430\u043d \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0441 cdc_uart_t, \u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0435\u0440\u0435\u0437 DFI \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441. CDC_UART \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 3 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u0447\u0430\u0441\u0442\u0435\u0439:<\/p>\n<ul>\n<li>\n<p><code>uart_cdc_upstream_t\u00a0\u00a0\u00a0us;<\/code>\u00a0  <br \/>\u041e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u0442\u0440\u0430\u0444\u0438\u043a \u043e\u0442 uart \u043a \u0445\u043e\u0441\u0442\u0443.<\/p>\n<\/li>\n<li>\n<p><code>uart_cdc_downstream_t ds;<\/code>\u00a0  <br \/>\u041e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u0442\u0440\u0430\u0444\u0438\u043a \u043e\u0442 \u0445\u043e\u0441\u0442\u0430 \u043a uart.<\/p>\n<\/li>\n<li>\n<p><code>cdc_dfi_t \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0dfi;<br \/><\/code>\u041d\u0430\u0431\u043e\u0440 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0432\u044b\u0437\u043e\u0432\u043e\u0432 \u0441\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u044b USB. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0442\u0430\u043a\u0438\u0445 \u043a\u0430\u043a \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043a\u043e\u043c\u043c\u0430\u043d\u0434 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f, \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0431\u0443\u0444\u0435\u0440\u043e\u0432 \u0438 \u0442.\u043f.<\/p>\n<\/li>\n<\/ul>\n<details class=\"spoiler\">\n<summary>cdc_ictrl_t-g_cdc_ictrl;<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">typedef struct cdc_ictrl_s {     ictrl_cdc_upstream_t    us;     ictrl_cdc_downstream_t  ds;     cdc_dfi_t               dfi; } cdc_ictrl_t; <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u041c\u043e\u0434\u0443\u043b\u044c Internal Control (ICTRL) \u0442\u0430\u043a\u0436\u0435 \u043a\u0430\u043a \u0438 <code>cdc_uart_t<\/code> \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u0432\u044b\u0448\u0435 \u0441\u0432\u044f\u0437\u0430\u043d \u0441 CDC \u0447\u0435\u0440\u0435\u0437 DFI.   <\/p>\n<p><code>USBD_HID_Handle\u00a0\u00a0\u00a0\u00a0 -\u00a0\u00a0\u00a0 g_hid0<\/code><\/p>\n<details class=\"spoiler\">\n<summary>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0442\u0438\u043f\u0430 USBD_HID_Handle<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">typedef struct _USBD_HID_Handle {      union {         USBD_Dev0_HID_ConfigDesc *dev0;        \/* Pointer to HID part in Composite device                                                   descriptor Initialized during HID                                                    registration upon startup *\/     } hid_cfg_desc;      \/********** Configuration specific parameters *****\/     \/* Initialized @ USBD_Composite_Init -> USBD_HID_Init *\/     uint8_t ifnum;     uint8_t epnum;      size_t epin_size;     size_t epout_size;      uint8_t *ReportBuf;     size_t   ReportBufLen;      uint8_t *ReportDesc;     size_t   ReportDescLen;      struct _USBD_Handle *pdev;     \/***********************************************\/      uint8_t *pReport;     uint32_t Protocol;     uint32_t IdleState;     uint32_t AltSetting;     uint32_t IsReportAvailable;     CUSTOM_HID_StateTypeDef     state;      void (*Register)(struct _USBD_HID_Handle *hhid, USBD_ConfigDesc *config_desc, \u2026     USBD_HidDesc* (*GetHidDescr)(struct _USBD_HID_Handle *hhid);     void (*Init)(struct _USBD_HID_Handle *hhid, uint8_t cfgidx);     void (*DeInit)(struct _USBD_HID_Handle *hhid);     int8_t (*OutEvent)(struct _USBD_HID_Handle *hhid, uint8_t *buf, int len);  } USBD_HID_Handle; <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>HID \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u2013 \u044d\u0442\u043e \u043e\u0431\u0449\u0438\u0439 \u043a\u043b\u0430\u0441\u0441 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432, \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440\u043e\u043c. HID \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0441\u043e \u0441\u0432\u043e\u0438\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u043e\u043c (\u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 <code>dev0<\/code>) \u043f\u0440\u0438 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0439 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438.<\/p>\n<p><code>dev0_t g_dev0<\/code>&#8212; \u0444\u0443\u043a\u0446\u0438\u043e\u043d\u0430\u043b HID \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 <\/p>\n<details class=\"spoiler\">\n<summary>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0442\u0438\u043f\u0430 dev0_t<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">typedef struct {     uint32_t last_report_tick;     USBD_HID_Handle *hid;     dev0_in_report_t hid_in_report;     dev0_out_report_t hid_out_report; } dev0_t; <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0417\u0430\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u0442\u0435\u043c, \u0447\u0442\u043e \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438 \u0437\u0430\u0431\u0438\u0440\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u043c\u043e\u0434\u0443\u043b\u044f \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0445 \u0434\u0430\u0442\u0447\u0438\u043a\u043e\u0432 (imon) \u0438 \u043e\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0438\u0445 \u0432 HID \u0434\u043b\u044f \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0439 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0443\u0436\u0435 \u0432 \u0432\u0438\u0434\u0435 USB \u043f\u0430\u043a\u0435\u0442\u0430 (HID Report).  \u0412 \u0434\u0430\u043d\u043d\u043e\u043c  \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 dev0 \u0441\u043e\u0437\u043d\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u0432\u0435\u0434\u0435\u043d\u044b \u043a \u043c\u0438\u043d\u0438\u043c\u0443\u043c\u0443, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u043a\u043e\u0434 \u0442\u0435\u043c, \u0447\u0442\u043e \u043d\u0435 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u043a \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0442\u0435\u043c\u0435.<\/p>\n<h2>\u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u044d\u0442\u0430\u043f\u044b \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b<\/h2>\n<details class=\"spoiler\">\n<summary>\u0411\u0430\u0437\u043e\u0432\u0430\u044f \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">  HAL_Init(); SystemClock_Config();  __disable_irq();  MX_GPIO_Init(); MX_DMA_Init(); MX_ADC1_Init(); MX_TIM3_Init();\/* Used by ADC as a trigger source *\/ MX_USART3_UART_Init(); <\/code><\/pre>\n<p>\u0422\u0438\u043f\u043e\u0432\u0430\u044f \u0430\u0432\u0442\u043e\u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0435\u0440\u0435\u0444\u0435\u0440\u0438\u0438. \u041d\u0438\u0447\u0435\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0433\u043e.<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>MX_USB_DEVICE_Init();  \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f USB \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0417\u0430 \u043e\u0441\u043d\u043e\u0432\u0443 \u0432\u0437\u044f\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 CubeIDE.<br \/>\u041f\u043e \u043c\u0438\u043c\u043e \u0432\u0441\u0435\u0433\u043e \u043f\u0440\u043e\u0447\u0435\u0433\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432 \u0432\u043d\u0443\u0442\u0440\u0438 \u0441\u043e\u0441\u0442\u0430\u0432\u043d\u043e\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 (USB Composite device).<\/p>\n<pre><code class=\"cpp\">{ \/* Link interfaces into composite class *\/ int ep_in_use = 1; int if_in_use = 0; HID_Register(&amp;g_hid0, &amp;pdev->intf[0], pdev->config_desc, &amp;if_in_use, &amp;ep_in_use); CDC_Register(&amp;g_cdc0, &amp;pdev->intf[1], pdev->config_desc, &amp;if_in_use, &amp;ep_in_use); CDC_Register(&amp;g_cdc1, &amp;pdev->intf[2], pdev->config_desc, &amp;if_in_use, &amp;ep_in_use); pdev->config_desc->bNumInterfaces = if_in_use; } <\/code><\/pre>\n<p>\u0412\u043e \u0432\u0440\u0435\u043c\u044f \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438, \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043a \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440\u0443 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 (<code>pdev->config_desc<\/code>) \u0441\u0432\u043e\u044e \u0438\u043d\u0434\u0438\u0432\u0438\u0434\u0443\u0430\u043b\u044c\u043d\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u0438 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u0441\u0447\u0435\u0442\u0447\u0438\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0445 \u0442\u043e\u0447\u0435\u043a (<code>ep_in_use<\/code>) \u0438 \u0438\u0445 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432 (<code>if_in_use<\/code>). \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0441\u0432\u043e\u044e \u0447\u0430\u0441\u0442\u044c \u0432 \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0445\u0440\u0430\u043d\u0438\u0442 \u0443 \u0441\u0435\u0431\u044f \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0435\u0433\u043e \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0432 \u0444-\u0446\u0438\u0438 <code>pClass->Init()<\/code>.<\/p>\n<p>\u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043f\u0440\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u043d\u043e\u0432\u044b\u0445 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432 \u0441\u044e\u0434\u0430 \u043d\u0430\u0434\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0435\u0433\u043e \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044e.<\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u0438\u043c\u0435\u0440 \u0444-\u0446\u0438\u0438 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 HID \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">void Dev0_HID_Register ( USBD_HID_Handle *hhid, USBD_ConfigDesc *config_desc, int *ifnum, int *epnum) { USBD_Dev0_HID_ConfigDesc *desc =      &amp;dev0_hid_config_desc_template;  desc->interface_desc.bInterfaceNumber = *ifnum; desc->ep_in.bEndpointAddress = EP_IN_ADDR(*epnum); desc->ep_out.bEndpointAddress = EP_OUT_ADDR(*epnum);  hhid->hid_cfg_desc.dev0 = USBD_CfgDescAppend(        config_desc,        (uint8_t*)desc,        sizeof(USBD_Dev0_HID_ConfigDesc));  *ifnum += 1; *epnum += 1; } <\/code><\/pre>\n<p>\u0424-\u0446\u0438\u044f\u00a0 <code>USBD_CfgDescAppend()<\/code> \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u0439 \u0432 \u0432\u0438\u0434\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430 (<code>desc<\/code>) \u043a \u043e\u0431\u0449\u0435\u043c\u0443 \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440\u0443 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 (<code>config_desc<\/code>) \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0430\u0434\u0440\u0435\u0441 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043a\u0443\u0434\u0430 \u043e\u043d \u0431\u044b\u043b \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d.<\/p>\n<p>\u0412 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u043e\u043c \u043a\u043e\u0434\u0435 \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440 HID \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 <code>desc<\/code> \u0442\u0438\u043f\u0430 <code>USBD_Dev0_HID_ConfigDesc<\/code> &#8212; \u044d\u0442\u043e \u0448\u0430\u0431\u043b\u043e\u043d (<code>dev0_hid_config_desc_template<\/code>) \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u0434\u0440\u0443\u0433\u0438\u0445 \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440\u043e\u0432 \u0438 \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u043b\u044f \u0437\u0430\u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0443\u0436\u0435 \u0437\u0430\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432 \u0438 \u043e\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0445 \u0442\u043e\u0447\u0435\u043a.<\/p>\n<pre><code class=\"cpp\">#pragma pack(push, 1) typedef struct _USBD_Dev0_HID_ConfigDesc {     USBD_InterfaceDesc  interface_desc;     USBD_HidDesc        hid_desc;     USBD_EpDesc         ep_in;     USBD_EpDesc         ep_out; } USBD_Dev0_HID_ConfigDesc; #pragma pack(pop) <\/code><\/pre>\n<p>\u0410, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440 CDC \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0432\u043e\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"cpp\">#pragma pack(push, 1) typedef struct _USBD_CDC_ConfigDesc {     USBD_IADDesc           if_assoc_desc;     USBD_InterfaceDesc     interface_desc_cmd;     USBD_FuncDescHdr       func_desc_header;     USBD_FuncDescCallMng   func_desc_call_mng;     USBD_FuncDescACM       func_desc_acm;     USBD_FuncDescUnion     func_desc_union;     USBD_EpDesc            cmd_ep;     USBD_InterfaceDesc     interface_desc_data;     USBD_EpDesc            data_ep_out;     USBD_EpDesc            data_ep_in; } USBD_CDC_ConfigDesc; #pragma pack(pop) <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>dev0_init();     \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u0430 HID \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u0438 \u044d\u0442\u043e\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0441\u0432\u0435\u0434\u0435\u043d\u044b \u043a \u043c\u0438\u043d\u0438\u043c\u0443\u043c\u0443, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438 \u0432 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0438\u0447\u0435\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0433\u043e.<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>imon_init();     \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u043e\u0434\u0443\u043b\u044f Internal Monitor   &#8212; <\/summary>\n<div class=\"spoiler__content\">\n<p>\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u043e\u0432 \u0434\u043b\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u0438\u0439 \u0441 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0433\u043e \u0434\u0430\u0442\u0447\u0438\u043a\u0430 \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u044b \u0438 \u043d\u0430\u043f\u0440\u044f\u0436\u0435\u043d\u0438\u044f \u0441 \u0443\u0447\u0435\u0442\u043e\u043c \u043a\u0430\u043b\u0438\u0431\u0440\u043e\u0432\u043e\u0447\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439.<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>cdc_uart_init(&amp;g_cdc_uart3, &amp;g_cdc0, &amp;huart3);     \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f CDC_UART<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0424-\u0446\u0438\u044f \u0441\u0432\u044f\u0437\u0432\u0430\u0435\u0442 \u0432\u043c\u0435\u0441\u0442\u0435 CDC \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e (<code>g_cdc0<\/code>) \u0441 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u043e\u043c USB UART \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0435\u0440\u0430 (<code>g_cdc_uart3<\/code>) \u0438 \u0441\u0430\u043c \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0435\u0440 \u0441 \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u044b\u043c \u043f\u043e\u0440\u0442\u043e\u043c UART (<code>huart3<\/code>).  \u0422\u0430\u043a\u0436\u0435 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 DFI \u0438\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430.<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>cdc_ictrl_init(&amp;g_cdc1);     \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f CDC_ICTRL<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0424-\u0446\u0438\u044f \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u0442 CDC \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e (<code>g_cdc1<\/code>) c \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u043e\u043c ictrl \u2013 <code>g_cdc_ictrl<\/code>. \u0412 \u043e\u0442\u043b\u0438\u0447\u0438\u0438 \u043e\u0442 UART \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0435\u0440\u0430, ictrl \u043d\u0435 \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d \u0438\u043c\u0435\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0438\u043d\u0441\u0442\u0430\u043d\u0446\u0438\u0439 \u0438 \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u043d \u043d\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u0432 \u0444-\u0446\u0438\u044e \u043a\u0430\u043a \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440, \u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043a\u0430\u043a \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442.<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>HAL_ADC_Start_DMA(&amp;hadc, (uint32_t*)&amp;g_adc_samples[0], ADC_CH_NUM); \u0417\u0430\u043f\u0443\u0441\u043a \u0410\u0426\u041f.<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0410\u0426\u041f \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u043e \u0441\u0438\u0433\u043d\u0430\u043b\u0443 \u043e\u0442 \u0442\u0430\u0439\u043c\u0435\u0440\u0430 \u0438 \u043f\u043e \u043a\u0440\u0443\u0433\u0443 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432. <\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>HAL_TIM_Base_Start_IT(&amp;htim3);             \u0417\u0430\u043f\u0443\u0441\u043a \u0442\u0430\u0439\u043c\u0435\u0440\u0430<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0439\u043c\u0435\u0440\u0430 \u0441 \u043f\u0435\u0440\u0438\u043e\u0434\u043e\u043c 4.5\u043c\u0441 \u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0435\u0439 \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u0434\u043b\u044f \u0410\u0426\u041f<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0446\u0438\u043a\u043b \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">    while (1)  {         now = HAL_GetTick();         g_cnt ++;                  dev0_on_idle(now);         imon_on_idle(now);          g_cdc_uart3.dfi.on_idle(&amp;g_cdc_uart3.dfi);         g_cdc_ictrl.dfi.on_idle(&amp;g_cdc_ictrl.dfi);  #if NAVIG     cdc_uart_dfi_on_idle();     cdc_ictrl_dfi_on_idle(); #endif      } <\/code><\/pre>\n<p><code>dev0_on_idle()<\/code> \u2013 \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u043e\u0442 imon \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0438\u0445 \u0432 USB.<\/p>\n<p><code>imon_on_idle()<\/code> \u2013 \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u0443\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0441 \u043a\u0430\u043d\u0430\u043b\u043e\u0432 \u0410\u0426\u041f \u0432 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u0438\u044f \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u044b \u0438 \u043d\u0430\u043f\u0440\u044f\u0436\u0435\u043d\u0438\u044f \u043f\u0438\u0442\u0430\u043d\u0438\u044f.<\/p>\n<p><code>g_cdc_uart3.dfi.on_idle()<\/code> \u2013 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043f\u0440\u0438\u0435\u043c\u043d\u0438\u043a\u0430 UART \u0438 \u0435\u0441\u043b\u0438 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0430\u044f \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u043b\u0430\u0441\u044c, \u0442\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0441\u0442\u0430\u0432\u0448\u0435\u0435\u0441\u044f \u043c\u0435\u0441\u0442\u043e \u0432 \u043f\u0440\u0438\u0435\u043c\u043d\u043e\u043c \u0431\u0443\u0444\u0435\u0440\u0435 \u0438 \u0438\u043d\u0438\u0446\u0438\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u043e\u0432\u0430\u044f DMA \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f \u0441 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0435\u0439 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u044f \u043f\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044e. \u0422\u0430\u043a\u0436\u0435, \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043f\u0440\u0438\u0435\u043c\u043d\u043e\u043c UART \u0431\u0443\u0444\u0435\u0440\u0435 \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0438\u0445 \u0445\u043e\u0441\u0442\u0443. \u0424\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438, \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u0446\u0438\u043a\u043b\u0435 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e upstream \u043f\u043e\u0442\u043e\u043a. Downstream \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u044e \u043e\u0442 USB, \u0442.\u0435. \u043f\u043e \u043f\u0440\u0438\u0445\u043e\u0434\u0443 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u0430\u043a\u0435\u0442\u0430 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<p><code>g_cdc_ictrl.dfi.on_idle()<\/code> \u2013 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u043d\u0430 \u0445\u043e\u0441\u0442 \u0438 \u0435\u0441\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430\u043a\u043e\u043f\u0438\u043b\u043e\u0441\u044c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043c\u043d\u043e\u0433\u043e (64\u0431\u0430\u0439\u0442\u0430) \u0438\u043b\u0438 \u043e\u043d\u0438 \u0437\u0430\u043b\u0435\u0436\u0430\u043b\u0438\u0441\u044c (>16\u043c\u0441), \u0442\u043e \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u043e\u0432\u044b\u0439 \u043f\u0430\u043a\u0435\u0442 \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432 CDC \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 (<code>USBD_CDC_TransmitPacket()<\/code>).<\/p>\n<blockquote>\n<p>\u0417\u0434\u0435\u0441\u044c \u0438 \u0434\u0430\u043b\u0435\u0435 \u0432\u0441\u0435 \u0432\u044b\u0437\u043e\u0432\u044b \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u043f\u043e\u0434 \u043f\u0440\u0435\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043d\u044b\u043c \u0443\u0441\u043b\u043e\u0432\u0438\u0435\u043c NAVIG \u043d\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0443\u0434\u043e\u0431\u043d\u043e\u0433\u043e \u0447\u0442\u0435\u043d\u0438\u044f \u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u043f\u043e \u043a\u043e\u0434\u0443. \u0422\u0430\u043a \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u0441\u0432\u0435\u043d\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 <code>g_cdc_uart3.dfi.on_idle()<\/code> \u0432 \u0445\u043e\u0434\u0435 \u0440\u0430\u0431\u043e\u0442\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043a\u0430\u043a <code>cdc_uart_dfi_on_idle()<\/code>, \u0430 <code>g_cdc_ictrl.dfi.on_idle()<\/code> \u043a\u0430\u043a <code>cdc_ictrl_dfi_on_idle()<\/code> \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435.<\/p>\n<\/blockquote>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>HAL_PCD_IRQHandler() \u2013 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0439 \u043e\u0442 USB.<\/summary>\n<div class=\"spoiler__content\">\n<p>\u041a\u0430\u0436\u0434\u044b\u0439 \u043f\u0440\u0438\u0445\u043e\u0434\u044f\u0449\u0438\u0439 \u043f\u0430\u043a\u0435\u0442 \u043e\u0442 USB \u0441\u043f\u0435\u0440\u0432\u0430 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0442\u0438\u043f\u043e\u0432\u044b\u043c \u043a\u043e\u0434\u043e\u043c \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c CubeIDE. \u042d\u0442\u043e\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0432 \u0441\u0435\u0431\u044f \u0440\u0430\u0437\u0431\u043e\u0440 \u0441\u043b\u0443\u0436\u0435\u0431\u043d\u044b\u0445 \u043f\u0430\u043a\u0435\u0442\u043e\u0432, \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440\u043e\u0432, \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u043e\u0448\u0438\u0431\u043e\u043a \u0438 \u0442.\u043f. \u041f\u043e \u043f\u0440\u0438\u0445\u043e\u0434\u0443 \u043f\u0430\u043a\u0435\u0442\u0430 \u0434\u0430\u043d\u043d\u044b\u0445, \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043e\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0445 \u0442\u043e\u0447\u0435\u043a \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 USB \u043a\u043b\u0430\u0441\u0441\u0430 <code>pClass->DataOut()<\/code> \u0438\u043b\u0438\u00a0 <code>pClass->EP0_RxReady()<\/code>, \u043e\u043d\u0438 \u0436\u0435 <code>USBD_Composite_DataOut()<\/code> \u0438 <code>USBD_Composite_EP0_RxReady()<\/code>, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e.<\/p>\n<p>\u0414\u043b\u044f \u0441\u043b\u0443\u0436\u0435\u0431\u043d\u044b\u0445 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b \u0434\u043b\u044f \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0444-\u0446\u0438\u0438\u00a0 <code>USBD_Composite_Init()<\/code> \u0438 <code>USBD_Composite_Setup()<\/code>. <\/p>\n<p>\u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0441\u0443\u0442\u044c \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430 \u043a \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u0443\u0435\u043c\u043e\u043c\u0443 \u043c\u0430\u0441\u0441\u0438\u0432\u0443 USB \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u043c\u0435\u043d\u044f\u0442\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0439 \u043f\u0440\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0438\/\u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0438 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432 \u0438\u0437 \u043a\u043e\u0434\u0430. \u0422.\u0435. \u043f\u0430\u043a\u0435\u0442\u044b \u043f\u043e\u0441\u0442\u0443\u043f\u0430\u044e\u0442 \u043d\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0441\u043e\u0441\u0442\u0430\u0432\u043d\u043e\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 (<code>USBD_Composite_xxx<\/code>), \u0430 \u0437\u0430\u0442\u0435\u043c \u0432 \u0446\u0438\u043a\u043b\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u043d\u0430 \u0432\u0441\u0435 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b \u043f\u043e\u043a\u0430 \u043a\u0430\u043a\u043e\u0439-\u043b\u0438\u0431\u043e \u0438\u0437 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432 \u043d\u0435 \u0437\u0430\u0431\u0435\u0440\u0435\u0442\u00a0 \u043f\u0430\u043a\u0435\u0442 \u0441\u0435\u0431\u0435 (\u0442.\u0435. \u0432\u0435\u0440\u043d\u0435\u0442 \u043a\u043e\u0434 <code>USBD_BUSY<\/code>).<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>USBD_Composite_Init() &#8212; \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0441\u043b\u0443\u0436\u0435\u0431\u043d\u044b\u0445 \u043f\u0430\u043a\u0435\u0442\u043e\u0432<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">for (i = 0; i &lt; COMPOSITE_INTF_NUM; i ++) { usbd_intf_t *intf = &amp;pdev->intf[i]; if (!intf || !intf->Init || !intf->h.ctx) continue; intf->Init(intf->h, pdev, cfgidx); #if NAVIG USBD_HID_Init(hhid, pdev, cfgidx); USBD_CDC_Init(hcdc, pdev, cfgidx); #endif } <\/code><\/pre>\n<p>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043f\u043e \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0444-\u0446\u0438\u0438 Init() \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432. \u042d\u0442\u0438 \u0444-\u0446\u0438\u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u044e\u0442 \u043e\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0435 \u0442\u043e\u0447\u043a\u0438 USB \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u043f\u0435\u0440\u0438\u0444\u0435\u0440\u0438\u0438 \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u0432 \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0430\u0449\u0435\u0439 \u0438\u043c \u0447\u0430\u0441\u0442\u0438 \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u044b\u043b\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0430 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430.<\/p>\n<p>\u0415\u0449\u0451 \u043e\u0434\u043d\u0438\u043c \u0432\u0430\u0436\u043d\u044b\u043c  \u043e\u0442\u043b\u0438\u0447\u0438\u0435\u043c \u043e\u0442 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 CubeIde \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u043f\u0430\u043c\u044f\u0442\u0438 \u043f\u043e\u0434 \u043e\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0435 \u0442\u043e\u0447\u043a\u0438 (PMA \u0431\u0443\u0444\u0435\u0440\u0430). \u0412 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u043c \u043a\u043e\u0434\u0435 \u043f\u0430\u043c\u044f\u0442\u044c \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0438 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438, \u0442\u043e\u0433\u0434\u0430 \u043a\u0430\u043a \u0432 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0435 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u2013 \u0441\u043c. \u0444-\u0446\u0438\u044e <code>HAL_PCD_PMA_Alloc()<\/code>. \u041f\u0430\u043c\u044f\u0442\u044c \u0432\u044b\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u0438 \u043e\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u0432 \u0446\u0435\u043f\u043e\u0447\u043a\u0435 \u0432\u044b\u0437\u043e\u0432\u043e\u0432 <code>pClass->Init() => USBD_Composite_Init() => USBD_xxx_Init() => USBD_LL_OpenEP() => HAL_PCD_EP_Open()<\/code> \u0438 \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u0438 USB \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0432 \u0446\u0435\u043f\u043e\u0447\u043a\u0435  <code>pClass->DeInit() => ... => HAL_PCD_EP_Close().<\/code><\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>USBD_Composite_Setup() &#8212; \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0441\u043b\u0443\u0436\u0435\u0431\u043d\u044b\u0445 \u043f\u0430\u043a\u0435\u0442\u043e\u0432<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">for (i = 0; i &lt; COMPOSITE_INTF_NUM; i++) { usbd_intf_t *intf = &amp;pdev->intf[i]; if (!intf || !intf->Setup) continue; rc = intf->Setup(intf->h, recp, recp_idx, req); #if NAVIG USBD_CDC_Setup(); USBD_HID_Setup(); #endif if (rc == USBD_BUSY || rc == USBD_FAIL) break; } <\/code><\/pre>\n<p>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a Setup \u0444\u0430\u0437\u044b \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u043e\u043c \u043e\u0431\u043c\u0435\u043d\u0430 USB. \u0414\u043b\u044f CDC \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 \u043d\u0430 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0434\u0438\u0438 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0441\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b UART \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u2013 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c, \u043a\u043e\u043b-\u0432\u043e \u0431\u0438\u0442 \u0438 \u0442.\u043f. \u0414\u043b\u044f HID \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u043d\u0430 \u044d\u0442\u043e\u0439 \u0444\u0430\u0437\u0435 \u0445\u043e\u0441\u0442 \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442 \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440 \u0444\u043e\u0440\u043c\u0430\u0442\u0430 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 (\u0430\u043a\u0430 <code>ReportDesc<\/code>), \u0430 \u0442\u0430\u043a\u0436\u0435 \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440 HID \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 &#8212; <code>USBD_HidDesc<\/code>.   <\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>USBD_Composite_DataOut() &#8212; \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 <\/summary>\n<div class=\"spoiler__content\">\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a <strong>\u0432\u0445\u043e\u0434\u043d\u044b\u0445<\/strong> \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432. \u041d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0435\u043c \u0447\u0442\u043e \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0432 USB \u0432\u0441\u0435\u0433\u0434\u0430 <strong>\u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0441\u0442\u0430<\/strong>. \u0422.\u0435. DataOut \u0434\u043b\u044f USB \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u2013 \u044d\u0442\u043e \u0432\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435.<\/p>\n<p>\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u043d\u043e\u043c\u0435\u0440 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u0438 \u043d\u043e\u043c\u0435\u0440 \u043e\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u044d\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u044b. \u041a\u0430\u043a \u0438 \u0432 \u0434\u0440\u0443\u0433\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u0445 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0442\u043d\u043e\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430, \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u043d\u0430 \u0432\u0441\u0435 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b \u0438 \u0435\u0441\u043b\u0438 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0438\u0437 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432 \u043f\u0440\u0438\u0437\u043d\u0430\u0435\u0442 \u044d\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u0441\u0432\u043e\u0438\u043c\u0438, \u0442\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043e\u0434 <code>USBD_BUSY<\/code> \u0438\u00a0 \u043d\u0430 \u044d\u0442\u043e\u043c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043f\u0430\u043a\u0435\u0442\u0430 \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f.<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>USBD_Composite_DataIn() &#8212; \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0412\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e <code>USBD_Composite_DataOut()<\/code><\/p>\n<\/div>\n<\/details>\n<h2>\u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044f \u0438 \u0437\u0430\u043f\u0443\u0441\u043a<\/h2>\n<p>\u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044f \u0431\u0435\u0437 \u043a\u0430\u043a\u0438\u0445-\u043b\u0438\u0431\u043e  \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0435\u0439 \u0432\u0441\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0432 \u0434\u0435\u0444\u043e\u043b\u0442\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u0445. \u041d\u0438\u0436\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d \u0440\u0430\u0437\u043c\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 \u043f\u043e\u0441\u043b\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u0441 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u043e\u0439 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u0438 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u043e\u043c. \u0420\u0430\u0437\u043c\u0435\u0440 \u041e\u0417\u0423 \u043c\u043e\u0436\u0435\u0442 \u0432\u0430\u0440\u044c\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u0432 \u0431\u0443\u0444\u0435\u0440\u043e\u0432 CDC \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0435\u0440\u043e\u0432. \u0412 \u044d\u0442\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u043e\u0441\u043e\u0431\u043e \u043d\u0435 \u0436\u0430\u0434\u043d\u0438\u0447\u0430\u043b. \u041e\u0431\u044a\u0435\u043c \u043a\u043e\u0434\u0430 ~32\u043a\u0411.<\/p>\n<pre><code class=\"bash\">arm-none-eabi-objcopy  -O binary  USB-PD.elf  \"USB-PD.bin\"    text   data    bss    dec    hexfilename   33480    988   6804  41272   a138USB-PD.elf <\/code><\/pre>\n<p>\u041f\u043e \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u0441 \u0445\u043e\u0441\u0442 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u043c\u0438 \u043f\u0440\u043e\u0435\u043a\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u0435\u043d \u043d\u0430 \u0434\u0432\u0443\u0445 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445 \u2013 Windows10 \u0438 OpenWrt.<\/p>\n<h3>\u041f\u0440\u0438\u043c\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u0434 Linux \u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439 OpenWrt<\/h3>\n<p>\u0414\u043b\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 HID \u0438 CDC \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u0441\u0431\u043e\u0440\u043a\u0438 Linux \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043c\u043e\u0434\u0443\u043b\u0438 ACM \u0438 HID. \u041e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e usbutils.<\/p>\n<pre><code class=\"assembly\">&lt;*> kmod-usb2................................... Support for USB2 controllers &lt;*> kmod-usb-hid......................... Support for USB Human Input Devices &lt;*> kmod-usb-acm......................... Support for modems\/isdn controllers &lt;*> usbutils................................... USB devices listing utilities<\/code><\/pre>\n<p>\u0412\u043e \u0432\u0440\u0435\u043c\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 OpenWrt \u0434\u0435\u0442\u0435\u043a\u0442\u0438\u0440\u0443\u0435\u0442 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<pre><code>[   13.319863] hidraw: raw HID events driver (C) Jiri Kosina [   13.441134] cdc_acm 1-1:1.1: ttyACM0: USB ACM device [   13.455548] cdc_acm 1-1:1.3: ttyACM1: USB ACM device [   13.462624] usbcore: registered new interface driver cdc_acm [   13.468568] cdc_acm: USB Abstract Control Model driver for USB modems and ISDN adapters ... [   13.682913] hid-generic 0003:0483:5732.0001: hiddev96,hidraw0: USB HID v1.11 Device [AV 2xCDC HID Composite device] on usb-ehci-platform-1\/input0 [   13.696697] usbcore: registered new interface driver usbhid [   13.702451] usbhid: USB HID core driver <\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432\u044b\u0432\u043e\u0434 \u0443\u0442\u0438\u043b\u0438\u0442\u044b lsusb.<\/p>\n<details class=\"spoiler\">\n<summary>\u041b\u0438\u0441\u0442\u0438\u043d\u0433 lsusb<\/summary>\n<div class=\"spoiler__content\">\n<pre><code>root@OpenWrt:~# root@OpenWrt:~# lsusb Bus 001 Device 005: ID 0483:5732 STMicroelectronics Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub root@OpenWrt:~# root@OpenWrt:~# root@OpenWrt:~# lsusb -v -d 0483:5732  Bus 001 Device 005: ID 0483:5732 STMicroelectronics Device Descriptor:   bLength                18   bDescriptorType         1   bcdUSB               2.00   bDeviceClass          239 Miscellaneous Device   bDeviceSubClass         2 ?   bDeviceProtocol         1 Interface Association   bMaxPacketSize0        64   idVendor           0x0483 STMicroelectronics   idProduct          0x5732   bcdDevice            0.01   iManufacturer           1 AV   iProduct                2 2xCDC HID Composite device   iSerial                 3 104731433332   bNumConfigurations      1   Configuration Descriptor:     bLength                 9     bDescriptorType         2     wTotalLength          173     bNumInterfaces          5     bConfigurationValue     1     iConfiguration          2 2xCDC HID Composite device     bmAttributes         0xc0       Self Powered     MaxPower              100mA     Interface Descriptor:       bLength                 9       bDescriptorType         4       bInterfaceNumber        0       bAlternateSetting       0       bNumEndpoints           2       bInterfaceClass         3 Human Interface Device       bInterfaceSubClass      0 No Subclass       bInterfaceProtocol      0 None       iInterface              0         HID Device Descriptor:           bLength                 9           bDescriptorType        33           bcdHID               1.11           bCountryCode            0 Not supported           bNumDescriptors         1           bDescriptorType        34 Report           wDescriptorLength      31          Report Descriptors:            ** UNAVAILABLE **       Endpoint Descriptor:         bLength                 7         bDescriptorType         5         bEndpointAddress     0x81  EP 1 IN         bmAttributes            3           Transfer Type            Interrupt           Synch Type               None           Usage Type               Data         wMaxPacketSize     0x0002  1x 2 bytes         bInterval               5       Endpoint Descriptor:         bLength                 7         bDescriptorType         5         bEndpointAddress     0x01  EP 1 OUT         bmAttributes            3           Transfer Type            Interrupt           Synch Type               None           Usage Type               Data         wMaxPacketSize     0x0001  1x 1 bytes         bInterval               5     Interface Association:       bLength                 8       bDescriptorType        11       bFirstInterface         1       bInterfaceCount         2       bFunctionClass          2 Communications       bFunctionSubClass       2 Abstract (modem)       bFunctionProtocol       1 AT-commands (v.25ter)       iFunction               0     Interface Descriptor:       bLength                 9       bDescriptorType         4       bInterfaceNumber        1       bAlternateSetting       0       bNumEndpoints           1       bInterfaceClass         2 Communications       bInterfaceSubClass      2 Abstract (modem)       bInterfaceProtocol      1 AT-commands (v.25ter)       iInterface              0       CDC Header:         bcdCDC               1.10       CDC Call Management:         bmCapabilities       0x00         bDataInterface          2       CDC ACM:         bmCapabilities       0x02           line coding and serial state       CDC Union:         bMasterInterface        1         bSlaveInterface         2       Endpoint Descriptor:         bLength                 7         bDescriptorType         5         bEndpointAddress     0x82  EP 2 IN         bmAttributes            3           Transfer Type            Interrupt           Synch Type               None           Usage Type               Data         wMaxPacketSize     0x0008  1x 8 bytes         bInterval              16     Interface Descriptor:       bLength                 9       bDescriptorType         4       bInterfaceNumber        2       bAlternateSetting       0       bNumEndpoints           2       bInterfaceClass        10 CDC Data       bInterfaceSubClass      0 Unused       bInterfaceProtocol      0       iInterface              0       Endpoint Descriptor:         bLength                 7         bDescriptorType         5         bEndpointAddress     0x03  EP 3 OUT         bmAttributes            2           Transfer Type            Bulk           Synch Type               None           Usage Type               Data         wMaxPacketSize     0x0040  1x 64 bytes         bInterval               0       Endpoint Descriptor:         bLength                 7         bDescriptorType         5         bEndpointAddress     0x83  EP 3 IN         bmAttributes            2           Transfer Type            Bulk           Synch Type               None           Usage Type               Data         wMaxPacketSize     0x0040  1x 64 bytes         bInterval               0     Interface Association:       bLength                 8       bDescriptorType        11       bFirstInterface         3       bInterfaceCount         2       bFunctionClass          2 Communications       bFunctionSubClass       2 Abstract (modem)       bFunctionProtocol       1 AT-commands (v.25ter)       iFunction               0     Interface Descriptor:       bLength                 9       bDescriptorType         4       bInterfaceNumber        3       bAlternateSetting       0       bNumEndpoints           1       bInterfaceClass         2 Communications       bInterfaceSubClass      2 Abstract (modem)       bInterfaceProtocol      1 AT-commands (v.25ter)       iInterface              0       CDC Header:         bcdCDC               1.10       CDC Call Management:         bmCapabilities       0x00         bDataInterface          4       CDC ACM:         bmCapabilities       0x02           line coding and serial state       CDC Union:         bMasterInterface        3         bSlaveInterface         4       Endpoint Descriptor:         bLength                 7         bDescriptorType         5         bEndpointAddress     0x84  EP 4 IN         bmAttributes            3           Transfer Type            Interrupt           Synch Type               None           Usage Type               Data         wMaxPacketSize     0x0008  1x 8 bytes         bInterval              16     Interface Descriptor:       bLength                 9       bDescriptorType         4       bInterfaceNumber        4       bAlternateSetting       0       bNumEndpoints           2       bInterfaceClass        10 CDC Data       bInterfaceSubClass      0 Unused       bInterfaceProtocol      0       iInterface              0       Endpoint Descriptor:         bLength                 7         bDescriptorType         5         bEndpointAddress     0x05  EP 5 OUT         bmAttributes            2           Transfer Type            Bulk           Synch Type               None           Usage Type               Data         wMaxPacketSize     0x0040  1x 64 bytes         bInterval               0       Endpoint Descriptor:         bLength                 7         bDescriptorType         5         bEndpointAddress     0x85  EP 5 IN         bmAttributes            2           Transfer Type            Bulk           Synch Type               None           Usage Type               Data         wMaxPacketSize     0x0040  1x 64 bytes         bInterval               0 Device Status:     0x0001   Self Powered root@OpenWrt:~# root@OpenWrt:~# root@OpenWrt:~# <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0414\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043c\u043e\u0434\u0443\u043b\u0435\u043c ICTRL \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043b\u044e\u0431\u043e\u0435 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 &#8212; screen, picocom, Minicom, Putty,\u00a0 \u0438 \u0442.\u0434. \u0432\u043f\u043b\u043e\u0442\u044c  \u0445\u043e\u0442\u044c \u0434\u043e socat.<\/p>\n<p>\u0414\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 HID \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e\u043c, \u043b\u0438\u0447\u043d\u043e \u044f, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 libusb &#8212; <a href=\"https:\/\/libusb.info\/\" rel=\"noopener noreferrer nofollow\">https:\/\/libusb.info\/<\/a><\/p>\n<h2>\u0417\u0430\u043f\u0443\u0441\u043a \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430 Windows<\/h2>\n<p>\u041f\u043e\u0441\u043b\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a Windows \u0445\u043e\u0441\u0442\u0443 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f 3 \u043d\u043e\u0432\u044b\u0445 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 (\u0441\u043c. \u043d\u0438\u0436\u0435) \u2013 \u0434\u0432\u0430 USB Serial \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 COM8 \u0438 COM9, \u0430 \u0442\u0430\u043a\u0436\u0435 USB Input Device.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/a4e\/cb3\/af9\/a4ecb3af9730fc80d80e501b064521a9.png\" alt=\"\u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 Windows \u043f\u0440\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u043e\u043c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435.\" title=\"\u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 Windows \u043f\u0440\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u043e\u043c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435.\" width=\"1426\" height=\"1125\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/a4e\/cb3\/af9\/a4ecb3af9730fc80d80e501b064521a9.png\"\/><figcaption>\u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 Windows \u043f\u0440\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u043e\u043c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435.<\/figcaption><\/figure>\n<p>\u0414\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 USB Serial\u00a0 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0435\u0440\u0430 (\u043e\u043d \u0436\u0435 CDC UART) \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0432\u043d\u0435\u0448\u043d\u0435\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e. <\/p>\n<p>\u0414\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 CDC ICTRL \u043d\u0438\u0447\u0435\u0433\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u043d\u0435 \u043d\u0430\u0434\u043e. \u0414\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u044c \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b \u043d\u0430 \u043f\u043e\u0440\u0442\u0443 COM8. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 PuTTY.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/4a3\/767\/0f2\/4a37670f2a954030348b559ac078406e.png\" alt=\"\u041f\u0440\u0438\u043c\u0435\u0440 \u0432\u044b\u0432\u043e\u0434\u0430 \u0434\u0435\u0431\u0430\u0433\u043e\u0432\u043e\u0439 \u043f\u0435\u0447\u0430\u0442\u0438 ICTRL (\u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u0430 \u0438 \u0440\u0430\u0431\u043e\u0447\u0435\u0435 \u043d\u0430\u043f\u0440\u044f\u0436\u0435\u043d\u0438\u0435).\" title=\"\u041f\u0440\u0438\u043c\u0435\u0440 \u0432\u044b\u0432\u043e\u0434\u0430 \u0434\u0435\u0431\u0430\u0433\u043e\u0432\u043e\u0439 \u043f\u0435\u0447\u0430\u0442\u0438 ICTRL (\u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u0430 \u0438 \u0440\u0430\u0431\u043e\u0447\u0435\u0435 \u043d\u0430\u043f\u0440\u044f\u0436\u0435\u043d\u0438\u0435).\" width=\"1893\" height=\"743\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/4a3\/767\/0f2\/4a37670f2a954030348b559ac078406e.png\"\/><figcaption>\u041f\u0440\u0438\u043c\u0435\u0440 \u0432\u044b\u0432\u043e\u0434\u0430 \u0434\u0435\u0431\u0430\u0433\u043e\u0432\u043e\u0439 \u043f\u0435\u0447\u0430\u0442\u0438 ICTRL (\u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u0430 \u0438 \u0440\u0430\u0431\u043e\u0447\u0435\u0435 \u043d\u0430\u043f\u0440\u044f\u0436\u0435\u043d\u0438\u0435).<\/figcaption><\/figure>\n<p>\u0412 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0442\u0435\u043a\u0443\u0449\u0430\u044f \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u0430 \u0438 \u043d\u0430\u043f\u0440\u044f\u0436\u0435\u043d\u0438\u0435 \u043f\u0438\u0442\u0430\u043d\u0438\u044f \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043a\u0430\u043a \u043f\u0440\u0438\u043c\u0435\u0440 \u0434\u0435\u0431\u0430\u0433\u043e\u0432\u043e\u0439 \u043f\u0435\u0447\u0430\u0442\u0438 \u0438\u0437 \u0444-\u0446\u0438\u0438 <code>dev0_on_idle()<\/code>.<\/p>\n<details class=\"spoiler\">\n<summary>dev0_on_idle()<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">void dev0_on_idle (uint32_t now_tick) { ....     if ((imon->temp_degc != INT16_MAX) &amp;&amp; g_dbg0 == 0){         static int cnt = 0;         ictrl_printf(\"[%d] %dC, %dmV\\n\",                       cnt++, imon->temp_degc, imon->vref);     } ... } <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u042d\u0442\u043e\u0442 \u0436\u0435 \u043f\u043e\u0440\u0442 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438 \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0445 \u043a\u043e\u043c\u0430\u043d\u0434. \u041e\u0434\u043d\u0430\u043a\u043e, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u0443\u0434\u043e\u0431\u043d\u043e \u0442.\u043a. \u043f\u0440\u0438 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e\u043c \u0432\u044b\u0432\u043e\u0434\u0435 \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u044c \u043d\u0430\u0431\u0438\u0440\u0430\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432 \u0441\u043b\u0435\u043f\u0443\u044e. \u0414\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430, \u0432 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445, \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c RealTerm \u0443 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0435\u0441\u0442\u044c \u0434\u0432\u0430 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u043e\u043b\u044f \u0434\u043b\u044f \u043e\u0442\u0441\u044b\u043b\u043a\u0438 \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0445 \u043f\u043e\u0441\u044b\u043b\u043e\u043a.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b1b\/389\/8e2\/b1b3898e248caf9dd6d91f2163ad36db.png\" alt=\"\u041f\u0440\u0438\u043c\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f RealTerm \u0434\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0445 \u043a\u043e\u043c\u0430\u043d\u0434 \u043d\u0430 \u0434\u0435\u0431\u0430\u0433 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441.\" title=\"\u041f\u0440\u0438\u043c\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f RealTerm \u0434\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0445 \u043a\u043e\u043c\u0430\u043d\u0434 \u043d\u0430 \u0434\u0435\u0431\u0430\u0433 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441.\" width=\"1858\" height=\"1068\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/b1b\/389\/8e2\/b1b3898e248caf9dd6d91f2163ad36db.png\"\/><figcaption>\u041f\u0440\u0438\u043c\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f RealTerm \u0434\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0445 \u043a\u043e\u043c\u0430\u043d\u0434 \u043d\u0430 \u0434\u0435\u0431\u0430\u0433 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441.<\/figcaption><\/figure>\n<p>\u0414\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 USB HID \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0441\u0430\u043c\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u043e\u0435 \u0447\u0442\u043e \u043d\u0430\u0448\u043b\u043e\u0441\u044c \u044d\u0442\u043e \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0442\u0443\u043b\u0437\u0430 hidapi (<a href=\"https:\/\/github.com\/libusb\/hidapi.git\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/libusb\/hidapi.git<\/a>).<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/3a7\/d0b\/287\/3a7d0b28776ae7102e04e0250a03cd73.png\" alt=\"\u041f\u0440\u0438\u043c\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f HIDAPI Test Tool \u0434\u043b\u044f \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0438 USB HID \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430.\" title=\"\u041f\u0440\u0438\u043c\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f HIDAPI Test Tool \u0434\u043b\u044f \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0438 USB HID \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430.\" width=\"1368\" height=\"1569\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/3a7\/d0b\/287\/3a7d0b28776ae7102e04e0250a03cd73.png\"\/><figcaption>\u041f\u0440\u0438\u043c\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f HIDAPI Test Tool \u0434\u043b\u044f \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0438 USB HID \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430.<\/figcaption><\/figure>\n<p>\u0412 \u043e\u043a\u043d\u0435 Input \u0432\u044b\u0432\u043e\u0434\u044f\u0442\u0441\u044f HID \u043f\u0430\u043a\u0435\u0442\u044b \u043e\u0442 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0432 \u0444-\u0446\u0438\u0438 <code>dev0_on_idle()<\/code> \u043a\u0430\u0436\u0434\u044b\u0435 100\u043c\u0441.<\/p>\n<details class=\"spoiler\">\n<summary>dev0_on_idle()<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">#pragma pack(push, 1) typedef struct {     uint8_t temperature;     uint8_t voltage; } dev0_in_report_t; #pragma pack(pop)  void dev0_on_idle (uint32_t now_tick) {     dev0_t *dev0 = &amp;g_dev0;     imon_t *imon = &amp;g_imon;      if (now_tick - dev0->last_report_tick > 100 ){         dev0->last_report_tick = now_tick;          if (dev0->hid &amp;&amp; imon->temp_degc != INT16_MAX) {                        dev0->hid_in_report.temperature = (int8_t)imon->temp_degc;                        dev0->hid_in_report.voltage =                (uint8_t)((imon->vref + 50) \/ 100) ;                        HID_SendReport(               dev0->hid,                (uint8_t*)&amp;dev0->hid_in_report,               sizeof(dev0->hid_in_report));                              }     }     ... } <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u044f 0\u04451\u0410 0\u044521 \u2013 \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u0430 26 \u0433\u0440\u0430\u0434\u0443\u0441\u043e\u0432 \u0426\u0435\u043b\u044c\u0441\u0438\u044f, \u043d\u0430\u043f\u0440\u044f\u0436\u0435\u043d\u0438\u0435 3.3\u0412.<\/p>\n<p>\u0412 \u043e\u043a\u043d\u0435 Output Data \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 Output HID report \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u0432\u0435\u0442\u043e\u0434\u0438\u043e\u0434\u0430\u043c\u0438, \u043f\u0440\u043e\u0441\u0442\u043e \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u0430.<\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0441\u0432\u043e\u0438\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c \u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0441 HID \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 libusb. \u041e\u0442\u043b\u0438\u0447\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043a\u0430\u043a \u043d\u0430 Windows, \u0442\u0430\u043a \u0438 \u043d\u0430 OpenWrt. \u0417\u0430\u044f\u0432\u043b\u0435\u043d\u0430 \u0435\u0449\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 macOS \u0438 Android, \u043d\u043e \u043b\u0438\u0447\u043d\u043e \u043d\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u043b.<\/p>\n<h2>\u041f\u0440\u0438\u043c\u0435\u0440 \u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443 STM32L072 <\/h2>\n<p>\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430 \u0434\u0440\u0443\u0433\u0438\u0435 \u0441\u0435\u0440\u0438\u0438 STM \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0441\u0435\u0440\u0438\u0438 STM32G4 \u043d\u0430 STM32L072.<\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043d\u043e\u0432\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u0432 \u0434\u0432\u0430 \u044d\u0442\u0430\u043f\u0430: <\/p>\n<ul>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0430\u0432\u0442\u043e\u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0434\u043b\u044f \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u0442\u0430\u043a\u0442\u043e\u0432\u044b\u0445 \u0447\u0430\u0441\u0442\u043e\u0442, \u0438 \u0438\u0445 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f, \u043f\u0435\u0440\u0435\u0444\u0435\u0440\u0438\u0438, \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0439 \u0438 \u0442.\u043f. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043c\u043e\u0436\u043d\u043e <a href=\"https:\/\/github.com\/avasilje\/CompositeUSB_L072K.git\" rel=\"noopener noreferrer nofollow\">\u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0437\u0434\u0435\u0441\u044c<\/a>, \u0432\u0435\u0442\u043a\u0430 <strong>Autogen<\/strong>.<\/p>\n<\/li>\n<li>\n<p>\u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043c\u043e\u0434\u0443\u043b\u044f USB \u0438 main \u0434\u043b\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u0441\u043e\u0441\u0442\u0430\u0432\u043d\u043e\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430. <a href=\"https:\/\/github.com\/avasilje\/CompositeUSB_L072K.git\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/avasilje\/CompositeUSB_L072K.git<\/a>, \u0432\u0435\u0442\u043a\u0430 <strong>main<\/strong>.<\/p>\n<\/li>\n<\/ul>\n<details class=\"spoiler\">\n<summary>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0430\u0432\u0442\u043e\u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430<\/summary>\n<div class=\"spoiler__content\">\n<ol>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u0432\u0438\u0437\u0430\u0440\u0434\u043e\u043c STM32CubeIDE \u0441\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0435\u0439 (CompositeUSB-Autogen.ioc \u0432\u0435\u0442\u043a\u0438 Autogen). <\/p>\n<\/li>\n<\/ol>\n<p>    1.1.\u00a0Timer3<br \/>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u0437\u0430\u0434\u0430\u044e\u0449\u0438\u0439 \u0442\u0430\u0439\u043c\u0435\u0440 \u0434\u043b\u044f \u0410\u0426\u041f, \u0441 \u043f\u0435\u0440\u0438\u043e\u0434\u043e\u043c 4.5\u043c\u0441<\/p>\n<p>    1.2. ADC + DMA Channel 1<br \/>\u0410\u0426\u041f \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 \u0446\u0438\u043a\u043b\u0438\u0447\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435 (mode = CIRC) \u043f\u043e \u0441\u0438\u0433\u043d\u0430\u043b\u0443 \u043e\u0442 \u0442\u0430\u0439\u043c\u0435\u0440\u0430 \u04223.<br \/> \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0434\u0432\u0430 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0445 \u043a\u0430\u043d\u0430\u043b\u0430 \u2013 VrefInt, Temperature Sensor.<\/p>\n<p>    1.3. USB Custom HID device<br \/>\u0412\u043a\u043b\u044e\u0447\u0435\u043c \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0435, \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u0443\u0435\u043c \u043f\u0438\u043d\u044b \u043d\u0430 PA11, PA12. \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b HID \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u043e\u0441\u043e\u0431\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043d\u0435 \u0438\u043c\u0435\u044e\u0442 \u0442.\u043a. \u043a\u043e\u0434 \u0431\u0443\u0434\u0435\u0442 \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0438 \u0437\u0430\u043c\u0435\u043d\u0435\u043d.<\/p>\n<p>    1.4.\u00a0USART1 + DMA Channel 2,3<br \/>    1.5. 3xGPIO<br \/>    1.6.\u00a0Clocks \u2013 internal High Speed (USB crystal less configuration)<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/fcb\/732\/4e2\/fcb7324e2e438fa825806742dbbf6cf3.png\" width=\"1104\" height=\"832\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/fcb\/732\/4e2\/fcb7324e2e438fa825806742dbbf6cf3.png\"\/><figcaption><\/figcaption><\/figure>\n<ol start=\"2\">\n<li>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043a\u043e\u0434 \u043c\u043e\u0434\u0443\u043b\u044f \u00abimon\u00bb (imon.c, imon.h)<br \/>\u041f\u043e\u043c\u0438\u043c\u043e \u0444\u0430\u0439\u043b\u043e\u0432 \u0441\u0430\u043c\u043e\u0433\u043e imon, \u0435\u0449\u0451 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0444\u0430\u0439\u043b stm32l0xx_ll_adc.h \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e\u00a0 CompositeUSB_L072K\\Drivers\\STM32L0xx_HAL_Driver\\Inc.<br \/>\u0424\u0430\u0439\u043b \u043c\u043e\u0436\u043d\u043e \u0432\u0437\u044f\u0442\u044c \u0438\u0437 SDK \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 <a href=\"https:\/\/github.com\/STMicroelectronics\/STM32CubeL0.git\" rel=\"noopener noreferrer nofollow\">\u043e\u0442\u0441\u044e\u0434\u0430<\/a>.<br \/>\u0424\u0430\u0439\u043b \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c \u0434\u043b\u044f \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442 \u0410\u0426\u041f (<code>TEMPSENSOR_CAL1_ADDR<\/code>, \u0438 \u0442.\u043f.)<\/p>\n<\/li>\n<li>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0438 \u0437\u0430\u043f\u0443\u0441\u043a \u043f\u0435\u0440\u0435\u0444\u0435\u0440\u0438\u0438, \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0439 \u043c\u0430\u0441\u0438\u0432 \u0434\u043b\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0410\u0426\u041f, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043c\u043e\u0434\u0443\u043b\u044f imon. <\/p>\n<\/li>\n<\/ol>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u0438\u043c\u0435\u0440 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0432 main()<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">\/* USER CODE BEGIN Includes *\/ #include \"imon.h\" \/* USER CODE END Includes *\/  \/* USER CODE BEGIN PV *\/ int16_t g_adc_samples[ADC_CH_NUM];\/* DMA destination *\/  \/* USER CODE END PV *\/ ... int main(void) { ...   \/* USER CODE BEGIN Init *\/   __disable_irq();   \/* USER CODE END Init *\/    \/* USER CODE BEGIN 2 *\/   imon_init(g_adc_samples);    HAL_TIM_Base_Start_IT(&amp;htim6);    HAL_ADC_Start_DMA(&amp;hadc, (uint32_t*) &amp;g_adc_samples[0], 2);   HAL_TIM_Base_Start_IT(&amp;htim3);    __enable_irq();   \/* USER CODE END 2 *\/  ...    \/* Infinite loop *\/   \/* USER CODE BEGIN WHILE *\/   while (1)   {     uint32_t now_tick = HAL_GetTick();     imon_on_idle(now_tick);     \/* USER CODE END WHILE *\/      \/* USER CODE BEGIN 3 *\/   }   \/* USER CODE END 3 *\/ <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<ol start=\"4\">\n<li>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043a\u0430\u043b\u0438\u0431\u0440\u043e\u0432\u043a\u0443 \u0410\u0426\u041f \u0432 \u0444-\u0446\u0438\u044e void <code>MX_ADC_Init(void)<\/code>. \u0411\u0435\u0437 \u043a\u0430\u043b\u0438\u0431\u0440\u043e\u0432\u043a\u0443 \u0434\u0430\u0442\u0447\u0438\u043a \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u044b \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f.<\/p>\n<\/li>\n<\/ol>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u0438\u043c\u0435\u0440 \u043a\u0430\u043b\u0438\u0431\u0440\u043e\u0432\u043a\u0438 \u0410\u0426\u041f<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">\/* USER CODE BEGIN ADC_Init 2 *\/   LL_ADC_StartCalibration(ADC1);   while (LL_ADC_IsCalibrationOnGoing(ADC1)) {     __asm__ __volatile__ (\"nop;nop;nop;nop;\" ::);   };   \/* USER CODE END ADC_Init 2 *\/ <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<ol start=\"5\">\n<li>\n<p>\u041a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u043c\u00a0 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0447\u0442\u043e \u0442\u0430\u0439\u043c\u0435\u0440 \u0438 \u0410\u0426\u041f \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043a\u0430\u043a \u043d\u0430\u0434\u043e \u2013 \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u0430 +\/- 2\u0421, \u043d\u0430\u043f\u0440\u044f\u0436\u0435\u043d\u0438\u0435 \u043f\u0438\u0442\u0430\u043d\u0438\u044f \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u043c\u0443, \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u0438\u044f \u0432 \u043c\u0438\u043b\u043b\u0438\u0432\u043e\u043b\u044c\u0442\u0430\u0445.<\/p>\n<\/li>\n<\/ol>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043c\u043e\u0434\u0443\u043b\u044f USB \u0438 main<\/summary>\n<div class=\"spoiler__content\">\n<p>1.\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u0417\u0430\u043c\u0435\u043d\u044f\u0435\u043c \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u043e\u0440\u0438\u044e USB_DEVICE.<br \/>2.\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u0417\u0430\u043c\u0435\u043d\u044f\u0435\u043c Middlewares\\ST\\STM32_USB_Device_Library.<br \/>3.\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c dev0.c\/.h \u0432 Core.<br \/>4.\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043f\u0443\u0442\u0438 \u0438\u043d\u043a\u043b\u0443\u0434\u043e\u0432.<\/p>\n<p><code>..\/Middlewares\/ST\/STM32_USB_Device_Library\/Class\/Composite<br \/>..\/Middlewares\/ST\/STM32_USB_Device_Library\/Class\/CDC\/Inc<\/code><\/p>\n<p>5.              \u041c\u0435\u043d\u044f\u0435\u043c \u0437\u043d\u0430\u044f\u0435\u043d\u0438\u044f \u043d\u043e\u043c\u0435\u0440\u0430 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u044f USB \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>HAL_PCD_MspInit()<\/code> (usbd_conf.c)<\/p>\n<details class=\"spoiler\">\n<summary>HAL_PCD_MspInit()<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">HAL_NVIC_SetPriority(USB_LP_IRQn, 0, 0); HAL_NVIC_EnableIRQ(USB_LP_IRQn);  HAL_NVIC_SetPriority(USB_IRQn, 0, 0); HAL_NVIC_EnableIRQ(USB_IRQn); <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<ol start=\"6\">\n<li>\n<p>     \u00a0\u00a0 \u041c\u0435\u043d\u044f\u0435\u043c &#8230;_hal_pcd.c\/.h<\/p>\n<\/li>\n<\/ol>\n<details class=\"spoiler\">\n<summary>hal_pcd_patch.diff<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"diff\">--- a\/Drivers\/STM32L0xx_HAL_Driver\/Inc\/stm32l0xx_hal_pcd.h +++ b\/Drivers\/STM32L0xx_HAL_Driver\/Inc\/stm32l0xx_hal_pcd.h @@ -119,6 +119,8 @@ typedef struct                                         This parameter can be set to ENABLE or DISABLE        *\/    void                    *pData;      \/*!&lt; Pointer to upper stack Handler *\/   +  uint32_t   pma_map;     \/* USB memory allocation map *\/ +  #if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)    void (* SOFCallback)(struct __PCD_HandleTypeDef *hpcd);                              \/*!&lt; USB OTG PCD SOF callback                *\/    void (* SetupStageCallback)(struct __PCD_HandleTypeDef *hpcd);                       \/*!&lt; USB OTG PCD Setup Stage callback        *\/ @@ -220,6 +222,10 @@ typedef struct    *\/  HAL_StatusTypeDef HAL_PCD_Init(PCD_HandleTypeDef *hpcd);  HAL_StatusTypeDef HAL_PCD_DeInit(PCD_HandleTypeDef *hpcd); + +uint32_t HAL_PCD_PMA_Alloc(PCD_HandleTypeDef *hpcd, uint32_t ep_mps); +void HAL_PCD_PMA_Free(PCD_HandleTypeDef *hpcd, uint32_t ep_pmaadress, uint32_t ep_mps); +  void HAL_PCD_MspInit(PCD_HandleTypeDef *hpcd);  void HAL_PCD_MspDeInit(PCD_HandleTypeDef *hpcd);   --- a\/Drivers\/STM32L0xx_HAL_Driver\/Src\/stm32l0xx_hal_pcd.c +++ b\/Drivers\/STM32L0xx_HAL_Driver\/Src\/stm32l0xx_hal_pcd.c @@ -54,8 +54,17 @@    *\/    \/* Includes ------------------------------------------------------------------*\/ +#include &lt;assert.h>  #include \"stm32l0xx_hal.h\"   +#define PMA_BLOCK_SIZE_EXP 5 +#define PMA_BLOCK_SIZE (1 &lt;&lt; PMA_BLOCK_SIZE_EXP) +#define PMA_BLOCKS_NUM (1024 \/ PMA_BLOCK_SIZE) + +\/\/ Note: pma_map - uses 32bit word for segment marking +\/\/ #include \"main.h\" +\/\/ CTASSERT(PMA_BLOCKS_NUM &lt;= 32); +  \/** @addtogroup STM32L0xx_HAL_Driver    * @{    *\/ @@ -113,6 +122,51 @@ static uint16_t HAL_PCD_EP_DB_Receive(PCD_HandleTypeDef *hpcd, PCD_EPTypeDef *ep    * @{    *\/   +void HAL_PCD_PMA_Free(PCD_HandleTypeDef *hpcd, uint32_t ep_pmaadress, uint32_t ep_mps) +{ +uint32_t ep_map; + +int blocks_num = (ep_mps + PMA_BLOCK_SIZE - 1) >> PMA_BLOCK_SIZE_EXP; + +ep_map = (blocks_num == 32) ? UINT32_MAX : (1 &lt;&lt; blocks_num) - 1; +ep_map &lt;&lt;= ep_pmaadress >> PMA_BLOCK_SIZE_EXP; + +\/* Sanity check. All blocks to be allocated + * have to be marked as occupied +  *\/ +assert((ep_map &amp; hpcd->pma_map) == ep_map); + +\/* Clear map *\/ +hpcd->pma_map &amp;= ~ep_map; +} + +uint32_t HAL_PCD_PMA_Alloc(PCD_HandleTypeDef *hpcd, uint32_t ep_mps) +{ +int i, blocks_num; +uint32_t ep_map = 0; +uint32_t ep_pmaaddress = UINT32_MAX; + +\/* + * 1024Bytes split by 32bytes blocks => 32 blocks + * pma_map => 1 bit one block. 1 - occupied, 0 - free. + * LSB = 0x0000 +  *\/ +blocks_num = (ep_mps + PMA_BLOCK_SIZE - 1) >> PMA_BLOCK_SIZE_EXP; +ep_map = (blocks_num == 32) ? UINT32_MAX : (1 &lt;&lt; blocks_num) - 1; + +for (i = 0; i &lt;= PMA_BLOCKS_NUM - blocks_num; i++) { +if ((ep_map &amp; hpcd->pma_map) == 0) { +\/* Free slot were found - allocate them *\/ +hpcd->pma_map |= ep_map; +ep_pmaaddress = i * PMA_BLOCK_SIZE; +break; +} +ep_map = ep_map &lt;&lt; 1; +} + +return ep_pmaaddress; +} +  \/**    * @brief  Initializes the PCD according to the specified    *         parameters in the PCD_InitTypeDef and initialize the associated handle. @@ -1382,6 +1436,11 @@ HAL_StatusTypeDef HAL_PCD_EP_Open(PCD_HandleTypeDef *hpcd, uint8_t ep_addr,      ep->is_in = 0U;    }   +  \/\/ Allocate PMA memory. No memory - no party +  uint32_t pma_addr = HAL_PCD_PMA_Alloc(hpcd, ep_mps); +  assert(pma_addr != UINT32_MAX); +  HAL_PCDEx_PMAConfig(hpcd, ep_addr, PCD_SNG_BUF, pma_addr); +    ep->num = ep_addr &amp; EP_ADDR_MSK;    ep->maxpacket = ep_mps;    ep->type = ep_type; @@ -1426,9 +1485,19 @@ HAL_StatusTypeDef HAL_PCD_EP_Close(PCD_HandleTypeDef *hpcd, uint8_t ep_addr)    }    ep->num   = ep_addr &amp; EP_ADDR_MSK;   +  if (ep->maxpacket == 0) +  { +    \/\/ EP not opened yet +    return HAL_OK; +  } +    __HAL_LOCK(hpcd);    (void)USB_DeactivateEndpoint(hpcd->Instance, ep);    __HAL_UNLOCK(hpcd); + +  HAL_PCD_PMA_Free(hpcd,ep->pmaadress,ep->maxpacket); +  ep->maxpacket = 0; +    return HAL_OK;  }   <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<ul>\n<li>\n<p>\u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442;<\/p>\n<\/li>\n<li>\n<p>\u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0444-\u0446\u0438\u0438 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u044f\/\u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u043f\u0430\u043c\u044f\u0442\u0438 \u043f\u043e\u0434 \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0435 \u0442\u043e\u0447\u043a\u0438 USB <code>HAL_PCD_PMA_Free\/Alloc();<\/code><\/p>\n<\/li>\n<li>\n<p>\u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u044d\u0442\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0432 <code>HAL_PCD_EP_Open\/Close()<\/code>;<\/p>\n<\/li>\n<li>\n<p>\u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043f\u043e\u043b\u0435 pma_map \u0432 struct <code>PCD_HandleTypeDef<\/code>, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0434\u0435\u043a\u043b\u0430\u0440\u0430\u0446\u0438\u044e \u0444-\u0446\u0438\u0439 <code>HAL_PCD_PMA_Free\/Alloc()<\/code> \u0432 .h \u0444\u0430\u0439\u043b <\/p>\n<\/li>\n<\/ul>\n<ol start=\"7\">\n<li>\n<p>\u041c\u0435\u043d\u044f\u0435\u043c main.c\/.h<\/p>\n<\/li>\n<\/ol>\n<details class=\"spoiler\">\n<summary>main_patch.diff<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"diff\">--- a\/Core\/Inc\/main.h +++ b\/Core\/Inc\/main.h @@ -27,6 +27,7 @@ extern \"C\" {  #endif    \/* Includes ------------------------------------------------------------------*\/ +#include \"av-generic.h\"  #include \"stm32l0xx_hal.h\"    \/* Private includes ----------------------------------------------------------*\/ --- a\/Core\/Src\/main.c +++ b\/Core\/Src\/main.c @@ -22,7 +22,12 @@    \/* Private includes ----------------------------------------------------------*\/  \/* USER CODE BEGIN Includes *\/ +\/\/#include \"stm32l0xx_ll_adc.h\"  #include \"imon.h\" +#include \"cdc_uart.h\" +#include \"cdc_ictrl.h\" +#include \"dev0.h\" +  \/* USER CODE END Includes *\/    \/* Private typedef -----------------------------------------------------------*\/ @@ -53,6 +58,10 @@ DMA_HandleTypeDef hdma_usart1_tx;  #define ADC_CH_NUM 2  int16_t g_adc_samples[ADC_CH_NUM];\/* DMA destination *\/   + +extern cdc_ictrl_t g_cdc_ictrl; +extern cdc_uart_t g_cdc_uart1; +  \/* USER CODE END PV *\/    \/* Private function prototypes -----------------------------------------------*\/ @@ -115,6 +124,10 @@ int main(void)    \/* USER CODE BEGIN 2 *\/    imon_init(&amp;g_adc_samples[1], &amp;g_adc_samples[0]);   +  \/* Link USB Device CDC interface with a corresponding Downface Interface (DFI) *\/ +  cdc_uart_init(&amp;g_cdc_uart1, &amp;g_cdc0, &amp;huart1); +  cdc_ictrl_init(&amp;g_cdc1); +    HAL_TIM_Base_Start_IT(&amp;htim6);      HAL_ADC_Start_DMA(&amp;hadc, (uint32_t*)&amp;g_adc_samples[0], ADC_CH_NUM); @@ -129,6 +142,14 @@ int main(void)    {      uint32_t now_tick = HAL_GetTick();      imon_on_idle(now_tick); +    dev0_on_idle(now_tick); + +    g_cdc_uart1.dfi.on_idle(&amp;g_cdc_uart1.dfi); +    g_cdc_ictrl.dfi.on_idle(&amp;g_cdc_ictrl.dfi); +#if NAVIG +    cdc_uart_dfi_on_idle(); +    cdc_ictrl_dfi_on_idle(); +#endif      \/* USER CODE END WHILE *\/        \/* USER CODE BEGIN 3 *\/  <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<ul>\n<li>\n<p>\u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0432 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e CDC \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432;<\/p>\n<\/li>\n<li>\n<p>\u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0432 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 CDC \u0438 HID \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 \u0432 \u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u0446\u0438\u043a\u043b;<\/p>\n<\/li>\n<li>\n<p>\u0441\u043e\u043b\u044c, \u043f\u0435\u0440\u0435\u0446 \u043f\u043e \u0432\u043a\u0443\u0441\u0443.<\/p>\n<\/li>\n<\/ul>\n<\/div>\n<\/details>\n<p>\u041a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u043c, \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c\u0441\u044f, \u0440\u0430\u0434\u0443\u0435\u043c\u0441\u044f \u0438 \u043c\u0430\u0448\u0435\u043c \u0440\u0443\u043a\u0430\u043c\u0438.<\/p>\n<h3>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h3>\n<p>\u041f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u044e \u0441\u043b\u043e\u0432\u0430 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043b\u0435\u0433\u043b\u0430 \u0432 \u043e\u0441\u043d\u043e\u0432\u0443 \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 <a href=\"https:\/\/habr.com\/ru\/post\/335018\/\" rel=\"noopener noreferrer nofollow\">CDC+MSC USB Composite Device \u043d\u0430 STM32 HAL<\/a>.<\/p>\n<p>ST  &#8212; \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u043c\u043e\u043d\u0441\u0442\u0440 \u0435\u0449\u0451 \u0442\u043e\u0442 \u0438 \u0432\u043e \u043c\u043d\u043e\u0433\u0438\u0445 \u043c\u0435\u0441\u0442\u0430\u0445 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0430 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043d\u0435\u0440\u044f\u0448\u043b\u0438\u0432\u043e, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0432 \u0447\u0430\u0441\u0442\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u044f, \u043d\u043e! 1) \u043e\u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442; 2) \u043d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0435\u043c \u0447\u0442\u043e \u044d\u0442\u043e \u043a\u043e\u0434 \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u0430\u0432\u0442\u043e\u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u043e\u0434\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u043e\u0434 \u0440\u0430\u0437\u043d\u044b\u0435 \u0441\u0435\u0440\u0438\u0438 \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u043e\u0432 \u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u0432\u0430\u0440\u0438\u0430\u0446\u0438\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 USB \u043f\u0435\u0440\u0438\u0444\u0435\u0440\u0438\u0438. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043a ST \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u043f\u0440\u0435\u0442\u0435\u043d\u0437\u0438\u0439 \u0438 \u0441\u043f\u0430\u0441\u0438\u0431\u043e \u0437\u0430 \u0438\u0445 \u0442\u0440\u0443\u0434. \u041a\u0442\u043e \u043f\u0438\u0441\u0430\u043b \u0430\u0432\u0442\u043e\u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u044b, \u0442\u043e\u0442 \u043f\u043e\u0439\u043c\u0435\u0442.<\/p>\n<p>\u0418\u043d\u043e\u0433\u0434\u0430, \u0432 \u0437\u0430\u043f\u0430\u043b\u0435, \u043f\u043e\u0441\u0435\u0449\u0430\u043b\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u00ab\u043f\u043e\u043c\u0430\u0445\u0430\u0442\u044c \u0448\u0430\u0448\u043a\u043e\u0439\u00bb \u0432 HAL \u0447\u0430\u0441\u0442\u0438 \u043a\u043e\u0434\u0430, \u0442\u0430\u043a \u0447\u0442\u043e \u0432 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u0434 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u044b \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u043a\u043e\u0441\u043c\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043d\u0435 \u0432\u043e\u0448\u0435\u0434\u0448\u0438\u0435 \u0432 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0432\u044b\u0448\u0435. \u041e\u0434\u043d\u0430\u043a\u043e \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u044b\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c (PCD, \u0444\u0430\u0439\u043b\u044b _ll_usb.c\/.h ) \u043e\u0441\u0442\u0430\u043b\u0441\u044f \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0431\u0435\u0437 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439, \u0447\u0442\u043e\u0431\u044b \u0431\u044b\u043b\u043e \u043b\u0435\u0433\u0447\u0435 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442\u044c \u0441 \u043e\u0434\u043d\u043e\u0439 \u0441\u0435\u0440\u0438\u0438 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u043e\u0432 \u043d\u0430 \u0434\u0440\u0443\u0433\u0443\u044e.<\/p>\n<p>\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0433\u043e\u0442\u043e\u0432\u043e\u0439 \u043a \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u043e\u0439, \u0430 \u0441\u043a\u043e\u0440\u0435\u0435 \u0448\u0430\u0431\u043b\u043e\u043d \u0434\u043b\u044f \u0430\u0434\u0430\u043f\u0442\u0430\u0446\u0438\u0438 \u043a \u0434\u0440\u0443\u0433\u0438\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u043c. \u0422.\u0435. \u044d\u0442\u043e \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u0441 \u0432\u044b\u043f\u0438\u043b\u0435\u043d\u043d\u043e\u0439 \u0438\u0437 \u043d\u0435\u0433\u043e \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u043e\u0439 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u0440\u0430\u0431\u043e\u0447\u0435\u0433\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u0430. \u0422\u0430\u043a \u0447\u0442\u043e, \u043d\u0430\u0431\u043e\u0440 \u043d\u0430\u043f\u0438\u043b\u044c\u043d\u0438\u043a\u043e\u0432 \u0432 \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0442\u0435.<\/p>\n<p>\u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0446\u0435\u043b\u044c \u0431\u044b\u043b\u0430 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0443\u0434\u043e\u0431\u043d\u044b\u0439 \u0448\u0430\u0431\u043b\u043e\u043d \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 USB \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 \u043d\u0430 \u043e\u0434\u043d\u043e\u043c \u0447\u0438\u043f\u0435, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u0445 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0435\u0440\u043e\u0432, HID \u0438 \u0442.\u043f.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"v-portal\" style=\"display:none;\"><\/div>\n<\/div>\n<p> <!----> <!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/post\/674662\/\"> https:\/\/habr.com\/ru\/post\/674662\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u041f\u0440\u043e\u0435\u043a\u0442 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435\u043c \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043d\u0430 \u0425\u0430\u0431\u0440\u0435 &#8212; <a href=\"https:\/\/habr.com\/ru\/post\/335018\/\" rel=\"noopener noreferrer nofollow\">CDC+MSC USB Composite Device \u043d\u0430 STM32 HAL<\/a> \u0438 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0442 \u043a\u0430\u043a \u043d\u0430 STM32 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442 \u0441 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 USB \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438, \u0441 \u0447\u0438\u0442\u0430\u0435\u043c\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0442\u0438\u043f\u043e\u0432\u044b\u0435 \u043c\u043e\u0434\u0443\u043b\u0438. \u041a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d \u043f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u0438 <strong>HID<\/strong> + <strong>CDC UART<\/strong> + <strong>CDC<\/strong>, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u043d\u043e \u043a\u0430\u043a \u044d\u0442\u043e\u0442 \u043f\u0440\u043e\u0435\u043a\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u0438\u0442\u044c \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430\u043c\u0438.<\/p>\n<h2>\u041c\u043e\u0442\u0438\u0432\u0430\u0446\u0438\u044f<\/h2>\n<p>Once upon a time\u2026 \u041f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u0437\u0430\u0434\u0430\u0447\u0430 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u043e\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0441 USB Serial \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0435\u0440\u043e\u043c \u043d\u0430 \u0431\u043e\u0440\u0442\u0443 \u043f\u043b\u044e\u0441 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u0444-\u0446\u0438\u0439. \u041e\u043a, \u0435\u0441\u0442\u044c \u0433\u043e\u0442\u043e\u0432\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0434\u043b\u044f STM32. \u0417\u0430\u0442\u0435\u043c \u0430\u043f\u043f\u0435\u0442\u0438\u0442\u044b \u0441\u0442\u0430\u043b\u0438 \u0440\u0430\u0441\u0442\u0438 \u0438 \u00ab\u043d\u0435\u043c\u043d\u043e\u0433\u043e\u00bb \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u0444-\u0446\u0438\u0439 \u043f\u0435\u0440\u0435\u0440\u0430\u0441\u043b\u043e \u0432 \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u043e\u0435 USB HID \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e. \u041e\u043a, \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 HID \u0442\u043e\u0436\u0435 \u0435\u0441\u0442\u044c, \u043d\u043e \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u044d\u0442\u043e \u043d\u0435 \u0442\u0430\u043a\u0430\u044f \u0443\u0436 \u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u0434\u0432\u0430 USB \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u043d\u0430 \u043e\u0434\u043d\u043e\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0435. \u041d\u0430 \u0443\u0434\u0430\u0447\u0443, \u043d\u0430 \u0425\u0430\u0431\u0440\u0435 \u043d\u0430\u0448\u043b\u0430\u0441\u044c \u0441\u0442\u0430\u0442\u044c\u044f \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043a\u0430\u043a \u0440\u0430\u0437 \u0438 \u0440\u0435\u0448\u0430\u043b\u0430 \u043f\u043e\u0434\u043e\u0431\u043d\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443 &#8212; CDC+MSC USB Composite Device \u043d\u0430 STM32 HAL (\u0441\u0441\u044b\u043b\u043a\u0430 \u0432\u044b\u0448\u0435).\u00a0\u0421\u043f\u0430\u0441\u0438\u0431\u043e \u0430\u0432\u0442\u043e\u0440\u0443 \u0437\u0430 \u0435\u0433\u043e \u0442\u0440\u0443\u0434! \u0412\u0441\u0435 \u0437\u0430\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e. \u041e\u0434\u043d\u0430\u043a\u043e, \u0430\u043f\u043f\u0435\u0442\u0438\u0442\u044b \u0432\u0441\u0435 \u0440\u043e\u0441\u043b\u0438 \u0438 \u0440\u043e\u0441\u043b\u0438 \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432 \u0432 \u0442\u043e\u043c \u0436\u0435 \u0441\u0442\u0438\u043b\u0435 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u043b\u043e \u043a\u043e\u0434 \u0432 \u043d\u0435\u0447\u0442\u043e \u0443\u0436\u0430\u0441\u043d\u043e\u0435 \u0438 \u043d\u0435 \u0447\u0438\u0442\u0430\u0435\u043c\u043e\u0435. \u0422\u043e, \u0447\u0442\u043e \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e \u0441\u043c\u043e\u0442\u0440\u0435\u043b\u043e\u0441\u044c \u0434\u043b\u044f \u0434\u0432\u0443\u0445 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432 \u0443\u0436\u0435 \u0434\u043b\u044f \u0442\u0440\u0435\u0445, \u043f\u0440\u0438\u0447\u0435\u043c \u0434\u0432\u0430 \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0431\u044b\u043b\u0438 \u043e\u0434\u043d\u043e\u0442\u0438\u043f\u043d\u044b\u043c\u0438, \u0441\u043c\u043e\u0442\u0440\u0435\u043b\u043e\u0441\u044c \u0441\u043e\u0432\u0441\u0435\u043c \u043f\u043b\u043e\u0445\u043e. \u0410 \u043d\u0430 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0435 \u0443 \u0448\u0435\u0444\u0430 \u043f\u043e\u044f\u0432\u043b\u044f\u043b\u0438\u0441\u044c \u0432\u0441\u0435 \u043d\u043e\u0432\u044b\u0435 \u0438 \u043d\u043e\u0432\u044b\u0435 \u0444\u0430\u043d\u0442\u0430\u0437\u0438\u0438 \u043d\u0430 \u0442\u0435\u043c\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u0430 \u00ab\u0441\u0442\u043c\u043a\u0438\u00bb. \u0422\u0430\u043a\u0436\u0435, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b \u0432\u0441\u0435 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u043b\u0441\u044f \u0438 \u0435\u0433\u043e \u043e\u0442\u043b\u0430\u0434\u043a\u0430 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b\u0430\u0441\u044c \u0441\u043b\u043e\u0436\u043d\u0435\u0435 \u0438 \u0441\u043b\u043e\u0436\u043d\u0435\u0435, \u0442\u043e \u043d\u0430\u0437\u0440\u0435\u043b \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u0442\u0438\u043f USB Serial \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0434\u043b\u044f \u0432\u044b\u0432\u043e\u0434\u0430 \u043f\u0435\u0447\u0430\u0442\u0438 \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0445 \u043a\u043e\u043c\u0430\u043d\u0434 \u0441 \u043a\u043e\u043d\u0441\u043e\u043b\u0438 \u043d\u0430 \u0441\u0430\u043c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440. \u0422\u0430\u043a \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f Internal Control (ICTRL). \u0412 \u043e\u0431\u0449\u0435\u043c &#8212; \u043d\u0430\u0431\u043e\u043b\u0435\u043b\u043e \u0438 \u0431\u044b\u043b\u0430 \u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430 \u043d\u043e\u0432\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430&#8230;<\/p>\n<h2>\u0417\u0430\u0434\u0430\u0447\u0430<\/h2>\n<p>\u041d\u0430 \u0431\u0430\u0437\u0435 ST \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043a\u0430\u0440\u043a\u0430\u0441 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 USB HAL, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u0431\u043b\u043e\u043a\u0430\u043c\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438\/\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u043f\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438, \u0431\u0435\u0437 \u043e\u0441\u043e\u0431\u044b\u0445 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0432 \u043a\u043e\u0434\u0435 \u0441\u0430\u043c\u043e\u0433\u043e HAL. \u0412 \u0438\u0434\u0435\u0430\u043b\u0435, \u0434\u043b\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u0430 \u0432 \u043f\u0440\u043e\u0435\u043a\u0442 \u0434\u043e\u043b\u0436\u0435\u043d \u043b\u0438\u043d\u043a\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u043c\u043e\u0434\u0443\u043b\u044c, \u043f\u043b\u044e\u0441 \u043f\u0430\u0440\u0430 \u0441\u0442\u0440\u043e\u043a \u0432 main \u2013 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0438 \u0432\u044b\u0437\u043e\u0432\u044b \u0432 \u0433\u043b\u0430\u0432\u043d\u043e\u043c \u0446\u0438\u043a\u043b\u0435.<\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430, \u0442\u0430\u043a\u0438\u043c\u0438 \u0431\u043b\u043e\u043a\u0430\u043c\u0438 \u0431\u044b\u043b\u0438 \u0432\u044b\u0431\u0440\u0430\u043d\u044b \u0434\u0432\u0430 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0447\u0430\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445 \u0442\u0438\u043f\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 \u2013 HID \u0438 USB Serial \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0435\u0440. \u041f\u0440\u0438\u0447\u0435\u043c \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0435\u0440 \u043c\u043e\u0433 \u0431\u044b\u0442\u044c \u043a\u0430\u043a UART, \u0442\u0430\u043a \u0438 I2C, SPI, 1Wire. ICTRL \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u043b\u0441\u044f \u0432\u043e \u0432\u0441\u0435\u0445 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u0445 \u0443\u0436\u0435 \u043f\u043e-\u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e.<\/p>\n<h2>\u0414\u043b\u044f \u043a\u043e\u0433\u043e \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d \u043f\u0440\u043e\u0435\u043a\u0442<\/h2>\n<p>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043d\u0438\u0436\u0435 \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0435\u0442, \u0447\u0442\u043e \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u043b \u0438 \u043e\u0441\u043e\u0437\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u044e \u00abCDC+MSC USB Composite Device \u043d\u0430 STM32 HAL\u00bb, \u0433\u0434\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 USB HAL \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043e\u0442 ST \u043e\u043f\u0438\u0441\u0430\u043d\u0430 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e. \u0414\u0430\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u043f\u043e\u0441\u0432\u044f\u0449\u0435\u043d \u0438\u043c\u0435\u043d\u043d\u043e \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0443 \u043e\u0442 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0439 ST \u043a \u0431\u043e\u043b\u0435\u0435 \u043c\u043e\u0434\u0443\u043b\u044c\u043d\u043e\u043c\u0443 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0443 \u0431\u0435\u0437 \u0440\u0430\u0437\u0431\u043e\u0440\u0430 \u043e\u0441\u043d\u043e\u0432 \u0440\u0430\u0431\u043e\u0442\u044b USB. \u0422\u0430\u043a\u0436\u0435 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0443 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044f \u0440\u043e\u0434\u043d\u043e\u0439 \u044f\u0437\u044b\u043a \u0421 \u0438\u043b\u0438 Assembler \u0438 \u0432 \u0441\u0442\u0440\u043e\u043a\u0430\u0445 \u043a\u043e\u0434\u0430 \u0447\u0438\u0442\u0430\u044e\u0442\u0441\u044f \u043d\u0435 \u0431\u0443\u043a\u0432\u044b, \u0430 \u0431\u043b\u043e\u043a\u0438 \u0438\u0445 \u0441\u0432\u044f\u0437\u0438 \u0438 \u0432\u0437\u0430\u0438\u043c\u043e\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438. \u0414\u043b\u044f \u0442\u0435\u0445 \u0443 \u043a\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043d\u0430 \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0435 \u044d\u0442\u043e \u0433\u0430\u043b\u043e\u0447\u043a\u0438 \u0432 \u0430\u0432\u0442\u043e\u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0435 \u0438\u043b\u0438 \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u043f\u0438\u0441\u044c\/\u0447\u0442\u0435\u043d\u0438\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432, \u0442\u0435\u043c \u0431\u0443\u0434\u0435\u0442 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e. \u041d\u043e, \u043a\u0430\u043a \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u0441\u044f, \u0447\u0442\u043e \u043d\u0430\u0441 \u043d\u0435 \u0443\u0431\u0438\u0432\u0430\u0435\u0442, \u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 \u0441\u0438\u043b\u044c\u043d\u0435\u0435.<\/p>\n<h2>\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435<\/h2>\n<p>\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0431\u044b\u043b\u0430 \u0432\u044b\u0431\u0440\u0430\u043d\u0430 \u043e\u0434\u043d\u0430 \u0438\u0437 \u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0439 \u2013 USB UART \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0435\u0440 + HID \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0438 \u0435\u0449\u0435 \u043e\u0434\u043d\u043e USB Serial \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u0430\u043c\u0438\u043c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u043e\u043c \u0438 \u043e\u0442\u043b\u0430\u0434\u043e\u0447\u043d\u043e\u0439 \u043f\u0435\u0447\u0430\u0442\u0438. \u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430 HID \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0438 ICTRL \u0431\u044b\u043b\u0430 \u0441\u043e\u0437\u043d\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u043f\u0443\u0449\u0435\u043d\u0430 \u0438 \u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u0442\u043e\u043b\u044c\u043a\u043e \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b, \u0442\u0430\u043a \u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043d\u0430 \u0440\u0430\u0441\u0441\u0430\u0434\u0443 \u0438 \u0447\u0442\u043e\u0431 \u043d\u0435 \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u043a\u043e\u0434 \u043f\u0440\u0438 \u0447\u0442\u0435\u043d\u0438\u0438.<\/p>\n<h2>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 &#8212; USB Composite<\/h2>\n<p>UBS Composite \u2013 USB \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 3 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432, \u0433\u0434\u0435 \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441, \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043d\u0430 \u0445\u043e\u0441\u0442 \u0441\u0438\u0441\u0442\u0435\u043c\u0435, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e\u043c.<\/p>\n<p>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u044b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430:<\/p>\n<ol>\n<li>\n<p>CDC UART<\/p>\n<\/li>\n<li>\n<p>CDC ICTRL <\/p>\n<\/li>\n<li>\n<p>HID<\/p>\n<\/li>\n<\/ol>\n<h3>CDC <\/h3>\n<p>CDC (Communication Device Class) \u2013 \u044d\u0442\u043e \u043a\u043b\u0430\u0441\u0441 USB \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 \u043e\u0431\u0449\u0438\u0439 \u0434\u043b\u044f CDC UART \u0438 CDC ICTRL. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f PSTN120 \u043f\u0440\u043e\u0444\u0438\u043b\u044c \u043a\u043b\u0430\u0441\u0441\u0430 USB CDC. \u0415\u0441\u043b\u0438 \u043f\u043e-\u043f\u0440\u043e\u0441\u0442\u043e\u043c\u0443, \u0442\u043e \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u0445\u043e\u0441\u0442 \u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u044d\u0442\u043e \u043e\u0431\u044b\u0447\u043d\u044b\u0439 USB Serial \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0435\u0440 \u0438 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u043e\u0432. \u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 CDC \u043d\u0430 usb.org:<br \/><a href=\"https:\/\/www.usb.org\/document-library\/class-definitions-communication-devices-12\" rel=\"noopener noreferrer nofollow\">https:\/\/www.usb.org\/document-library\/class-definitions-communication-devices-12<\/a><br \/>\u0423\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u0438 \u0444\u043e\u0440\u043c\u0430\u0442\u0430 \u043f\u043e\u0441\u044b\u043b\u043a\u0438 (\u0441\u0442\u0430\u0440\u0442, \u0441\u0442\u043e\u043f \u0431\u0438\u0442\u044b, \u0431\u0438\u0442\u044b \u0447\u0435\u0442\u043d\u043e\u0441\u0442\u0438 \u0438 \u0442.\u0434.). \u0412 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0442\u0438\u043f\u0430 \u043d\u0438\u0436\u0435\u0441\u0442\u043e\u044f\u0449\u0435\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 (downward facing interface, aka DFI) \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c  \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0444-\u0446\u0438\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0442\u0430\u043a\u0438\u0435 \u043a\u0430\u043a UART, SPI \u0438\u043b\u0438 I2C \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0435\u0440. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043e \u0434\u0432\u0435 \u0440\u0430\u0437\u043d\u043e\u0432\u0438\u0434\u043d\u043e\u0441\u0442\u0438 CDC \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 \u2013 CDC UART \u0438 CDC ICTRL.<\/p>\n<h4>CDC UART   <\/h4>\n<p>\u0422\u0440\u0430\u043d\u0441\u043b\u0438\u0440\u0443\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0447\u0435\u0440\u0435\u0437 \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u044b\u0439 UART \u043f\u043e\u0440\u0442 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430 \u0432 USB CDC \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0438 \u043e\u0431\u0440\u0430\u0442\u043d\u043e. \u0422.\u0435. \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043a\u0430\u043a \u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u044b\u0439 USB UART \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0435\u0440.<\/p>\n<h4>CDC ICTRL<\/h4>\n<p>\u0423\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u043d\u0435 \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0441 \u0432\u043d\u0435\u0448\u043d\u0438\u043c\u0438 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430\u043c\u0438, \u0430 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0438 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e. \u041c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u043b\u044f \u0432\u044b\u0432\u043e\u0434\u0430 \u043e\u0442\u043b\u0430\u0434\u043e\u0447\u043d\u043e\u0439 \u043f\u0435\u0447\u0430\u0442\u0438 \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0445 \u043a\u043e\u043c\u0430\u043d\u0434 \u043d\u0430 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440.<\/p>\n<h3>HID <\/h3>\n<p>\u041d\u0435 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0435 (vendor specific) USB HID \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442 \u043d\u0430 \u0445\u043e\u0441\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0441\u043e \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0433\u043e \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u043d\u043e\u0433\u043e \u0434\u0430\u0442\u0447\u0438\u043a\u0430 \u0438 \u043d\u0430\u043f\u0440\u044f\u0436\u0435\u043d\u0438\u0435 \u043f\u0438\u0442\u0430\u043d\u0438\u044f \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430. \u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 HID \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430: <br \/><a href=\"https:\/\/usb.org\/sites\/default\/files\/hid1_11.pdf\" rel=\"noopener noreferrer nofollow\">usb.org\/sites\/default\/files\/hid1_11.pdf<\/a><\/p>\n<p>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b HID \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 (<code>USBD_HidDesc<\/code>) \u0438 \u0444\u043e\u0440\u043c\u0430\u0442\u0430 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 (<code>Dev0_HID_ReportDesc<\/code> hid report descriptor) \u043e\u0442\u0441\u044b\u043b\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0445\u043e\u0441\u0442 \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 HID \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430.<\/p>\n<h2>\u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u0434\u0430\u043d\u043d\u044b\u0445, \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0438 \u0438\u0445 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438  <\/h2>\n<figure class=\"full-width\"><figcaption>\u0421\u0432\u044f\u0437\u044c \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0438 \u0438\u0445 \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u044f<\/figcaption><\/figure>\n<hr\/>\n<p><code>USBD_Handle hUsbDevice<\/code> &#8212; USB \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0432\u0435\u0440\u0445\u043d\u0435\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f (aka Middleware)   <\/p>\n<p>\u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043e\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0445 \u0442\u043e\u0447\u0435\u043a (end points ep_in\/ep_out), \u0441\u0442\u0430\u0442\u0443\u0441\u0430, \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 (<code>pDesc<\/code>), \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u043d\u0430 \u0444-\u0446\u0438\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 (<code>pClass<\/code>), \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 USB \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e HAL \u0443\u0440\u043e\u0432\u043d\u044f (<code>pPCDHandle<\/code>), \u0430 \u0442\u0430\u043a\u0436\u0435 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u043d\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b (<code>intf<\/code>).<\/p>\n<details class=\"spoiler\">\n<summary>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0442\u0438\u043f\u0430 USBD_Handle<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">typedef struct _USBD_Handle {   uint8_t              id;   uint32_t             dev_config;   uint32_t             dev_default_config;   uint32_t             dev_config_status;    USBD_Speed           dev_speed;   USBD_Endpoint        ep_in[16];   USBD_Endpoint        ep_out[16];   __IO uint32_t        ep0_state;   uint32_t             ep0_data_len;   __IO uint8_t         dev_state;   __IO uint8_t         dev_old_state;   uint8_t              dev_address;   uint8_t              dev_connection_status;   uint8_t              dev_test_mode;   uint32_t             dev_remote_wakeup;   USBD_SetupReq        request;   USBD_Descriptors     *pDesc;   USBD_Class           *pClass;   uint8_t              ConfIdx;      USBD_ConfigDesc      *config_desc;   usbd_intf_t          intf[COMPOSITE_INTF_NUM];      PCD_HandleTypeDef    *pPCDHandle;    } USBD_Handle; <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0430 \u043d\u0430 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u043a\u043e\u0434\u0435 CubeIDE, \u043e\u0434\u043d\u0430\u043a\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f. \u041f\u0435\u0440\u0432\u043e\u0435 &#8212; \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0438 \u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440\u044b \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430, \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432, \u043e\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0445 \u0442\u043e\u0447\u0435\u043a \u0438 \u0442.\u043f. \u0412 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u043c \u043a\u043e\u0434\u0435 \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u044d\u0442\u043e \u0431\u0430\u0439\u0442\u043e\u0432\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 (\u0441\u043f\u0430\u0441\u0438\u0431\u043e \u0445\u043e\u0442\u044c \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u044b \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043f\u043e\u043b\u0435\u0439 \u0432\u0441\u0442\u0430\u0432\u0438\u043b\u0438), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0438 \u043b\u044e\u0431\u043e\u043c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u043d\u0430\u0434\u043e \u0437\u0430\u043d\u043e\u0432\u043e \u0440\u0443\u043a\u0430\u043c\u0438 \u043f\u0435\u0440\u0435\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u0438 \u043f\u043e \u0441\u0442\u043e \u0440\u0430\u0437 \u043f\u0435\u0440\u0435\u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c. \u0412 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u043c \u043a\u043e\u0434\u0435 \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0445 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043e\u043c \u043f\u043e\u043b\u0435\u0439 \u0438 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u043c \u043d\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439, \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u0434\u043e\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440\u0430\u043c\u0438 \u043f\u043e \u043c\u0435\u0440\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u043d\u0438\u0436\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0441 \u043f\u043e\u043b\u044f\u043c\u0438 \u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438 \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043e\u043c USB.<\/p>\n<details class=\"spoiler\">\n<summary>\u0422\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 (USBD_ConfigDesc)<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">typedef struct {     uint8_t   bLength;              \/* Size of this descriptor in bytes. 0x09 *\/     uint8_t   bDescriptorType;      \/* Configuration (assigned by USB). 0x02 *\/     uint16_t  wTotalLength;         \/* Total length of data returned for this configuration. *\/     uint8_t   bNumInterfaces;       \/* Number of interfaces supported by this configuration. *\/     uint8_t   bConfigurationValue;  \/* Value to use as an argument to Set Configuration to                                        select this configuration.*\/     uint8_t   iConfiguration;       \/* Index of string descriptor describing this configuration.                                        In this case there is none*\/     uint8_t   bmAttributes;         \/* Configuration characteristics *\/     uint8_t   bMaxPower;            \/* Maximum power consumption of USB device from bus                                        in this specific configuration when the device is fully                                        operational. Expressed in 2 mA units *\/     uint8_t   data[0];              \/* Place holder for other descriptors *\/ } USBD_ConfigDesc; <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u0410 \u0442\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f HID \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440\u0430 \u0441 \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438 \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440\u0430\u043c\u0438.<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">\/************** Descriptor of CUSTOM HID interface ****************\/ USBD_Dev0_HID_ConfigDesc dev0_hid_config_desc_template = {      .interface_desc = {         .bLength            = sizeof(USBD_InterfaceDesc),         .bDescriptorType    = USB_DESC_TYPE_INTERFACE,         .bInterfaceNumber   = TBD,                      \/* Initialized at HID_Register() *\/         .bAlternateSetting  = 0x00,         .bNumEndpoints      = 0x02,         .bInterfaceClass    = 0x03,                     \/* USB Class HID = 3 *\/         .bInterfaceSubClass = 0x00,                     \/* bInterfaceSubClass : 1=BOOT, 0=no boot*\/         .nInterfaceProtocol = 0x00,                     \/* nInterfaceProtocol : 0=none, 1=keyb, 2=mouse*\/         .iInterface         = 0x00,     },      .hid_desc = {         .bLength              = sizeof(USBD_HidDesc),         .bDescriptorType      = HID_DESCRIPTOR_TYPE,    \/* bDescriptorType: HID                     *\/         .bcdHID               = 0x0111,                 \/* HID Class Spec release number 1.11       *\/         .bCountryCode         = 0x00,                   \/* 0x17 *\/         .bNumDescriptors      = 0x01,                   \/* Number of class descriptors to follow    *\/         .bRepDescriptorType   = HID_REPORT_DESC,        \/* bDescriptorType                          *\/         .wRepDescriptorLength = host2usb_u16(sizeof(Dev0_HID_ReportDesc)),                                                          \/* wItemLength: Tot len of Report descriptor*\/     },      .ep_in = {         .bLength             = sizeof(USBD_EpDesc),      \/* bLength: Endpoint Descriptor size *\/<\/code><\/pre>\n<\/div>\n<\/details>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-335240","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/335240","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=335240"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/335240\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=335240"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=335240"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=335240"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}