Π ΡΠ΄ ΠΌΠΈΠΊΡΠΎΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠΎΠ² STM32 ΠΈΠΌΠ΅ΡΡ Π½Π° Π±ΠΎΡΡΡ USB ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ Π΄Π»Ρ ΡΠ²ΡΠ·ΠΈ Ρ ΠΊΠΎΠΌΠΏΡΡΡΠ΅ΡΠ°ΠΌΠΈ. ΠΠ°ΠΊ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ, ΡΠ΄ΠΎΠ±Π½Π΅Π΅ Π²ΡΠ΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅ΠΌΡΠΉ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΉ ST Microelectronics Π΄ΡΠ°ΠΉΠ²Π΅Ρ ΠΊΠ»Π°ΡΡΠ° CDC (Communication Device Class ). ΠΠ½ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π½Π° ΡΡΠΎΡΠΎΠ½Π΅ ΠΊΠΎΠΌΠΏΡΡΡΠ΅ΡΠ° UART ΡΠ΅ΡΠ΅Π· USB ΠΈ Π½Π΅ ΡΡΠ΅Π±ΡΠ΅Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ Π΄ΡΠ°ΠΉΠ²Π΅ΡΠΎΠ². Π‘ΠΎ ΡΡΠΎΡΠΎΠ½Ρ STM32 ΠΏΡΠΈ ΡΡΠΎΠΌ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΠΌΠ΅Π½ΡΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π²ΡΠ²ΠΎΠ΄Π° Π΄Π°Π½Π½ΡΡ , ΠΎΡΡΠ°Π»ΡΠ½ΠΎΠ΅ Π΄Π΅Π»Π°Π΅ΡΡΡ ΡΠ°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»ΡΠ½ΠΎ. ΠΡΠΈΡΡΠΌ ΡΠΊΠΎΡΠΎΡΡΡ ΡΠ°ΠΊΠΎΠ³ΠΎ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ Π»ΡΠ±ΠΎΠΉ, ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΠΌΠΎΠΉ ΠΊΠΎΠΌΠΏΡΡΡΠ΅ΡΠΎΠΌ.
ΠΠ΄Π½Π°ΠΊΠΎ ΡΡΠ΄ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΎΠΊ, ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎ, ΠΊΠΎΠ³Π΄Π° ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡΡ Π² Π΄ΡΡΠ³ΡΡ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΡ, Π³Π΄Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ HID Class (Human Interface Device), Π² ΡΠ»ΡΡΠ°Π΅ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ Π½ΠΎΠ²ΠΎΠΉ Π²Π΅ΡΡΠΈΠΈ ΡΡΡΡΠΎΠΉΡΡΠ²Π° ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡ ΡΠ°Π½Π΅Π΅ Π²ΡΠ±ΡΠ°Π½Π½ΡΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ. Π§ΡΠΎ, ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎ, ΠΈ ΡΠ»ΡΡΠΈΠ»ΠΎΡΡ. ΠΡΠΈΠΌΠ΅ΡΡ ΠΏΡΠΎΠ΅ΠΊΡΠΎΠ² ΠΎΡ ΡΠ°ΠΌΠΎΠΉ ST, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΎΠ½ΠΈ Π΄Π°ΡΡ ΠΏΡΠΈ Π·Π°Π³ΡΡΠ·ΠΊΠ΅ STM32 Cube MX ΠΈ IDE, ΠΊΠ°ΠΊ ΠΎΠ±ΡΡΠ½ΠΎ, Π΄Π°Π»ΠΈ ΡΠΎΠ»ΡΠΊΠΎ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ΅ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅, Π½ΠΎ Π½Π΅ ΡΠ°ΡΠΊΡΡΠ»ΠΈ, ΡΡΠΎ ΠΈ ΠΊΠ°ΠΊ Π½Π°Π΄ΠΎ Π΄Π΅Π»Π°ΡΡ. Π― ΠΊΠΎΠ³Π΄Π°-ΡΠΎ ΡΠ°Π·Π±ΠΈΡΠ°Π»ΡΡ Ρ USB, Π΄Π°ΠΆΠ΅ ΠΏΠΈΡΠ°Π» ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠΉ Π΄ΡΠ°ΠΉΠ²Π΅Ρ, Π½ΠΎ ΡΡΠΎ Π±ΡΠ»ΠΎ ΡΠ°ΠΊ Π΄Π°Π²Π½ΠΎβ¦ ΠΡΡΠ°Π»ΠΈΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ±ΡΠΈΠ΅ Π²ΠΎΡΠΏΠΎΠΌΠΈΠ½Π°Π½ΠΈΡ. ΠΠΎΡΠ΅ΠΌΡ ΠΏΡΠΈΡΠ»ΠΎΡΡ ΠΈΡΠΊΠ°ΡΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ, ΡΡΠΎΠ±Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΡΡΠ°ΡΡΠΎΠ²ΡΡ ΡΠΎΡΠΊΡ.
ΠΠ΅ΡΠ²ΠΎΠ΅ Π½Π°ΠΉΠ΄Π΅Π½Π½ΠΎΠ΅ Π±ΡΠ»ΠΎ Π²ΠΈΠ΄Π΅ΠΎΡΠΎΠ»ΠΈΠΊΠΎΠΌ Π½Π° youtube Π² ΡΡΠΈΠ»Π΅ HID Π·Π° 5 ΠΌΠΈΠ½ΡΡ π ΠΠ²ΡΠΎΡ Π΄Π°ΡΡ Π΄ΠΎΡΡΡΠΏ ΠΊ ΡΠ²ΠΎΠ΅ΠΌΡ ΠΊΠΎΠ΄Ρ Π½Π° GitHub. ΠΡΡ, ΡΠΈΠΏΠ° ΠΊΡΡΡΠΎ, ΠΊΡΠ°ΡΠΈΠ²ΠΎ, ΠΏΡΠΎΡΡΠΎ Π²ΡΡΠ°Π²Π»ΡΠΉΡΠ΅ ΠΊ ΡΠ΅Π±Π΅ ΠΈ Π²ΡΡ Π±ΡΠ΄Π΅Ρ ΡΡΠ΄Π΅ΡΠ½ΠΎ. Π‘ΡΠ΄Ρ ΠΏΠΎ ΠΎΡΠ·ΡΠ²Π°ΠΌ ΠΏΠΎΠ΄ ΡΠΎΠ»ΠΈΠΊΠΎΠΌ, Π½Π΅ΠΊΠΎΡΠΎΡΡΠΌ ΡΡΠΎΠ³ΠΎ Ρ Π²Π°ΡΠΈΠ»ΠΎ.Β ΠΠ·ΡΡΠΈΠ² ΠΈΡΡ ΠΎΠ΄Π½ΠΈΠΊΠΈ ΠΏΠΎΠ½ΡΠ», ΡΡΠΎ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΠΏΡΠΎΠ·ΡΠ΅Π½ΠΈΡ Π½Π΅ Π½Π°ΡΡΡΠΏΠΈΠ»ΠΎ, Π΄Π° ΠΈ ΡΡΠΎΠ²Π΅Π½Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΠΎΠΉ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΌΠ°Π» Π΄Π»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΡΠ΅ΡΠΈΡΡ ΠΏΠΎΡΡΠ°Π²Π»Π΅Π½Π½ΡΡ Π·Π°Π΄Π°ΡΡ.Β ΠΠΎ Π·Π°ΠΊΠΎΠΌΡΡΠ²ΠΎ Ρ ΡΡΠΈΠΌ ΠΌΠ°ΡΠ΅ΡΠΈΠ°Π»ΠΎΠΌ Π±ΡΠ»ΠΎ ΡΠ²Π½ΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΡΠΌ. Π Π΅ΡΠ΅Π½ΠΈΠ΅ Π²ΠΎΠΏΡΠΎΡΠ° Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΊΡΠ±ΠΈΠΊΠ° (STM32Cube MX) ΠΌΠ½Π΅ Π»ΠΈΡΠ½ΠΎ ΠΈΠΌΠΏΠΎΠ½ΠΈΡΡΠ΅Ρ Π±ΠΎΠ»ΡΡΠ΅, ΡΠ΅ΠΌ Π΄ΡΡΠ³ΠΈΠ΅ ΠΏΠΎΠ΄Ρ ΠΎΠ΄Ρ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΎΡΠ²Π»Π΅ΡΡΡΡ ΠΎΡ ΡΡΠ΄Π° Π½ΠΈΠ·ΠΊΠΎΡΡΠΎΠ²Π½Π΅Π²ΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ ΠΈ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΡ ΠΏΡΠΎΠ΅ΠΊΡΠ° Π²ΡΠ΅Π³Π΄Π° ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ Π² ΠΎΠ΄Π½ΠΎΠΌ ΡΡΠΈΠ»Π΅. Π‘ΠΎΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎ, ΠΈΠ·ΡΡΠ΅Π½ΠΈΠ΅ ΡΡΠΎΠ³ΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠ° ΠΏΠΎΠΊΠ°Π·Π°Π»ΠΎ, Π½Π° ΠΊΠ°ΠΊΠΈΠ΅ ΡΠ°ΠΉΠ»Ρ Π½Π°Π΄ΠΎ ΠΎΠ±ΡΠ°ΡΠΈΡΡ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Π³Π΄Π΅ ΠΈ ΡΡΠΎ Π½Π°Π΄ΠΎ ΠΏΠΎΠΌΠ΅Π½ΡΡΡ ΠΈΠ»ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ, ΠΊΠ°ΠΊΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΠΈ ΠΎΡΠΏΡΠ°Π²ΠΊΠΈ Π΄Π°Π½Π½ΡΡ ΠΈΠΌΠ΅Π½Π½ΠΎ Π΄Π»Ρ Π½Π°ΡΠ΅ΠΉ Π²ΡΠ±ΡΠ°Π½Π½ΠΎΠΉ ΡΡΠ΅Π΄Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ.
Π‘Π»Π΅Π΄ΡΡΡΠΈΠΉ ΠΏΠΎΠΈΡΠΊ ΠΎΠΊΠ°Π·Π°Π»ΡΡ Π²Π΅ΡΡΠΌΠ° ΡΠ΄Π°ΡΠ½ΡΠΌ. Π₯Π°Π±Ρ β ΠΈΠ·Π²Π΅ΡΡΠ½ΡΠΉ ΡΠ°ΠΉΡ, Π½Π° ΠΊΠΎΡΠΎΡΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡΠΈ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠ³ΠΎ ΠΏΠΎ ΡΠ°Π·Π½ΠΎΠΉ ΡΠ»Π΅ΠΊΡΡΠΎΠ½Π½ΠΎΠΉ ΡΠ΅ΠΌΠ°ΡΠΈΠΊΠ΅. ΠΠ°ΡΠ»Π°ΡΡ ΡΠ°ΠΌ ΠΈ ΡΡΠ°ΡΡΡ STM32 ΠΈ USB-HID β ΡΡΠΎ ΠΏΡΠΎΡΡΠΎ. Π― Π½Π΅ ΡΠ²Π»ΡΡΡΡ ΠΏΠΎΡΡΠΎΡΠ½Π½ΡΠΌ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠΌ Π₯Π°Π±ΡΠ° ΠΈ Π½Π΅ Π·Π½Π°Ρ Π°Π²ΡΠΎΡΠ° ΡΡΠΎΠΉ ΡΡΠ°ΡΡΠΈ RaJa, Π½ΠΎ Π½Π° ΠΌΠΎΠΉ Π²Π·Π³Π»ΡΠ΄ ΡΡΠΎ ΠΎΡΠ΅Π½Ρ Ρ ΠΎΡΠΎΡΠ°Ρ ΡΡΠ°ΡΡΡ, ΠΎΠΏΠΈΡΡΠ²Π°ΡΡΠ°Ρ ΠΎΡΠ½ΠΎΠ²Π½ΡΠ΅ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΡΠ°Π±ΠΎΡΡ HID ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡ. ΠΠ΅Π· Π΅Ρ ΠΏΡΠΎΡΡΠ΅Π½ΠΈΡ ΡΠΈΡΠ°ΡΡ Π΄Π°Π»ΡΡΠ΅ Π·Π΄Π΅ΡΡ Π±Π΅ΡΡΠΌΡΡΠ»Π΅Π½Π½ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π΄Π°Π»Π΅Π΅ Π±ΡΠ΄ΡΡ, Π² ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΌ,Β ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ Π΄Π»Ρ Π°Π΄Π°ΠΏΡΠ°ΡΠΈΠΈ ΠΊΠΎΠ΄Π° ΠΊ ΡΡΠ΅Π΄Π΅ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ STM32IDE/STM32CubeMX + Atollic TrueStudio. (ΠΠ°Π»Π΅Π΅ STM32IDE). ΠΠ° ΠΈ ΡΡΠΎΠ»Ρ ΠΏΠΎΠΏΡΠ»ΡΡΠ½ΡΠΉ Π² 2014 Π³ΠΎΠ΄Ρ ΠΈ ΡΠ΅Π°Π»ΡΠ½ΠΎ ΠΎΡΠ΅Π½Ρ Π½Π΅ΠΏΠ»ΠΎΡ ΠΎΠΉ ΠΏΡΠΎΠ΅ΠΊΡ EmBlocks, ΡΠ²Ρ, ΡΠΌΠ΅Ρ.
ΠΠ΅ΡΠ²ΠΎΠ΅, ΡΡΠΎ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΡΠ΅ΡΠΈΡΡ β ΠΊΠ°ΠΊ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°ΡΡ Π²Π½ΠΎΠ²Ρ ΡΠΎΠ·Π΄Π°Π²Π°Π΅ΠΌΠΎΠ΅ ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎ. ΠΠ΅Ρβ¦ Π΄ΡΠ°ΡΡ Π½Π°Π·Π°Π΄ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π» Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡ ΠΈ ΡΠΈΠ½ΡΠ΅Π·Π°ΡΠΎΡ ΡΡΠ°ΡΠΈΠΊΠ° USB β ΠΎΡΠ΅Π½Ρ ΠΏΠΎΠ»Π΅Π·Π½ΡΠ΅, Π½ΠΎ Π΄ΠΎΡΠΎΠ³ΠΈΠ΅ ΠΈΠ³ΡΡΡΠΊΠΈ π Π‘Π΅ΠΉΡΠ°Ρ Ρ ΠΌΠ΅Π½Ρ ΡΠ°ΠΊΠΎΠΉ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ Π½Π΅Ρ, Π΄Π° ΠΈ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΆΠ΅ Π±ΡΡΡ Π±ΠΎΠ»Π΅Π΅ ΠΏΡΠΎΡΡΠΎΠΉ ΠΏΡΡΡ. Π’Π΅ΠΌ Π±ΠΎΠ»Π΅Π΅ Π΄Π»Ρ ΠΏΡΠΎΡΡΠΎΠ³ΠΎ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎΠ³ΠΎ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° Π±Π΅Π· Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΡ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎΠ³ΠΎ Π΄ΡΠ°ΠΉΠ²Π΅ΡΠ°. ΠΠ²ΡΠΎΡΡ ΠΎΠ±ΠΎΠΈΡ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π½Π½ΡΡ Π²ΡΡΠ΅ ΠΏΡΠΎΠ΅ΠΊΡΠΎΠ² ΠΏΠΎΡΠ»ΠΈ ΡΠ°ΠΌΡ ΠΏΡΠΎΡΡΡΠΌ Π΄Π»Ρ Π½ΠΈΡ ΠΏΡΡΡΠΌ β Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΠΏΡΠΎΡΡΠΎΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π½Π° ΠΈΠ·Π²Π΅ΡΡΠ½ΡΡ ΠΈΠΌ ΡΠ·ΡΠΊΠ°Ρ . ΠΠΎ Π°Π²ΡΠΎΡ ΡΡΠ°ΡΡΠΈ Π½Π° Π₯Π°Π±ΡΠ΅ ΡΠ΄Π΅Π»Π°Π» ΠΎΡΠ΅Π½Ρ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΡΠΉ ΡΠ°Π³ β ΠΎΠ½ Π½Π°ΠΏΠΈΡΠ°Π» ΡΠ²ΠΎΠΉ ΠΏΡΠΎΠ΅ΠΊΡ, ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΡΠΉ Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΎΠΉ ST HID Demonstrator (ΡΡΡΠ»ΠΊΠ° Π΅ΡΡΡ Π² ΡΡΠ°ΡΡΠ΅), ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡΠ΅ΠΉ ΠΏΠΎΡΠΏΡΠ°Π²Π»ΡΡΡ Π½Π°ΡΠΈΠΌ ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎΠΌ, ΠΊΠ°ΠΊ Π³ΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ, ΡΠ°ΠΊ ΠΈ ΠΏΠΎΡΠ»Π°ΡΡ ΡΠ²ΠΎΠΈ Π΄Π°Π½Π½ΡΠ΅ ΠΈ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ, ΡΡΠΎ ΠΏΡΠΈΡΠ»ΠΎ ΠΎΡ Π½Π°ΡΠ΅Π³ΠΎ ΡΡΡΡΠΎΠΉΡΡΠ²Π°. Π€Π°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΠΌΠΎΠΆΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ ΠΈ Π² Π΄Π°Π»ΡΠ½Π΅ΠΉΡΠ΅ΠΌ Π΄Π»Ρ ΠΎΡΠ»Π°Π΄ΠΊΠΈ Π±ΡΠ΄ΡΡΠ΅ΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π½Π° Π²ΡΠ±ΡΠ°Π½Π½ΠΎΠΌ ΠΌΠΈΠΊΡΠΎΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠ΅.
Π‘Π²ΠΎΡ ΠΎΠ·Π½Π°ΠΊΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ Ρ ΠΏΡΠΎΠ΅ΠΊΡΠΎΠΌ Π΄Π»Ρ HID Ρ ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΠ» Ρ ΠΏΠ»Π°ΡΠΎΠΉ STM32L476 Discovery. ΠΠ»Π°ΡΠ°, Π²ΠΎΠΎΠ±ΡΠ΅ Π³ΠΎΠ²ΠΎΡΡ, ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π»ΡΠ±ΠΎΠΉ, Π³Π΄Π΅ USB ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ ΠΌΠΈΠΊΡΠΎΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠ° ΡΠΈΠ·ΠΈΡΠ΅ΡΠΊΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΡΠ½ ΠΊ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΠΌΡ ΡΠ°Π·ΡΡΠΌΡ USB. ΠΡΡΡ Ρ ΠΌΠ΅Π½Ρ ΠΈ Nucleo 32 Ρ STM32L4, Π½ΠΎ ΡΠ°ΠΌ ΠΎΠ΄ΠΈΠ½ ΡΠ°Π·ΡΡΠΌ USB ΡΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΈ Π΄Π»Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ/ΠΎΡΠ»Π°Π΄ΠΊΠΈ, ΠΈ Π΄Π»Ρ ΡΠ²ΡΠ·ΠΈ Ρ Ρ ΠΎΡΡΠΎΠΌ, ΡΡΠΎ Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅Ρ ΠΈΠ½ΡΡΠΈΠ³ΠΈ Π² ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ ΠΈ ΠΌΠΎΠΆΠ΅Ρ ΡΠ»ΡΠΆΠΈΡΡ ΠΈΡΡΠΎΡΠ½ΠΈΠΊΠΎΠΌ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΡ Π½Π΅ΠΏΠΎΠ½ΡΡΠΎΠΊ. ΠΠ½ΠΎ Π½Π°ΠΌ Π½Π°Π΄ΠΎ?
ΠΡΠ°ΠΊ, ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ ΠΈ Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΊ ΡΡΠ°ΡΡΠ΅ ΠΏΠΎ ΠΏΡΠΈΠ²ΡΠ·ΠΊΠ΅ HID ΠΊ STM32IDE ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ ΠΏΠΎ ΡΠ΅ΠΌ ΠΆΠ΅ ΡΠ°Π³Π°ΠΌ, ΠΊΠ°ΠΊ ΠΈ Π² Ρ Π°Π±ΡΠΎΠ²ΡΠΊΠΎΠΉ ΡΡΠ°ΡΡΠ΅.
Π STM32IDE ΡΡΡΡΠΊΡΡΡΠ° Π²ΡΠ΅Ρ ΠΏΡΠΎΠ΅ΠΊΡΠΎΠ² Π·Π°Π΄Π°ΡΡΡΡ ΠΏΡΠΈ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ ΠΏΡΠΎΠ΅ΠΊΡΠ° ΠΈΠ· ΡΡΠ΅Π΄Ρ Π½Π°Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΡΡΠΈ ΠΏΠΈΠ½ΠΎΠ² ΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΎ ΡΠΎΠΌ Π·Π°Π±ΠΎΡΠΈΡΡΡΡ Π½Π΅ Π½Π°Π΄ΠΎ. Π ΡΠ°ΡΡΠ½ΠΎΡΡΠΈ, Π² ΠΊΡΠ±ΠΈΠΊΠ΅ (ΡΡΠΎ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΠΌ STM32Cube MX, ΡΡΠΎ Π² Π²ΡΡΡΠΎΠ΅Π½Π½ΠΎΠΌ Π² STM32IDE)Β Π°ΠΊΡΠΈΠ²ΠΈΡΡΠ΅ΠΌ USB, ΠΊΠ°ΠΊ Device, ΠΈ Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ Middleware USB Custom HID.
Π ΠΈΡ.1 ΠΡΠ±ΠΎΡ USB ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°Π ΠΈΡ.2 ΠΡΠ±ΠΎΡ ΠΈ ΠΏΠ΅ΡΠ²ΠΈΡΠ½Π°Ρ Π½Π°ΡΡΡΠΎΠΉΠΊΠ° MiddlewareΠΠ°Π΄ΠΎ Π·Π°ΠΌΠ΅ΡΠΈΡΡ, ΡΡΠΎ Π½Π΅ΡΠΌΠΎΡΡΡ Π½Π° ΡΡΡΠ°Π½ΠΎΠ²ΠΊΡ ΡΠ°Π·ΠΌΠ΅ΡΠ° Π±ΡΡΠ΅ΡΠ° Π² 64 Π±Π°ΠΉΡΠ°, ΡΡΠ° Π²Π΅Π»ΠΈΡΠΈΠ½Π° Π½Π΅ Π²Π½ΠΎΡΠΈΡΡΡ ΠΏΠΎ #define. ΠΠΈΠ΄ΠΈΠΌΠΎ Π±Π°Π³ ΡΠ΅ΠΊΡΡΠ΅ΠΉ Π²Π΅ΡΡΠΈΠΈ ΠΊΡΠ±ΠΈΠΊΠ°. ΠΠ°Π»Π΅Π΅ ΠΏΠΎΠΊΠ°ΠΆΠ΅ΠΌ, Π³Π΄Π΅ Π½Π°Π΄ΠΎ ΠΏΠΎΡΠΈΠΊΡΠΈΡΡ. Π£ΠΊΠ°Π·Π°Π½Π½ΡΠΉ ΡΠ΅Π·ΠΌΠ΅Ρ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠ° ΡΠ°Π²Π½ΡΠΉ 79 β ΡΡΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π΄Π»Ρ Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ½ΡΠ΅ΡΠ½ΠΎΠ³ΠΎ ΡΡΠ°ΡΡΠΎΠ²ΠΎΠ³ΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠ°ΠΠ°Ρ ΠΎΠ΄ΠΈΠΌ Π² Clock Configuration. ΠΠΏΠΎΠ»Π½Π΅ Π²Π΅ΡΠΎΡΡΠ½ΠΎ, ΡΡΠΎ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Ρ ΡΠΈΡΡΠ΅ΠΌΠ½ΡΠΌΠΈ ΡΠ°ΡΡΠΎΡΠ°ΠΌΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠ°ΡΠΊΠΈΡΡΡΡΡΡ ΠΌΠ°Π»ΠΈΠ½ΠΎΠ²ΡΠΌ ΡΠ²Π΅ΡΠΎΠΌ.
Π ΠΈΡ. 3 ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΡΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ ΠΏΠΎ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠ΅ ΡΠ°ΡΡΠΎΡΠΡΠ»ΠΈ ΡΠ°ΠΊ, Π½Π°ΠΆΠΈΠΌΠ°Π΅ΠΌ Resolve Clock Issues ΠΈ, ΡΠΊΠΎΡΠ΅Π΅ Π²ΡΠ΅Π³ΠΎ, Π²ΡΡ Π±ΡΠ΄Π΅Ρ Π½Π°ΡΡΡΠΎΠ΅Π½ΠΎ Π½Π° ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΡΠ΅ ΡΠ°ΡΡΠΎΡΡ. ΠΠ»Π°Π²Π½ΠΎΠ΅ β USB Clock Π±ΡΠ΄Π΅Ρ Π²ΡΡΡΠ°Π²Π»Π΅Π½ Π½Π° 48 ΠΠΡ. ΠΠ°Π΄ΠΎ Π·Π°ΠΌΠ΅ΡΠΈΡΡ, ΡΡΠΎ Π² ΡΠ΅ΠΌΠ΅ΠΉΡΡΠ²Π΅ STM32L4 Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡ Π½Π° 48ΠΠΡ ΠΈΠΌΠ΅Π΅Ρ Π°Π²ΡΠΎΠΏΠΎΠ΄ΡΡΡΠΎΠΉΠΊΡ ΠΏΠΎ SOF (Start Of Frame), ΡΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ USB ΡΡΡΡΠΎΠΉΡΡΠ²Π° Π±Π΅Π· Π²Π½Π΅ΡΠ½Π΅Π³ΠΎ ΠΊΠ²Π°ΡΡΠ°/Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡΠ°. ΠΡΠ»ΠΈ, ΠΊΠΎΠ½Π΅ΡΠ½ΠΎ, ΠΎΡΡΠ°Π»ΡΠ½ΠΎΠΉ Π΄ΠΈΠ·Π°ΠΉΠ½ Π΄ΠΎΠΏΡΡΠΊΠ°Π΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π΅ΠΊΠ²Π°ΡΡΠΎΠ²Π°Π½Π½ΡΡ Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡΠΎΠ². ΠΠ»Ρ Π΄ΡΡΠ³ΠΈΡ ΡΠ΅ΠΌΠ΅ΠΉΡΡΠ² Π½Π΅ ΠΏΡΠΎΠ²Π΅ΡΡΠ», ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π΄Π»Ρ ΠΌΠΎΠ΅Π³ΠΎ ΡΠ΅ΠΊΡΡΠ΅Π³ΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠ° Π±ΡΠ» Π²ΡΠ±ΡΠ°Π½ ΠΈΠΌΠ΅Π½Π½ΠΎ L4. Π’ΠΎΠ»ΡΠΊΠΎ Π½Π°Π΄ΠΎ ΠΎΡΠΌΠ΅ΡΠΈΡΡ, ΡΡΠΎ ΠΏΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ USB Π΅ΡΡΡ Π½Π΅ΠΊΠΎΡΠΎΡΠ°Ρ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½Π°Ρ ΡΠ°ΡΡΠΎΡΠ° ΡΠ°Π±ΠΎΡΡ ΠΌΠΈΠΊΡΠΎΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠ°. Π― Π΄Π΅Π»Π°Π» ΠΏΡΠΈΠΊΠΈΠ΄ΠΊΡ Π΄Π»Ρ Π΄ΡΡΠ³ΠΎΠ³ΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠ°, Π³Π΄Π΅ Π½Π°Π΄ΠΎ ΠΎΠ±ΡΠ°ΡΡΡΡ Ρ Ρ ΠΎΡΡΠΎΠΌ ΠΈ ΠΏΡΠΈ ΡΡΠΎΠΌ ΠΏΠΎΡΡΠ΅Π±Π»ΡΡΡ ΠΌΠΈΠ½ΠΈΠΌΡΠΌ ΡΠΎΠΊΠ°. ΠΠ°Π΄Π°ΡΠΈ ΠΏΡΠΎΡΡΡΠ΅, Π½Π΅ ΡΡΠ΅Π±ΡΡΡ Π±ΠΎΠ»ΡΡΠΎΠΉ ΡΠΊΠΎΡΠΎΡΡΠΈ ΠΈ Ρ Ρ ΠΎΡΠ΅Π» Π·Π°ΠΏΡΡΡΠΈΡΡ ΠΠ Π½Π° 8ΠΠΡ. ΠΠΊΠ°Π·Π°Π»ΠΎΡΡ, ΡΡΠΎ ΠΌΠ΅Π½ΡΡΠ΅ 14ΠΠΡ ΠΏΡΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠΈ USB ΡΡΠ°Π²ΠΈΡΡ Π½Π΅ ΠΌΠΎΠ³Ρ, RCC Π½Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ. ΠΡΠΈΡΠ»ΠΎΡΡ ΠΎΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡΡ Π½Π° ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΌ ΠΊΡΡΠ³Π»ΠΎΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΠΈ 16ΠΠΡ.
Π‘ΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎ, Π½Π°ΡΡΡΠΎΠΉΠΊΠ° Π°ΠΏΠΏΠ°ΡΠ°ΡΠ½ΠΎΠΉ ΡΠ°ΡΡΠΈ USB ΠΈ Π²ΡΠ±ΠΎΡ ΡΠ°ΠΉΠ»ΠΎΠ², ΠΎΡΠ²Π΅ΡΠ°ΡΡΠΈΡ Π·Π° Π±Π°Π·ΠΎΠ²ΡΡ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΡΡΡ ΡΡΠΎΠ³ΠΎ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° Π½Π° Π½Π° ΡΡΠΎΠΌ Π·Π°ΠΊΠΎΠ½ΡΠ΅Π½Ρ.Β ΠΡΡ ΠΎΡΡΠ°Π»ΡΠ½Π°Ρ ΠΏΠ΅ΡΠΈΡΠ΅ΡΠΈΡ, Π½Π°Ρ ΠΎΠ΄ΡΡΠ°ΡΡΡ Π½Π° Π²ΡΠ±ΡΠ°Π½Π½ΠΎΠΉ ΠΏΠ»Π°ΡΠ΅ Π½Π°ΡΡΡΠ°ΠΈΠ²Π°Π΅ΡΡΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΠΏΡΠΈ Π΅Ρ Π²ΡΠ±ΠΎΡΠ΅ Π½Π° ΡΡΠ°ΡΡΠ΅ ΠΏΡΠΎΠ΅ΠΊΡΠ°. Π‘ΠΎΡ ΡΠ°Π½ΡΠ΅ΠΌ, Π³Π΅Π½Π΅ΡΠΈΠΌ ΠΏΡΠΎΠ΅ΠΊΡ ΠΈ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄ΠΈΠΌ ΠΊ Β«ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡΒ» Π² ΡΡΠ°Π²Π½Π΅Π½ΠΈΠΈ Ρ ΠΎΠΏΠΈΡΠ°Π½Π½ΡΠΌ Π½Π° Π₯Π°Π±ΡΠ΅ ΠΏΡΠΎΠ΅ΠΊΡΠΎΠΌ.
Π‘ΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠ΅ ΠΌΠ°ΡΡΠΈΠ²Ρ Π΄Π°Π½Π½ΡΡ Π΄Π»Ρ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ Ρ ΠΎΡΡΡ, Ρ ΡΠ΅ΠΌ ΠΎΠ½ Π±ΡΠ΄Π΅Ρ ΠΈΠΌΠ΅ΡΡ Π΄Π΅Π»ΠΎ. ΠΠ»Ρ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ° ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΡ ΡΡΡΡΠΎΠΉΡΡΠ²Π° ΠΈ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ.Β Π‘Π΅ΠΉΡΠ°Ρ ΠΈΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡΡΠ°Π²ΠΈΡΡ ΡΠ°ΠΊΠΈΠΌΠΈ, ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΡΡΠΈΠ»ΠΈΡΡ, Π½ΠΎ Π² Π΄Π°Π»ΡΠ½Π΅ΠΉΡΠ΅ΠΌ ΠΎΠ½ΠΈ Π½Π°Π²Π΅ΡΠ½ΡΠΊΠ° ΠΏΠΎΡΡΠ΅Π±ΡΡΡ ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ. ΠΠΏΡΠΎΡΠ΅ΠΌ, Π½Π΅ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΎ, ΡΡΠΎ ΠΎΠ½ΠΈ Π±ΡΠ΄ΡΡ Π³Π΅Π½Π΅ΡΠΈΡΡΡΡ ΠΏΠΎ ΡΠ΅ΠΌ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°ΠΌ, ΡΡΠΎ ΡΡΠ°Π²ΡΡΡΡ Π² ΠΊΡΠ±ΠΈΠΊΠ΅. Π§ΡΠΎ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ Π½Π΅ ΡΠ°Π΄ΠΎΠ²Π°ΡΡ. Π Π²ΠΎΡ Report Descriptor ΡΡΠΎΠΈΡ ΠΈΠ·ΡΡΠΈΡΡ ΠΏΠΎΠ»ΡΡΡΠ΅ β ΡΡΠΎ ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠ΅, ΡΡΠΎ ΠΏΡΠΈΠ΄ΡΡΡΡ Π² Π΄Π°Π»ΡΠ½Π΅ΠΉΡΠ΅ΠΌ ΠΏΡΠ°Π²ΠΈΡΡ ΡΡΡΠΊΠ°ΠΌΠΈ. ΠΠ΅ Π·Π½Π°Ρ, ΠΎΡΠΊΡΠ΄Π° RaJa Π²Π·ΡΠ» Π΅Π³ΠΎ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΡ, Π² Π½Π°ΡΡΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΎΠ½ΠΈ Π³Π΅Π½Π΅ΡΠΈΡΡΡΡΡΡ ΠΊΡΠ±ΠΈΠΊΠΎΠΌ ΠΈ ΡΠ°ΡΠΏΠΎΠ»Π°Π³Π°ΡΡΡΡ Π² ΡΠ»Π΅Π΄ΡΡΡΠΈΡ ΡΠ°ΠΉΠ»Π°Ρ ΠΏΡΠΎΠ΅ΠΊΡΠ°:
ΠΠ΅ΡΠΊΡΠΈΠΏΡΠΎΡ ΠΎΡ Raja | ΠΠ΅ΡΠΊΡΠΈΠΏΡΠΎΡ ΠΎΡ ST | Π€Π°ΠΉΠ» Π² ΠΏΡΠΎΠ΅ΠΊΡΠ΅ |
RHID_DeviceDescriptor | USBD_FS_DeviceDesc | usbd_desc. c |
RHID_ConfigDescriptor | USBD_CUSTOM_HID_CfgFSDesc | usbd_customhid.c |
RHID_ReportDescriptor | CUSTOM_HID_ReportDesc_FS | usbd_custom_hid_if.c |
ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π΄Π»Ρ ΠΏΡΠΎΡΡΠΎΡΡ ΡΠ΅ΠΉΡΠ°Ρ Π±ΡΠ΄Π΅ΠΌ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΡΠΎΠ»ΡΠΊΠΎ Ρ ST HID Demonstrator, ΡΠΎ Π½Π΅ ΠΌΡΠ΄ΡΡΡΠ²ΡΡ Π»ΡΠΊΠ°Π²ΠΎ Ρ ΠΏΡΠΎΡΡΠΎ ΡΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π» ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅Β RHID_ReportDescriptor Π² ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ΅Π΅ ΠΌΠ΅ΡΡΠΎ ΠΌΠΎΠ΅Π³ΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠ°. Π’ΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΠ΄ΡΡΠ°Π²ΠΈΠ» ΡΠ²ΠΎΠΈ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΡ Π½Π° ΠΌΠ΅ΡΡΠΎ Π΄Π»ΠΈΠ½Ρ. ΠΠ°Π΄ΠΎ ΠΎΡΠΌΠ΅ΡΠΈΡΡ, ΡΡΠΎ Π½Π°Π΄ΠΎ ΡΠΎΡΠ½ΠΎ ΠΏΠΎΡΡΠΈΡΠ°ΡΡ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π±Π°ΠΉΡΠΎΠ² Π² ΡΡΠΎΠΌ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠ΅ (Π² ΡΡΠΎΠΌ ΠΏΡΠΎΠ΅ΠΊΡΠ΅ 79) ΠΈ ΡΠ±Π΅Π΄ΠΈΡΡΡΡ, ΡΡΠΎ ΠΈΠΌΠ΅Π½Π½ΠΎ ΡΡΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΡΠΎΠΈΡ Π² Class Parameters. ΠΠ΅ Π±ΠΎΠ»ΡΡΠ΅ ΠΈ Π½Π΅ ΠΌΠ΅Π½ΡΡΠ΅. ΠΠ½Π°ΡΠ΅ Ρ ΠΎΡΡ Π½Π΅ ΠΎΠΏΠΎΠ·Π½Π°Π΅Ρ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΡΠ½Π½ΠΎΠ΅ ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎ. ΠΡΠΎΠ²Π΅ΡΠ΅Π½ΠΎ π
ΠΠ°Π»Π΅Π΅ Π·Π°Ρ ΠΎΠ΄ΠΈΠΌ Π² ΡΠ°ΠΉΠ» usbd_customhid.hΒ ΠΈ ΠΌΠ΅Π½ΡΠ΅ΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΡ CUSTOM_HID_EPIN_SIZE ΠΈ CUSTOM_HID_EPOUT_SIZE Π½Π° 0x40U. Π§Π΅ΡΡΠ½ΠΎ Π³ΠΎΠ²ΠΎΡΡ, Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π½Π°ΠΏΡΡΠ³Π°Π΅Ρ ΡΠΎ, ΡΡΠΎ ST Π½Π΅ Π΄Π°ΡΡ Π°Π»ΡΡΠ΅ΡΠ½Π°ΡΠΈΠ² ΡΠΌΠ΅Π½Π΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ 2 Π½Π° Π΄ΡΡΠ³ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΈ Π΄Π°Π»Π΅Π΅ Π² ΠΊΠΎΠ΄Π΅ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΡΡΠΈΡ ΠΊΠΎΠ½ΡΡΠ°Π½Ρ ΡΡΠΎΠΈΡ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΉ, ΡΡΠΎ Π½Π΅ Π±ΠΎΠ»Π΅Π΅ 2Ρ Π±Π°ΠΉΡ. ΠΠΎ,Β Ρ Π΄ΡΡΠ³ΠΎΠΉ ΡΡΠΎΡΠΎΠ½Ρ,Β ΡΡΠΎ Π±ΡΠ»ΠΎ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΠΎΠ²Π°Π½ΠΎ Π² ΠΏΠ΅ΡΠ²ΠΎΠΌ Π½Π°ΠΉΠ΄Π΅Π½Π½ΠΎΠΌ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠΈ ΠΈ, Π²ΠΎΠΎΠ±ΡΠ΅ Π³ΠΎΠ²ΠΎΡΡ, ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ΡΠ°ΠΊΠΎΠ³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ Π»ΠΎΠ³ΠΈΡΠ½ΠΎ. ΠΠ½Π°ΡΠ΅ Π² ΡΡΠΌ ΠΎΡΠ»ΠΈΡΠΈΠ΅ CustomHID ΠΎΡ ΠΎΠ±ΡΡΠ½ΠΎΠ³ΠΎ? ΠΡΠΎΠ±Π»Π΅ΠΌΠ° Π² ΡΠΎΠΌ, ΡΡΠΎ ΠΏΡΠΈ ΡΠ΅Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ ΠΏΡΠΎΠ΅ΠΊΡΠ° ΠΈΠ· ΠΊΡΠ±ΠΈΠΊΠ°, ΡΡΠΎ Π½Π° ΡΡΠ°ΠΏΠ΅ ΠΏΠ΅ΡΠ²ΠΈΡΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ ΡΠ°ΡΡΠΎ, ΡΡΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π½Π΅ ΡΠΎΡ ΡΠ°Π½ΡΠ΅ΡΡΡ ΠΈ Π΅Π³ΠΎ Π½Π°Π΄ΠΎ Π²ΠΎΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°ΡΡ ΡΡΡΠΊΠ°ΠΌΠΈ. ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ Ρ ΡΠ΅Π±Π΅ Π² main Π²ΡΠ²Π΅Π» ΡΡΡΠΎΠΊΡ warning, ΡΡΠΎΠ±Ρ Π½Π΅ Π·Π°Π±ΡΠ²Π°ΡΡ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ ΡΡΠΈ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΡ. ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Ρ ΠΎΡΠΈΠ±Π°ΡΡΡ, ΠΈ Π² Π΄Π°Π»ΡΠ½Π΅ΠΉΡΠ΅ΠΌ Π²ΡΡ ΠΎΠΊΠ°ΠΆΠ΅ΡΡΡ ΠΏΡΠΎΡΠ΅. ΠΠΎ Π² ΡΠ°ΠΊΠΎΠΉ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ π
ΠΠ»Ρ Π²ΡΠ΄Π°ΡΠΈ Π΄Π°Π½Π½ΡΡ Π½Π° Ρ ΠΎΡΡ Π²ΡΡ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΠΎ ΠΎΠΏΠΈΡΠ°Π½ΠΈΡ Π½Π° Π₯Π°Π±ΡΠ΅. Π’ΠΎΠ»ΡΠΊΠΎ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π΄ΡΡΠ³ΠΎΠ΅: USBD_CUSTOM_HID_SendReport(). ΠΡΠ΅ ΠΎΡΡΠ°Π»ΡΠ½ΡΠ΅ ΡΠ΅ΠΎΠΌΠ΅Π½Π΄Π°ΡΠΈΠΈ ΠΈΠ· ΡΠΎΠΉ ΡΡΠ°ΡΡΠΈ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΡΡ ΠΏΠΎ ΠΏΠΎΠ»Π½ΠΎΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅.
Π Π²ΠΎΡ ΡΡΠ΅Π½ΠΈΠ΅ Π·Π΄Π΅ΡΡ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½Π΅Π΅, ΡΠ΅ΠΌ Π½Π° Π₯Π°Π±ΡΠ΅.Β Π Π½Π° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΡΠΎΡΠ΅. ΠΠ±ΡΠ°Π±ΠΎΡΠΊΠ° ΠΏΡΠΈΠ½ΡΡΠΎΠ³ΠΎ ΠΌΠ°ΡΡΠΈΠ²Π° ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ Π² usbd_custom_hid_if.c / static int8_t CUSTOM_HID_OutEvent_FS(uint8_t event_idx, uint8_t state). Β
Π ΡΡΠΎΠΌ ΡΠ΅ΡΡΠΎΠ²ΠΎΠΌ ΠΏΡΠΎΠ΅ΠΊΡΠ΅ Ρ Π½Π΅ Π·Π°ΠΌΠΎΡΠ°ΡΠΈΠ²Π°Π»ΡΡ Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΎΠΉ Π²Ρ ΠΎΠ΄Π½ΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ² ΠΈ ΡΠ»Π΅Π΄ΡΡ ΡΠ²ΠΎΠ΅ΠΉ ΠΎΠ±ΡΡΠ½ΠΎΠΉ ΠΏΡΠ°ΠΊΡΠΈΠΊΠ΅ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΠΎΡΡΠΈ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΏΡΠ΅ΡΡΠ²Π°Π½ΠΈΠΉ, ΠΏΡΠΎΡΡΠΎ ΠΊΠΎΠΏΠΈΡΡΡ ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ Π² Π·Π°ΡΠ°Π½Π΅Π΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΡΠΉ ΠΌΠ°ΡΡΠΈΠ² ΠΈ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Ρ ΡΠ»Π°Π³ Π³ΠΎΡΠΎΠ²Π½ΠΎΡΡΠΈ Π΄Π°Π½Π½ΡΡ ΠΎΡ USB
ΠΡ, Π° ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎ Β«ΡΠ±ΠΎΡ Π΄Π°Π½Π½ΡΡ Β» (Π½Π°ΠΆΠ°ΡΠΈΠ΅ ΠΊΠ½ΠΎΠΏΠΎΠΊ Π΄ΠΆΠΎΠΉΡΡΠΈΠΊΠ°) ΠΈ ΡΠ΅Π°ΠΊΡΠΈΡ Π½Π° ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΡΠ΅ ΠΎΡ Ρ ΠΎΡΡΠ° Π΄Π°Π½Π½ΡΠ΅ Π² ΡΡΠΎΠΌ ΠΏΡΠΎΡΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠ΅ Π΄Π΅Π»Π°Ρ Π²Π½ΡΡΡΠΈ Π±Π΅ΡΠΊΠΎΠ½Π΅ΡΠ½ΠΎΠ³ΠΎ ΡΠΈΠΊΠ»Π° Π² main.c ΠΡΡ ΠΏΡΠΎΡΡΠΎ π Π ΡΡΠΎΠΌ ΠΏΡΠΎΡΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠ΅ Π½Π΅Ρ ΡΠ°Π·Π΄Π΅Π»Π΅Π½ΠΈΡ ΡΠ΅Π°ΠΊΡΠΈΠΈ Π½Π° SET_FEATURE ΠΈ SET_REPORT,Β Ρ ΡΡΠΈΠΌ Π½Π°Π΄ΠΎ Π±ΡΠ΄Π΅Ρ ΡΠ°Π·ΠΎΠ±ΡΠ°ΡΡΡΡ Π΄Π°Π»Π΅Π΅, Π² ΡΠ΅Π°Π»ΡΠ½ΠΎΠΌ ΠΏΡΠΎΠ΅ΠΊΡΠ΅. ΠΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΠ΅ΠΌ, Π·Π°ΠΏΡΡΠΊΠ°Π΅ΠΌ, ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ°Π΅ΠΌ ΠΊ Ρ ΠΎΡΡΡ ΠΈ ΡΠ°ΠΌ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΡΠ²ΠΈΡΡΡΡ Π½ΠΎΠ²ΡΠΉ CustomHID ΠΎΡ STMicroelectronics.
ΠΠ²ΠΏΡΡΠΊΠ°Π΅ΠΌ Π½Π° Ρ ΠΎΡΡΠ΅ Β USB HID Demonstrator. ΠΠ° ΠΏΠ»Π°ΡΠ΅,Β Ρ ΠΊΠΎΡΠΎΡΠΎΠΉ Ρ Π·Π°ΠΏΡΡΠΊΠ°Π» ΡΡΠΎΡ ΠΏΡΠΎΠ΅ΠΊΡ, Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ ΠΎΡΠ³Π°Π½ΠΎΠ² Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ Variable Inputs/Outputs, ΠΏΠΎΡΡΠΎΠΌΡ Π² ΡΠ°Π·Π΄Π΅Π»Π΅ Graphic customization Π±ΡΠ»ΠΈ ΡΠ±ΡΠ°Π½Ρ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠ΅ Π½Π°Π·Π½Π°ΡΠ΅Π½ΠΈΡΠΌΠΈ, ΠΎΡΡΠ°Π²Π»Π΅Π½ΠΎ 5 ΠΊΠ½ΠΎΠΏΠΎΠΊ ΠΈ Π½Π°Π·Π½Π°ΡΠ΅Π½Ρ ID, ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΡΠ΅ Π² ΠΏΡΠΎΠ΅ΠΊΡΠ΅: 1, 2 Π΄Π»Ρ Output report (Π²Ρ ΠΎΠ΄Π½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ Π΄Π»Ρ ST) ΠΈ 4 Π΄Π»Ρ Input Report (Π²ΡΡ ΠΎΠ΄ ΠΎΡ ST).
Π ΠΈΡ. 4 ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠ°ΡΠΎΡΠ°ΠΠΎΠ΅ΠΉ Π·Π°Π΄Π°ΡΠ΅ΠΉ Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠ° Π±ΡΠ»ΠΎ ΡΠΏΡΠ°Π²Π»ΡΡΡ ΠΏΠ°ΡΠΎΠΉ ΡΠ²Π΅ΡΠΎΠ΄ΠΈΠΎΠ΄ΠΎΠ² Π½Π° ΠΏΠ»Π°ΡΠ΅, ΡΡΠΎ ΡΡΠ°Π»ΠΎ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΡΡΠ°Π·Ρ, ΠΊΠ°ΠΊ ΡΡΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΠΎΠ±Π½Π°ΡΡΠΆΠΈΠ»Π° ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½Π½ΡΡ ΠΏΠ»Π°ΡΡ, ΠΈ Π²ΠΊΠ»ΡΡΠ°ΡΡ Β«Π»Π°ΠΌΠΏΠΎΡΠΊΠΈΒ» ΡΡΠΎΠΉ ΠΏΠ»Π°ΡΡ ΠΏΡΠΈ Π½Π°ΠΆΠ°ΡΠΈΠΈ ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ ΠΊΠ½ΠΎΠΏΠΎΠΊ Π΄ΠΆΠΎΠΉΡΡΠΈΠΊΠ° Π½Π° ΠΏΠ»Π°ΡΠ΅, Π° Π²ΠΎΡ Π·Π΄Π΅ΡΡ ΡΡΠ°Π·Ρ Π½Π΅ ΠΏΠΎΠ»ΡΡΠΈΠ»ΠΎΡΡ. ΠΡΠΈ ΡΠΊΠ°Π·Π°Π½Π½ΡΡ Π½Π°ΡΡΡΠΎΠΉΠΊΠ°Ρ Π²ΡΠ΅ ΠΏΡΡΡ Π»Π°ΠΌΠΏΠΎΡΠ΅ΠΊ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ Π·Π°ΠΆΠΈΠ³Π°Π»ΠΈΡΡΒ ΠΏΡΠΈ Π½Π°ΠΆΠ°ΡΠΈΠΈ Π½Π° ΡΠ΅Π½ΡΡ Π΄ΠΆΠΎΠΉΡΡΠΈΠΊΠ°. ΠΡΡΠ°Π»ΡΠ½ΡΠ΅ ΠΊΠ½ΠΎΠΏΠΊΠΈ Π½Π΅ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π»ΠΈΡΡ. ΠΡΠΈ ΡΡΠΎΠΌ, Π΅ΡΠ»ΠΈ ΠΏΠ΅ΡΠ΅ΠΉΡΠΈ Π½Π° Input/Otput transfer, ΡΠΎ Π΄Π°Π½Π½ΡΠ΅ Π±ΡΠ»ΠΈ Π²ΠΏΠΎΠ»Π½Π΅ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΡ. Π’.Π΅. ΡΠ°ΠΌ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ, Π½ΠΎ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ Π½Π° Ρ ΠΎΡΡΠ΅ Π½Π΅ ΠΎΡΠ²Π΅ΡΠ°Π΅Ρ ΠΌΠΎΠΈΠΌ Π·Π°ΠΏΡΠΎΡΠ°ΠΌ. Π‘Π»Π°Π²Π° Π±ΠΎΠ³Ρ ST ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅ΡΡ ΠΈΡΡ ΠΎΠ΄Π½ΠΈΠΊΠΈ,Β Π° Π² ΡΠΎΡΠ΅Π΄Π½Π΅ΠΌ ΠΊΡΠ±ΠΈΠΊΠ΅ ΡΠΈΠ΄ΠΈΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΡ Π½Π°ΡΠ΅ΠΉ Π³ΡΡΠΏΠΏΡ, ΠΏΠΈΡΡΡΠΈΠΉ Π² ΡΠΎΠΌ ΡΠΈΡΠ»Π΅ ΠΈ ΡΠΎΡΡ Π΄Π»Ρ ΠΊΠΎΠΌΠΏΡΡΡΠ΅ΡΠΎΠ². Π ΠΎΠ±ΡΠ΅ΠΌ, ΠΎΠ½ ΠΏΠΎΠ΄ΠΏΡΠ°Π²ΠΈΠ» ΠΎΠ΄Π½Ρ ΡΡΠ½ΠΊΡΠΈΡ ΠΈ ΡΠ³Π΅Π½Π΅ΡΠΈΠ» ΠΈΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ. ΠΡΡ ΡΡΠ°Π»ΠΎ ΡΠ°Π±ΠΎΡΠ°ΡΡ, ΠΊΠ°ΠΊ Ρ ΠΎΡΠ΅Π»ΠΎΡΡ. ΠΠΎΠ½Π΅ΡΠ½ΠΎ, ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ Π±Ρ Π½Π° ΠΊΠ°ΠΆΠ΄ΡΡ ΠΊΠ½ΠΎΠΏΠΊΡ ΡΠΎΠ·Π΄Π°ΡΡ ΡΠ²ΠΎΠΉ report Ρ ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΡΠΌ Π½ΠΎΠΌΠ΅ΡΠΎΠΌ, ΡΡΠΎ ΠΈΡΡ ΠΎΠ΄Π½ΠΎ ΠΈ ΠΏΡΠ΅Π΄ΡΡΠΌΠΎΡΡΠ΅Π½ΠΎ. Π ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π±ΡΠ»ΠΎ Π±Ρ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΠΏΠΎΡΡΠ»Π°ΡΡ ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡ Π±Π°ΠΉΡΡ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΊΠ½ΠΎΠΏΠΊΠΈ, Π½ΠΎ ΠΌΠΎΠΉ ΠΏΡΠΎΠ΅ΠΊΡ ΠΏΡΠ΅Π΄ΡΡΠΌΠ°ΡΡΠΈΠ²Π°Π΅Ρ ΠΌΠ½ΠΎΠ³ΠΎΠ±Π°ΠΉΡΠ½ΡΠΉ ΠΎΡΡΡΡ. Β ΠΡΡ ΠΎΠ΄Π½ΠΈΠΊ ΠΏΠΎΠ΄ΠΏΡΠ°Π²Π»Π΅Π½Π½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΈ ΠΏΠΎΠ΄ΠΏΡΠ°Π²Π»Π΅Π½Π½ΡΠΉ ΠΈΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΡΠΉ ΡΠ°ΠΉΠ» ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ°ΡΠ°ΡΡ ΠΏΠΎ ΡΡΡΠ»ΠΊΠ΅ Π½ΠΈΠΆΠ΅.Β
Β ΠΠ° ΡΡΠΎΠΌ, ΠΏΠΎΠΆΠ°Π»ΡΠΉ, Π²ΡΡ.Β ΠΡΠ»ΠΈ Ρ ΠΠ°Ρ Π΅ΡΡΡ ΡΠ°ΠΊΠ°Ρ ΠΆΠ΅ ΠΏΠ»Π°ΡΠ° 32L476GDISCOVERY, ΡΠΎ Π΄Π»Ρ Π½Π°ΡΠ°Π»Π° ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠΎΡΡΠΎ ΡΠΊΠ°ΡΠ°ΡΡ ΠΌΠΎΠΉ ΠΏΡΠΎΡΠΎ ΠΏΡΠΎΠ΅ΠΊΡ, Π°Π΄Π°ΠΏΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ Π΄Π»Ρ Π½Π΅Π³ΠΎ Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠ°ΡΠΎΡ ΠΈ ΠΈΡΡ ΠΎΠ΄Π½ΠΈΠΊ ΠΈΠ·ΠΌΠ΅Π½ΡΠ½Π½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΏΠΎ ΡΡΠΎΠΉ ΡΡΡΠ»ΠΊΠ΅. ΠΡΡ ΠΎΠ΄Π½ΡΠΉ USB HID Demonstrator ΡΠΊΠ°ΡΠΈΠ²Π°Π΅ΡΡΡ Ρ ΡΠ°ΠΉΡΠ° STM, ΠΈΠ½ΡΡΠ°Π»Π»ΠΈΡΡΠ΅ΡΡΡ ΠΈ Π΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΡΠΉ ΡΠ°ΠΉΠ» Π·Π°ΠΌΠ΅Π½ΡΠ΅ΡΡΡ ΠΌΠΎΠΈΠΌ. ΠΠΌΠΏΠΎΡΡΠΈΡΡΠ΅ΡΠ΅ Π² STM32IDE ΠΌΠΎΠΉ ΠΏΡΠΎΠ΅ΠΊΡ, ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΠ΅ΡΠ΅ ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΡΠ°Π±ΠΎΡΠ°ΡΡΡΡ Π±Π°Π·Ρ Π΄Π»Ρ ΡΠ²ΠΎΠΈΡ ΠΏΡΠΎΠ΅ΠΊΡΠΎΠ². ΠΡΠ»ΠΈ Ρ ΠΠ°Ρ Π΄ΡΡΠ³Π°Ρ ΠΏΠ»Π°ΡΠ°, ΡΠΎ Π°Π΄Π°ΠΏΡΠΈΡΡΠ΅ΡΠ΅ Β«ΡΠ±ΠΎΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈΒ» ΠΈ Π²ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΡΠ²Π΅ΡΠΎΠ΄ΠΈΠΎΠ΄ΠΎΠ² ΠΏΠΎΠ΄ ΡΠ²ΠΎΡ ΠΏΠ»Π°ΡΡ.
ΠΠ»Ρ Π΄Π°Π»ΡΠ½Π΅ΠΉΡΠ΅ΠΉ ΡΠ°Π±ΠΎΡΡ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ ΠΏΡΠΎΡΡΠΈΡΠ΅ ΡΠΊΠ°Π·Π°Π½Π½ΡΡ ΡΡΠ°ΡΡΡ RaJa Ρ Π₯Π°Π±ΡΠ°. ΠΠ½Π° Π΄Π°ΡΡ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΡΠΎΠ³ΠΎ, ΡΡΠΎ ΠΈ ΠΊΠ°ΠΊ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±ΡΡΡ ΡΠ΄Π΅Π»Π°Π½ΠΎ Π΄Π»Ρ Π΄ΡΡΠ³ΠΈΡ ΠΏΡΠΎΠ΅ΠΊΡΠΎΠ² Ρ USB HID ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΎΠΌ. Π Π΅ΡΡ Π»ΡΡΡΠ΅ Π½Π°ΡΠ°ΡΡ Ρ Π½Π΅Ρ π
Π ΠΏΡΠΈ Π²ΡΠ±ΠΎΡΠ΅ ΠΊΠ»Π°ΡΡΠ° ΡΡΡΡΠΎΠΉΡΡΠ²Π° Π΄Π»Ρ ΠΠ°ΡΠ΅Π³ΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠ° Π½Π°Π΄ΠΎ ΡΡΠΈΡΡΠ²Π°ΡΡ ΡΠ»Π΅Π΄ΡΡΡΠ΅Π΅: ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΡΠΉ ΠΏΠ΅ΡΠΈΠΎΠ΄ ΠΎΠΏΡΠΎΡΠ° HID ΡΡΡΡΠΎΠΉΡΡΠ² β 1ms. Π Π΅ΡΠ»ΠΈ Ρ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ ΠΏΠΎΠΌΠ½Ρ, ΡΡΠΎ ΡΠΊΠΎΡΠ΅Π΅ ΠΏΠΎΠΆΠ΅Π»Π°Π½ΠΈΠ΅ ΡΠΈΡΡΠ΅ΠΌΠ΅ ΠΎΡ Π²Π½Π΅ΡΠ½Π΅Π³ΠΎ ΡΡΡΡΠΎΠΉΡΡΠ²Π°. Π ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎΠΌ HID ΡΡΡΡΠΎΠΉΡΡΠ²Π΅ Π·Π° ΠΎΠ΄ΠΈΠ½ ΠΊΠ°Π΄Ρ (frame) ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π΄Π²Π° Π±Π°ΠΉΡΠ°, Ρ.Π΅. ΡΠΊΠΎΡΠΎΡΡΡ ΠΎΠ±ΠΌΠ΅Π½Π° Π½Π΅ Π±ΠΎΠ»Π΅Π΅ 2 ΠΊΠ±Π°ΠΉΡ/Ρ. Π Custom HID Π½Π°Β
Full Speed (12 ΠΌΠ±ΠΈΡ/Ρ) ΠΎΠ±ΡΡΠΌ Π΄Π°Π½Π½ΡΡ
ΠΎΡΡΡΡΠ° (report) —Β Π½Π΅ Π±ΠΎΠ»Π΅Π΅ 64 Π±Π°ΠΉΡ, Ρ.Π΅. ΡΠΊΠΎΡΠΎΡΡΡ ΠΎΠ±ΠΌΠ΅Π½Π° Ρ ΠΠ°ΡΠΈΠΌ HID Π½Π΅ Π±ΠΎΠ»Π΅Π΅ 64 ΠΊΠ±Π°ΠΉΡ/Ρ. ΠΠ»Ρ High Speed (480 ΠΌΠ±ΠΈΡ/Ρ) β ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΡΠΉ ΠΎΠ±ΡΡΠΌ Π΄Π°Π½Π½ΡΡ
512 Π±Π°ΠΉΡ (512 ΠΊΠ±Π°ΠΉΡ/Ρ). ΠΠ΅ Π±ΡΠ΄Ρ Ρ ΠΌΠ΅Π½Ρ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΡΡΠΈ Ρ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠΈΠΌ ΡΠΎΡΡΠΎΠΌ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠΌ Π² ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π» Ρ
ΠΎΡΡ Π±Ρ CDC.
Π£ ΠΌΠ΅Π½Ρ ΠΈΠ·ΡΡΠ΅Π½ΠΈΠ΅ ΡΡΠ°ΡΠ΅ΠΉ ΠΈ Π°Π΄Π°ΠΏΡΠ°ΡΠΈΡ ΠΏΠΎΠ΄ ΠΌΠΎΠΈ Ρ ΠΎΡΠ΅Π»ΠΊΠΈ Π·Π°Π½ΡΠ»ΠΎ ΡΡΠΈ Π΄Π½Ρ. ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅ Π·Π°Π½ΡΠ»ΠΎ Π±ΠΎΠ»ΡΡΠ΅ π ΠΠ°Π΄Π΅ΡΡΡ, ΡΡΠΎ Ρ ΡΠ΅Ρ , ΠΊΡΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΡΡΠΎΠΉ ΡΡΠ°ΡΡΡΠΉ, Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΡΠΉ ΠΏΡΠΎΡΠ΅ΡΡ Π·Π°ΠΉΠΌΡΡ Π½Π΅ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π΄Π½Ρ. ΠΠΎΠΌΠΌΠ΅Π½ΡΠΈΡΡΠΉΡΠ΅, ΡΠΏΡΠ°ΡΠΈΠ²Π°ΠΉΡΠ΅. Π§ΡΠΎ ΡΠΌΠΎΠ³Ρ β ΠΎΡΠ²Π΅ΡΡ. Π§ΡΠΎ Π½Π΅ ΡΠΌΠΎΠ³Ρ, Π²ΠΌΠ΅ΡΡΠ΅ ΠΏΠΎΠΈΡΠ΅ΠΌ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅.
ΠΠΎΠ±ΡΠΎΠ³ΠΎ Π΄Π½Ρ Π²ΡΠ΅ΠΌ ΠΏΠΎΡΠ΅ΡΠΈΡΠ΅Π»ΡΠΌ ΠΈ ΡΠΈΡΠ°ΡΠ΅Π»ΡΠΌ Π½Π°ΡΠ΅Π³ΠΎ ΡΠ°ΠΉΡΠ°! ΠΠ°ΠΊΠΎΠ½Π΅Ρ-ΡΠΎ, ΠΏΠΎΡΠ»Π΅ Π΄Π»ΠΈΡΠ΅Π»ΡΠ½ΠΎΠ³ΠΎ Π»Π΅ΡΠ½Π΅Π³ΠΎ ΠΏΠ΅ΡΠ΅ΡΡΠ²Π°, Π²ΠΎΠ·ΠΎΠ±Π½ΠΎΠ²Π»ΡΠ΅ΡΡΡ ΡΠ°Π±ΠΎΡΠ° Π½Π°Π΄ Π½ΠΎΠ²ΡΠΌΠΈ ΡΡΠ°ΡΡΡΠΌΠΈ ) Π’Π΅ΠΌ Π½Π°ΠΊΠΎΠΏΠΈΠ»ΠΎΡΡ ΠΎΡΠ΅Π½Ρ ΠΌΠ½ΠΎΠ³ΠΎ, ΡΠ΅ΠΌΡ Π°Π±ΡΠΎΠ»ΡΡΠ½ΠΎ ΡΠ°Π·Π½ΡΠ΅, ΡΠ°ΠΊ ΡΡΠΎ Π² Π±Π»ΠΈΠΆΠ°ΠΉΡΠ΅Π΅ Π²ΡΠ΅ΠΌΡ, Π½Π°Π΄Π΅ΡΡΡ ΠΊΠ°ΠΆΠ΄ΡΠΉ Π½Π°ΠΉΠ΄Π΅Ρ ΡΡΠΎ-ΡΠΎ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΎΠ΅ Π΄Π»Ρ ΡΠ΅Π±Ρ. Π ΡΠ΅Π³ΠΎΠ΄Π½Ρ ΠΌΡ Π½Π°ΡΠ½Π΅ΠΌ ΠΎΠ±ΡΡΠΆΠ΄Π°ΡΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΊΠ»Π°ΡΡΠ° USB HID Π΄Π»Ρ Π½Π°ΡΠΈΡ Π»ΡΠ±ΠΈΠΌΡΡ ΠΌΠΈΠΊΡΠΎΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠΎΠ² STM32. ΠΠΎΡΠ΅ΠΌΡ Π½Π°ΡΠ½Π΅ΠΌ? ΠΡΠΎΡΡΠΎ Ρ ΡΠ΅ΡΠΈΠ», ΡΡΠΎ Π΄Π»Ρ ΠΎΠ΄Π½ΠΎΠΉ ΡΡΠ°ΡΡΠΈ ΡΡΡ Π±ΡΠ΄Π΅Ρ ΠΌΠ½ΠΎΠ³ΠΎΠ²Π°ΡΠΎ Π²ΡΠ΅Π³ΠΎ, ΠΏΠΎΡΡΠΎΠΌΡ ΠΈΡ Π±ΡΠ΄Π΅Ρ Π΄Π²Π΅ ΠΈΠ»ΠΈ ΡΡΠΈ, ΡΠ°ΠΊ ΡΡΠΎ Π΄Π°Π²Π°ΠΉΡΠ΅ ΠΏΡΠΈΡΡΡΠΏΠ°ΡΡ.
ΠΡΠ°ΠΊ, ΠΏΠΎ ΡΡΠ°ΡΠΎΠΉ Π΄ΠΎΠ±ΡΠΎΠΉ ΡΡΠ°Π΄ΠΈΡΠΈΠΈ ΡΠ°Π·Π±Π΅ΡΠ΅ΠΌΡΡ Ρ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠ΅ΠΌ… Π― Π±ΡΠ΄Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΎΡΠ»Π°Π΄ΠΎΡΠ½ΡΡ ΠΏΠ»Π°ΡΡ Ρ ΠΌΠΈΠΊΡΠΎΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠΎΠΌ STM32F103VET6, Π° Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΏΡΠΎΠ΅ΠΊΡΠ° ΠΌΡ Π·Π°Π΄Π΅ΠΉΡΡΠ²ΡΠ΅ΠΌ Π½Π°Π±ΠΈΡΠ°ΡΡΠΈΠΉ Π²ΡΠ΅ Π±ΠΎΠ»ΡΡΡΡ ΠΏΠΎΠΏΡΠ»ΡΡΠ½ΠΎΡΡΡ STM32CubeMx.
Π‘ΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎ, Π·Π°ΠΏΡΡΠΊΠ°Π΅ΠΌ, ΡΠΎΠ·Π΄Π°Π΅ΠΌ Π½ΠΎΠ²ΡΠΉ ΠΏΡΠΎΠ΅ΠΊΡ (Π½Π° ΡΡΠΈΡ ΡΠ°Π³Π°Ρ Ρ Π½Π΅ ΠΎΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°ΡΡΡ, Π²ΡΠ΅ ΡΠΆΠ΅ ΡΠ°Π·ΠΎΠ±ΡΠ°Π½ΠΎ Π² ΠΌΠΈΠ½ΠΈ-ΡΠΈΠΊΠ»Π΅ ΡΡΠ°ΡΠ΅ΠΉ, ΠΏΠΎΡΠ²ΡΡΠ΅Π½Π½ΡΡ ΡΡΠΎΠΉ ΡΠ΅ΠΌΠ΅ Π½Π° Π½Π°ΡΠ΅ΠΌ ΡΠ°ΠΉΡΠ΅ — ΠΈΡ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡΠΈ Π² ΡΡΠ±ΡΠΈΠΊΠ΅ STM32CubeMx). ΠΠΊΠ»ΡΡΠ°Π΅ΠΌ ΡΠΎΠ»ΡΠΊΠΎ ΡΠΎ, ΡΡΠΎ Π½Π°ΠΌ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡΡΡ Π΄Π»Ρ ΡΠ΅ΡΠ΅Π½ΠΈΡ Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΠΎ ΡΠ΅Π³ΠΎΠ΄Π½ΡΡΠ½Π΅ΠΉ Π·Π°Π΄Π°ΡΠΈ, Π½ΠΈΡΠ΅Π³ΠΎ Π»ΠΈΡΠ½Π΅Π³ΠΎ:
ΠΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, Π½Π° ΠΌΠΎΠ΅ΠΉ ΠΏΠ»Π°ΡΠ΅ Π΅ΡΡΡ Π²ΠΎΡ ΡΠ°ΠΊΠ°Ρ ΡΠΈΡΠΊΠ°:
ΠΠΎΡΡΠΎΠΌΡ Π΄Π»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΏΠΎ USB Π² ΠΏΡΠΈΠ½ΡΠΈΠΏΠ΅ ΠΌΠΎΠ³Π»ΠΎ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΠΌΠ½Π΅ Π½Π°Π΄ΠΎ ΠΏΠΎΠ΄Π°ΡΡ Π½Π° PC13 Π½Π°ΠΏΡΡΠΆΠ΅Π½ΠΈΠ΅ Π½ΠΈΠ·ΠΊΠΎΠ³ΠΎ ΡΡΠΎΠ²Π½Ρ, ΡΡΠΎΠ±Ρ ΠΎΡΠΊΡΡΡΡ ΡΡΠ°Π½Π·ΠΈΡΡΠΎΡ.
Π Π½Π°ΡΡΡΠΎΠΉΠΊΠ°Ρ ΡΠ°ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΡΡ 48 ΠΠΡ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ USB. Π’ΡΡ Π½ΠΈΡΠ΅Π³ΠΎ ΡΠ»ΠΎΠΆΠ½ΠΎΠ³ΠΎ, ΠΏΡΠΎΡΡΠΎ ΠΏΠΎΠ΄Π±ΠΈΡΠ°Π΅ΠΌ Π½ΡΠΆΠ½ΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΡΠΌΠ½ΠΎΠΆΠΈΡΠ΅Π»Π΅ΠΉ ΠΈ Π΄Π΅Π»ΠΈΡΠ΅Π»Π΅ΠΉ ΡΠ°ΡΡΠΎΡΡ ΠΈ Π½Π΅ Π·Π°Π±ΡΠ²Π°Π΅ΠΌ Π°ΠΊΡΠΈΠ²ΠΈΡΠΎΠ²Π°ΡΡ Π²Π½Π΅ΡΠ½ΠΈΠΉ ΠΊΠ²Π°ΡΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΡ ΡΠΆΠ΅ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠΈΠ»ΠΈ Π² ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅ΠΌ ΠΎΠΊΠ½Π΅:
ΠΠ΅ΡΠ΅Ρ ΠΎΠ΄ΠΈΠΌ Π½Π° Π²ΠΊΠ»Π°Π΄ΠΊΡ Configuration, Π½ΠΎ ΡΠ°ΠΌ Π²ΡΠ΅ ΠΎΡΡΠ°Π²Π»ΡΠ΅ΠΌ Π² ΠΏΠ΅ΡΠ²ΠΎΠ·Π΄Π°Π½Π½ΠΎΠΌ Π²ΠΈΠ΄Π΅. Π Π°Π·Π²Π΅ ΡΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΉΡΠΈ Π² Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ USB_Device ΠΈ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ PID ΠΈ VID, ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡΡ Π½Π°ΠΌ ΠΏΡΠΈΠ³ΠΎΠ΄ΠΈΡΡΡΡ Π²ΠΏΠΎΡΠ»Π΅Π΄ΡΡΠ²ΠΈΠΈ Π΄Π»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ, Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ Π»ΠΈ Π½Π°ΡΠ΅ ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎ ΡΡΠΏΠ΅ΡΠ½ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠΈΠ»ΠΎΡΡ ΠΊ ΠΠ. ΠΠΎ Π½Π΅ Π±ΡΠ΄Π΅ΠΌ Π·Π°Π±Π΅Π³Π°ΡΡ Π²ΠΏΠ΅ΡΠ΅Π΄, Π° ΠΏΡΠΎΡΡΠΎ Π·Π°ΠΏΠΎΠΌΠ½ΠΈΠΌ ΠΈΠ»ΠΈ Π·Π°ΠΏΠΈΡΠ΅ΠΌ ΡΡΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΡ. ΠΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΠΎΠ½ΠΈ ΡΠ°ΠΊΠΈΠ΅:
Π Π°Π±ΠΎΡΡ Π² CubeMx Π½Π° ΡΡΠΎΠΌ Π·Π°ΠΊΠ°Π½ΡΠΈΠ²Π°Π΅ΠΌ, Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅ΠΌ ΡΠ°ΠΉΠ»Ρ ΠΏΡΠΎΠ΅ΠΊΡΠ° ΠΈ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄ΠΈΠΌ Π² IAR (Π½Ρ ΠΈΠ»ΠΈ Keil, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠ²ΠΎΡ IDE). ΠΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡΠΎΡΠΈΡΡ ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π² ΠΌΠΈΠΊΡΠΎΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅Ρ, Π½ΠΎ, ΠΊ ΡΠΎΠΆΠ°Π»Π΅Π½ΠΈΡ, ΡΡΠΎ Π½Π°ΠΌ Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ Π΄Π°ΡΡ — ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡΡ Π² ΡΠΈΡΡΠ΅ΠΌΠ΅, Π½ΠΎ ΡΠ°Π±ΠΎΡΠ°ΡΡ Π½Π΅ Π±ΡΠ΄Π΅Ρ, Π° Π² Π΄ΠΈΡΠΏΠ΅ΡΡΠ΅ΡΠ΅ ΡΡΡΡΠΎΠΉΡΡΠ² ΠΌΡ ΡΠ²ΠΈΠ΄ΠΈΠΌ ΠΎΡΠΈΠ±ΠΊΡ — «Π‘Π±ΠΎΠΉ Π·Π°ΠΏΡΠΎΡΠ° Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠ° ΡΡΡΡΠΎΠΉΡΡΠ²Π°». Π ΡΡΠ° ΡΠΈΡΡΠ°ΡΠΈΡ ΠΊΠ°ΠΊ Π½ΠΈ ΠΏΠ°ΡΠ°Π΄ΠΎΠΊΡΠ°Π»ΡΠ½ΠΎ Π°Π±ΡΠΎΠ»ΡΡΠ½ΠΎ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½Π° ΠΈ Π»ΠΎΠ³ΠΈΡΠ½Π°. ΠΠ΅Π»ΠΎ Π² ΡΠΎΠΌ, ΡΡΠΎ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ Π΄Π»Ρ Π½Π°ΡΠ΅Π³ΠΎ Custom HID ΡΡΡΡΠΎΠΉΡΡΠ²Π° ΠΌΡ Π΄ΠΎΠ»ΠΆΠ½Ρ ΡΠΎΠ·Π΄Π°ΡΡ ΡΠ°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»ΡΠ½ΠΎ ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π² Π½Π°Ρ ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ ΠΏΡΠΎΠ΅ΠΊΡ. ΠΡΠΈΠΌ ΠΌΡ ΡΠ΅ΠΉΡΠ°Ρ ΠΈ Π·Π°ΠΉΠΌΠ΅ΠΌΡΡ.
ΠΡΠ΅Π³ΠΎ Π΅ΡΡΡ ΡΡΠΈ USB Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠ°, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΎΡΠ²Π΅ΡΠ°ΡΡ Π·Π° ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΊ ΠΠ:
ΠΠ΅ΡΠΊΡΠΈΠΏΡΠΎΡ ΡΡΡΡΠΎΠΉΡΡΠ²Π° ΠΎΠΏΠΈΡΠ°Π½ Π² ΡΠ°ΠΉΠ»Π΅ usbd_desc.c ΠΈ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ:
/* USB Standard Device Descriptor */ __ALIGN_BEGIN uint8_t USBD_FS_DeviceDesc[USB_LEN_DEV_DESC] __ALIGN_END = { 0x12, /*bLength */ USB_DESC_TYPE_DEVICE, /*bDescriptorType*/ 0x00, /*bcdUSB */ 0x02, 0x00, /*bDeviceClass*/ 0x00, /*bDeviceSubClass*/ 0x00, /*bDeviceProtocol*/ USB_MAX_EP0_SIZE, /*bMaxPacketSize*/ LOBYTE(USBD_VID), /*idVendor*/ HIBYTE(USBD_VID), /*idVendor*/ LOBYTE(USBD_PID_FS), /*idVendor*/ HIBYTE(USBD_PID_FS), /*idVendor*/ 0x00, /*bcdDevice rel. 2.00*/ 0x02, USBD_IDX_MFC_STR, /*Index of manufacturer string*/ USBD_IDX_PRODUCT_STR, /*Index of product string*/ USBD_IDX_SERIAL_STR, /*Index of serial number string*/ USBD_MAX_NUM_CONFIGURATION /*bNumConfigurations*/ }; /* USB_DeviceDescriptor */
Π ΠΏΡΠΈΠ½ΡΠΈΠΏΠ΅, Π·Π΄Π΅ΡΡ Π²ΡΠ΅ ΡΠ½Π°Π±ΠΆΠ΅Π½ΠΎ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠΌΠΈ, Π²ΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠ΅, Π½Ρ ΠΈ ΠΌΡ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎ, Π·Π΄Π΅ΡΡ Π½ΠΈΡΠ΅Π³ΠΎ ΡΡΠΎΠ³Π°ΡΡ ΡΠ΅ΠΉΡΠ°Ρ Π½Π΅ Π±ΡΠ΄Π΅ΠΌ, Π° Π΄Π²ΠΈΠ½Π΅ΠΌΡΡ Π΄Π°Π»ΡΡΠ΅. ΠΠ΅ΡΠΊΡΠΈΠΏΡΠΎΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ Π½Π°ΠΉΡΠΈ Π² ΡΠ°ΠΉΠ»Π΅ usbd_customhid.c:
/* USB CUSTOM_HID device Configuration Descriptor */ __ALIGN_BEGIN static uint8_t USBD_CUSTOM_HID_CfgDesc[USB_CUSTOM_HID_CONFIG_DESC_SIZ] __ALIGN_END = { 0x09, /* bLength: Configuration Descriptor size */ USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType: Configuration */ USB_CUSTOM_HID_CONFIG_DESC_SIZ, /* wTotalLength: Bytes returned */ 0x00, 0x01, /* bNumInterfaces: 1 interface */ 0x01, /* bConfigurationValue: Configuration value */ 0x00, /* iConfiguration: Index of string descriptor describing the configuration */ 0xC0, /* bmAttributes: bus powered */ 0x32, /* MaxPower 100 mA: this current is used for detecting Vbus */ /************** Descriptor of CUSTOM HID interface ****************/ /* 09 */ 0x09, /*bLength: Interface Descriptor size*/ USB_DESC_TYPE_INTERFACE, /*bDescriptorType: Interface descriptor type*/ 0x00, /*bInterfaceNumber: Number of Interface*/ 0x00, /*bAlternateSetting: Alternate setting*/ 0x02, /*bNumEndpoints*/ 0x03, /*bInterfaceClass: CUSTOM_HID*/ 0x00, /*bInterfaceSubClass : 1=BOOT, 0=no boot*/ 0x00, /*nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse*/ 0, /*iInterface: Index of string descriptor*/ /******************** Descriptor of CUSTOM_HID *************************/ /* 18 */ 0x09, /*bLength: CUSTOM_HID Descriptor size*/ CUSTOM_HID_DESCRIPTOR_TYPE, /*bDescriptorType: CUSTOM_HID*/ 0x11, /*bCUSTOM_HIDUSTOM_HID: CUSTOM_HID Class Spec release number*/ 0x01, 0x00, /*bCountryCode: Hardware target country*/ 0x01, /*bNumDescriptors: Number of CUSTOM_HID class descriptors to follow*/ 0x22, /*bDescriptorType*/ USBD_CUSTOM_HID_REPORT_DESC_SIZE, /*wItemLength: Total length of Report descriptor*/ 0x00, /******************** Descriptor of Custom HID endpoints ********************/ /* 27 */ 0x07, /*bLength: Endpoint Descriptor size*/ USB_DESC_TYPE_ENDPOINT, /*bDescriptorType:*/ CUSTOM_HID_EPIN_ADDR, /*bEndpointAddress: Endpoint Address (IN)*/ 0x03, /*bmAttributes: Interrupt endpoint*/ CUSTOM_HID_EPIN_SIZE, /*wMaxPacketSize: 2 Byte max */ 0x00, 0x20, /*bInterval: Polling Interval (20 ms)*/ /* 34 */ 0x07, /* bLength: Endpoint Descriptor size */ USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: */ CUSTOM_HID_EPOUT_ADDR, /*bEndpointAddress: Endpoint Address (OUT)*/ 0x03, /* bmAttributes: Interrupt endpoint */ CUSTOM_HID_EPOUT_SIZE, /* wMaxPacketSize: 2 Bytes max */ 0x00, 0x20, /* bInterval: Polling Interval (20 ms) */ /* 41 */ };
Π ΠΎΠ±ΡΠ΅ΠΌ-ΡΠΎ, Π·Π΄Π΅ΡΡ ΡΠΎΠΆΠ΅ ΠΈΠ½ΠΆΠ΅Π½Π΅ΡΡ ΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΡΡ ST ΠΏΠΎΠ·Π°Π±ΠΎΡΠΈΠ»ΠΈΡΡ ΠΎ ΡΠΎΠΌ, ΡΡΠΎΠ±Ρ Ρ ΠΎΡΠΎΡΠ΅Π½ΡΠΊΠΎ Π²ΡΠ΅ ΠΏΡΠΎΠΊΠΎΠΌΠΌΠ΅Π½ΡΠΈΡΠΎΠ²Π°ΡΡ, ΠΏΠΎΡΡΠΎΠΌΡ Ρ Π½Π΅ Π±ΡΠ΄Ρ ΠΎΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°ΡΡΡΡ Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΏΠΎΠ»Π΅ (Π΅ΡΠ»ΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡΡ Π²ΠΎΠΏΡΠΎΡΡ ΠΈΠ»ΠΈ ΡΡΠΎ-ΡΠΎ Π½Π΅ Π±ΡΠ΄Π΅Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ, ΠΏΠΈΡΠΈΡΠ΅ Π² ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΡΡ , ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ ΠΏΠΎΠΌΠΎΠ³Ρ).
ΠΡΠ΄Π΅Π»ΡΠ½ΠΎ ΡΡΠΎΠΈΡ ΠΎΠ±ΡΠ°ΡΠΈΡΡ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° CUSTOM_HID_EPOUT_SIZE. Π ΡΠ°ΠΉΠ»Π΅ usbd_customhid.h Π½Π°Ρ ΠΎΠ΄ΠΈΠΌ:define CUSTOM_HID_EPOUT_SIZE 0x02
ΠΡΠ° ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ° ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΡΠΉ ΡΠ°Π·ΠΌΠ΅Ρ ΠΏΠ°ΠΊΠ΅ΡΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ Π±ΡΠ΄ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ ΠΏΡΠΈ ΠΎΠ±ΠΌΠ΅Π½Π΅ Π΄Π°Π½Π½ΡΠΌΠΈ Ρ ΠΠ. ΠΠ°Π²Π°ΠΉΡΠ΅ ΠΏΠΎΡΡΠ°Π²ΠΈΠΌ 4 Π±Π°ΠΉΡΠ°. ΠΠΎ Π½Π΅ Π·Π°Π±ΡΠ²Π°ΠΉΡΠ΅, ΡΡΠΎ ΠΏΠΎ ΡΡΠ°Π½Π΄Π°ΡΡΡ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΡΠΉ ΡΠ°Π·ΠΌΠ΅Ρ ΠΏΠ°ΠΊΠ΅ΡΠ° ΡΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ 64 Π±Π°ΠΉΡΠ° (0x40).
Π‘ Π΄Π²ΡΠΌΡ ΠΈΠ· ΡΠΏΠΎΠΌΡΠ½ΡΡΡΡ USB Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠΎΠ² ΡΠ°Π·ΠΎΠ±ΡΠ°Π»ΠΈΡΡ, ΡΠ΅ΠΏΠ΅ΡΡ Π½Π°ΡΡΠ°Π»Π° ΠΎΡΠ΅ΡΠ΅Π΄Ρ ΡΡΠ΅ΡΡΠ΅Π³ΠΎ. ΠΠ½ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ Π² ΡΠ°ΠΉΠ»Π΅ usbd_custom_hid_if.c:
__ALIGN_BEGIN static uint8_t CUSTOM_HID_ReportDesc_FS[USBD_CUSTOM_HID_REPORT_DESC_SIZE] __ALIGN_END = { /* USER CODE BEGIN 0 */ 0x00, /* USER CODE END 0 */ 0xC0 /* END_COLLECTION */ };
ΠΠ°ΠΊ Π²ΠΈΠ΄ΠΈΡΠ΅ ΠΎΠ½ Π°Π±ΡΠΎΠ»ΡΡΠ½ΠΎ ΠΏΡΡΡ, ΠΏΠΎΡΡΠΎΠΌΡ Π½Π°ΡΠ΅ ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎ ΠΈ Π½Π΅ ΡΠΌΠΎΠ³Π»ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡΡΡ Π² ΡΠΈΡΡΠ΅ΠΌΠ΅ ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΎ. Π’Π°ΠΊ ΡΡΠΎ Π΄Π°Π²Π°ΠΉΡΠ΅ ΡΠ°Π·Π±Π΅ΡΠ΅ΠΌΡΡ ΠΈ ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅ΠΌ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ ΡΠ΅ΠΏΠΎΡΡΠ°.
Π§ΡΠΎ ΡΠ°ΠΊΠΎΠ΅ Π² ΠΏΡΠΈΠ½ΡΠΈΠΏΠ΅ ΡΠ΅ΠΏΠΎΡΡ?
ΠΡΠ΅ Π΄Π΅Π»ΠΎ Π² ΡΠΎΠΌ, ΡΡΠΎ ΠΠ ΠΈ Π½Π°ΡΠ΅ ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎ Π½Π΅ ΠΏΡΠΎΡΡΠΎ ΠΊΠΈΠ΄Π°ΡΡ Π΄ΡΡΠ³ Π΄ΡΡΠ³Ρ Π±Π°ΠΉΡΡ Π΄Π°Π½Π½ΡΡ , Π° ΠΎΠ±ΠΌΠ΅Π½ΠΈΠ²Π°ΡΡΡΡ ΠΏΠ°ΠΊΠ΅ΡΠ°ΠΌΠΈ, ΠΈΠΌΠ΅ΡΡΠΈΠΌΠΈ ΡΠ΅ΡΠΊΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΡ ΡΡΡΡΠΊΡΡΡΡ. ΠΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ ΠΏΠ°ΠΊΠ΅ΡΠ° ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΠΏΠΎ ΠΏΠ΅ΡΠ²ΠΎΠΌΡ Π±Π°ΠΉΡΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΈΠ· ΡΠ΅Π±Ρ ID ΡΠ΅ΠΏΠΎΡΡΠ°. ΠΠ΅ΡΠ΅Π΄ Π½Π°ΠΌΠΈ ΡΡΠΎΠΈΡ Π·Π°Π΄Π°ΡΠ° ΠΎΡΠΏΡΠ°Π²Π»ΡΡΡ Π΄Π°Π½Π½ΡΠ΅ Ρ ΠΎΡΡΡ, Π° ΡΠ°ΠΊΠΆΠ΅ ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡ Π΄Π°Π½Π½ΡΠ΅, ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡΠΈΠ΅ΡΡ Π² ΠΎΠ±ΡΠ°ΡΠ½ΠΎΠΌ Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠΈ. ΠΠΎΡΡΠΎΠΌΡ ΠΌΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΠΌ Π΄Π²Π° ΡΠ΅ΠΏΠΎΡΡΠ° — Π½Π° ΠΏΡΠΈΠ΅ΠΌ ΠΈ Π½Π° ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ. ΠΡΡΡΡ Π½Π° ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ Ρ Π½Π°Ρ Π±ΡΠ΄Π΅Ρ ΡΠ΅ΠΏΠΎΡΡ Ρ ID = 1, Π° Π½Π° ΠΏΡΠΈΠ΅ΠΌ ΡΠ΅ΠΏΠΎΡΡ Ρ ID = 2:
__ALIGN_BEGIN static uint8_t CUSTOM_HID_ReportDesc_FS[USBD_CUSTOM_HID_REPORT_DESC_SIZE] __ALIGN_END = { /* USER CODE BEGIN 0 */ 0x06, 0x00, 0xff, // USAGE_PAGE (Generic Desktop) 0x09, 0x01, // USAGE (Vendor Usage 1) // System Parameters 0xa1, 0x01, // COLLECTION (Application) 0x85, 0x01, // REPORT_ID (1) 0x09, 0x01, // USAGE (Vendor Usage 1) 0x15, 0x00, // LOGICAL_MINIMUM (0) 0x25, 0x01, // LOGICAL_MAXIMUM (1) 0x75, 0x08, // REPORT_SIZE (8) 0x95, 4, // REPORT_COUNT (4) 0xb1, 0x82, // FEATURE (Data,Var,Abs,Vol) 0x85, 0x01, // REPORT_ID (1) 0x09, 0x01, // USAGE (Vendor Usage 1) 0x91, 0x82, // OUTPUT (Data,Var,Abs,Vol) 0x85, 0x02, // REPORT_ID (2) 0x09, 0x02, // USAGE (Vendor Usage 2) 0x75, 0x08, // REPORT_SIZE (8) 0x95, 4, // REPORT_COUNT (4) 0x81, 0x82, // INPUT (Data,Var,Abs,Vol) /* USER CODE END 0 */ 0xC0 /* END_COLLECTION */ };
ΠΠ΅ Π·Π°Π±ΡΠ²Π°Π΅ΠΌ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ ΡΠ°Π·ΠΌΠ΅Ρ ΠΌΠ°ΡΡΠΈΠ²Π° Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠ° — USBD_CUSTOM_HID_REPORT_DESC_SIZE, Π° Π·Π°ΠΎΠ΄Π½ΠΎ ΠΈ USBD_CUSTOMHID_OUTREPORT_BUF_SIZE:
#define USBD_CUSTOMHID_OUTREPORT_BUF_SIZE 4 #define USBD_CUSTOM_HID_REPORT_DESC_SIZE 38
ΠΡ ΠΈ Π² ΡΠ°ΠΉΠ»Π΅ usbd_customhid. h ΡΠ°ΠΊΠΆΠ΅ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΡ, ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠ΅ Π½Π°ΡΠ΅ΠΌΡ ΡΠ΅ΠΆΠΈΠΌΡ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ ΠΈ ΠΏΡΠΈΠ΅ΠΌΠ° (Π° ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠ° ΠΈ ΠΏΡΠΈΠ΅ΠΌ ΠΏΠΎ 4 Π±Π°ΠΉΡΠ°):
#define CUSTOM_HID_EPIN_ADDR 0x81 #define CUSTOM_HID_EPIN_SIZE 4 #define CUSTOM_HID_EPOUT_ADDR 0x01 #define CUSTOM_HID_EPOUT_SIZE 4
Π Π²ΠΎΡ ΡΠ΅ΠΏΠ΅ΡΡ ΡΠΆΠ΅ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠΏΡΠΎΠ±ΠΎΠ²Π°ΡΡ ΡΠΎΠ±ΡΠ°ΡΡ ΠΏΡΠΎΠ΅ΠΊΡ ΠΈ Π·Π°ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°ΡΡ ΠΌΠΈΠΊΡΠΎΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅Ρ. Π ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΡΡΠΏΠ΅ΡΠ½ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡΡΡ Π² Π΄ΠΈΡΠΏΠ΅ΡΡΠ΅ΡΠ΅ ΡΡΡΡΠΎΠΉΡΡΠ²:
Π‘ΠΎΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎ, Π·Π½Π°ΡΠ΅Π½ΠΈΡ PID ΠΈ VID Ρ ΡΡΠΎΠ³ΠΎ ΡΡΡΡΠΎΠΉΡΡΠ²Π° ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡ ΡΠ΅ΠΌ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΡ Π·Π°Π΄Π°Π»ΠΈ Π² STM32CubeMx ΠΏΡΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ ΠΈ Π½Π°ΡΡΡΠΎΠΉΠΊΠ΅ ΠΏΡΠΎΠ΅ΠΊΡΠ°.
Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, Π½Π° ΡΠ΅Π³ΠΎΠ΄Π½Ρ ΠΌΡ Π½Π° ΡΡΠΎΠΌ Π·Π°ΠΊΠ°Π½ΡΠΈΠ²Π°Π΅ΠΌ. Π‘ΡΠ°Π·Ρ ΡΠ°ΡΡΠΊΠ°ΠΆΡ, ΡΠ΅ΠΌ ΠΌΡ Π±ΡΠ΄Π΅ΠΌ Π·Π°Π½ΠΈΠΌΠ°ΡΡΡΡ Π² ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ ΡΡΠ°ΡΡΠ΅. ΠΠΎ Π²ΡΠΎΡΠΎΠΉ ΡΠ°ΡΡΠΈ, ΠΏΠΎΡΠ²ΡΡΠ΅Π½Π½ΠΎΠΉ USB Custom HID ΠΌΡ ΡΠ°Π·Π±Π΅ΡΠ΅ΠΌΡΡ ΠΊΠ°ΠΊ ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡ ΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°ΡΡ Π΄Π°Π½Π½ΡΠ΅, Π° Π² ΡΡΠ΅ΡΡΠ΅ΠΉ ΡΠ°ΡΡΠΈ ΠΌΡ Π½Π°ΠΏΠΈΡΠ΅ΠΌ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΊΡ Π΄Π»Ρ ΠΠ, ΠΊΠΎΡΠΎΡΠ°Ρ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎ ΠΈ Π±ΡΠ΄Π΅Ρ ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΡΡ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΈ ΠΎΠ±ΠΌΠ΅Π½ Π΄Π°Π½Π½ΡΠΌΠΈ Ρ Π½Π°ΡΠΈΠΌ ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎΠΌ. ΠΠΎ ΡΠΊΠΎΡΠΎΠΉ Π²ΡΡΡΠ΅ΡΠΈ!
Π― ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ°Π» ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠΉ Π³Π΅ΠΉΠΌΠΏΠ°Π΄, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ STM32. ΠΠ½ ΠΈΠΌΠ΅Π΅Ρ ΡΠ΅ΡΡΡΠ΅ Π°Π½Π°Π»ΠΎΠ³ΠΎΠ²ΡΠ΅ ΠΎΡΠΈ ΠΈ 22 ΠΊΠ½ΠΎΠΏΠΊΠΈ. Π― Π½Π°ΠΏΠΈΡΠ°Π» Π΄Π»Ρ Π½Π΅Π³ΠΎ ΠΏΡΠΎΡΠΈΠ²ΠΊΡ, Π²ΠΊΠ»ΡΡΠ°Ρ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ USB (ΡΡΠΎ Π·Π°Π½ΡΠ»ΠΎ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΠΏΡΡΠΎΠΊ).
ΠΠ½ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΡΠΎΡΠ½ΠΎ ΡΠ°ΠΊ, ΠΊΠ°ΠΊ ΠΎΠΆΠΈΠ΄Π°Π»ΠΎΡΡ, Π² Windows, Π½ΠΎ Π² Linux (Π² ΡΠ°ΡΡΠ½ΠΎΡΡΠΈ, Raspbian) ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠ΅ 5 ΠΊΠ½ΠΎΠΏΠΎΠΊ ΠΈΠ½Π²Π΅ΡΡΠΈΡΠΎΠ²Π°Π½Ρ (Β«Π²ΠΊΠ»Β» ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ, Β«Π²ΡΠΊΠ»Β» ΠΏΡΠΈ Π½Π°ΠΆΠ°ΡΠΈΠΈ)
ΠΠ»Ρ ΠΌΠΎΠ΅Π³ΠΎ ΠΏΡΠΎΠ΄ΡΠΊΡΠ° Π²Π°ΠΆΠ½ΠΎ, ΡΡΠΎΠ±Ρ ΠΎΠ½ ΡΠ°Π±ΠΎΡΠ°Π» Π½Π° ΠΎΠ±Π΅ΠΈΡ ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ°Ρ (Mac ΡΠΎΠΆΠ΅, Π½ΠΎ Ρ ΠΌΠ΅Π½Ρ ΡΠ΅ΠΉΡΠ°Ρ Π½Π΅Ρ Π΅Π³ΠΎ Π΄Π»Ρ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ)
ΠΡΡΡ ΠΈΠ΄Π΅ΠΈ, ΠΏΠΎΡΠ΅ΠΌΡ ΡΡΠΎ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΈ ΡΡΠΎ Ρ ΡΡΠΈΠΌ Π΄Π΅Π»Π°ΡΡ?
ΠΠΎΡ Π²ΡΠ²ΠΎΠ΄ lsusb -v Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ ΡΡΡΡΠΎΠΉΡΡΠ²Π°:
Π¨ΠΈΠ½Π° 001 Π£ΡΡΡΠΎΠΉΡΡΠ²ΠΎ 003: ID 0483:5750 STMicroelectronics ΠΠ΅ΡΠΊΡΠΈΠΏΡΠΎΡ ΡΡΡΡΠΎΠΉΡΡΠ²Π°: Π±ΠΠ»ΠΈΠ½Π° 18 bDescriptorType 1 bcdUSB 2. 00 bDeviceClass 0 bDeviceSubClass 0 bDeviceProtocol 0 bMaxPacketSize0 64 idVendor 0x0483 STMicroelectronics idProduct 0x5750 bcdDevice 2.00 iManufacturer 1 STMicroelectronics ΠΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠΉ ΡΠ΅Π»ΠΎΠ²Π΅ΡΠ΅ΡΠΊΠΈΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ iProduct 2 STM32 iSerial 3 74E79C303734 bNumConfigurations 1 ΠΠ΅ΡΠΊΡΠΈΠΏΡΠΎΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ: bΠΠ»ΠΈΠ½Π° 9 bDescriptorType 2 wTotalLength 0x0029 bNumΠΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡ 1 bConfigurationValue 1 iΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ 0 Π±ΠΌΠ°ΡΡΠΈΠ±ΡΡΠ΅Ρ 0xc0 ΠΠ²ΡΠΎΠ½ΠΎΠΌΠ½ΡΠΉ ΠΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½Π°Ρ ΠΌΠΎΡΠ½ΠΎΡΡΡ 100 ΠΌΠ ΠΠ΅ΡΠΊΡΠΈΠΏΡΠΎΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°: bΠΠ»ΠΈΠ½Π° 9 bDescriptorType 4 bInterfaceNumber 0 bAlternateSetting 0 bNumEndpoints 2 bInterfaceClass 3 Π£ΡΡΡΠΎΠΉΡΡΠ²ΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΎΠ³ΠΎ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° bInterfaceSubClass 0 bInterfaceProtocol 0 ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ 0 ΠΠ΅ΡΠΊΡΠΈΠΏΡΠΎΡ HID-ΡΡΡΡΠΎΠΉΡΡΠ²Π°: bΠΠ»ΠΈΠ½Π° 9Π±Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΡΠΈΠΏ 33 bcdHID 1.11 bCountryCode 0 ΠΠ΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΡΡΡ bNumDescriptors 1 bDescriptorType 34 ΠΡΡΠ΅Ρ wDescriptorLength 53 ΠΠ΅ΡΠΊΡΠΈΠΏΡΠΎΡ ΠΎΡΡΠ΅ΡΠ°: (Π΄Π»ΠΈΠ½Π° 53) ΠΠ»Π΅ΠΌΠ΅Π½Ρ (Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΡΠΉ): ΡΡΡΠ°Π½ΠΈΡΠ° ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ, Π΄Π°Π½Π½ΡΠ΅ = [0x01] 1 ΠΠ±ΡΠΈΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΡΠ°Π±ΠΎΡΠΈΠΌ ΡΡΠΎΠ»ΠΎΠΌ ΠΠ»Π΅ΠΌΠ΅Π½Ρ (Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΠΉ): ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅, Π΄Π°Π½Π½ΡΠ΅ = [0x05] 5 ΠΠ΅ΠΉΠΌΠΏΠ°Π΄ ΠΠ»Π΅ΠΌΠ΅Π½Ρ (ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ): ΠΊΠΎΠ»Π»Π΅ΠΊΡΠΈΡ, Π΄Π°Π½Π½ΡΠ΅ = [0x01] 1 ΠΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΠ»Π΅ΠΌΠ΅Π½Ρ (Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΠΉ): ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅, Π΄Π°Π½Π½ΡΠ΅ = [0x01] 1 Π£ΠΊΠ°Π·Π°ΡΠ΅Π»Ρ ΠΠ»Π΅ΠΌΠ΅Π½Ρ (ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ): ΠΊΠΎΠ»Π»Π΅ΠΊΡΠΈΡ, Π΄Π°Π½Π½ΡΠ΅ = [0x00] 0 Π€ΠΈΠ·ΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΠ»Π΅ΠΌΠ΅Π½Ρ (Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΠΉ): ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅, Π΄Π°Π½Π½ΡΠ΅ = [0x30] 48 ΠΠ°ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅-X ΠΠ»Π΅ΠΌΠ΅Π½Ρ (Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΠΉ): ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅, Π΄Π°Π½Π½ΡΠ΅ = [0x31] 49ΠΠ°ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅-Y ΠΠ»Π΅ΠΌΠ΅Π½Ρ (Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΠΉ): ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅, Π΄Π°Π½Π½ΡΠ΅ = [0x32] 50 ΠΠ°ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅-Z ΠΠ»Π΅ΠΌΠ΅Π½Ρ (Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΠΉ): ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅, Π΄Π°Π½Π½ΡΠ΅ = [0x33] 51 ΠΠΎΠ²Π΅ΡΠ½ΡΡΡ-X ΠΠ»Π΅ΠΌΠ΅Π½Ρ (Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΡΠΉ): Π»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΌΠΈΠ½ΠΈΠΌΡΠΌ, Π΄Π°Π½Π½ΡΠ΅ = [0x00] 0 ΠΠ»Π΅ΠΌΠ΅Π½Ρ (Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΡΠΉ): Π»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΌΠ°ΠΊΡΠΈΠΌΡΠΌ, Π΄Π°Π½Π½ΡΠ΅ = [0xff 0x0f] 4095 ΠΠ»Π΅ΠΌΠ΅Π½Ρ (Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΡΠΉ): ΡΠ°Π·ΠΌΠ΅Ρ ΠΎΡΡΠ΅ΡΠ°, Π΄Π°Π½Π½ΡΠ΅ = [0x10] 16 ΠΠ»Π΅ΠΌΠ΅Π½Ρ (Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΡΠΉ): ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΎΡΡΠ΅ΡΠΎΠ², Π΄Π°Π½Π½ΡΠ΅ = [0x04] 4 ΠΠ»Π΅ΠΌΠ΅Π½Ρ (ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ): Π²Π²ΠΎΠ΄, Π΄Π°Π½Π½ΡΠ΅ = [0x02] 2 ΠΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ Π΄Π°Π½Π½ΡΡ ΠΠ±ΡΠΎΠ»ΡΡΠ½Π°Ρ No_Wrap ΠΠΈΠ½Π΅ΠΉΠ½Π°Ρ Preferred_State No_Null_Position Non_Volatile ΠΠΈΡΠΎΠ²ΠΎΠ΅ ΠΏΠΎΠ»Π΅ ΠΠ»Π΅ΠΌΠ΅Π½Ρ (ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ): ΠΊΠΎΠ½Π΅Ρ ΠΊΠΎΠ»Π»Π΅ΠΊΡΠΈΠΈ, Π΄Π°Π½Π½ΡΠ΅ = Π½Π΅Ρ ΠΠ»Π΅ΠΌΠ΅Π½Ρ (Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΡΠΉ): Π‘ΡΡΠ°Π½ΠΈΡΠ° ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ, Π΄Π°Π½Π½ΡΠ΅ = [ 0x09] 9 ΠΠ½ΠΎΠΏΠΊΠΈ ΠΠ»Π΅ΠΌΠ΅Π½Ρ (Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΠΉ): ΠΌΠΈΠ½ΠΈΠΌΡΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ, Π΄Π°Π½Π½ΡΠ΅ = [0x01] 1 ΠΠ½ΠΎΠΏΠΊΠ° 1 (ΠΎΡΠ½ΠΎΠ²Π½Π°Ρ) ΠΠ»Π΅ΠΌΠ΅Π½Ρ (Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΠΉ): ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅, Π΄Π°Π½Π½ΡΠ΅ = [0x16] 22 (Π½ΡΠ»Π΅Π²ΠΎΠΉ) ΠΠ»Π΅ΠΌΠ΅Π½Ρ (Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΡΠΉ): Π»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΌΠΈΠ½ΠΈΠΌΡΠΌ, Π΄Π°Π½Π½ΡΠ΅ = [0x00] 0 ΠΠ»Π΅ΠΌΠ΅Π½Ρ (Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΡΠΉ): Π»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΌΠ°ΠΊΡΠΈΠΌΡΠΌ, Π΄Π°Π½Π½ΡΠ΅ = [0x01] 1 ΠΠ»Π΅ΠΌΠ΅Π½Ρ (Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΡΠΉ): ΡΠ°Π·ΠΌΠ΅Ρ ΠΎΡΡΠ΅ΡΠ°, Π΄Π°Π½Π½ΡΠ΅ = [0x01] 1 ΠΠ»Π΅ΠΌΠ΅Π½Ρ (Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΡΠΉ): ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΎΡΡΠ΅ΡΠΎΠ², Π΄Π°Π½Π½ΡΠ΅ = [0x16] 22 ΠΠ»Π΅ΠΌΠ΅Π½Ρ (ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ): Π²Π²ΠΎΠ΄, Π΄Π°Π½Π½ΡΠ΅ = [0x02] 2 ΠΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ Π΄Π°Π½Π½ΡΡ ΠΠ±ΡΠΎΠ»ΡΡΠ½Π°Ρ No_Wrap ΠΠΈΠ½Π΅ΠΉΠ½Π°Ρ Preferred_State No_Null_Position Non_Volatile ΠΠΈΡΠΎΠ²ΠΎΠ΅ ΠΏΠΎΠ»Π΅ ΠΠ»Π΅ΠΌΠ΅Π½Ρ (Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΡΠΉ): ΡΠ°Π·ΠΌΠ΅Ρ ΠΎΡΡΠ΅ΡΠ°, Π΄Π°Π½Π½ΡΠ΅ = [0x01] 1 ΠΠ»Π΅ΠΌΠ΅Π½Ρ (Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΡΠΉ): ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΎΡΡΠ΅ΡΠΎΠ², Π΄Π°Π½Π½ΡΠ΅ = [0x02] 2 ΠΠ»Π΅ΠΌΠ΅Π½Ρ (ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ): Π²Π²ΠΎΠ΄, Π΄Π°Π½Π½ΡΠ΅ = [0x03] 3 ΠΠΎΡΡΠΎΡΠ½Π½Π°Ρ ΠΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ ΠΠ±ΡΠΎΠ»ΡΡΠ½Π°Ρ No_Wrap ΠΠΈΠ½Π΅ΠΉΠ½Π°Ρ Preferred_State No_Null_Position Non_Volatile ΠΠΈΡΠΎΠ²ΠΎΠ΅ ΠΏΠΎΠ»Π΅ ΠΠ»Π΅ΠΌΠ΅Π½Ρ (ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ): ΠΊΠΎΠ½Π΅Ρ ΠΊΠΎΠ»Π»Π΅ΠΊΡΠΈΠΈ, Π΄Π°Π½Π½ΡΠ΅ = Π½Π΅Ρ ΠΠ΅ΡΠΊΡΠΈΠΏΡΠΎΡ ΠΊΠΎΠ½Π΅ΡΠ½ΠΎΠΉ ΡΠΎΡΠΊΠΈ: bΠΠ»ΠΈΠ½Π° 7 bDescriptorType 5 bEndpointAddress 0x81 EP 1 IN bmΠΡΡΠΈΠ±ΡΡΡ 3 ΠΡΠ΅ΡΡΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎ ΡΠΈΠΏΡ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ Π’ΠΈΠΏ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ ΠΠ΅Ρ ΠΠ°Π½Π½ΡΠ΅ ΠΎ ΡΠΈΠΏΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ wMaxPacketSize 0x0002 1x 2 Π±Π°ΠΉΡΠ° Π±ΠΠ½ΡΠ΅ΡΠ²Π°Π» 10 ΠΠ΅ΡΠΊΡΠΈΠΏΡΠΎΡ ΠΊΠΎΠ½Π΅ΡΠ½ΠΎΠΉ ΡΠΎΡΠΊΠΈ: bΠΠ»ΠΈΠ½Π° 7 bDescriptorType 5 bEndpointAddress 0x01 EP 1 OUT bmΠΡΡΠΈΠ±ΡΡΡ 3 ΠΡΠ΅ΡΡΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎ ΡΠΈΠΏΡ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ Π’ΠΈΠΏ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ ΠΠ΅Ρ ΠΠ°Π½Π½ΡΠ΅ ΠΎ ΡΠΈΠΏΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ wMaxPacketSize 0x0002 1x 2 Π±Π°ΠΉΡΠ° Π±ΠΠ½ΡΠ΅ΡΠ²Π°Π» 10 Π‘ΡΠ°ΡΡΡ ΡΡΡΡΠΎΠΉΡΡΠ²Π°: 0x0001 ΠΠ²ΡΠΎΠ½ΠΎΠΌΠ½ΡΠΉ
Π― ΡΠ°ΠΊΠΆΠ΅ ΡΠΎΠ»ΡΠΊΠΎ ΡΡΠΎ Π·Π°ΠΌΠ΅ΡΠΈΠ», ΡΡΠΎ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΄ΠΆΠΎΠΉΡΡΠΈΠΊΠ° ΠΎΡΠ»ΠΈΡΠ°Π΅ΡΡΡ (ΠΎΠΏΡΡΡ ΠΆΠ΅, ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎΠ΅ Π² Windows ΠΈ Π½Π΅ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎΠ΅ Π² Linux. )
Π― ΡΠΈΡΠ°Π» ΡΡΠΎ-ΡΠΎ ΠΎ ΡΠΎΠΌ, ΡΡΠΎ Π² Linux Π΅ΡΡΡ Π΄ΡΠ°ΠΉΠ²Π΅Ρ ΡΠ΄ΡΠ°, ΠΊΠΎΡΠΎΡΡΠΉ ΡΡΠΎ-ΡΠΎ Π΄Π΅Π»Π°Π΅Ρ Ρ ΡΡΠΈΠΌΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΡΠΌΠΈ? jstest-gtk ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΌΠ½Π΅ ΠΊΠΎΠ½ΡΡΠΎΠ»ΠΈΡΠΎΠ²Π°ΡΡ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ Π°ΡΠΏΠ΅ΠΊΡΡ ΠΎΡΠ΅ΠΉ (ΠΌΠ°ΡΡΡΠ°Π±ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅, ΠΌΠ΅ΡΡΠ²ΡΠ΅ Π·ΠΎΠ½Ρ, ΠΈΠ½Π²Π΅ΡΡΠΈΡ), ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ, ΡΡΠΎ ΠΏΠΎΠ΄ΡΠΊΠ°Π·ΠΊΠ°?
ΠΠ»Π°ΡΡ USB HID Device (HID) ΠΏΡΠ΅Π΄Π»Π°Π³Π°Π΅Ρ ΡΠ°ΠΌΡΠΉ ΠΏΡΠΎΡΡΠΎΠΉ ΡΠΏΠΎΡΠΎΠ± Π²ΠΊΠ»ΡΡΠΈΡΡ USB-ΡΠ²ΡΠ·Ρ ΠΌΠ΅ΠΆΠ΄Ρ Π²ΡΡΡΠΎΠ΅Π½Π½ΡΠΌ ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎΠΌ ΠΈ Ρ ΠΎΡΡ-ΠΊΠΎΠΌΠΏΡΡΡΠ΅Ρ Π±Π΅Π· Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΡ ΠΊΠ°ΠΊΠΈΡ -Π»ΠΈΠ±ΠΎ Π΄ΡΠ°ΠΉΠ²Π΅ΡΠΎΠ² ΡΡΡΡΠΎΠΉΡΡΠ². ΠΠ΄Π½Π°ΠΊΠΎ ΠΌΡ Π΄ΠΎΠ»ΠΆΠ½Ρ Π½Π°ΠΏΠΈΡΠ°ΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΎΠ³ΠΎ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π°, Π΅ΡΠ»ΠΈ ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎ Π½Π΅ ΠΏΠΎΠ΄ΠΏΠ°Π΄Π°Π΅Ρ Π½ΠΈ ΠΏΠΎΠ΄ ΠΎΠ΄Π½ΠΎ ΠΈΠ· ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠΈΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠΉ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π² ΠΊΠ»Π°ΡΡΠ΅ HID.
ΠΡΠ΅ΠΆΠ΄Π΅ ΡΠ΅ΠΌ ΠΈΠ΄ΡΠΈ Π΄Π°Π»ΡΡΠ΅, ΠΏΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅ΡΡΡ, ΡΡΠΎ Ρ Π²Π°Ρ Π΅ΡΡΡ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ Π·Π½Π°Π½ΠΈΡ ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ USB 2.0 [1] , Π²Π°ΠΌ Π½Π΅ Π½ΡΠΆΠ½ΠΎ Π±ΡΡΡ ΡΠΊΡΠΏΠ΅ΡΡΠΎΠΌ Π² USB-ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Π°Ρ , ΡΠ°ΠΊ ΠΊΠ°ΠΊ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ ΠΏΡΠΎΠΌΠ΅ΠΆΡΡΠΎΡΠ½ΠΎΠ³ΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΡ, ΠΏΠΎΡΡΠ°Π²Π»ΡΠ΅ΠΌΡΠ΅ ΠΏΠΎΡΡΠ°Π²ΡΠΈΠΊΠ°ΠΌΠΈ ΠΌΠΈΠΊΡΠΎΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠΎΠ², Π²ΡΠ΅Ρ ΠΊΠ»ΡΡΠ΅Π²ΡΡ ΡΠ°ΡΡΠ΅ΠΉ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΏΡΠΎΡΠΈΠ²ΠΊΠΈ USB. ΠΡΠ»ΠΈ Π²Ρ Π½ΠΈΠΊΠΎΠ³Π΄Π° ΡΠ°Π½ΡΡΠ΅ Π½Π΅ ΡΠΈΡΠ°Π»ΠΈ ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ USB, ΡΠΎ Ρ ΠΏΠΎΡΠΎΠ²Π΅ΡΠΎΠ²Π°Π» Π±Ρ ΠΏΡΠΎΡΠΈΡΠ°ΡΡ USB Π² Π΄Π²ΡΡ ΡΠ»ΠΎΠ²Π°Ρ [2] ΠΏΡΠ΅ΠΆΠ΄Π΅ ΡΠ΅ΠΌ ΠΏΠΎΠ³ΡΡΠ·ΠΈΡΡΡΡ Π² ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠ΅ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΡ.
Π£ΡΡΡΠΎΠΉΡΡΠ²ΠΎ ΠΊΠ»Π°ΡΡΠ° HID ΠΈ Ρ ΠΎΡΡ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΡΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΊΠ°Π½Π°Π»Π° ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ (ΠΊΠΎΠ½Π΅ΡΠ½Π°Ρ ΡΠΎΡΠΊΠ° 0), ΠΠ°Π½Π°Π» Interrupt IN ΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠΉ ΠΊΠ°Π½Π°Π» Interrupt OUT. Π‘ΠΠ Π―Π’ΠΠΠΠ«Π ΠΊΠ»Π°ΡΡ ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ [3] Π΅ΡΡΡ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΠΌΠΎ ΠΊ ΡΡΡΡΠΎΠΉΡΡΠ²Π°ΠΌ Ρ Π½ΠΈΠ·ΠΊΠΎΠΉ, ΠΏΠΎΠ»Π½ΠΎΠΉ ΠΈ Π²ΡΡΠΎΠΊΠΎΠΉ ΡΠΊΠΎΡΠΎΡΡΡΡ. Π ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΏΡΠΈΠΌΠ΅ΡΠ° Π½Π° ΠΌΠ°ΠΊΡΠΈΠΌΡΠΌΠ΅ Π΄ΠΎΡΡΡΠΏΠ½Π°Ρ ΠΏΡΠΎΠΏΡΡΠΊΠ½Π°Ρ ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡΡ, Π½Π° ΠΏΠΎΠ»Π½ΠΎΠΉ ΡΠΊΠΎΡΠΎΡΡΠΈ Ρ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠΉ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ Π½Π°Π³ΡΡΠ·ΠΊΠΎΠΉ Π΄Π°Π½Π½ΡΡ 64 Π±Π°ΠΉΡΠ°, ΠΊΠ°Π½Π°Π» ΠΏΡΠ΅ΡΡΠ²Π°Π½ΠΈΡ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°ΡΡ 1216 Π±Π°ΠΉΡ ΠΏΠΎΠ»Π΅Π·Π½ΡΡ Π΄Π°Π½Π½ΡΡ Π½Π° ΠΊΠ°Π΄Ρ [4] . ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΊΠ°Π½Π°Π»Ρ ΠΏΡΠ΅ΡΡΠ²Π°Π½ΠΈΠΉ ΠΈΠΌΠ΅ΡΡ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½Π½ΡΡ Π·Π°Π΄Π΅ΡΠΆΠΊΡ, ΡΠ°ΠΊΠΎΠ΅ ΡΠ°ΡΡΠΎΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠΉ ΠΏΠΎΠ»ΠΎΡΡ ΠΏΡΠΎΠΏΡΡΠΊΠ°Π½ΠΈΡ Π±ΡΠ΄Π΅Ρ Π·Π°Π΄ΡΡΠΈΡΡ Π²Π΅ΡΡ Π°Π²ΡΠΎΠ±ΡΡ, ΠΏΠΎ ΡΡΠΎΠΉ ΠΏΡΠΈΡΠΈΠ½Π΅ ΡΠ°Π·Π½ΡΠ΅ ΡΠΈΠΏΡ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡΡΡ Π² ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ. ΠΡΠ»ΠΈ ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΡ ΠΊ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠ΅ Π΄Π°Π½Π½ΡΡ ΡΡΡΡΠΎΠΉΡΡΠ²Π° ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ Π²ΡΡΡΠ΅ΡΠΈΠ»ΡΡ Ρ Π΄Π²ΡΠΌΡ ΠΊΠ°Π½Π°Π»Π°ΠΌΠΈ ΠΏΡΠ΅ΡΡΠ²Π°Π½ΠΈΠΉ, ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠ΅ΡΠ΅ΠΉΡΠΈ ΠΊ ΠΊΠ»Π°ΡΡΡ HID.
ΠΡΠ΅ΠΆΠ΄Π΅ ΡΠ΅ΠΌ Ρ ΠΎΡΡ ΡΠΌΠΎΠΆΠ΅Ρ ΠΎΠ±ΡΠ°ΡΡΡΡ Ρ ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎΠΌ, Π΅ΠΌΡ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π·Π½Π°ΡΡ ΠΊΠ°ΠΊΠΎΠ²ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈΠ»ΠΈ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΡΡΠΎΠ³ΠΎ ΡΡΡΡΠΎΠΉΡΡΠ²Π°? ΠΠ°ΠΊ ΠΎΡΠ³Π°Π½ΠΈΠ·ΠΎΠ²Π°Π½Ρ Π΅Π³ΠΎ Π΄Π°Π½Π½ΡΠ΅? ΠΈ Π§ΡΠΎ Π½Π° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ ΠΈΠ·ΠΌΠ΅ΡΡΡΡ Π΄Π°Π½Π½ΡΠ΅?
ΠΠ°Π²Π°ΠΉΡΠ΅ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ ΠΏΡΠΎΡΡΠΎΠΉ ΠΏΡΠΈΠΌΠ΅Ρ, ΡΡΠΎΠ±Ρ ΠΏΠΎΠ½ΡΡΡ Π²ΡΡΠ΅ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΡΠ΅ Π²ΠΎΠΏΡΠΎΡΡ: ΠΠΎΠΏΡΡΡΠΈΠΌ, Ρ Π½Π°Ρ Π΅ΡΡΡ Π‘ΠΈΡΡΠ΅ΠΌΠ° ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΏΠΈΡΠ°Π½ΠΈΠ΅ΠΌ HID-ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎ, ΠΏΡΠΈ Π½Π°ΠΆΠ°ΡΠΈΠΈ ΠΊΠ½ΠΎΠΏΠΊΠΈ Π½Π° ΡΡΡΡΠΎΠΉΡΡΠ²Π΅ Ρ ΠΎΡΡ-ΠΊΠΎΠΌΠΏΡΡΡΠ΅Ρ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²ΠΎΠΉΡΠΈ Π² ΡΠΏΡΡΠΈΠΉ ΡΠ΅ΠΆΠΈΠΌ. ΠΡΠ΅ ΡΡΠΎ Π±Π΅Π· Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΡ ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π½Π° ΡΡΠΎΡΠΎΠ½Π΅ Ρ ΠΎΡΡΠ°.
ΠΠ»Ρ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΡ Π²ΡΡΠ΅ΡΠΊΠ°Π·Π°Π½Π½ΡΡ ΡΠΎΠ±ΡΡΠΈΠΉ Π΄ΡΠ°ΠΉΠ²Π΅Ρ ΠΊΠ»Π°ΡΡΠ° HID Π΄ΠΎΠ»ΠΆΠ΅Π½ Π·Π½Π°ΡΡ:
ΠΡΡ ΡΡΠ° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎΠΏΠΈΡΠ°Π½Π° Π² Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠ΅ ΠΎΡΡΠ΅ΡΠ° . ΠΠ°ΠΊ ΡΠΎΠ»ΡΠΊΠΎ Π΄ΡΠ°ΠΉΠ²Π΅Ρ ΠΊΠ»Π°ΡΡΠ° ΠΏΡΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡΡΠ΅Ρ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ ΠΎΡΡΠ΅ΡΠ°, ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠΈΡΠΎΠ²Π°ΡΡ Π΄Π°Π½Π½ΡΠ΅, ΠΏΠΎΡΡΡΠΏΠ°ΡΡΠΈΠ΅ Π² ΠΊΠ°Π½Π°Π»Ρ ΠΏΡΠ΅ΡΡΠ²Π°Π½ΠΈΠΉ, ΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°ΡΡ ΠΈΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. ΠΠ΅ΡΠΊΡΠΈΠΏΡΠΎΡ ΠΎΡΡΠ΅ΡΠ° Π½Π΅ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΡΡΡ Π²ΠΌΠ΅ΡΡΠ΅ Ρ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠΎΠΌ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ ΠΏΡΠΈ ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ»Π΅Π½ΠΈΠΈ, ΡΠΎΠ»ΡΠΊΠΎ Π΅Π³ΠΎ Π΄Π»ΠΈΠ½Π° Π²ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π² Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ ΠΊΠ»Π°ΡΡΠ° HID, ΠΊΠ°ΠΊ ΡΠΎΠ»ΡΠΊΠΎ Ρ ΠΎΡΡ Π·Π½Π°Π΅Ρ, ΡΡΠΎ ΡΡΠΎ ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎ ΠΈΠΌΠ΅Π΅Ρ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ HID, Π΄ΡΠ°ΠΉΠ²Π΅Ρ ΠΊΠ»Π°ΡΡΠ° HID Π±ΡΠ΄Π΅Ρ ΠΎΡΠΏΡΠ°Π²ΠΈΡΡ Π·Π°ΠΏΡΠΎΡ GET_DESCRIPTOR Π½Π° ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ, ΡΡΠΎΠ±Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π΅Π³ΠΎ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ ΠΎΡΡΠ΅ΡΠ°.
ΠΠ΅ΡΠΊΡΠΈΠΏΡΠΎΡ ΠΎΡΡΠ΅ΡΠ° ΠΎΠΏΠΈΡΡΠ²Π°Π΅ΡΡΡ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΡΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ², Π²ΠΌΠ΅ΡΡΠ΅ ΡΡΠΈ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ ΠΎΠΏΠΈΡΡΠ²Π°ΡΡ Π΄Π°Π½Π½ΡΠ΅ (ΡΠ°ΠΊΠΆΠ΅ Π½Π°Π·ΡΠ²Π°Π΅ΠΌΡΠ΅ ΠΎΡΡΠ΅ΡΠΎΠΌ), ΠΊΠΎΡΠΎΡΡΠ΅ Π±ΡΠ΄ΡΡ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°ΡΡΡΡ ΠΏΠΎ ΠΊΠ°Π½Π°Π»Π°ΠΌ. ΠΠ»Π΅ΠΌΠ΅Π½Ρ Π½Π°ΡΠΈΠ½Π°Π΅ΡΡΡ Ρ 1-Π±Π°ΠΉΡΠΎΠ²ΠΎΠ³ΠΎ ΠΏΡΠ΅ΡΠΈΠΊΡΠ°, ΡΠΊΠ°Π·ΡΠ²Π°ΡΡΠ΅Π³ΠΎ ΡΠΎΠ»Ρ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° ΠΈ Π΅Π³ΠΎ Π΄Π»ΠΈΠ½Ρ. ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΊΠΎΡΠΎΡΠΊΠΈΠΌ ΠΈΠ»ΠΈ Π΄Π»ΠΈΠ½Π½ΡΠΌ. ΠΠΎΡΠΎΡΠΊΠΈΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ ΠΌΠΎΠΆΠ΅Ρ ΠΈΠΌΠ΅ΡΡ 0, 1, 2 ΠΈΠ»ΠΈ 4 Π±Π°ΠΉΡΠ° Π΄Π°Π½Π½ΡΡ . ΠΠ»ΠΈΠ½Π½ΡΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ ΠΌΠΎΠΆΠ΅Ρ ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΡ 255 Π±Π°ΠΉΡ Π΄Π°Π½Π½ΡΡ , Π΄Π»ΠΈΠ½Π½ΡΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ Π½Π΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Ρ Π² ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ ΠΊΠ»Π°ΡΡΠ° HID.
ΠΠΎΡΠΎΡΠΊΠΈΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ Π±ΡΠ²Π°ΡΡ ΡΡΠ΅Ρ ΡΠΈΠΏΠΎΠ²: ΠΠ»ΠΎΠ±Π°Π»ΡΠ½ΡΠ΅, ΠΠΎΠΊΠ°Π»ΡΠ½ΡΠ΅ ΠΈ ΠΡΠ½ΠΎΠ²Π½ΡΠ΅. ΠΠ°ΠΆΠ΄ΡΠΉ ΡΠΈΠΏ Π΄Π°Π»Π΅Π΅ Π΄Π΅Π»ΠΈΡΡΡ Π½Π° ΡΠ΅Π³ΠΈ, Π΄Π°Π²Π°ΠΉΡΠ΅ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΈΠ· Π½ΠΈΡ :
Π€ΡΠ°Π³ΠΌΠ΅Π½Ρ ΠΊΠΎΠ΄Π° Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 1 ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ ΠΎΡΡΠ΅ΡΠ° Π΄Π»Ρ ΡΠΈΡΡΠ΅ΠΌΡ Π ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΏΠΈΡΠ°Π½ΠΈΠ΅ΠΌ ΠΎΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ Π² ΠΊΠ°Π½Π°Π»Π΅ Interrupt IN ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Π±Π°ΠΉΡ Π΄Π°Π½Π½ΡΡ ΠΎΡΡΠ΅ΡΠ°. ΠΎΡΠΏΡΠ°Π²ΠΈΠ». ΠΠ· ΠΊΠΎΡΠΎΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π±ΠΈΡ-0 ΠΈΠΌΠ΅Π΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅.
ΠΠΈΡΡΠΈΠ½Π³-1: sys_ctrl_hid_report_desc.c
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 1920 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | /* 1-Π±Π°ΠΉΡΠΎΠ²ΡΠΉ ΠΏΡΠ΅ΡΠΈΠΊΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° ΠΠΈΡΡ: 7654 | 32 | 10 Π±ΡΠ΅Π³ | bΠ’ΠΈΠΏ | bΠ Π°Π·ΠΌΠ΅Ρ bSize: Π΄Π»ΠΈΠ½Π° Π΄Π°Π½Π½ΡΡ ΠΏΠΎΡΠ»Π΅ ΠΏΡΠ΅ΡΠΈΠΊΡΠ° 0= 0 Π±Π°ΠΉΡ 1= 1 Π±Π°ΠΉΡ 2= ββ2 Π±Π°ΠΉΡΠ° 3= 4 Π±Π°ΠΉΡΠ° bType: Π’ΠΈΠΏΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² 0= ΠΡΠ½ΠΎΠ²Π½ΠΎΠΉ 1= Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΡΠΉ 2= ββΠΌΠ΅ΡΡΠ½ΡΠΉ 3= Π·Π°ΡΠ΅Π·Π΅ΡΠ²ΠΈΡΠΎΠ²Π°Π½ΠΎ bTag: ΡΠΌ. 4-Π±ΠΈΡΠ½ΡΠ΅ ΡΡΠ°ΡΡΠΈΠ΅ Π±ΠΈΡΡ Π² ΠΌΠ°ΠΊΡΠΎΡΠ°Ρ Π½ΠΈΠΆΠ΅. */ // ΠΡΠ½ΠΎΠ²Π½ΡΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ #define HID_Input(x) 0x81,x #define HID_Output(x) 0x91,Ρ #define HID_Feature(x) 0xB1,x #define HID_Collection(x) 0xA1,x # ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ HID_EndCollection 0xC0 // ΠΠ»ΠΎΠ±Π°Π»ΡΠ½ΡΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ #define HID_UsagePage(x) 0x05,x #define HID_LogicalMin(x) 0x15,x #define HID_LogicalMax(x) 0x25,x #define HID_ReportSize(x) 0x75,x #define HID_ReportCount(x) 0x95,x // ΠΠΎΠΊΠ°Π»ΡΠ½ΡΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ #define HID_Usage(x) 0x09,x const uint8_t HID_ReportDescriptor[] = { // ΠΠΎΠ»Π»Π΅ΠΊΡΠΈΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΏΡΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ ΡΠ½ΠΈΠ²Π΅ΡΡΠ°Π»ΡΠ½ΠΎΠΉ ΡΡΡΠ°Π½ΠΈΡΠ΅ ΡΠ°Π±ΠΎΡΠ΅Π³ΠΎ ΡΡΠΎΠ»Π°. HID_UsagePage(HID_USAGE_PAGE_GENERIC), // Π’Π΅Π³ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° Π΄Π°Π»Π΅Π΅ ΠΊΠ»Π°ΡΡΠΈΡΠΈΡΠΈΡΡΠ΅Ρ Π΅Π³ΠΎ ΠΊΠ°ΠΊ ΡΠΈΡΡΠ΅ΠΌΠ½ΡΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ. HID_Usage(HID_USAGE_GENERIC_SYSTEM_CTL), HID_Collection (HID_Application), HID_LogicalMin(0), HID_LogicalMax(1), // 1-Π±ΠΈΡΠ½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ ΠΎΡΡΠ΅ΡΠ° Sleep Control HID_ReportSize(1), HID_ReportCount(1), // ΠΡ ΠΎΠ΄ ΠΡΠ½ΠΎΠ²Π½ΠΎΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ»Π΅Π΄ΡΠ΅Ρ Π·Π° ΡΡΠΈΠΌ, ΠΎΡΠ½ΠΎΡΠΈΡΡΡ ΠΊ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΡΠΏΡΡΠΈΠΌ ΡΠ΅ΠΆΠΈΠΌΠΎΠΌ, ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄ 0 -> 1 ΠΈΠ½ΠΈΡΠΈΠΈΡΡΠ΅Ρ ΡΠΏΡΡΠΈΠΉ ΡΠ΅ΠΆΠΈΠΌ. HID_Usage(HID_USAGE_GENERIC_SYSCTL_SLEEP), // ΠΠ½ΠΎΠΏΠΊΠ° Π²Π²ΠΎΠ΄Π° ΠΈΠΌΠ΅Π΅Ρ ΠΏΡΠ΅Π΄ΠΏΠΎΡΡΠΈΡΠ΅Π»ΡΠ½ΠΎΠ΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ 0, HID_Input(HID_Data | HID_Variable | HID_Relative | HID_PreferredState), // 7-Π±ΠΈΡΠ½ΠΎΠ΅ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π΄Π»Ρ Π²ΡΡΠ°Π²Π½ΠΈΠ²Π°Π½ΠΈΡ ΠΎΡΡΠ΅ΡΠ° ΠΏΠΎ Π³ΡΠ°Π½ΠΈΡΠ΅ Π±Π°ΠΉΡΠ°. HID_ReportSize(7), HID_ReportCount(1), HID_Input(HID_Constant), HID_EndCollection, }; |
Π‘ΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ ΠΊΠ»Π°ΡΡΠ° HID ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΡΠ°Π½ΠΈΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ, ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΡ ΠΏΠΎΡΡΠ°Π²ΡΠΈΠΊΠΎΠΌ. Π΄Π»Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΎΠ³ΠΎ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Π° Ρ ΡΠΏΡΠΎΡΠ΅Π½Π½ΡΠΌ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠΎΠΌ ΠΎΡΡΠ΅ΡΠ°. ΠΡΠ°ΠΉΠ²Π΅Ρ ΠΊΠ»Π°ΡΡΠ° HID ΠΈΠ³Π½ΠΎΡΠΈΡΡΠ΅Ρ Π½Π°Π±ΠΎΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠΉ ΠΏΠΎΡΡΠ°Π²ΡΠΈΠΊΠΎΠΌ, ΠΈ ΠΎΠΆΠΈΠ΄Π°Π΅Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠΎΡΡΠ°Π²ΡΠΈΠΊΠ° Π΄Π»Ρ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎΠΌ. ΠΠΎΠ·ΡΠΌΠ΅ΠΌ ΠΏΡΠΈΠΌΠ΅Ρ ARM Cortex CMSIS DAP [6] ΠΠ»ΠΎΠΊ ΠΎΡΠ»Π°Π΄ΡΠΈΠΊΠ°, Π΅Π³ΠΎ Π²Π΅ΡΡΠΈΡ ΠΏΡΠΎΡΠΈΠ²ΠΊΠΈ V1 ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ΠΎ Ρ ΠΊΠ»Π°ΡΡΠΎΠΌ HID ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ USB HID Report Descriptor Viewer [11] ΡΡΠΎΠ±Ρ ΠΈΠ·ΡΡΠΈΡΡ Π΅Π³ΠΎ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ ΠΎΡΡΠ΅ΡΠ°, Π²ΠΎΡ Π²ΡΠ²ΠΎΠ΄ ΡΡΠ΅Π΄ΡΡΠ²Π° ΠΏΡΠΎΡΠΌΠΎΡΡΠ° ΠΈΠ· ΠΌΠΎΠ΄ΡΠ»Ρ ΠΎΡΠ»Π°Π΄ΡΠΈΠΊΠ° ULink2:
Usage Page(0xff00) // Π‘ΡΡΠ°Π½ΠΈΡΠ°, ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½Π°Ρ ΠΏΠΎΡΡΠ°Π²ΡΠΈΠΊΠΎΠΌ. Usage(0x1) // ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅, ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ ΠΏΠΎΡΡΠ°Π²ΡΠΈΠΊΠΎΠΌ. Collection(0x1) // ΠΠΎΠ»Π»Π΅ΠΊΡΠΈΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ. ΠΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΌΠΈΠ½ΠΈΠΌΡΠΌ (0x0) ΠΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΌΠ°ΠΊΡΠΈΠΌΡΠΌ (0xff) Π Π°Π·ΠΌΠ΅Ρ ΠΎΡΡΠ΅ΡΠ° (0x8) // ΠΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ ΠΈΠΌΠ΅ΡΡ ΡΠ°Π·ΠΌΠ΅Ρ Π² Π±Π°ΠΉΡΠ°Ρ . Report Count(0x40) // ΠΠ±ΡΠΈΠΉ ΡΠ°Π·ΠΌΠ΅Ρ Π²Ρ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΎΡΡΠ΅ΡΠ° = 64 Π±Π°ΠΉΡΠ°. ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ (0x1) Input(0x2) // ΠΠ°Π½Π½ΡΠ΅ ΠΈΠΌΠ΅ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠΉ ΡΠΈΠΏ. Report Count(0x40) // ΠΠ±ΡΠΈΠΉ ΡΠ°Π·ΠΌΠ΅Ρ Π²ΡΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΎΡΡΠ΅ΡΠ° = 64 Π±Π°ΠΉΡΠ°. ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ (0x1) Output(0x2) // ΠΠ°Π½Π½ΡΠ΅ ΠΈΠΌΠ΅ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠΉ ΡΠΈΠΏ. Report Count(0x1) // ΠΠ±ΡΠΈΠΉ ΡΠ°Π·ΠΌΠ΅Ρ ΠΎΡΡΠ΅ΡΠ° ΠΎ ΡΡΠ½ΠΊΡΠΈΡΡ = 1 Π±Π°ΠΉΡ. ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ (0x1) Feature(0x2) // ΠΠ°Π½Π½ΡΠ΅ ΠΈΠΌΠ΅ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠΉ ΡΠΈΠΏ. ΠΠ°Π²Π΅ΡΡΠΈΡΡ ΡΠ±ΠΎΡ
ΠΡΠ»ΠΈ ΠΌΡ ΠΊΠΎΠ½ΡΡΠΎΠ»ΠΈΡΡΠ΅ΠΌ ΠΈ ΠΏΡΠΎΡΠΈΠ²ΠΊΡ ΡΡΡΡΠΎΠΉΡΡΠ²Π°, ΠΈ Ρ ΠΎΡΡ-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΡΠΎ Π½Π΅Ρ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ Π΄Π°ΠΆΠ΅ ΠΏΡΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ ΠΎΡΡΠ΅ΡΠ°. ΠΠ°Π²Π°ΠΉΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΠΎΠΏΠΈΡΠ°Π½Π½ΡΠΉ Π²ΡΡΠ΅ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ ΠΎΡΡΠ΅ΡΠ°, ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠΉ ΠΏΠΎΡΡΠ°Π²ΡΠΈΠΊΠΎΠΌ. Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΎΠ±ΡΠ΅Π³ΠΎ ΡΠ°Π±Π»ΠΎΠ½Π° ΠΈ ΡΠΎΠ·Π΄Π°ΠΉΡΠ΅ Π΅ΡΠ΅ ΠΎΠ΄ΠΈΠ½ ΠΏΡΠΈΠΌΠ΅Ρ, ΡΡΠΎΠ±Ρ ΠΏΠΎΠΉΠΌΠ°ΡΡ ΡΠΎΠ±ΡΡΠΈΠ΅ Π½Π°ΠΆΠ°ΡΠΈΡ ΠΊΠ½ΠΎΠΏΠΊΠΈ ΠΈ ΡΠ²Π΅ΡΠΎΠ΄ΠΈΠΎΠ΄Ρ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ Π½Π°Π΄ Π‘ΠΠ Π―Π’ΠΠΠΠ«Π. Π€ΡΠ°Π³ΠΌΠ΅Π½Ρ ΠΊΠΎΠ΄Π° Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 2 ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ ΠΎΡΡΠ΅ΡΠ°. ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΎ:
ΠΠΈΡΡΠΈΠ½Π³-2: led_ctrl_over_hid_report_desc.c
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 2930 31 32 33 34 35 36 37 | #define HID_INPUT_REPORT_BYTES 1 /* ΡΠ°Π·ΠΌΠ΅Ρ ΠΎΡΡΠ΅ΡΠ° Π² Π±Π°ΠΉΡΠ°Ρ */ #define HID_OUTPUT_REPORT_BYTES 1 /* ΡΠ°Π·ΠΌΠ΅Ρ ΠΎΡΡΠ΅ΡΠ° Π² Π±Π°ΠΉΡΠ°Ρ */ #define HID_FEATURE_REPORT_BYTES 1 /* ΡΠ°Π·ΠΌΠ΅Ρ ΠΎΡΡΠ΅ΡΠ° Π² Π±Π°ΠΉΡΠ°Ρ */ /** * ΠΠ΅ΡΠΊΡΠΈΠΏΡΠΎΡ ΠΎΡΡΠ΅ΡΠ° HID */ const uint8_t HID_ReportDescriptor[] = { HID_UsagePageVendor (0x00), HID_Usage(0x01), HID_Collection (HID_Application), HID_LogicalMin(0), HID_LogicalMax(0xFF), HID_ReportSize(8), // 8 Π±ΠΈΡ HID_ReportCount (HID_INPUT_REPORT_BYTES), HID_Usage(0x01), // ΠΠΈΡ-0 1-Π±Π°ΠΉΡΠΎΠ²ΠΎΠ³ΠΎ Π²Π²ΠΎΠ΄Π° ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ Π½Π° ΡΠΎΠ±ΡΡΠΈΠ΅ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄Π° ΠΊΠ½ΠΎΠΏΠΊΠΈ. // 1 = 0 -> 1, ΠΊΠ½ΠΎΠΏΠΊΠ° Π½Π°ΠΆΠ°ΡΠ° HID_Input(HID_Data | HID_Variable | HID_Absolute), HID_ReportCount (HID_OUTPUT_REPORT_BYTES), HID_Usage(0x01), // Π±ΠΈΡ-0 ΡΠΏΡΠ°Π²Π»ΡΠ΅Ρ ΠΏΠ»Π°ΡΠΎΠΉ LED5 // 1 = Π²ΠΊΠ»ΡΡΠΈΡΡ ΡΠ²Π΅ΡΠΎΠ΄ΠΈΠΎΠ΄ // 0 = Π²ΡΠΊΠ»ΡΡΠΈΡΡ ΡΠ²Π΅ΡΠΎΠ΄ΠΈΠΎΠ΄ HID_Output(HID_Data | HID_Variable | HID_Absolute), // Π§Π°ΡΡΠΎΡΠ° ΠΌΠΈΠ³Π°Π½ΠΈΡ ΡΠ²Π΅ΡΠΎΠ΄ΠΈΠΎΠ΄Π°, ΠΎΡ 1 Π΄ΠΎ 20 ΠΌΠΈΠ³Π°Π½ΠΈΠΉ Π² ΡΠ΅ΠΊΡΠ½Π΄Ρ. HID_LogicalMin(1), HID_LogicalMax(20), // Π§Π°ΡΡΠΎΡΠ° ΠΌΠΈΠ³Π°Π½ΠΈΡ ΡΠ²Π΅ΡΠΎΠ΄ΠΈΠΎΠ΄Π° 4 Π½Π° ΠΏΠ»Π°ΡΠ΅ ΠΊΠΎΠ½ΡΡΠΎΠ»ΠΈΡΡΠ΅ΡΡΡ ΠΎΡΡΠ΅ΡΠΎΠΌ ΠΎ ΡΡΠ½ΠΊΡΠΈΠΈ. HID_ReportCount(HID_FEATURE_REPORT_BYTES), HID_Usage(0x01), HID_Feature(HID_Data | HID_Variable | HID_Absolute), HID_EndCollection, }; |
ΠΠ»Ρ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΡΡ Π²ΡΡΠ΅ ΠΏΡΠΈΠΌΠ΅ΡΠΎΠ² Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΠΌΠ°ΠΊΠ΅ΡΠ½ΡΡ ΠΏΠ»Π°ΡΡ NGX LPC4357 Xplorer++ [7] . LPC4357 [8] ΠΌΠΈΠΊΡΠΎΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅Ρ ΠΎΡΠ½ΠΎΠ²Π°Π½ Π½Π° ΡΠ΄ΡΠ°Ρ ARM Cortex-M4/M0, ΠΎΠ½ ΡΠ°ΠΊΠΆΠ΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΡΡΡ ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° LPCOpen Software [9] , ΠΊΠΎΡΠΎΡΠ°Ρ Π²ΠΊΠ»ΡΡΠ°Π΅Ρ Π² ΡΠ΅Π±Ρ ΡΡΠ΅ΠΊ ΠΏΡΠΎΠΌΠ΅ΠΆΡΡΠΎΡΠ½ΠΎΠ³ΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΡ USB.
Π’Π΅ΠΏΠ΅ΡΡ Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ Ρ ΠΎΡΡ-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΄Π»Ρ ΡΠ²ΡΠ·ΠΈ Ρ USB-ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎΠΌ, ΠΏΡΠΎΡΠ΅ Π²ΡΠ΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ PyUSB [10] . ΠΡΠ»ΠΈ Ρ Π²Π°Ρ Π΅ΡΡΡ ΡΠΊΠ°Π·Π°Π½Π½Π°Ρ Π²ΡΡΠ΅ ΠΏΠ»Π°ΡΠ° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ, Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΠΎΠΏΡΠΎΠ±ΠΎΠ²Π°ΡΡ ΠΈΠ· ΡΡΠΈΡ ΠΏΡΠΈΠΌΠ΅ΡΠΎΠ² ΠΎΠ½ΠΈ Π±ΡΠ»ΠΈ ΠΏΡΠΎΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½Ρ Π½Π° Ubuntu 16.04.
Π‘Π½ΠΈΠΌΠΎΠΊ ΡΠΊΡΠ°Π½Π° β Π₯ΠΎΡΡ-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅
ΠΡΡ ΠΎΠ΄Π½ΡΠΉ ΠΊΠΎΠ΄ ΠΈ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ Π΄ΠΎΡΡΡΠΏΠ½Ρ Π² ΠΎΠ±ΡΠ΅Π΄ΠΎΡΡΡΠΏΠ½ΠΎΠΌ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΈ GitHub: https://github.