STM32 рдФрд░ USB-HID - рдпрд╣ рдЖрд╕рд╛рди рд╣реИ

рдпрд╣ 2014 рд╣реИ, рдФрд░ рдПрдХ рдкреАрд╕реА рдХреЗ рд╕рд╛рде рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░реНрд╕ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рд╕рд╛рдзрди рдПрдХ рдирд┐рдпрдорд┐рдд рд╕реАрд░рд┐рдпрд▓ рдкреЛрд░реНрдЯ рд╣реИред рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ, рдкреНрд░рдзрд╛рдирддрд╛ рдХреЛ рд╕рдордЭрдирд╛ рдЖрд╕рд╛рди рд╣реИ - рдмрд╛рдЗрдЯреНрд╕ рдХреА рдПрдХ рдзрд╛рд░рд╛ред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╕рднреА рдЖрдзреБрдирд┐рдХ рдорд╛рдирдХреЛрдВ рдиреЗ рдкреАрд╕реА рд╕реЗ COM рдкреЛрд░реНрдЯ рдХреЛ рдмрд╛рд╣рд░ рд░рдЦрд╛ рд╣реИ рдФрд░ рдЖрдкрдХреЛ рдПрдордХреЗ рдкрд░ рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдпреВрдПрд╕рдмреА-рдпреВрдПрдЖрд░ рдПрдбреЗрдкреНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рд╡рд╣ рд╣рдореЗрд╢рд╛ рд╣рд╛рде рдореЗрдВ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдбреНрд░рд╛рдЗрд╡рд░реЛрдВ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рдХрд╛рд░рдг рдРрд╕рд╛ рдПрдбреЗрдкреНрдЯрд░ рд╣рдореЗрд╢рд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд░реВрдк рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрдиреНрдп рдиреБрдХрд╕рд╛рди рднреА рд╣реИрдВред
рд▓реЗрдХрд┐рди рд╣рд░ рдмрд╛рд░ рдЬрдм рдпреВрдПрд╕рдмреА рдпрд╛ рд╕реАрд░рд┐рдпрд▓ рдкреЛрд░реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдмрд╛рдд рдЖрддреА рд╣реИ, рддреЛ UART рдХреА рддрд╛рд░реНрдХрд┐рдХ рд╕рд╛рджрдЧреА рдХреЗ рдХрдИ рдкреНрд░рд╢рдВрд╕рдХ рд╣реИрдВред рдФрд░ рдЙрдирдХреЗ рдкрд╛рд╕ рдЕрдЪреНрдЫрд╛ рдХрд╛рд░рдг рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╣ рдПрдХ рд╡рд┐рдХрд▓реНрдк рд╣реИ рдЕрдЪреНрдЫрд╛ рд╣реИ?

рдореБрдЭреЗ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдпрд╣ рдмрддрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ STM32F103 рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдкреАрд╕реА рдФрд░ рдПрдордХреЗ рдХреЗ рдмреАрдЪ рдкреИрдХреЗрдЯ рдбреЗрдЯрд╛ рдПрдХреНрд╕рдЪреЗрдВрдЬ рдХреЛ рдХреИрд╕реЗ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПред рдореИрдВ рдПрдХ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рдорд╕реМрджреЗ рдХреЛ рджреЗ рджреВрдВрдЧрд╛ рдФрд░ рдЖрдкрдХреЛ рдмрддрд╛рдКрдВрдЧрд╛ рдХрд┐ рдЗрд╕реЗ рдЕрдкрдиреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдХреИрд╕реЗ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПред рдФрд░ рдЖрдк рдЦреБрдж рддрдп рдХрд░реЗрдВ рдХрд┐ рдЖрдкрдХреЛ рдЗрд╕рдХреА рдЬрд░реВрд░рдд рд╣реИ рдпрд╛ рдирд╣реАрдВред

рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдЖрдзреБрдирд┐рдХ рдХрдо рд▓рд╛рдЧрдд рд╡рд╛рд▓рд╛ рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ STM32F103C8 рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдмрд┐рд▓реНрдЯ-рдЗрди USB рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рд╕рдкреЛрд░реНрдЯ рд╣реИ, рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рднреА рдмрддрд╛рдпрд╛ рдерд╛ред


рдореИрдВрдиреЗ рдХрд╣рд╛ рдХрд┐ рд╕реАрд░рд┐рдпрд▓ рдкреЛрд░реНрдЯ рдореЗрдВ рдЕрдиреНрдп рдХрдорд┐рдпрд╛рдВ рд╣реИрдВ:
- рдЕрдХреНрд╕рд░ COM рдкреЛрд░реНрдЯ рдкреАрд╕реА рдпрд╛ рд▓реИрдкрдЯреЙрдк рдкрд░ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ
-рдЗрд╕ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЛ рдЕрд▓рдЧ рд╕реЗ рд╕рдВрдЪрд╛рд▓рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛
- рдкреАрд╕реА рдореЗрдВ COM рдкреЛрд░реНрдЯ рд╣реЛрдиреЗ рдкрд░ рднреА, рд╕рд┐рдЧреНрдирд▓ рд╕реНрддрд░реЛрдВ рдХреЛ рд╕рдордиреНрд╡рд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ: рдкреАрд╕реА RS232 рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╡рд┐рднреЗрджрдХ рд╕рд┐рдЧреНрдирд▓ рд╕реНрддрд░ + 15V рдФрд░ -15V рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ TTL рд╕реНрддрд░реЛрдВ (+ 5V, + 3.3V, рдПрдХрдзреНрд░реБрд╡реАрдп) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
- рдЕрдХреНрд╕рд░ рджрд░реНрдЬрдиреЛрдВ рд╡рд░реНрдЪреБрдЕрд▓ COM рдкреЛрд░реНрдЯ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдмрдирддреЗ рд╣реИрдВ рдФрд░ рдЖрдкрдХреЗ рдбрд┐рд╡рд╛рдЗрд╕ рд╕реЗ рдореЗрд▓ рдЦрд╛рдиреЗ рд╡рд╛рд▓реЗ рдкреЛрд░реНрдЯ рдХреЛ рдЦреЛрдЬрдирд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдмрджрд▓реЗ рдореЗрдВ, USB рдХрдИ рд╡рд░реНрд╖реЛрдВ рд╕реЗ рд╣рдорд╛рд░реЗ рд╕рд╛рде рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рдлрд╛рдпрджреЗ рд╣реИрдВ:
HOST рдбрд┐рд╡рд╛рдЗрд╕ рд╕реЗ рдмрд┐рдЬрд▓реА рдХреА рдЖрдкреВрд░реНрддрд┐ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛
- рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдкреИрдХреЗрдЬ рд╡рд┐рдирд┐рдордп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
-рдПрдХ рд╕рд╛рде рдХрдИ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЗ рд╕рд╛рде рдбрд┐рд╡рд╛рдЗрд╕ рд╕реЗ рдЬреБрдбрд╝рдиреЗ рдХреА рдХреНрд╖рдорддрд╛
рдХрдиреЗрдХреНрдЯ рдбрд┐рд╡рд╛рдЗрд╕ рдХреА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛
рдХрдИ рдЖрдзреБрдирд┐рдХ рдПрдордХреЗ рдореЗрдВ -рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдХрд╛ рд╕рдорд░реНрдерди, рдЬреЛ рдПрдбреЗрдкреНрдЯрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ
USB рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдмреЗрд╣рдж рд╕рдореГрджреНрдз рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдЬрдиреНрдо рджреЗрддрд╛ рд╣реИ - рд╕рдордЭ рдПрдХ рд╕реАрд░рд┐рдпрд▓ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╕рд╛рде рдЙрддрдирд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИред рдЙрдкрдХрд░рдгреЛрдВ рдХрд╛ рдПрдХ рдЕрд▓рдЧ рд╡рд░реНрдЧ рд╣реИ - USB-HID, рдЬрд┐рдиреНрд╣реЗрдВ рдбреНрд░рд╛рдЗрд╡рд░реЛрдВ рдХреА рд╕реНрдерд╛рдкрдирд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдордиреБрд╖реНрдпреЛрдВ рдФрд░ рд╡рд┐рднрд┐рдиреНрди рдЗрдирдкреБрдЯ-рдЖрдЙрдЯрдкреБрдЯ рдбрд┐рд╡рд╛рдЗрд╕реЛрдВ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдП рдЧрдП рд╣реИрдВред рдПрдордХреЗ рдХреЗ рд╕рд╛рде рдбреЗрдЯрд╛ рдПрдХреНрд╕рдЪреЗрдВрдЬ рдХреЗ рдЖрдпреЛрдЬрди рдХреЗ рд▓рд┐рдП рдЖрджрд░реНрд╢ред рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдореБрдЭреЗ рдмреИрдЪ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдкрд╕рдВрдж рд╣реИред рдпрд╣ рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдЕрдореВрд░реНрддрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдмреИрдЪ рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рдЕрд▓рдЧ рдХрд░рдирд╛ рдмрд╛рдЗрдЯреНрд╕ рдХреА рдПрдХ рд╕рд░рд▓ рдзрд╛рд░рд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХреБрдЫ рдЖрд╕рд╛рди рдФрд░ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред

