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 */
四、按键检测
可以使用在线键盘测试工具来检测哪些按键被按下。参考文章:在线键盘测试
热门推荐
跨越数十年的征途:艾滋病药物研发的漫长历程与希望之光
低通电路(Low-pass circuit)
多传感器融合技术简介
成语在交流中的智慧:探讨“言”与“语”的应用与意义
日本恐怖电影《午夜凶铃》:录像带背后的恐怖真相与生存之战
新家办传奇 | 家族宪章下的和谐:霍氏豪门的“完美遗嘱”(下)
清朝晚期的衰落:多维度视角下的历史考察
如何对证据进行保全管理措施
征兵录取通知,你不可不知道的那些事儿!
一个人陷入平庸的九大心理根源
如何使用AMD显卡在本地运行大语言模型
中药的服用方法和时间有何讲究?
手术祛除和激光点痣如何选择?关于点痣,详细解答来了
青岛十大特色名小吃,品味海滨城市的独特风味
清代国家邮政的发展
解锁泰国房产投资机密:历史数据解读与高回报策略
俞敏洪反复推荐的5本好书,值得列入必读书单!
如何利用技术分析来识别股票市场的短期和长期趋势?
如果第一次去弥勒,建议直接复制这条路线
K线图应用指南:技术分析中的K线图应用
代表委员热议重塑城市发展格局
喝中药,您忌口了吗?
饭盒买什么材质的好一点?饭盒怎么选择?
尼克斯全明星赛后赛程解析:28场关键战役能否冲击东部第二?
《沙丘:预言》首播,这部前传剧能否延续经典魅力?
T细胞全家福:T细胞亚型
新婚姻法如何界定婚前财产分割
IT人的职业成长路径:从入门到行业精英
蜂王浆正确吃法及用量,饭前吃还是饭后吃?详解最佳搭配!
命理中身旺的八字特征