一、背景

项目用到单片机采集模拟量数据,原先使用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. 关于同时使用Vue.js 和 Jquery时dom事件失效问题

    先加载vue.js,让页面渲染完成后加载jq,给jq绑定ready事件 $(document).ready(function(){ $(function(){ (Jq) }); });

  2. 使用vue渲染大量数据时应该怎么优化?

    Object.freeze 适合一些 big data的业务场景.尤其是做管理后台的时候,经常会有一些超大数据量的 table,或者一个含有 n 多数据的图表,这种数据量很大的东西使用起来最明显的感受 ...

  3. Java的引用(强软弱虚)

    Java中引用相关的类 类 名 说明 ReferenceQueue 引用队列 与某个引用类绑定,当引用死亡后会进入这个队列对象标记为垃圾(并不代表回收了)后或虚引用的对象被回收后,会加入到引用队列 H ...

  4. grep展示相邻行

    grep搜索展示匹配行的上面或下面相邻的行: # grep -A 1 pattern file -A选项,是 After 的缩写,表示除了展示匹配行之外,还要展示出匹配行下面的若干行.而示例中的 -A ...

  5. MySQL升级5.7.29

    采用卸载后升级的方式 参考:https://blog.csdn.net/liu_dong_mei_mei/article/details/104010567 1.卸载原有的MySQL: 之前是wind ...

  6. Ftp连接-200 Switching to ASCII mode,227 Entering Passive Mode

    测试 ftp 服务器是否部署成功,最简单的方法,就是找个 windows 系统直连服务器,能连上就说明服务部署成功了.不过,有时候即使 ftp 服务部署成功了,windows 系统依然连接不上服务,这 ...

  7. 压缩打包,tar

    压缩打包命令 创建压缩包 tar -zcvf /home/xxxx.tar.gz /xahot 解压 tar -zxvf xxx.tar.gz gzip   xxxx  自动变为 xxx.gz

  8. 邮件合并 :处理ACCESS中批量查询语句的运行

    利用邮件合并,制作批量查询语句,一条一条的复制粘贴并运行. 有点笨但是想不出什么好办法,除非用模块的过程,但还是要手动输入参数.http://www.docin.com/p-695725657.htm ...

  9. testtesttest

    test test       2022-09-24 #include<iostream> using namespace std; int main(){ cout<<&qu ...

  10. vim 转换大小写

    只转化某个单词 guw .gue gUw.gUe 这样,光标后面的单词便会进行大小写转换 想转换5个单词的命令如下: gu5w.gu5e gU5w.gU5e 转换几行的大小写 4.转换几行的大小写 将 ...