好了,这几天终于又开始闲下来了,继续那个键盘的项目吧,上次把键盘那边的电路设计了一下,不过,我决定改版一下,一个是无线芯片换了一下,再一个,通过了解键盘的相关协议,发现也没那么复杂,所以回头再改吧,这篇呢,先说一下如何用stm32来实现一个HID协议的键盘。
HID(Human Interface Device)是一个人机接口实现,现在的操作系统都支持HID,这使得,我们只需要根据HID的协议,我们自己指定自己的设备是什么东西,操作系统就可以把我们的设备当作什么设备进行处理,而且有个好处,不需要驱动,这样的话,真正做到直插直用。
大多数STM32的芯片都包含了一个USB接口,可以通过配置,实现创建HID设备,配置的过程可以使用CubeMX还是很方便的。本文主要参考两个文档。
https://blog.csdn.net/zhanglifu3601881/article/details/89675307
https://blog.csdn.net/hecumt/article/details/103906632
本文基于stm32f103c8t6芯片,回头会换到stm32f070f6p6(便宜。。。。。)
一、创建项目
二、修改代码
经过第一步的配置,生成的代码是可以直接运行了的,只不过此时,操作系统(win10)仍无法识别是什么设备,因为此时我们并没有指定自己的设备是什么设备,所以需要进一步进行代码修改。
/** Usb HID report descriptor. */
__ALIGN_BEGIN static uint8_t CUSTOM_HID_ReportDesc_FS[USBD_CUSTOM_HID_REPORT_DESC_SIZE] __ALIGN_END =
{
/* USER CODE BEGIN 0 */
// 0x00,
0x05, 0x01,
0x09, 0x06,
0xa1, 0x01,
0x05, 0x07, //USAGE_PAGE (Keyboard)
0x19, 0xe0, //USAGE_MINIMUM (Keyboard LeftControl)
0x29, 0xe7, //USAGE_MAXIMUM (Keyboard Right GUI)
0x15, 0x00, //LOGICAL_MINIMUM (0)
0x25, 0x01, //LOGICAL_MAXIMUM (1)
0x75, 0x01, //REPORT_SIZE (1)
0x95, 0x08, //REPORT_COUNT (8)
0x81, 0x02, //INPUT (Data,Var,Abs)
0x95, 0x01, //REPORT_COUNT (1)
0x75, 0x08, //REPORT_SIZE (8)
0x81, 0x03, //INPUT (Cnst,Var,Abs)
0x95, 0x05, //REPORT_COUNT (5)
0x75, 0x01, //REPORT_SIZE (1)
0x05, 0x80, //USAGE_PAGE (LEDs)
0x19, 0x01, //USAGE_MINIMUM (Num Lock)
0x29, 0x05, //USAGE_MAXIMUM (Kana)
0x91, 0x02, //OUTPUT (Data,Var,Abs)
0x95, 0x01, //REPORT_COUNT (1)
0x75, 0x03, //REPORT_SIZE (3)
0x91, 0x03, //OUTPUT (Cnst,Var,Abs)
0x95, 0x06, //REPORT_COUNT (6)
0x75, 0x08, //REPORT_SIZE (8)
0x15, 0x00, //LOGICAL_MINIMUM (0)
0x25, 0xFF, //LOGICAL_MAXIMUM (255)
0x05, 0x07, //USAGE_PAGE (Keyboard)
0x19, 0x00, //USAGE_MINIMUM (Reserved (no event indicated))
0x29, 0x65, //USAGE_MAXIMUM (Keyboard Application)
0x81, 0x00, //INPUT (Data,Ary,Abs)
/* USER CODE END 0 */
0xC0 /* END_COLLECTION */
};
三、编译烧录
这个都懂的吧。。。