基于STM32的USB键盘

这篇具有很好参考价值的文章主要介绍了基于STM32的USB键盘。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、STM32CubeMX配置

1、选择相应芯片(本文使用STM32F070F6P6)

基于STM32的USB键盘,stm32,嵌入式硬件,单片机

2、RCC时钟配置和Debug设置

基于STM32的USB键盘,stm32,嵌入式硬件,单片机

基于STM32的USB键盘,stm32,嵌入式硬件,单片机

注:这里的PA9/10要重映射为PA11/12供USB接口使用(大部分芯片是分开的不用设置)

3、配置USB

基于STM32的USB键盘,stm32,嵌入式硬件,单片机

基于STM32的USB键盘,stm32,嵌入式硬件,单片机

注:这里的PID和VID默认就可以了(多设备时可以更改)

4、时钟配置

基于STM32的USB键盘,stm32,嵌入式硬件,单片机

二、应用层代码编写

1、修改usbd_hid.c文件

①、修改USBD_HID_CfgFSDesc参数

基于STM32的USB键盘,stm32,嵌入式硬件,单片机

首先长度,跳转至定义修改为41U(之前是34U)

基于STM32的USB键盘,stm32,嵌入式硬件,单片机

端点数1改为2,接口协议2(鼠标)改为1(键盘),报告描述符长度重定义为HID_KEYBOARD_REPORT_DESC_SIZE    63U

基于STM32的USB键盘,stm32,嵌入式硬件,单片机

最后配置集合中增加一部分端点描述符(添加到末尾),因为USB键盘对主机来说,不光有输入,还有输出。所以,增加的这部分端点描述符,用来描述输出

②、修改USBD_HID_Desc描述符长度

基于STM32的USB键盘,stm32,嵌入式硬件,单片机

③、把USB鼠标的报告描述符删掉,换成USB键盘的报告描述符

__ALIGN_BEGIN static uint8_t HID_KEYBOARD_ReportDesc[HID_KEYBOARD_REPORT_DESC_SIZE]  __ALIGN_END =
{
    0x05, 0x01,                    // USAGE_PAGE (Generic Desktop)
    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
};

④、修改USBD_HID_Setup函数

基于STM32的USB键盘,stm32,嵌入式硬件,单片机

2、main编写

①、添加头文件和句柄

#include "usbd_hid.h"

extern USBD_HandleTypeDef hUsbDeviceFS;

②、数据包分析

/*
    *keyBoardData[0]:特殊键D0:Ctrl D1:Shift D2:Alt
    *keyBoardData[1]:预留
    普通按键可以一起按下(从0x04开始对应的按键为a)
    *keyBoardData[2]:
    *keyBoardData[3]:
    *keyBoardData[4]:
    *keyBoardData[5]:
    *keyBoardData[6]:
    *keyBoardData[7]:
  */

③、USB发送数据

USBD_HID_SendReport(&hUsbDeviceFS,(uint8_t*)&keyBoardData,sizeof(keyBoardData));

3、下面是笔者实现Ctrl+C/V键盘代码逻辑

uint8_t keyBoardData[8] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
uint8_t keyBoardDataEmpty[8] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};


extern USBD_HandleTypeDef hUsbDeviceFS;
extern struct KEY key; 


static void keyboard_key_test(void)
{
    memset(keyBoardData, 0x00, sizeof(keyBoardData));
    key_scan(1);   //支持连续按下
    if(key.key0 == 1)
    {
        keyBoardData[0] = 0x01;     //ctrl
    }
    if(key.key1 == 1)
    {
        keyBoardData[2] = 0x06;     //C
    }
    if(key.key2 == 1)
    {
        keyBoardData[2] = 0x19;     //V
    }
    USBD_HID_SendReport(&hUsbDeviceFS,(uint8_t*)&keyBoardData,sizeof(keyBoardData));
    HAL_Delay(15);
}


int main(void)
{
    HAL_Init();
    SystemClock_Config();
    MX_GPIO_Init();
    MX_USB_DEVICE_Init();
    while (1)
    {
        keyboard_key_test();
    }
}

4、代码开源

链接:https://pan.baidu.com/s/1TK_te2Yv031mls00Ue1Vnw

提取码:9icj文章来源地址https://www.toymoban.com/news/detail-774554.html

到了这里,关于基于STM32的USB键盘的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • stm32毕设分享 基于stm32的便携用电功率统计系统 -物联网 嵌入式 单片机

    🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。 为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天

    2024年02月22日
    浏览(58)
  • 嵌入式毕设分享 基于单片机的风速测量系统 - 物联网 嵌入式 stm32 arduino

    🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。 为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天

    2024年02月20日
    浏览(64)
  • 嵌入式毕设分享 基于单片机的智能音响设计与实现 -物联网 嵌入式 stm32

    🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。 为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天

    2024年02月22日
    浏览(58)
  • 【项目设计】基于STM32人脸识别系统 - 单片机 物联网 嵌入式

    项目设计主要是对于所学知识的整体回顾,需要结合各个学科,才能做出达到符合标准的设计。 文章的目的在分享优质的项目以及项目经验,提供设计思路,欢迎交流与指正不足之处。 由于人脸识别技术具有无需接触、安全性高、可靠性高等优点,在身份认证领域具有广阔

    2024年01月21日
    浏览(62)
  • 嵌入式-Stm32-江科大基于标准库的GPIO通用输入输出口

    (推荐先看文章:《 嵌入式-32单片机-GPIO推挽输出和开漏输出》) 下文图都是从参考手册借阅:STM32F10xxx(中文),大概页数是110/775左右 GPIO (General Purpose Input Output)通用输入输出口 可配置为8种输入输出模式 引脚电平:0V~3.3V,部分引脚可容忍5V(有FT标识) 输出模式 下可控

    2024年01月17日
    浏览(56)
  • 嵌入式-Stm32-江科大基于标准库的GPIO的八种模式

    (推荐先看文章:《 嵌入式-32单片机-GPIO推挽输出和开漏输出》) 下文图都是从参考手册借阅:STM32F10xxx(中文),大概页数是110/775左右 GPIO (General Purpose Input Output)通用输入输出口 可配置为8种输入输出模式 引脚电平:0V~3.3V,部分引脚可容忍5V(有FT标识) 输出模式 下可控

    2024年01月20日
    浏览(48)
  • 嵌入式-stm32-基于HAL库的感应开关盖垃圾桶项目(开源)

    网盘资料: 《嵌入式-stm32-基于HAL库的感应开关盖垃圾桶项目(开源)》 链接:https://pan.baidu.com/s/1kFk09nMKPDvLwIUqMT9q3w 提取码:og66 –来自百度网盘超级会员V6的分享 一:项目概述 二:材料准备 三:细节分析(重点) 四:Stm32CubeMx操作步骤以及实现细节 五:Keil5业务逻辑代码编

    2024年02月03日
    浏览(61)
  • 嵌入式-Stm32-江科大基于标准库的GPIO4个小实验

    核心:本文共4个小实验: 第一个:LED灯闪烁 第二个:LED流水灯 第三个:按键控制LED 第四个:光敏传感器控制蜂鸣器 1.1 LED、蜂鸣器、面包板 LED:发光二极管,正向通电点亮,反向通电不亮。 有源蜂鸣器(本实验):内部自带振荡源,将正负极接上直流电压即可持续发声,频

    2024年01月21日
    浏览(61)
  • STM32G431RB--基于HAL库(蓝桥杯嵌入式赛前梳理)

    明天就进行蓝桥杯的比赛了,最后一天再重新梳理一下各个模块的使用和代码的编写。 如果各个模块的MX配置是根据我之前发的来的,那么这篇文章中的代码完全适用;如不是,原理部分也是相同的,代码部分适用,可以自行判断,作为一个参考。 引脚: 1.控制LED灯亮灭时需

    2023年04月08日
    浏览(93)
  • 毕设开源 基于stm32的智能平衡小车 - 单片机 物联网嵌入式

    文章目录 0 前言 1 项目背景 2 设计思路 3 硬件设计 4 软件设计 4.2 直立控制程序设计 4.3 速度控制程序设计 4.4 方向控制程序设计 4.5 关键代码 5 最后 🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这

    2024年02月22日
    浏览(60)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包