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 */
四、按键检测
可以使用在线键盘测试工具来检测哪些按键被按下。参考文章:在线键盘测试
热门推荐
海口16条路内临时停车位标识已整改!免费停放时间延长。
如何划分城市的线级?这些划分标准如何影响城市发展?
墙面油漆重新(刷墙漆的步骤)
口吃怎么治疗最好方法
探究冰草和穿心莲的生长特点与应用价值(从外形特征到生态习性)
冰菜要怎么吃?
肠易激综合征平时吃什么食物好
邵阳至成都高铁、飞机及自驾完整时间指南:详析不同交通方式所需时长
打野城市猎人犯法吗?法律解读与实务分析
三天去青春痘的小妙招
超详细!北京7大火车站出行指南!
马恩河战役中,法军20万人伤亡,而原因竟是军服颜色过于鲜艳
法国陆军军服:从波旁王朝到大革命的历史演变
安史之乱的历史影响及后续事件
摩托车骑行攻略:从新手到高手,安全与健康同行之旅
在线定制OpenWrt固件后如何恢复出厂设置
自学心理学怎么开始呢?
萨摩耶皮肤上有黑斑怎么办?原因分析与处理方法
边界感的定义:如何建立健康的人际关系界限
2025年十大热门高薪专业排名及就业前景分析
什么是纯净水?纯净水和矿泉水哪个更健康?
系统架构师常用的工具和软件
退休办理指南:所需材料、流程及注意事项
头痛头晕的原因和治疗方法
深圳今年力争开通6条新线,城市轨道交通线路长度将增至634.6公里
深圳城市轨道交通线网密度继续领跑全国
治疗汗疱疹方法有哪些
胃病如何注意饮食
图鉴 | 昌平永安城的前世今生
苞谷种植时间是什么时候 苞谷如何种植