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 */
四、按键检测
可以使用在线键盘测试工具来检测哪些按键被按下。参考文章:在线键盘测试
热门推荐
盗窃罪的案件启示:如何提高居民财产安全与防范意识
艺术设计学和视觉传达设计一样吗?哪个好就业
2025年,不懂这5个标志,别开车!规则公平,轻松上路
脾虚的根本原因是什么 中医认为脾胃虚弱的根源
日柱七杀偏印偏财同柱的影响(附八字案例分析)
解析八字命理中为什么把丙火比作为太阳初升之火?
如何理解货币在经济中的作用?这种作用如何体现?
怎样通过敏锐的市场洞察力发现潜在商机?
一级代理授权书:法律实务中的重要工具与应用
律师怎样委托代理案件
我国患者约占全球40%!警惕这一“喂”出来的癌症!
“可持续时尚”二手服饰带来“循环经济”热
Visio绘制时间轴安排图的方法
SMART目标制定:引领企业迈向成功的关键之道
PPT主标题和副标题的格式设置方法
女孩好听的名字寓意好
买房怎么看周边配套好坏
具体劳动与抽象劳动:理解劳动价值论的关键概念
PLC中的大端小端
如何理解主力资金流动对股价的影响
银行的个人征信报告的错误纠正流程有哪些?
联想笔记本小新潮7000硬盘升级与维护全攻略
用什么做防水,打造无渗漏家居环境
羊肉怎么去腥味和膻味?这几个香料缺一不可,羊肉鲜香汤不膻
如何保护服务器安全?这5点一定要注意!
服务器安全维护的重要性与实施策略
新疆库车市5万余名农村学生吃上了“升级版”营养午餐
杭州东站到西湖交通指南:地铁、公交、出租车多种出行方式详解
各阶段婴儿奶量标准对照表:从0到6个月的喂养指南
汉语朗读之技巧