STM32F103C8T6 USB实现键盘
创作时间:
作者:
@小白创作中心
STM32F103C8T6 USB实现键盘
引用
CSDN
1.
https://m.blog.csdn.net/m0_43559786/article/details/142777320
本文将详细介绍如何使用STM32F103C8T6微控制器通过USB实现键盘功能。通过本教程,读者将学习到如何新建工程、修改相关代码以及检测按键状态,最终实现一个简单的USB键盘。
一、新建工程
- 使用STM32CubeMX软件新建工程,双击选择所需内容。
- 在芯片选择界面找到并选择STM32F103C8T6。
进行RCC设置,选择外部高速时钟源。
SYS设置如下:
- USB设置,勾选Device(FS),参数默认。
- 选择HID人机接口,参数默认;如果电脑无法识别USB,需要修改VID和PID的参数。
时钟树设置:USB最大时钟频率为48MHz。
工程管理Project Manager设置:
二、修改usbd_hid.h和usbd_hid.c
由于生成的代码默认是鼠标相关的,需要进行一些修改才能应用于键盘。
- 修改usbd_hid.h:
- 将HID_EPIN_SIZE从4U修改为8U,即端点长度改为8。
- 将HID_MOUSE_REPORT_DESC_SIZE从72U修改为63U。
- 修改usbd_hid.c:
- 在USBD_HID_CfgFSDesc函数中,将0x02改为0x01(0=none, 1=keyboard, 2=mouse)。
- 修改HID_MOUSE_ReportDesc函数中的报告描述符,将鼠标描述符替换为键盘描述符:
0x05, 0x01, // USAGE_PAGE (Generic Desktop) //63
0x09, 0x06, // USAGE (Keyboard)
0xa1, 0x01, // COLLECTION (Application)
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, 0x08, // 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, 0x65, // LOGICAL_MAXIMUM (101)
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)
0xc0, // END_COLLECTION
三、修改main.c
- 添加必要的头文件和USB设备句柄:
/* USER CODE BEGIN Includes */
#include "usbd_hid.h"
/* USER CODE END Includes */
/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
/* USER CODE END PTD */
/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD */
/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */
/* USER CODE END PM */
/* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN PV */
extern USBD_HandleTypeDef hUsbDeviceFS;
- 添加用于传输键盘参数的数组变量buffer,以及用于清空按键的数组变量buffer_0:
/*
* buffer[0] - bit0: Left CTRL
* -bit1: Left SHIFT
* -bit2: Left ALT
* -bit3: Left GUI
* -bit4: Right CTRL
* -bit5: Right SHIFT
* -bit6: Right ALT
* -bit7: Right GUI
* buffer[1] - Padding = Always 0x00
* buffer[2] - Key 1
* buffer[3] - Key 2
* buffer[4] - Key 3
* buffer[5] - Key 4
* buffer[6] - Key 5
* buffer[7] - Key 6
*/
uint8_t buffer[8] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
uint8_t buffer_0[8] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
- 发送按键值到电脑:
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
buffer[2] = 0x04; //a
buffer[3] = 0x05;
buffer[4] = 0x06;
buffer[5] = 0x1C;
buffer[6] = 0x1D;
USBD_HID_SendReport(&hUsbDeviceFS, buffer, 8); //send
HAL_Delay(20); //delay
USBD_HID_SendReport(&hUsbDeviceFS, buffer_0, 8);
HAL_Delay(1000);
}
/* USER CODE END 3 */
四、按键检测
可以使用在线键盘测试工具来检测哪些按键被按下。参考文章:在线键盘测试
热门推荐
牛奶开启后可以放多久 1升牛奶开了怎么保存
文化中国行感受春分节气 探寻千年智慧与和谐之美
文化中国行感受春分节气 探寻千年智慧与和谐之美
中国法律七大类有哪些
Android中AIDL的使用详解+实例(源码)
辽宁男篮进前4希望不大,保5争6最务实,避免跌入附加赛下半区
山东女子花3万元把车库改成住房,装修好给婆婆住,但网友看后却“炸锅”了
夫妻关系信任修复:四种心理学方法助你重建情感联结
离婚财产调查令申请书怎么写?法院调查取证申请书范例
三尖瓣轻度反流怎样调理
数据库如何实现原子性
开发宝宝大脑的游戏:照镜子
我到底是谁?自我意识的本质到底是什么?
长痱子就要用痱子粉?
狗狗对主人的喜爱之道(探索狗狗喜欢主人的行为和情感)
科目一考试流程及注意事项(科目一考试须知)
狗狗髋关节问题如何处理?有效治疗方法有哪些?
解放战争为何要先打内线后打外线?邓公的解释让大家信服
南京长江大桥铁路桥开启“集中修”
为什么晒掉色?长时间暴晒对衣物、帽子和皮革的危害及防护措施
浙江教育观察:如何培养新时代复合型特殊教育教师?
服务器如何增加内存?提升内存的方法有哪些?
密码基础(序列密码算法-付ZUC算法详解)
买车是去4S店还是汽贸店?为什么汽贸店的价格便宜?有什么猫腻吗
人民大学开发智慧职业发展中心平台,用AI技术助力学生就业
女孩叫芊芊是什么意思?芊字最适合什么属相的人
硫酸亚铁的使用方法及用量?
画春天的景色怎么画:新手入门技巧及创作灵感!
根除皮肤病的有效策略:专业治疗与健康生活方式结合的重要性
华三SSL VPN基础配置教程