问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

STM32F103C8T6 USB实现键盘

创作时间:
作者:
@小白创作中心

STM32F103C8T6 USB实现键盘

引用
CSDN
1.
https://m.blog.csdn.net/m0_43559786/article/details/142777320

本文将详细介绍如何使用STM32F103C8T6微控制器通过USB实现键盘功能。通过本教程,读者将学习到如何新建工程、修改相关代码以及检测按键状态,最终实现一个简单的USB键盘。

一、新建工程

  1. 使用STM32CubeMX软件新建工程,双击选择所需内容。

  1. 在芯片选择界面找到并选择STM32F103C8T6。

  1. 进行RCC设置,选择外部高速时钟源。

  2. SYS设置如下:

  1. USB设置,勾选Device(FS),参数默认。

  1. 选择HID人机接口,参数默认;如果电脑无法识别USB,需要修改VID和PID的参数。


  1. 时钟树设置:USB最大时钟频率为48MHz。

  2. 工程管理Project Manager设置:

二、修改usbd_hid.h和usbd_hid.c

由于生成的代码默认是鼠标相关的,需要进行一些修改才能应用于键盘。

  1. 修改usbd_hid.h:
  • 将HID_EPIN_SIZE从4U修改为8U,即端点长度改为8。
  • 将HID_MOUSE_REPORT_DESC_SIZE从72U修改为63U。
  1. 修改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

  1. 添加必要的头文件和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;
  1. 添加用于传输键盘参数的数组变量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};
  1. 发送按键值到电脑:
/* 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 */

四、按键检测

可以使用在线键盘测试工具来检测哪些按键被按下。参考文章:在线键盘测试

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号