рдЫрд┐рдкрд╛рдИ рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдЪрдпрди


USB-HID рдЙрдкрдХрд░рдгреЛрдВ рдХрд╛ рдПрдХ рдХрд╛рдлреА рд╡реНрдпрд╛рдкрдХ рд╡рд░реНрдЧ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рд╣рдореЗрдВ рдпрд╣ рдЪреБрдирдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рд╣рдо рдХреМрди рд╕рд╛ рдбрд┐рд╡рд╛рдЗрд╕ рдмрдирд╛рдПрдВрдЧреЗред
рд╣рдо рдХреАрдмреЛрд░реНрдб, рдорд╛рдЙрд╕, рдЬреЙрдпрд╕реНрдЯрд┐рдХ рдФрд░ рдЕрдиреНрдп рдЗрдирдкреБрдЯ рдбрд┐рд╡рд╛рдЗрд╕ рдХрд╛ рдЕрдиреБрдХрд░рдг рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рд╣рдо рдЕрдкрдирд╛ рдбрд┐рд╡рд╛рдЗрд╕ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдорд╛рдирдХ рдХреЗ рдХрдареЛрд░ рдврд╛рдВрдЪреЗ рдкрд░ рдирд┐рд░реНрднрд░ рди рд╣реЛрдВ рдФрд░ рдкреАрд╕реА рдХреЗ рд╕рд╛рде рдбреЗрдЯрд╛ рдХрд╛ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдЖрджрд╛рди-рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХреЗрдВред
рдореИрдВ рдЖрдкрдХреЛ рдмрддрд╛рдКрдВрдЧрд╛ рдХрд┐ рдХрд╕реНрдЯрдо HID рдбрд┐рд╡рд╛рдЗрд╕ рдХреИрд╕реЗ рдмрдирд╛рддреЗ рд╣реИрдВред рдЗрд╕рд╕реЗ рдЕрдзрд┐рдХрддрдо рд╕реНрд╡рддрдВрддреНрд░рддрд╛ рдорд┐рд▓рддреА рд╣реИред рд▓реЗрдЦ рдХреЛ рдмрд╛рд╣рд░ рдирд╣реАрдВ рдЦреАрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдпрдерд╛рд╕рдВрднрд╡ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдмрддрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ - рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рдФрд░ рдореЗрд░реЗ рдмрд┐рдирд╛ рдорд╛рдирдХ рдХреЗ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╡рд┐рд╡рд░рдг рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдЙрдиреНрд╣реЛрдВрдиреЗ рдореЗрд░реА рдереЛрдбрд╝реА рдорджрдж рдХреА рдЬрдм рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛ред

рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рд╕рдВрд░рдЪрдирд╛


рдореИрдВ STM32 рдХреЗ рддрд╣рдд рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП EmBlocks рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ ред рдЖрдк рдХрд┐рд╕реА рднреА рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╡рд╛рддрд╛рд╡рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдирд╛ рдмрд╣реБрдд рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИред
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рдореВрд▓ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдЬреЛрдбрд╝реЗ рдЧрдП рд╣реИрдВ:

рд╣рдо USB рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рд╕реА рднреА рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдЗрди рд╕рднреА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред

USB рдЖрд░рдВрднреАрдХрд░рдг


рдпреВрдПрд╕рдмреА рдореЙрдбреНрдпреВрд▓ рдХреЗ рд╕рд╣реА рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП, рдПрдордХреЗ рдХреА рдЖрд╡реГрддреНрддрд┐ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рд╕рднреА рдЖрд╡реГрддреНрддрд┐рдпрд╛рдБ рдЖрдкрдХреЛ USB рдШрдбрд╝реА рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддреА рд╣реИрдВред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, 8 рдореЗрдЧрд╛рд╣рд░реНрдЯреНрдЬ рдкрд░ рдПрдХ рдХреНрд░рд┐рд╕реНрдЯрд▓ рдерд░рдерд░рд╛рдирд╡рд╛рд▓рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдПрдордХреЗ 72 рдореЗрдЧрд╛рд╣рд░реНрдЯреНрдЬ рдХреА рдЖрд╡реГрддреНрддрд┐ рдкрд░ рд╕рдВрдЪрд╛рд▓рд┐рдд рд╣реЛрддрд╛ рд╣реИ, рдФрд░ 48 рдореЗрдЧрд╛рд╣рд░реНрдЯреНрдЬ рдкрд░ рдПрдХ рдпреВрдПрд╕рдмреА рдореЙрдбреНрдпреВрд▓ред
Main.c рдореЗрдВ, рдХреЛрдб рдХреА рдХреБрдЫ рдкрдВрдХреНрддрд┐рдпрд╛рдБ рд╢рд╛рдорд┐рд▓ рдХрд░реЗрдВ
main.c
/* Includes ------------------------------------------------------------------*/ #include "hw_config.h" #include "usb_lib.h" #include "usb_pwr.h" /* Private variables ---------------------------------------------------------*/ __IO uint8_t PrevXferComplete = 1; int main(void) { Set_System(); USB_Interrupts_Config(); Set_USBClock(); USB_Init(); while (1) { if (bDeviceState == CONFIGURED) { if (PrevXferComplete) { RHIDCheckState(); } } } } 


