一、背景

项目用到单片机采集模拟量数据,原先使用USB转串口,速度嫌慢,还要转串口芯片,电脑还要安装驱动,现更改为采用USB的HID类来传输。

二、单片机选型

STM32F103的USB接口简单易用,且有STM32CubeMx代码生成器,非常方便,可惜芯片越来越贵。本次转用国产替代品沁恒CH32F103C8T6,价格比51还便宜,这家做USB多年,值得尝试。

三、开发过程

(一)阅读相关资料:

1. 关于CH32F103与STM32F103在USB接口上的差异与使用

https://blog.csdn.net/CAImoontion/article/details/112565011

2.USB HID报告描述符教程

https://zhuanlan.zhihu.com/p/27568561

(二)硬件准备

沁恒原厂开发板。USB接口方面有USBHD和USBD两种,均是从芯片引脚直接引出到TYPE-C的USB座,没有任何上拉、下拉电阻。

(三)编程

1. 学习沁恒官方开发包自带的USB例程。里面没有HID相关示例。将自带的一个示例下载到板子后,电脑并没有识别出硬件,看了一下代码说明,可能需要安装相关驱动,并使用特定上位机程序才可以通信。放弃此示例。

2. 参看《关于CH32F103与STM32F103在USB接口上的差异与使用》一文,此芯片的USBD与STM32的USBD寄存器等完全兼容,于是想到,用STM32的现有成熟代码编好程序,再移植过来。

(1)使用STM32CubeMx,设置时钟树,确保USB时钟为48M,选择usb中间库,配置相关参数,生成代码。

(2)安装官方提供的器件描述文件,打开上一步骤生成的KEIL工程,在配置中更改芯片型号,添加flash算法文件,更改调试为DAP方式。

(3)设置官方DAP调试下载器。将TX和RX引脚短路,插入USB接口,蓝灯常亮,表示进入ARM模式。

(4)下载程序成功。但没有成功,电脑没有反应,未检测到USB设备。

(5)反复排查,阅读官方快速应用手册,得知:虽然此芯片内置上下拉电阻,但是上电默认是没打开的,估计这是为了彻底兼容STM32。按手册上的说法,要设置新增的寄存器。经查询,参考官方其它例程,在main函数前方代码中加入:

typedef struct
{
__IO uint32_t EXTEN_CTR;
} EXTEN_TypeDef;
#define EXTEN_BASE ((uint32_t)0x40023800)
#define EXTEN ((EXTEN_TypeDef *) EXTEN_BASE)
#define EXTEN_USBD_PU_EN ((uint32_t)0x00000002)

在main函数中初始化USB设备后,加入

(EXTEN->EXTEN_CTR) |= EXTEN_USBD_PU_EN;

这样就使能了内部电阻。

(6)下载程序,电脑可以发现设备,但认为是鼠标。正常,因为CUBEMx里面配置的是鼠标,需要改各种描述符。

(7)利用HID描述符生成软件DT.exe,生成joystick类型的报告描述符,仅保留油门,删除里面不需要的usage_page,只保留1个就行。

USAGE_PAGE (Generic Desktop)    05 01
LOGICAL_MINIMUM (0) 15 00
USAGE (Joystick) 09 04
COLLECTION (Application) A1 01
USAGE_PAGE (Simulation Controls) 05 02
USAGE (Throttle) 09 BB
LOGICAL_MINIMUM (0) 15 00
LOGICAL_MAXIMUM (255) 26 FF 00
REPORT_SIZE (8) 75 08
REPORT_COUNT (8) 95 08
INPUT (Data,Var,Abs) 81 02
END_COLLECTION C0

(8)将上述数据填入HID_MOUSE_ReportDesc,删掉原来的数据,得到

__ALIGN_BEGIN static uint8_t HID_MOUSE_ReportDesc[HID_MOUSE_REPORT_DESC_SIZE]  __ALIGN_END =
{
0x05, 0x01,
0x15, 0x00,
0x09, 0x04, 0xA1, 0x01,
0x05, 0x02,
0x09, 0xBB,
0x15, 0x00,
0x26, 0xFF, 0x00,
0x75, 0x08,
0x95, 0x08,
0x81, 0x02,
0xC0
};

编译下载,电脑可以识别,但是属性框里显示“报告描述符中找到未知项目”,说明报告描述符有问题。但仔细观察第(7)步数据,没发现问题。

联系代码上下文,发现上述数组中 HID_MOUSE_REPORT_DESC_SIZE 应该修改,否则还是之前自动生成前的数组大小,找到后修改为当前数组大小,编译下载,电脑识别成功,在【控制面板】>【设备和打印机】中找到设备,右键菜单中点击游戏控制器设置,点击属性,可以看到测试页,有油门的数据条。

(9)在单片机中继续编程,输出数据。在上位机中利用前面获取罗技方向盘的代码模块,获取应用数据。

四、后记

整个过程耗时一天,应该说还是挺顺利的。不过本次USBHD的功能没有得到测试,这个就不能通过STM32CUBEMx的方式来编程了,只能使用官方提供的函数库,这个要留待后面测试。

CH32F103C8T6的USB开发(一)的更多相关文章

  1. usb开发

    usb开发 USB HID报告及报告描述符简介 LibUSB通过SetReport()请求与USBHID设备通信 libusb开发者指南 USB枚举和HID枚举实例 USB命令 BusHound数据分 ...

  2. USB开发库STSW-STM32121文件分析(转)

    源: USB开发库STSW-STM32121文件分析

  3. Android USB 开发详解

    Android USB 开发详解 先附上 Android USB 官方文档 Android通过两种模式支持各种 USB 外设和 Android USB 附件(实现Android附件协议的硬件):USB ...

  4. USB开发——内核USB驱动+libusb开发方法

    linux内核已经具备usb驱动,所以一些设备使用可以免驱,libusb是针对linux内核中ubs驱动的一套api,会自行调用usb驱动接口,并为应用提供api接口,将usb设备开发减少为应用层开发 ...

  5. usb开发笔记

    U盘应属于海量存储类. USB海量存储设备,又包括通用海量存储子类,CDROM,Tape等,U盘实际上属于海量存储类中通用海量存储子类.通用海量存储设备实现上是基于块/扇区存储的设备. USB组织定义 ...

  6. USB开发库文件分析

    stm32f10x_it.c: 该文件中包含 USB 中断服务程序,由于 USB 中断有很多情况,这里的中断服务程序只是调用 usb_Istr.c 文件中的 USB_Istr 函数,由 USB_Ist ...

  7. 几篇很有用的USB开发资料

    1,USB描述符详解:http://blog.csdn.net/alien75/article/details/4622319 2,一种嵌入式USBMiniHost系统设计与实现:http://www ...

  8. USB开发库STSW-STM32121文件分析

    hw_config.c: 该文件中包含系统配置的函数. usb_desc.c:各种描述符 usb-endp.c:就两个函数分别处理端点1的IN和端点2的OUT. usb_istr.c: 该文件中只有一 ...

  9. 一步一步教你简单完成 Android USB开发

    项目中有一个新的需求,要求可以连接一个USB体温枪,APP可以从体温枪中读取到体温数据,一番搜寻之后发现一个封装很棒的USB通信库. github地址:usb-serial-for-android 准 ...

  10. STM32 USB开发(三) 基于F105RBT6核心板开发的自定义HID收发(FS)

    硬件设计 该核心板的USB插口有两个,一个是用于USB Slave的,可以用来做HID设备,把模拟STM32模拟为U盘等:另一个是USB Host设备,可以对插上的U盘的数据进行读写. 图中J2是Mi ...

随机推荐

  1. .NET Core基础:白话管道中间件

    在Asp.Net Core中,管道往往伴随着请求一起出现.客户端发起Http请求,服务端去响应这个请求,之间的过程都在管道内进行. 举一个生活中比较常见的例子:旅游景区. 我们都知道,有些景区大门离景 ...

  2. 创建一个httpserver、httpclient

    最近因为要和java进行通信.约定好使用http协议进行消息传递.在网上找了很久server编写发现有个博主写的很详细,因此把东西记录下来以便下次使用.这是原博主网址:https://blog.csd ...

  3. Python安装及配置教程

    安装教程 一.python3.6安装步骤 1.首先我们移步官网,下载最新版本的python-3.6.0.点我,我把你传送到python官网 在DownLoad下拉框中点击Windows,选择要下载的文 ...

  4. 前端之Vue day07 混入、插件、elementui、Router、Vuex

    一.Props补充 1.父传子在子组件标签上起自定义属性 使用数组 就不演示了,太简单了 2.限制传入的数据类类型 使用对象 同样,展示过的 3.props补充 就是套对象,加以限制 props:{ ...

  5. 【Java学习Day10】类型转换

    类型转换 由于Java是强类型语言,所以要进行某些运算的时候,需要用到类型转换 低------------------------------------------>高 byte-->s ...

  6. Vue3中使用JSX简明语法

    掘金JSX:https://juejin.cn/post/7114063575122984973

  7. 你的ASP.NET Pages项目编译时为何总是很慢慢慢~?

    摘要 很多同学在运行同一个Asp.net Pages项目解决方案时会发现,有时候很快,有时候超级慢,甚至时间超过10几分钟才可以完全编译完,随后才能调试! 其实这都是跟配置有关 有句话说的话,约定  ...

  8. MQTT QoS 0, 1, 2 介绍

    什么是 QoS 很多时候,使用 MQTT 协议的设备都运行在网络受限的环境下,而只依靠底层的 TCP 传输协议,并不能完全保证消息的可靠到达.因此,MQTT 提供了 QoS 机制,其核心是设计了多种消 ...

  9. vscode将本地代码实时同步到服务器

    vscode近些年变得越来越流行了,主要是IDEA用上去实在有点卡,机器卡崩溃几次,这段时间也想用vscode体验一下,在自己的一些项目上面,想实现像phpstorm或者goland那样直接把代码通过 ...

  10. Burpsuite入门之target模块攻防中利用

    可以用来收集目标站点的更多资产 可以探测一些自动加载的接口.内容等,有的内容并不能被访问者直接看见,通过抓包的方式就可以一目了然. 1栏中是流量信息,其中包含着你所请求的流量 2栏中是对1栏中内容的一 ...