| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 嵌入式 -> YIE002开发探索09-USB(HID双向通信) -> 正文阅读 |
|
[嵌入式]YIE002开发探索09-USB(HID双向通信) |
(请保留-> 作者: 罗冰 https://blog.csdn.net/luobing4365) YIE002开发探索之USB(HID双向通信)编写《UEFI编程实践》的时候,为了演示如何在UEFI下访问USB HID设备,我使用了正点原子的探索者F4开发板,做了一个双向通信的HID设备。随后考虑到版权问题,觉得还是不要放到书中较好。 毕竟书是需要出版的,而探索者F4的HID代码是在正点原子的USB代码上修改的。因此自己弄了个YIE002开发板,重新做了个HID设备。 以上的过程,在UEFI开发探索的系列博客中都写过,相关的代码也贴出过。 本篇所做的工作,是使用STM32 Cube MX重写USB代码,实现双向通信的HID设备。 1 YIE002上的USBYIE002上使用的主芯片为STM32F103C8T6,它自带了USB,不过只能用作设备,不能作为主机使用。 USB 发展到现在已经有 USB1.0/1.1/2.0/3.0/4.0 等多个版本。目前用的最多的就是 USB1.1 (比如大部分的USB键鼠)和USB2.0、 USB3.0。实际上USB2.0也基本上接近淘汰,常见的USB设备基本都是USB3.0设备了。STM32F103 自带的 USB 符合 USB2.0 规范。 STM32F103的单片机自带USB从控制器,PC主机和单片机在传输时,是通过共享一个专用的数据缓冲区来完成的。缓冲区的大小由所用的端到数目和每个端到最大的数据分组决定,每个端点最大可使用512字节缓冲区,最多可用于16个单向或8个双向端点。 USB 模块同 PC 主机通信,根据 USB 规范实现令牌分组的检测,数据发送/接收的处理,和握手分组的处理。整个传输的格式由硬件完成,其中包括 CRC 的生成和校验。每个端点都有一个缓冲区描述块,描述该端点使用的缓冲区地址、大小和需要传输的字节数。 USB 的中断映射单元:将可能产生中断的 USB 事件映射到三个不同的 NVIC 请求线上: 如图1所示,给出了USB设备框图。 在之前UEFI开发探索的系列博客中,对USB相关的知识介绍很多了,具体可以参考UEFI开发探索的81至85篇。其中也描述了如何在STM32提供的官方示例上,使用Legacy Library编写HID设备的过程。 UEFI开发探索85中,谈到了ST官方提供的USB开发库。对于STM32F1系列的单片机,也提供了相应的USB的Cube Library。之前几篇开发的例程中,在查看STM32CubeF1库代码的时,也能看到对应的支持USB部分的代码。 下面开始进入实现USB HID双向通信设备的实践部分。 2 YIE002-STM32的USB编程(HID双向通信)与UEFI开发探索85篇一样,我们准备实现对应三种通信方式的HID设备,也即对应上位机的下述三种通信方式: 实际编程过程如下。 2.1 USB HID的Cube MX图形配置首先在Pinout&Configuration栏的Connectivity下的USB项中,勾选“Device(FS)”选择框,打开对USB全速设备的支持。 然后在Middleware下的USB_DEVICE项中,修改对应的选项值。如图2所示。 选择USB设备为“Custom Human Interface Device Class(HID)”,再对参数设置和设备描述符相应的项进行修改。我所设置的报表描述符为33字节,PC主机和HID设备传输数据包设置为16字节,可以根据自己的需求修改这些值。 最后对时钟树进行调整,USB的时钟频率为48MHz,如图3所示。 完成上述工作后,点击GENERATE CODE按钮,生成代码。 2.2 添加应用代码编写代码的步骤如下。 1)添加报表描述符,修改传输数据包大小在源文件usbd_custom_hid_if.c中,修改报表描述符如下:
修改头文件usbd_customhid.h中对应传输数据包的大小:
2)添加USB通信所需要的全局变量在main.c中,添加对头文件usbd_customhid.h的包含,后续需要用到相关的函数。并在main.c的USER CODE BEGIN 0处,添加USB通信所需要的全局变量。
3)读文件和写文件的方式修改源文件usbd_custom_hid_if.c中的函数CUSTOM_HID_OutEvent_FS(),内容如下:
以上是对上位机发送数据的接收,下面实现设备对主机发送数据的功能。在主程序main()中添加如下代码:
USBD_CUSTOMHID_OUTREPORT_BUF_SIZE是在图形界面中设定的传输数据包大小,也即16,它定义在usbd_conf.h中。 这就实现了对应上位机读文件和写文件的方式。 4)Input Report&Output Report的方式,以及Feature Report方式Cube Library中没有提供相应的接口,这部分的代码实现,必须去修改原始的类命令处理。在usbd_customhid.c中,修改函数USBD_CUSTOM_HID_Setup(),内容如下:
也即对类命令SET_REPORT和GET_REPORT进行处理,并对发送过来的类命令进行了相应的分析,以对应不同的上位机访问方式。 具体细节就不一一分析了,可对照UEFI开发探索84篇中的类命令,对代码进行阅读。 至此,就完成了所有应用代码的编写了。 2.3 测试将代码编译后,下载到YIE002开发板中。可使用之前我开发的HID通信的测试工具UsbHID进行测试(UEFI开发探索74篇附带的测试工具)。如图4所示。 完成了上述实验后,下一篇将使用现在的代码,构建一个随机数生成设备。 |
|
嵌入式 最新文章 |
基于高精度单片机开发红外测温仪方案 |
89C51单片机与DAC0832 |
基于51单片机宠物自动投料喂食器控制系统仿 |
《痞子衡嵌入式半月刊》 第 68 期 |
多思计组实验实验七 简单模型机实验 |
CSC7720 |
启明智显分享| ESP32学习笔记参考--PWM(脉冲 |
STM32初探 |
STM32 总结 |
【STM32】CubeMX例程四---定时器中断(附工 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/25 20:44:16- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |