使用CubeMX软件傻瓜式的配置,一键生成USB的HID驱动。
一、USB鼠标
1、CubeMX配置
①、选择相对应的芯片
②、配置时钟和Debug和debug
③、配置USB
④、生成代码
最好把这个也勾上,勾上以后每个外设配置不再都给你塞到main.c里,而是建一个.c.h,这样感觉舒服多了
2、编写应用层代码
USB协议还是挺复杂的,原理和底层我也搞不清楚,这东西也不是看几篇文章学个一两天就能搞明白的,我写这个也主要是为了好玩,没有深层去理解。
我们用的鼠标主要就四个属性:键位(左键、右键、中键),左右移动、上下移动、滑轮
这四个属性用一个长度为4的数组一并包含进来:
/*
*MouseData[0]:低0位:左键 低1位:右键 低2位:中键
*MouseData[1]:1~127:右 --127~-1:左
*MouseData[2]:1~127:下 --127~-1:上
*MouseData[3]:1~127:上 --127~-1:下 (滑轮)
*/
char MouseData[4] = {0, 0, 0, 0};
发送这些信息用这个函数:
USBD_HID_SendReport(&hUsbDeviceFS,(uint8_t*)&MouseData,sizeof(MouseData));
主要代码:
memcpy(MouseDataT, MouseData, sizeof(MouseData));
key = KEY_Scan(1); //支持连续按下
switch(key)
{
case KEY0_PRES:
MouseData[0] |= 0x01;
break;
case KEY1_PRES:
MouseData[1] = 21;
break;
case WKUP_PRES:
MouseData[3] = -12;
break;
default:
MouseData[0] = 0;
MouseData[1] = 0;
MouseData[2] = 0;
MouseData[3] = 0;
}
//如果有变化,发送
if(MouseData[0]!=MouseDataT[0]||MouseData[1]!=MouseDataT[1]||MouseData[2]!=MouseDataT[2]||MouseData[3]!=MouseDataT[3])
{
USBD_HID_SendReport(&hUsbDeviceFS,(uint8_t*)&MouseData,sizeof(MouseData));
}
二、USB键盘
1、CubeMX配置同鼠标,这里不啰嗦了
2、在mouse的基础上修改为keyboard的
参考:基于STM32CUBE的USB键盘例程 | MCU起航 (mcublog.cn)
主要就是以下几点:
①、鼠标描述符换成键盘描述符,描述符大小也要改变
②、接口协议
③、端点发送的数据包长度
④、增加一个输出端点描述符 (按我的理解是,可以返回键盘指示灯的状态的,尝试了很久,还是不知道怎么返回,)
3、应用程序
/*
*keyBoardData[0]:特殊键
*keyBoardData[1]:预留
普通按键可以一起按下 4:a
*keyBoardData[2]:
*keyBoardData[3]:
*keyBoardData[4]:
*keyBoardData[5]:
*keyBoardData[6]:
*keyBoardData[7]:
*/
u8 keyBoardData[8] = {0,0,0,0,0,0,0,0};
extern USBD_HandleTypeDef hUsbDeviceFS;
static void keyboard_key_test()
{
u8 keyBoardDataEmpty[8] = {0,0,0,0,0,0,0,0};
u8 key = KEY_Scan(1); //支持连续按下
switch(key)
{
case KEY0_PRES:
keyBoardData[2] = 4;
break;
case KEY1_PRES:
keyBoardData[2] = 5;
break;
case WKUP_PRES:
keyBoardData[2] = 6;
break;
default:
keyBoardData[2] = 0;
}
USBD_HID_SendReport(&hUsbDeviceFS,(uint8_t*)&keyBoardData,sizeof(keyBoardData));
HAL_Delay(15);
USBD_HID_SendReport(&hUsbDeviceFS,(uint8_t*)&keyBoardDataEmpty,sizeof(keyBoardDataEmpty));
HAL_Delay(15);
}
三、程序代码
代码我已上传
期待有伙伴能解决我的疑惑
mouse DEMO:
keyboard DEMO: