STM32CUBEMX简单几步,DIY基于STM32的可编程USB鼠标,硬件自动化助手
STM32CUBEMX配置实现STM32 USB鼠标功能
提示:某项目需要用到可编程的USB鼠标,索性通过STM32结合STM32CUBEMX软件实现。
文章目录
- STM32CUBEMX配置实现STM32 USB鼠标功能
- 前言
- 一、下载安装
- 1.下载
- 2.安装
- 二、配置步骤
- 1.创建项目
- 2.引脚配置
- 3.时钟配置
- 4.生成代码
- 三、修改代码
- 1.向usb_device.c文件添加用户函数
- 2.在usb_device.h文件声明用户函数
- 3.向main.c文件添加测试程序
- 四、内容拓展
- 1.USB鼠标数据格式
- 2.USB接口硬件电路
前言
周所周知,嵌入式设备程序开发最为繁琐的工作莫过于各种库的编写和初始化函数的编写。STM32CubeMX(STM32 configuration and initialization C code generation)是一个图形化的工具,通过直观的可视化配置STM32初始化各项参数和功能,并且能够自动生成对应的C代码,大大提高开发效率。
对于制作一个可编程的USB鼠标,需要读懂几百页的USB协议文档才算入门,用兴趣可以通过此链接查看https://usb.org/ 。但站在巨人的肩膀上能看得更远,STM32CUBEMX软件能够帮我们把USB协议的各自库函数编写好,即使不懂USB协议也能流畅使用USB功能。
一、下载安装
1.下载
下载安装最新版本STM32CubeMX,本文使用的版本为V6.4.0,其他版本区别不大,下载链接:
https://download.csdn.net/download/XHL9434826546/75058920
(对于官网下载困难的用户可以下载,截止2022年1月发布的最新版本V6.4.0,适用于Windows平台,也可以访问官网进行下载:https://www.st.com/en/development-tools/stm32cubemx.html)
2.安装
全英文版,安装路径最后不要有任何中文,根据提示一路下一步,成功安装主界面如下:
二、配置步骤
1.创建项目
选择第一个,进入MCU选择器。
输入STM32F103C8筛选出对应的型号,点击开始项目按钮。
2.引脚配置
配置高速时钟源引脚与为外部晶振(默认8M)连接,
打开USB功能,
配置USB设备,设备名称和产品名称可以随意修改,这里默认保存不变
3.时钟配置
直接输入HCLK时钟为72,USB时钟为48,软件会自动匹配其他各个分频因子。
4.生成代码
输入项目名称,生成项目的路径(路径不能有任何中文,否则会报错),编译器类型以及最低版本
本文使用的IDE为Keil uVision V5.25.2.0
生成后直接点击打开项目
点击编译,0错误,0警告,表示生成成功。
三、修改代码
1.向usb_device.c文件添加用户函数
插入用户自定义函数,这里写了5个常用函数,分别是鼠标单击左/右/中键、鼠标滚动和鼠标移动,可根据需要添加更多函数。
/** -- Insert your external function declaration here --*/
/* USER CODE BEGIN 1 */
void Click_L()
{uint8_t buf0[4] = {1,0,0,0};uint8_t buf1[4] = {0,0,0,0};USBD_HID_SendReport(&hUsbDeviceFS,buf0,4);//按下鼠标左键HAL_Delay(10);USBD_HID_SendReport(&hUsbDeviceFS,buf1,4);//松开鼠标按键HAL_Delay(10);
}
void Click_R()
{uint8_t buf0[4] = {2,0,0,0};uint8_t buf1[4] = {0,0,0,0};USBD_HID_SendReport(&hUsbDeviceFS,buf0,4);//按下鼠标右键HAL_Delay(10);USBD_HID_SendReport(&hUsbDeviceFS,buf1,4);//松开鼠标按键HAL_Delay(10);
}
void Click_M()
{uint8_t buf0[4] = {4,0,0,0};uint8_t buf1[4] = {0,0,0,0};USBD_HID_SendReport(&hUsbDeviceFS,buf0,4);//按下鼠标右键HAL_Delay(10);USBD_HID_SendReport(&hUsbDeviceFS,buf1,4);//松开鼠标按键HAL_Delay(10);
}
void Scroll(int8_t x)
{uint8_t buf[4] = {0,0,0,0};buf[3]=x;USBD_HID_SendReport(&hUsbDeviceFS,buf,4);//鼠标滚动HAL_Delay(10);
}
void Move(int8_t x,int8_t y)
{uint8_t buf[4] = {0,0,0,0};buf[1]=x;buf[2]=y;USBD_HID_SendReport(&hUsbDeviceFS,buf,4);//鼠标移动HAL_Delay(10);
}
/* USER CODE END 1 */
2.在usb_device.h文件声明用户函数
/** -- Insert functions declaration here --*/
/* USER CODE BEGIN FD */
void Click_L();
void Click_R();
void Click_M();
void Scroll(int8_t x);
void Move(int8_t x,int8_t y);
/* USER CODE END FD */
3.向main.c文件添加测试程序
/* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */Move(100,0);//向右移动100个像素Click_R();//单击右键HAL_Delay(1000);//延时1秒Move(0,100);//向下移动100个像素Click_R();//单击右键HAL_Delay(1000);//延时1秒Move(-100,0);//向左移动100个像素Click_R();//单击右键HAL_Delay(1000);//延时1秒Move(0,-100);//向上移动100个像素Click_R();//单击右键HAL_Delay(1000);//延时1秒}/* USER CODE END 3 */
查看设备管理器,多出一个鼠标。通过测试鼠标每隔1秒在左下右上循环点击右键,验证成功。
四、内容拓展
1.USB鼠标数据格式
可以发现,定义用户函数时通过USB接口向主机发送了4个字节的数据,而不同的数据实现了不同的功能,这四个字节分别代表什么呢?
数据 | 字节1 | 字节2 | 字节3 | 字节4 |
---|---|---|---|---|
功能 | 按键状态 | 水平移动 | 垂直移动 | 滚轮滚动 |
类型 | 无符号 | 有符号 | 有符号 | 有符号 |
字节1 | bit7 | bit6 | bit5 | bit4 | bit3 | bit2 | bit1 | bit0 |
---|---|---|---|---|---|---|---|---|
为1 | 未知 | 未知 | 未知 | 未知 | 未知 | 中键按下 | 右键按下 | 左键按下 |
为0 | 未知 | 未知 | 未知 | 未知 | 未知 | 中键松开 | 右键松开 | 左键松开 |
一个字节有8位,字节1中低3位代表三个按键的状态,高5位通过实验没有发现任何功能,无法验证网上各种说法的正确性,持保留态度(实践是检验真理的唯一标准,如果有人知道这些位的作用望不吝赐教)。字节2、3、4都属于有符号数,故范围在-128~127之间。
2.USB接口硬件电路
STM32作为从机,它的USB接口工作在全速模式时需要将D+通过1.5K电阻上拉,低速模式下需要将D-通过1.5K电阻上拉。本文USB接口D+已上拉1.5K电阻。
STM32CUBEMX简单几步,DIY基于STM32的可编程USB鼠标,硬件自动化助手相关推荐
- 最简单DIY基于STM32单片机的WIFI智能小车设计方案
STM32库函数开发系列文章目录 第一篇:STM32F103ZET6单片机双串口互发程序设计与实现 第二篇:最简单DIY基于STM32单片机的蓝牙智能小车设计方案 第三篇:最简单DIY基于STM32F ...
- 最简单DIY基于STM32单片机的蓝牙智能小车设计方案
STM32库函数开发系列文章目录 第一篇:STM32F103ZET6单片机双串口互发程序设计与实现 第二篇:最简单DIY基于STM32单片机的蓝牙智能小车设计方案 文章目录 STM32库函数开发系列文 ...
- 最简单DIY基于STM32的远程控制电脑系统②(无线遥杆+按键控制)
STM32库函数开发系列文章目录 第一篇:STM32F103ZET6单片机双串口互发程序设计与实现 第二篇:最简单DIY基于STM32单片机的蓝牙智能小车设计方案 第三篇:最简单DIY基于STM32F ...
- 最简单DIY基于STM32的远程控制电脑系统①(电容触摸+按键控制)
STM32库函数开发系列文章目录 第一篇:STM32F103ZET6单片机双串口互发程序设计与实现 第二篇:最简单DIY基于STM32单片机的蓝牙智能小车设计方案 第三篇:最简单DIY基于STM32F ...
- 基于arduino的光控窗帘_分别基于STM32和Arduino的智能窗帘硬件分析与程序设计
这是在学校参加兴趣小组做的设计,分别用了STM32板和Arduino去实现 附件里面有源码内容和具体的软硬件分析,里面也有图片内容. 设计方案 基于Arduino的硬件设计: 所需元器件:Arduin ...
- 简单几步DIY属于自己的IAR工具栏
关注.星标公众号,不错过精彩内容 作者:strongerHuang 微信公众号:strongerHuang 对于开发工具,有的朋友喜欢使用快捷键进行操作,而有的朋友喜欢使用快捷按钮做一些操作. 本文给 ...
- 基于STM32的CAN转USB模块的PCB设计
1. 项目的文件结构 设计PCB项目时,文件结构主要分为四个模块 第一个文件夹用来存放设计PCB时用到芯片的数据手册. 第二个文件夹用来存放设计PCB时用到的参考设计,包括所用芯片最小系统电路图,各种 ...
- 《基于STm32的智能手环项目》笔记
Q1.本科期间做过什么科研项目/竞赛?具体负责什么?做出了什么成果?是否获得什么荣誉奖项?(简单介绍一下<基于STM32智能手环>课程设计?) 项目经历:本科课程设计做过一个<基于S ...
- 智能垃圾桶c语言程序,『免费开源』基于STM32的智能垃圾桶之语音播报
大家好,我是『芯知识学堂』的SingleYork,前面给大家简单介绍了<基于STM32的智能垃圾桶之成员简介>和<基于STM32的智能垃圾桶之语音识别>,今天笔者将要给大家介绍 ...
最新文章
- 在Javascript中使用面向对象的编程
- java socket 工具_java+socket 简易聊天工具
- 硬件语言编写规范与技巧
- [LeetCode] Move Zeroes - 整数数组处理问题
- Http实现文件下载
- “任何人请你去他家吃饭,都别空着手去“怎么看待这句话?
- 启动virt-manager报错:Failed to open /var/lib/dbus/machine-id
- html mysql 数据列表_html的列表加载数据库
- Linux信号量详解
- pcm2wav matlab,matlab输出pcm格式文件
- 【目标检测】SSD: Single Shot MultiBox Detector 模型fine-tune和网络架构
- python 语义similarity_GitHub - samelltiger/word_similarity: 基于《知网》的语义相似度计算 python2.7 API...
- 520. Detect Capital
- 关于Spark Steaming中的Processing Time/Total Delay/Processing Delay
- 2021年,从事数据分析行业前景如何?还能转行数据分析师吗?(上)
- java什么是monitor和Monitor监视器锁、对象布局
- 云计算平台 python_云计算开发 python
- 【牛客刷题】SQL专项错题记录三
- 基因对疾病的影响规律--读论文
- aec java ios_Java並發編程之原子操作類
热门文章
- 10分钟从零搭建QQ机器人,实现自动回复、推送等功能
- 织梦DedeCMS添加百度分享代码的最简单方法
- git获取代码,拉取最新代码,更新代码等
- 如何查看JAVA进程CPU占用100%的原因
- 微信商户转账到个人银行卡(Java)开发
- python爬取京东商品价格教科书中文版_Python爬虫,京东商品详情爬取!
- 非相干散射雷达数据(ISR)及电离层GNSS-TEC数据下载(madrigal数据库)
- 《程序员养成记》第8集 数据结构才是程序的灵魂
- python点击屏幕坐标_通过Python,如何获取鼠标在屏幕上的X、Y轴坐标点
- 键盘操作电脑,速度更快!