Set_System () рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ, рдкрд╛рд╡рд░ рдХреЗ рд▓рд┐рдП D + рд▓рд╛рдЗрди рдкреБрд▓ -рдЕрдк рдХрд╛ рдкрд┐рди рдкреНрд░реЛрдЧреНрд░рд╛рдореЗрдЯрд┐рдХ рд░реВрдк рд╕реЗ рдкреАрд╕реА рд╕реЗ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЛ рдХрдиреЗрдХреНрдЯ / рдбрд┐рд╕реНрдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рдпрд╣ рд╣рдорд╛рд░реЗ рдмреЛрд░реНрдб рдореЗрдВ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ), рд░реБрдХрд╛рд╡рдЯ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдбреЗрдореЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдПрд▓рдИрдбреА рдФрд░ рдмрдЯрди рдПрд▓рдИрдбреА рд╣реИрдВред
USB_Interrupts_Config () рдореЗрдВ, MK рдХреЗ рдкрд░рд┐рд╡рд╛рд░ (F10x, F37x, L1x рд╕рдорд░реНрдерд┐рдд рд╣реИрдВ) рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЗрдВрдЯрд░рдкреНрдЯ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
USB_Init () рдлрд╝рдВрдХреНрд╢рди USB рдореЙрдбреНрдпреВрд▓ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдкрдХреЛ рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП USB рдХрд╛рд░реНрдп рдХреЛ рдЕрд╕реНрдерд╛рдпреА рд░реВрдк рд╕реЗ рдЕрдХреНрд╖рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдмрд╕ рдЗрд╕ рд▓рд╛рдЗрди рдкрд░ рдЯрд┐рдкреНрдкрдгреА рдХрд░реЗрдВред
рдлрд┐рд░ рдПрдХ рдЕрдВрддрд╣реАрди рд▓реВрдк рдореЗрдВ рдпрд╣ рдЬрд╛рдВрдЪ рдХреА рдЬрд╛рддреА рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдкреАрд╕реА рд╕реЗ рдХрдиреЗрдХреНрдЯ рд╣реЛрдиреЗ рдкрд░ рдпреВрдПрд╕рдмреА рдореЙрдбреНрдпреВрд▓ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛ рд╕рдВрднрд╡ рдерд╛ред рдпрджрд┐ рд╕рдм рдХреБрдЫ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдбрд┐рд╡рд╛рдЗрд╕ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ, рддреЛ рдкреАрд╕реА рдЪрд╛рд▓реВ рд╣реИ рдФрд░ рдкрд╛рд╡рд░ рд╕реЗрд╡рд┐рдВрдЧ рдореЛрдб рдореЗрдВ рдирд╣реАрдВ рд╣реИ, рддреЛ рд╕реНрдерд┐рддрд┐ рдХрдВрдлрд░реНрдЯреЗрдмрд▓ рд╣реЛрдЧреАред
рдЕрдЧрд▓рд╛, рдпрд╣ рдЬрд╛рдВрдЪрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдкреАрд╕реА рдореЗрдВ рдкрд┐рдЫрд▓рд╛ рдбреЗрдЯрд╛ рдЯреНрд░рд╛рдВрд╕рдлрд░ рдкреВрд░рд╛ рд╣реЛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ RHIDCheckState () рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рдкреИрдХреЗрдЯ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ

рдкреИрдХреЗрдЯ рдХрд╛ рдЖрдХрд╛рд░ рдФрд░ рдкреНрд░рд╕рд╛рд░рдг рдЖрд╡реГрддреНрддрд┐


USB-HID рдбрд┐рд╡рд╛рдЗрд╕ рд╕реНрд╡рдпрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рдЖрд░рдВрдн рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛, рдХреНрдпреЛрдВрдХрд┐ рдмрд╕ рдореЗрдЬрдмрд╛рди рдбрд┐рд╡рд╛рдЗрд╕ рджреНрд╡рд╛рд░рд╛ рд╕рдордиреНрд╡рд┐рдд рд╣реИ - рдкреАрд╕реАред рдЗрд╕рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рдпреВрдПрд╕рдмреА рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдХреЛ рддреИрдпрд╛рд░ рдХрд░рддреЗ рд╕рдордп, рд╣рдо рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдореЗрдВ рдЕрдкрдиреЗ рдбрд┐рд╡рд╛рдЗрд╕ рд╕реЗ рдХрд┐рддрдиреА рдмрд╛рд░ рдкреВрдЫрддрд╛рдЫ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдЕрдзрд┐рдХрддрдо рдорддрджрд╛рди рдЖрд╡реГрддреНрддрд┐ 1 kHz рд╣реИ рдФрд░ рдПрдХ рд╕рдордп рдореЗрдВ рдкреНрд░реЗрд╖рд┐рдд рдкреИрдХреЗрдЯ рдХрд╛ рдЕрдзрд┐рдХрддрдо рдЖрдХрд╛рд░ 64 рдмрд╛рдЗрдЯреНрд╕ рд╣реИред рдпрджрд┐ рдпрд╣ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдСрдкрд░реЗрд╢рди рдХреЗ рдЕрдиреНрдп рддрд░реАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ - рдЬреИрд╕реЗ рдХрд┐ USB рдмрд▓реНрдХ, рд▓реЗрдХрд┐рди рд╡рд╣рд╛рдВ рдЖрдк рдмрд┐рдирд╛ рдбреНрд░рд╛рдЗрд╡рд░реЛрдВ рдХреЗ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред
рдкреАрд╕реА рдХреЗ рд╕рд╛рде рд╕рд╣рднрд╛рдЧрд┐рддрд╛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП 3 рд╣реИрдВрдбрд▓ рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИрдВ:
рдбрд┐рд╡рд╛рдЗрд╕ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░
 /* USB Standard Device Descriptor */ const uint8_t RHID_DeviceDescriptor[RHID_SIZ_DEVICE_DESC] = { RHID_SIZ_DEVICE_DESC, //       USB_DEVICE_DESCRIPTOR_TYPE, // bDescriptorType - ,    .    - Device descriptor 0x00, 0x02, // bcdUSB -    USB  . 2.0 // ,    ,   USB.   ,       0x00, //bDeviceClass 0x00, //bDeviceSubClass 0x00, //bDeviceProtocol 0x40, //bMaxPacketSize -     Endpoint 0 ( ) //    VID  PID,    ,     . 0x83, 0x04, //idVendor (0x0483) 0x11, 0x57, //idProduct (0x5711) DEVICE_VER_L, DEVICE_VER_H, // bcdDevice rel. DEVICE_VER_H.DEVICE_VER_L    //    ,  ,    . //        //         VID/PID  . 1, //Index of string descriptor describing manufacturer 2, //Index of string descriptor describing product 3, //Index of string descriptor describing the device serial number 0x01 // bNumConfigurations -   .   . } ; /* CustomHID_DeviceDescriptor */ 


рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рд╕рдм рдХреБрдЫ рдмрд╣реБрдд рдкрд╛рд░рджрд░реНрд╢реА рд╣реИред DEVICE_VER_L рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ, DEVICE_VER_H - рдпреЗ usb_desc.h рд╕реЗ рд╕реНрдерд┐рд░рд╛рдВрдХ рд╣реИрдВ, рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдк рдЕрдкрдиреЗ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред

рд╡рд┐рдиреНрдпрд╛рд╕ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ (рдбрд┐рд╡рд╛рдЗрд╕ рдХреНрд╖рдорддрд╛рдУрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ)
 /* USB Configuration Descriptor */ /* All Descriptors (Configuration, Interface, Endpoint, Class, Vendor */ const uint8_t RHID_ConfigDescriptor[RHID_SIZ_CONFIG_DESC] = { 0x09, // bLength:    USB_CONFIGURATION_DESCRIPTOR_TYPE, // bDescriptorType:   -  RHID_SIZ_CONFIG_DESC, 0x00, // wTotalLength:          0x01, // bNumInterfaces:      0x01, // bConfigurationValue:    0x00, // iConfiguration:  ,     0xE0, // bmAttributes:  ,       USB 0x32, // MaxPower 100 mA:    100  /**************   ****************/ 0x09, // bLength:    USB_INTERFACE_DESCRIPTOR_TYPE, // bDescriptorType:   -  0x00, // bInterfaceNumber:    - 0 0x00, // bAlternateSetting:   ,     0x02, // bNumEndpoints -  . 0x03, // bInterfaceClass:   - HID //       ,    ,          //      HID- 0x00, // bInterfaceSubClass :  . 0x00, // nInterfaceProtocol :   0, // iInterface:  ,   //      ,    -  HID  /******************** HID  ********************/ 0x09, // bLength:  HID- HID_DESCRIPTOR_TYPE, // bDescriptorType:   - HID 0x01, 0x01, // bcdHID:   HID 1.1 0x00, // bCountryCode:   ( ) 0x01, // bNumDescriptors:    report  HID_REPORT_DESCRIPTOR_TYPE, // bDescriptorType:   - report RHID_SIZ_REPORT_DESC, 0x00, // wItemLength:  report- /********************    (endpoints) ********************/ 0x07, // bLength:   USB_ENDPOINT_DESCRIPTOR_TYPE, //   - endpoints 0x81, // bEndpointAddress:      1(IN) 0x03, // bmAttributes:    - Interrupt endpoint wMaxPacketSize, 0x00, // wMaxPacketSize: Bytes max 0x20, // bInterval: Polling Interval (32 ms) 0x07, /* bLength: Endpoint Descriptor size */ USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: */ /* Endpoint descriptor type */ 0x01, /* bEndpointAddress: */ /* Endpoint Address (OUT) */ 0x03, /* bmAttributes: Interrupt endpoint */ wMaxPacketSize, /* wMaxPacketSize: Bytes max */ 0x00, 0x20, /* bInterval: Polling Interval (32 ms) */ } ; /* RHID_ConfigDescriptor */ 


рдпрд╣рд╛рдВ wMaxPacketSize рд╕реНрдерд┐рд░ рдкрд░ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ - рдпрд╣ рдЕрдзрд┐рдХрддрдо рдкреИрдХреЗрдЯ рдЖрдХрд╛рд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рдкреАрд╕реА рдХреЗ рд╕рд╛рде рд╡рд┐рдирд┐рдордп рдХрд░реЗрдВрдЧреЗред рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рддрд╛рдХрд┐ рдЬрдм рдпрд╣ рдмрджрд▓рддрд╛ рд╣реИ, рддреЛ рдмрдлрд╝рд░реНрд╕ рдХрд╛ рдЖрдХрд╛рд░ рднреА рдмрджрд▓рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рдордд рднреВрд▓реЛ рдХрд┐ рдЖрдкрдХреЛ рдорд╛рдирдХ рджреНрд╡рд╛рд░рд╛ 0x40 рд╕реЗ рдЕрдзрд┐рдХ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕ рдирд┐рд░рдВрддрд░ рдХреЗ рд╕рд╛рде рд╕рд╛рд╡рдзрд╛рди рд░рд╣реЗрдВ - рдпрджрд┐ рдкреНрд░реЗрд╖рд┐рдд рдкреИрдХреЗрдЯ рдЖрдХрд╛рд░ рдореЗрдВ рдЕрд▓рдЧ рд╣реИ, рддреЛ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реЛрдВрдЧреА!
рдЯрд┐рдкреНрдкрдгреА bInterval рдХреЗ рд╕рд╛рде рдЕрдЧрд▓рд╛ рд╕реНрдерд┐рд░рд╛рдВрдХ рдорд┐рд▓реАрд╕реЗрдХрдВрдб рдореЗрдВ рдбрд┐рд╡рд╛рдЗрд╕ рдХреА рдорддрджрд╛рди рдЕрд╡рдзрд┐ рд╣реИред рд╣рдорд╛рд░реЗ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рд▓рд┐рдП 32ms рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╣реИрдВред

рд░рд┐рдкреЛрд░реНрдЯ рд╕рдВрднрд╛рд▓ (рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ)
 const uint8_t RHID_ReportDescriptor[RHID_SIZ_REPORT_DESC] = { 0x06, 0x00, 0xff, // USAGE_PAGE (Generic Desktop) 0x09, 0x01, // USAGE (Vendor Usage 1) 0xa1, 0x01, // COLLECTION (Application) 0x85, 0x01, // REPORT_ID (1) 0x09, 0x01, // USAGE (Vendor Usage 1) 0x15, 0x00, // LOGICAL_MINIMUM (0) 0x25, 0x01, // LOGICAL_MAXIMUM (1) 0x75, 0x08, // REPORT_SIZE (8) 0x95, 0x01, // REPORT_COUNT (1) 0xb1, 0x82, // FEATURE (Data,Var,Abs,Vol) 0x85, 0x01, // REPORT_ID (1) 0x09, 0x01, // USAGE (Vendor Usage 1) 0x91, 0x82, // OUTPUT (Data,Var,Abs,Vol) 0x85, 0x02, // REPORT_ID (2) 0x09, 0x02, // USAGE (Vendor Usage 2) 0x15, 0x00, // LOGICAL_MINIMUM (0) 0x25, 0x01, // LOGICAL_MAXIMUM (1) 0x75, 0x08, // REPORT_SIZE (8) 0x95, 0x01, // REPORT_COUNT (1) 0xb1, 0x82, // FEATURE (Data,Var,Abs,Vol) 0x85, 0x02, // REPORT_ID (2) 0x09, 0x02, // USAGE (Vendor Usage 2) 0x91, 0x82, // OUTPUT (Data,Var,Abs,Vol) 0x85, 0x03, // REPORT_ID (3) 0x09, 0x03, // USAGE (Vendor Usage 3) 0x15, 0x00, // LOGICAL_MINIMUM (0) 0x26, 0xff, 0x00, // LOGICAL_MAXIMUM (255) 0x75, 0x08, // REPORT_SIZE (8) 0x95, RPT3_COUNT, // REPORT_COUNT (N) 0xb1, 0x82, // FEATURE (Data,Var,Abs,Vol) 0x85, 0x03, // REPORT_ID (3) 0x09, 0x03, // USAGE (Vendor Usage 3) 0x91, 0x82, // OUTPUT (Data,Var,Abs,Vol) 0x85, 0x04, // REPORT_ID (4) 0x09, 0x04, // USAGE (Vendor Usage 4) 0x75, 0x08, // REPORT_SIZE (8) 0x95, RPT4_COUNT, // REPORT_COUNT (N) 0x81, 0x82, // INPUT (Data,Var,Abs,Vol) 0xc0 // END_COLLECTION } 


рдпрд╣ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡рд░реНрдгрдирдХрд░реНрддрд╛ рд╣реИ - рдпрд╣ рд╕рдВрдЪрд╛рд░ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдФрд░ рдбрд┐рд╡рд╛рдЗрд╕ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдЧрдарди рдХреЛрдИ рдЖрд╕рд╛рди рдХрд╛рдо рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рдЖрдк рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдмрдирд╛рддреЗ рд╕рдордп рдХреЛрдИ рдЧрд▓рддреА рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдбрд┐рд╡рд╛рдЗрд╕ рдХрд╛рдо рдХрд░рдирд╛ рдмрдВрдж рдХрд░ рджреЗрдЧрд╛ред рд╡рд░реНрдгрдирдХрд░реНрддрд╛ рдкреНрд░рд╛рд░реВрдк рдмрд╣реБрдд рдХрдард┐рди рд╣реИред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдЫрд┐рдкрд╛рдИ Descriptor рдЙрдкрдХрд░рдг рдЙрдкрдпреЛрдЧрд┐рддрд╛ рднреА рд╣реИред рдФрд░ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдореВрд▓ рдореЗрдВ рдЗрд╕ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдореЗрдВ рд╕рдВрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рд╡рд░реНрдгрдирдХрд░реНрддрд╛ рдХреЗ рд╕рд╛рде рдлрд╛рдЗрд▓ "RHID.hid" рд╣реИред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк рдпрд╣ рдирд╣реАрдВ рд╕рдордЭрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рдХреНрдпрд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдмреЗрд╣рддрд░ рд╣реИ рдХрд┐ рдЖрдк рди рдЬрд╛рдПрдВред
рд╕рд╛рджрдЧреА рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рджреЛ рд╕реНрдерд┐рд░рд╛рдВрдХ рдмрдирд╛рдП:
RPT3_COUNT - OUTPUT рдмрдлрд░ рдЖрдХрд╛рд░ рдПрдордХреЗ рдореЗрдВ рдПрдХ рдкреИрдХреЗрдЯ рдкреНрд░реЗрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП - 1 рдмрд╛рдЗрдЯ)
RPT4_COUNT - рдкреИрдХреЗрдЯ рдХреЛ рдкреАрд╕реА рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рдЗрдЯреНрд╕ рдореЗрдВ INPUT рдмрдлрд░ рдХрд╛ рдЖрдХрд╛рд░ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП - 4 рдмрд╛рдЗрдЯреНрд╕)
рдЗрдирдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рднреА рдмрдлрд╝рд░ рдХрд╛ рдЖрдХрд╛рд░ wMaxPacketSize рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдХрдо рд╕рдВрднрд╡ рд╣реИред
рд╡реИрд╕реЗ, рдЖрдк рдХрд╕реНрдЯрдо рдЫрд┐рдкрд╛рдИ рдХреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рдЫрд┐рдкрд╛рдИ рдбрд┐рд╡рд╛рдЗрд╕ рдореЗрдВ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреЗрд╡рд▓ рдПрдХ рдХреБрдВрдЬреАрдкрдЯрд▓ рдпрд╛ рдЬреЙрдпрд╕реНрдЯрд┐рдХ, рд░рд┐рдкреЛрд░реНрдЯрдбрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛ рдФрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдореЗрдВ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рд╡рд░реНрдЧ рдФрд░ рдЙрдкрд╡рд░реНрдЧ рдХреЛ рдмрджрд▓рдирд╛ред

рд░рд┐рдкреЛрд░реНрдЯ рдХреНрдпрд╛ рд╣реИ?


рд╣реЛрд╕реНрдЯ (рдкреАрд╕реА) рдФрд░ рдбрд┐рд╡рд╛рдЗрд╕ (рдПрдордХреЗ) рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдбреЗрдЯрд╛ рдкреИрдХреЗрдЯ рдХрд╛ рдЖрджрд╛рди-рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ - рд░рд┐рдкреЛрд░реНрдЯред рдмрд╣реБрдд рд╕рд╛рд░реЗ рдкреИрдХреЗрдЬ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рд╕рднреА рдЕрд╡рд╕рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ - рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдбрд┐рд╡рд╛рдЗрд╕ рдореЗрдВ рдХреБрдЫ рдШрдЯрдирд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рдкреИрдХреЗрдЬ, рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рдкреИрдХреЗрдЬ рдЬрд┐рд╕реЗ рдкреАрд╕реА рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдПрдордХреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рдПрдХ рдкреИрдХреЗрдЬред рдХреБрдЫ рднреА рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рд╕рднреА рдкреИрдХреЗрдЬреЛрдВ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреЛ RHID_ReportDescriptor рдХреА рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдкреАрд╕реА рдФрд░ рдПрдордХреЗ рдЖрдИрдбреА рджреНрд╡рд╛рд░рд╛ рд░рд┐рдкреЛрд░реНрдЯ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдкреИрдХреЗрдЯ рдореЗрдВ рдкрд╣рд▓рд╛ рдмрд╛рдЗрдЯ рд╣реИред
рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, 4 рдкреНрд░рдХрд╛рд░ рдХреА рд░рд┐рдкреЛрд░реНрдЯреЗрдВ рд╣реИрдВ:

рдпрджрд┐ рдЖрдкрдиреЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдпрд╣ рдирд╣реАрдВ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ рд╣реИ рдХрд┐ рд░рд┐рдкреЛрд░реНрдЯ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдХреИрд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рдП, рддреЛ рдмрд╕ рд╕реНрдерд┐рд░рд╛рдВрдХ RPT3_COUNT рдФрд░ RPT4_COUNT рдХреЛ рдмрджрд▓реЗрдВ, рдЖрдЙрдЯрдЧреЛрдЗрдВрдЧ рдФрд░ рдЗрдирдХрдорд┐рдВрдЧ рдХрд╛ рдЗрдЪреНрдЫрд┐рдд рдЖрдХрд╛рд░ (рдкреАрд╕реА рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ) рдкреИрдХреЗрдЯ рд╕реЗрдЯ рдХрд░реЗрдВред рдмрд╛рдХреА рд░рд┐рдкреЛрд░реНрдЯреЛрдВ рдХреЛ рдХреЗрд╡рд▓ рдЫреБрдЖ рдирд╣реАрдВ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд╡реЗ рдЪреЛрдЯ рдирд╣реАрдВ рдкрд╣реБрдВрдЪрд╛рдПрдВрдЧреЗред рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдкрд╣рд▓реА рдмрд╛рдЗрдЯ рдПрдХ рд░рд┐рдкреЛрд░реНрдЯ рдЖрдИрдбреА рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред

рд╡рд┐рдирд┐рдордп рдЪрдХреНрд░


рдЗрд╕рд▓рд┐рдП, рд╣рдордиреЗ рдкреАрдЖрдИрдбреА, рд╡реАрдЖрдИрдбреА, рд╕рдВрд╕реНрдХрд░рдг рд╕рдВрдЦреНрдпрд╛ рд╕реЗрдЯ рдХрд░рдХреЗ рдЕрдкрдиреЗ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛, рдЗрдирдХрдорд┐рдВрдЧ рдФрд░ рдЖрдЙрдЯрдЧреЛрдЗрдВрдЧ рдкреИрдХреЗрдЯ рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдФрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИрдВред
рдкреНрд░рддреНрдпреЗрдХ 32ms, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдореЗрдВ рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рдерд╛, рдореЗрдЬрдмрд╛рди рд╣рдореЗрдВ рдкреЛрд▓ тАЛтАЛрдХрд░реЗрдЧрд╛ рдФрд░ RHIDCheckState рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд╣рдо рдЬрд╛рдВрдЪ рдХрд░реЗрдЧрд╛ - рдЕрдЧрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╣реИ, рддреЛ рд╣рдо рдореЗрдЬрдмрд╛рди рдХреЗ рд▓рд┐рдП рдПрдХ рдбреЗрдЯрд╛ рдкреИрдХреЗрдЯ рдмрдирд╛рддреЗ рд╣реИрдВред
RHIDCheckState - рдбреЗрдЯрд╛ рднреЗрдЬрдиреЗ рдХрд╛ рдХрд╛рд░реНрдп
 /******************************************************************************* * Function Name : RHIDCheckState. * Description : Decodes the RHID state. * Input : None. * Output : None. * Return value : The state value. *******************************************************************************/ uint16_t btn1_prev, btn2_prev; uint8_t Buffer[RPT4_COUNT+1]; uint8_t RHIDCheckState(void) { uint16_t btn1=0, btn2=0; btn1 = GPIO_ReadInputDataBit(BTN1_PORT, BTN1_PIN); btn2 = GPIO_ReadInputDataBit(BTN2_PORT, BTN2_PIN); Buffer[0] = 4; Buffer[1] = btn1; Buffer[2] = btn2; Buffer[3] = (GPIO_ReadInputDataBit(LED_PORT, LED1_PIN) | GPIO_ReadInputDataBit(LED_PORT, LED2_PIN)<<1); /* Reset the control token to inform upper layer that a transfer is ongoing */ PrevXferComplete = 0; /* Copy buffer date info in ENDP1 Tx Packet Memory Area*/ USB_SIL_Write(EP1_IN, Buffer, RPT4_COUNT+1); /* Enable endpoint for transmission */ SetEPTxValid(ENDP1); return (btn1 | btn2<<1); } 


Uint8_t рдмрдлрд░ [RPT4_COUNT + 1] рд╕рд░рдгреА рдХреЛ рдЖрд╡рдХ рдХреЗ рдкреЗрд▓реЛрдб рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рд╣рдореЗрд╢рд╛ рдореЗрдЬрдмрд╛рди рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ) рдкреИрдХреЗрдЯ + рдмрд╛рдЗрдЯ рдЖрдИрдбреАред рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ - рдЕрдЧрд░ рдмрдлрд░ рдХрд╛ рдЖрдХрд╛рд░ рдЕрд▓рдЧ рд╣реИ - рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реЛрдВрдЧреАред рдЗрд╕рд▓рд┐рдП, рдмрдлрд╝рд░ рдХрд╛ рдЖрдХрд╛рд░ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, usb_desc.h рдореЗрдВ рдирд┐рд░рдВрддрд░ рдорд╛рди рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВред
рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ, рд╣рдо рдПрдХ рдкреИрдХреЗрдЬ рдореЗрдВ рдбреЗрдЯрд╛ рдПрдХрддреНрд░ рдХрд░рддреЗ рд╣реИрдВ, рдЭрдВрдбрд╛ PrevXferComplete = 0 рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдпрд╣ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ рдбреЗрдЯрд╛ рднреЗрдЬрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рдФрд░ рд╣реЛрд╕реНрдЯ рдХреЛ рдбреЗрдЯрд╛ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП USB_SIL_Write рдФрд░ SetEPTxValid рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВред
рдмрд╕ рдЗрддрдирд╛ рд╣реА, рд╣реЛрд╕реНрдЯ рдХреЛ рдбреЗрдЯрд╛ рдЯреНрд░рд╛рдВрд╕рдлрд░ рдЦрддреНрдо рд╣реЛ рдЧрдпрд╛ рд╣реИред

рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИ - рдбрд┐рд╡рд╛рдЗрд╕ рдХреЛ рдбреЗрдЯрд╛ рднреЗрдЬрдиреЗ рдХреЗ рджреЛ рддрд░реАрдХреЗ рд╣реИрдВ - рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рд░рд┐рдкреЛрд░реНрдЯ рд╡рд┐рд╡рд░рдгрдХ рдореЗрдВ рд╡рд░реНрдгрд┐рдд SET_FEAUTRE рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдбрд┐рд╡рд╛рдЗрд╕ рдХреА рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред рдпрд╣ рдХреБрдЫ рдЕрдореВрд░реНрдд рд╣реИ, рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдПрдХ рд╕рдореВрд╣ рдХреЗ рд╕рд╛рде рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рд╕реБрдВрджрд░ рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рд▓рд┐рдП, рддрд╛рдХрд┐ рдЖрдк рд╕рд╛рд░реНрдердХ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдмреБрд▓рд╛ рд╕рдХреЗрдВ, рдФрд░ рди рдХреЗрд╡рд▓ рдмрд╛рдЗрдЯреНрд╕ рдХреА рдПрдХ рдзрд╛рд░рд╛ рднреЗрдЬреЗрдВред
рджреВрд╕рд░рд╛ рддрд░реАрдХрд╛ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рд╕рд╛рде рдлрд╝рд╛рдЗрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░рдирд╛ рд╣реИ - рдмрд╕ рдкреИрдХреЗрдЬ рдХреЛ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдЦреЗрдВред рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ SET_REPORT рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдереЛрдбрд╝рд╛ рдзреАрдорд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рд╣рдорд╛рд░рд╛ рдЙрдкрдХрд░рдг рджреЛрдиреЛрдВ рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рд░рд┐рдкреЛрд░реНрдЯ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдореЗрдВ рд╣реЛрд╕реНрдЯ рдХреЛ рдмрддрд╛рдпрд╛ рдерд╛ред

рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг SET_FEATURE

SET_FEAUTRE рд╡рд┐рдзрд┐ рджреНрд╡рд╛рд░рд╛ рднреЗрдЬрд╛ рдЧрдпрд╛ рдбреЗрдЯрд╛ usb_prop.c рдореЗрдВ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ

рдлрд╝рдВрдХреНрд╢рди HID_Status_In
 /******************************************************************************* * Function Name : HID_Status_In. * Description : HID status IN routine. * Input : None. * Output : None. * Return : None. *******************************************************************************/ void HID_Status_In(void) { BitAction Led_State; if (Report_Buf[1] == 0) { Led_State = Bit_RESET; } else { Led_State = Bit_SET; } switch (Report_Buf[0]) { case 1: /* Led 1 */ if (Led_State != Bit_RESET) { GPIO_SetBits(LED_PORT,LED1_PIN); } else { GPIO_ResetBits(LED_PORT,LED1_PIN); } break; case 2: /* Led 2 */ if (Led_State != Bit_RESET) { GPIO_SetBits(LED_PORT,LED2_PIN); } else { GPIO_ResetBits(LED_PORT,LED2_PIN); } break; case 3: /* Led 1&2 */ Buffer[4]=Report_Buf[1]; break; } } 


рдпрд╣рд╛рдВ рд╣рдо рд░рд┐рдкреЛрд░реНрдЯ рдореЗрдВ рдкрд╣рд▓реЗ рдмрд╛рдЗрдЯ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЙрд╕рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╣рдо рдкреИрдХреЗрдЯ рдХреЗ рдмрд╛рдХреА рд╣рд┐рд╕реНрд╕реЛрдВ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░рддреЗ рд╣реИрдВ - рд╣рдо рдПрд▓ рдИ рдбреА рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдпрд╛ рдореЗрдЬрдмрд╛рди рджреНрд╡рд╛рд░рд╛ рд╣рдореЗрдВ рднреЗрдЬреЗ рдЧрдП рдмрд╛рдЗрдЯ рдХреЛ рд▓реЗрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдкреИрдХреЗрдЯ рдореЗрдВ рдбрд╛рд▓рддреЗ рд╣реИрдВ рдФрд░ рдмрд╛рдж рдореЗрдВ RHIDKheckState рдлрд╝рдВрдХреНрд╢рди рдкрд░ рд╡рд╛рдкрд╕ рднреЗрдЬрддреЗ рд╣реИрдВред
Report_Buf рдХреЗ рддрд╣рдд, wMaxPacketSize рдмрд╛рдЗрдЯреНрд╕ рдЖрд░рдХреНрд╖рд┐рдд рд╣реИрдВ рддрд╛рдХрд┐ рдХреЛрдИ рднреА рдкреИрдХреЗрдЯ рдЬреЛ рд╣реЛрд╕реНрдЯ рд╣рдореЗрдВ рднреЗрдЬрддрд╛ рд╣реИ рд╡рд╣ рдлрд┐рдЯ рд╣реЛ рд╕рдХреЗред

SET_REPORT рд╡рд┐рдзрд┐ рджреНрд╡рд╛рд░рд╛ рднреЗрдЬрд╛ рдЧрдпрд╛ рдбреЗрдЯрд╛ usb_endp.c рдореЗрдВ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ
рдлрд╝рдВрдХреНрд╢рди EP1_OUT_Callback
 /******************************************************************************* * Function Name : EP1_OUT_Callback. * Description : EP1 OUT Callback Routine. * Input : None. * Output : None. * Return : None. *******************************************************************************/ void EP1_OUT_Callback(void) { BitAction Led_State; /* Read received data (2 bytes) */ USB_SIL_Read(EP1_OUT, Receive_Buffer); if (Receive_Buffer[1] == 0) { Led_State = Bit_RESET; } else { Led_State = Bit_SET; } switch (Receive_Buffer[0]) { case 1: /* Led 1 */ if (Led_State != Bit_RESET) { GPIO_SetBits(LED_PORT,LED1_PIN); } else { GPIO_ResetBits(LED_PORT,LED1_PIN); } break; case 2: /* Led 2 */ if (Led_State != Bit_RESET) { GPIO_SetBits(LED_PORT,LED2_PIN); } else { GPIO_ResetBits(LED_PORT,LED2_PIN); } break; case 3: /* Led 1&2 */ Buffer[4]=Receive_Buffer[1]; break; } SetEPRxStatus(ENDP1, EP_RX_VALID); } 


рдпрд╣рд╛рдВ рдпрд╣ рд▓рдЧрднрдЧ рд╕рдорд╛рди рд╣реИ, рдХреЗрд╡рд▓ рдЖрдкрдХреЛ USB_SIL_Read (EP1_OUT, Receive_Buffer) рдкрд░ рдХреЙрд▓ рдХрд░рдХреЗ рдбреЗрдЯрд╛ рд╕реНрд╡рдпрдВ рд▓реЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рдЕрдВрдд рдореЗрдВ рд╕реВрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рд╣рдордиреЗ SetEPRxStatus (EN1: EP_RX_VALID) рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рд╕рдорд╛рдкреНрдд рдХрд░ рджрд┐рдпрд╛ рд╣реИ;

рд╣рдордиреЗ рд╕реАрдЦрд╛ рдХрд┐ рдХрд┐рд╕ рддрд░рд╣ рд╕реЗ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛, рд╕рдВрдЪрд╛рд░ рдХрд░рдирд╛ рдФрд░ рд╕рд╣реА рдЖрдХрд╛рд░ рдХреЗ рдкреИрдХреЗрдЯ рдореЗрдВ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╣реИ, рдЬрд┐рд╕ рдЖрд╡реГрддреНрддрд┐ рдХреА рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рд╣рдо рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдбрд┐рд╡рд╛рдЗрд╕ рдореЗрдВ рдлреНрд▓реИрд╢ рдХрд░рддреЗ рд╣реИрдВред
рдпрд╣ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдХрд╛рдо рдХрд░реЗрдЧрд╛:


рдпрд╣ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдПрд╕рдЯреА рдорд╛рдЗрдХреНрд░реЛрдЗрд▓реЗрдХреНрдЯреНрд░реЙрдирд┐рдХ рд╕реЗ рдпреВрдПрд╕рдмреА рдЫрд┐рдкрд╛рдИ рдкреНрд░рджрд░реНрд╢рдирдХрд╛рд░реА рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреА рд╣реИред
рдбрд┐рд╡рд╛рдЗрд╕ рдХреНрд╖рдорддрд╛ рдкреГрд╖реНрда рд░рд┐рдкреЛрд░реНрдЯ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХреНрд╖рдорддрд╛рдУрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред
рдЗрдирдкреБрдЯ / рдЖрдЙрдЯрдкреБрдЯ рдЯреНрд░рд╛рдВрд╕рдлрд░ рдЖрдкрдХреЛ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдбреЗрдЯрд╛ рднреЗрдЬрдиреЗ рдФрд░ рдЙрд╕рд╕реЗ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдкреИрдХреЗрдЯ рдХреЛ рджреЗрдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рдЧреНрд░рд╛рдлрд┐рдХ рджреГрд╢реНрдп рдЖрдкрдХреЛ рдПрд▓ рдИ рдбреА рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЪреЗрдХрдмреЙрдХреНрд╕ рдПрд▓рдИрдбреА 1, рдПрд▓рдИрдбреА 2, рд╕рдВрдмрдВрдзрд┐рдд рд░рд┐рдкреЛрд░реНрдЯ рдЖрдИрдбреА рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдПрдХ рд╕реНрд▓рд╛рдЗрдбрд░ рдХреЗ рд╕рд╛рде рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рдмрд╛рдЗрдЯреНрд╕ (рд░рд┐рдкреЛрд░реНрдЯрдЖрдИрдбреА = 3)


рдореИрдВрдиреЗ рдПрдХ рдЫреЛрдЯрд╛ рдбреЗрдореЛ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рднреА рд▓рд┐рдЦрд╛ рд╣реИ рдЬреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдХрдВрдкреНрдпреВрдЯрд░ рд╕реЗ рдХрдиреЗрдХреНрд╢рди рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ VID рдФрд░ PID рджреНрд╡рд╛рд░рд╛ рд╣рдорд╛рд░реЗ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЛ рдбрд┐рд╕реНрдХрдиреЗрдХреНрдЯ рдХрд░рддрд╛ рд╣реИ, рдСрдЯреЛ рдХрдиреЗрдХреНрдЯ рдЪреЗрдХрдмреЙрдХреНрд╕ рдХреЗ рдмрдЧрд▓ рдореЗрдВ рд╕рдВрдХреЗрддрдХ рджреНрд╡рд╛рд░рд╛ рд╕реНрдерд┐рддрд┐ - рдЬреБрдбрд╝рд╛ / рдбрд┐рд╕реНрдХрдиреЗрдХреНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛

рд░реЗрдбрд┐рдпреЛ рдмрдЯрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рднреЗрдЬреЗрдВ рдЖрдкрдХреЛ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЛ рдбреЗрдЯрд╛ рднреЗрдЬрдиреЗ рдХреА рд╡рд┐рдзрд┐ рдЪреБрдирдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рд░рд┐рдкреЛрд░реНрдЯ: рдбрд┐рд╡рд╛рдЗрд╕ рдмрд╛рдЗрдЯ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдкреИрдХреЗрдЯ, рд░рд┐рдкреЛрд░реНрдЯрдЖрдИрдбреА рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред
рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдПрд▓ рдИ рдбреА рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдкрд░ - рд╣рдо рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рдПрд▓ рдИ рдбреА рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдЙрдирдХреА рд╕реНрдерд┐рддрд┐ рдбрд┐рд╡рд╛рдЗрд╕ рдХреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреА рд╣реИред рдпрд╣ рдбрд┐рд╡рд╛рдЗрд╕ рд╕реЗ рд░рд┐рдкреЛрд░реНрдЯ рд╕реЗ рдкрдврд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╕реНрд▓рд╛рдЗрдбрд░ рдХреЛ рдЖрдЧреЗ рдмрдврд╝рд╛рддреЗ рд╣реБрдП, рд╣рдо рдЖрдИрдбреА = 3 рдХреЗ рд╕рд╛рде рд░рд┐рдкреЛрд░реНрдЯ рднреЗрдЬрддреЗ рд╣реИрдВ рдФрд░ рд╕реНрд▓рд╛рдЗрдбрд░ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдореВрд▓реНрдпред рдЙрдкрдХрд░рдг рд░рд┐рдкреЛрд░реНрдЯ рдХреЗ 4 рдмрд╛рдЗрдЯреНрд╕ рдореЗрдВ рдЗрд╕ рдорд╛рди рдХреЛ рд▓реМрдЯрд╛рдПрдЧрд╛ред
рдХреЙрдореНрдмреЛрдмреЙрдХреНрд╕ рдореЗрдВ, рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдкрд╛рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ HID рдбрд┐рд╡рд╛рдЗрд╕ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ рдпрджрд┐ рд╣рдорд╛рд░рд╛ рдбрд┐рд╡рд╛рдЗрд╕ рдкрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЗрд╕рдХрд╛ рдирд╛рдо рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддрд╛ рд╣реИред

рдЖрдк GitHub рдкрд░ рдЕрдкрдиреА рдЬрд░реВрд░рдд рдХреА рд╕рднреА рдЪреАрдЬреЗрдВ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдХреА рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ:
рдбреАрдЯреА - рдЫрд┐рдкрд╛рдИ рд╡рд░реНрдгрдХ рдЙрдкрдХрд░рдг
tstHID-STM32F103 - рдПрдордмреНрд▓реЙрдХ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рдпреЛрдЬрдирд╛
рдпреВрдПрд╕рдмреА рдЫрд┐рдкрд╛рдИ рдкреНрд░рджрд░реНрд╢рдирдХрд╛рд░реА - рдПрд╕рдЯреА рдорд╛рдЗрдХреНрд░реЛрдЗрд▓реЗрдХреНрдЯреНрд░реЙрдирд┐рдХ рд╕реЗ рдЙрдкрдпреЛрдЧрд┐рддрд╛
HIDSTM32.exe - рдбреЗрд▓реНрдлреА рдкрд░ рдореЗрд░реЗ рдбреЗрдореЛ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдореЗрдВ рдПрдХ рд╕рдорд╛рди рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ

рдпрджрд┐ рдЖрдкрдХреЗ рдХреЛрдИ рдкреНрд░рд╢реНрди рд╣реИрдВ, рддреЛ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рд▓рд┐рдЦреЗрдВред рдореИрдВ рдЬрд╡рд╛рдм рджреЗрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ред рдореИрдВрдиреЗ рдЫреЛрдЯреА рдЪреАрдЬрд╝реЛрдВ рдХреЗ рдПрдХ рд╕рдореВрд╣ рдореЗрдВ рд╕рд╛рд░ рдХреЛ рдбреВрдмрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХреА, рддрд╛рдХрд┐ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╕рдордЭ рд╡рд┐рдХрд╕рд┐рдд рд╣реЛред рдмрд╛рдХреА рдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдХреЗ рд╕рдордЭрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдкрдХреЛ рдЬрд▓реНрджреА рд╕реЗ рдЕрдкрдиреА рдбрд┐рд╡рд╛рдЗрд╕ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдЬрдВрдЧрд▓ рдореЗрдВ рдЪрдврд╝рдиреЗ рдХрд╛ рд╕рдордп рдирд╣реАрдВ рд╣реИ - рдЖрдкрдХреЛ рдЬреЛ рдХреБрдЫ рднреА рдЪрд╛рд╣рд┐рдП, рдореИрдВрдиреЗ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рд╣реИред

PS рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдЬрдм рдХреЛрдИ рд╣реЛрд╕реНрдЯ рдкрд╛рд╡рд░ рд╕реЗрд╡рд┐рдВрдЧ рдореЛрдб рдореЗрдВ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдбрд┐рд╡рд╛рдЗрд╕ рдЙрд╕рдХреЗ рд╕рд╛рде рд╕реЛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рдЖрдк рдбрд┐рд╡рд╛рдЗрд╕ рдХреЛ рд╕реНрд▓реАрдкрд┐рдВрдЧ рдкреАрд╕реА рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рднреА рд╕реЛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕рд▓рд┐рдП, рдЕрдЧрд░ рд╣рдо рдмрд┐рдЬрд▓реА рдХреА рдЖрдкреВрд░реНрддрд┐ рдХреЛ рдбрд┐рд╡рд╛рдЗрд╕ рдореЗрдВ рдкреНрд▓рдЧ рдХрд░рддреЗ рд╣реИрдВ рдпрд╛ рдЗрд╕реЗ рдмреИрдЯрд░реА рд╕реЗ рдмрд┐рдЬрд▓реА рджреЗрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рдпрд╣ рдорд╛рдирддреЗ рд╣реБрдП рдХрд┐ рдпрд╣ рдПрдХ рдиреАрдВрдж рдкреАрд╕реА рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реИ (рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкреИрдХреЗрдЬ рдкреАрдПрд╕рдпреВ рд╕реЗ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдирд╣реАрдВ рдЖрдПрдЧрд╛)ред рдореИрдВрдиреЗ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛ рддрд╛рдХрд┐ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗрд╡рд▓ рдкреАрдПрд╕рдпреВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдкрд░ рднреА рдХрд╛рдо рдХрд░реЗред рдЗрд╕рд▓рд┐рдП, рдбрд┐рд╡рд╛рдЗрд╕ рдПрдХ рдкреАрд╕реА рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ рдФрд░ рд╕реНрд╡рд╛рдпрддреНрддрддрд╛ рд╕реЗ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред (рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдореЗрдВ рдореБрдЭреЗ рд▓рдВрдмрд╛ рд╕рдордп рд▓рдЧрд╛ред)

Source: https://habr.com/ru/post/In208026/


All Articles