打印
[应用相关]

WINUSB上位机模板编写及遇到的问题与解决方法

[复制链接]
3930|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 纪国圣 于 2021-7-31 14:39 编辑

#申请原创#
最近有空在STM32上移植了一个WINUSB库,并通过libusb编写了一个上位机进行测速。虽然效果不错,但是考虑到毕竟不是微软官方的东西,担心会有兼容性的问题,因此使用Visual Studio Enterprise 2019 + Windows 11 SDK (22000.1)作为开发环境编写一个上位机模板。虽然官方有入门教程,但是实际操作中有很多的坑。现总结一下,让大家避坑。
1.打开VS2019,新建项目:
file:///C:\Users\JIGUOS~1\AppData\Local\Temp\ksohtml6432\wps1.jpg
2. 在搜索框中输入USB,选择WinUSB Application作为应用程序的开发模板:
file:///C:\Users\JIGUOS~1\AppData\Local\Temp\ksohtml6432\wps2.jpg
3. 设置项目名称与存储路径:
file:///C:\Users\JIGUOS~1\AppData\Local\Temp\ksohtml6432\wps3.jpg
4. 创建完毕的工程如下:
file:///C:\Users\JIGUOS~1\AppData\Local\Temp\ksohtml6432\wps4.jpg
5. 右击“解决方案WinUSB”,选择“添加”->“新建项目”:
file:///C:\Users\JIGUOS~1\AppData\Local\Temp\ksohtml6432\wps5.jpg
6. 在搜索框中输入USB,选择WinUSB INF Driver Package作为INF文件的开发模板:
file:///C:\Users\JIGUOS~1\AppData\Local\Temp\ksohtml6432\wps6.jpg
7. 设置名称和路径:
file:///C:\Users\JIGUOS~1\AppData\Local\Temp\ksohtml6432\wps7.jpg
8. 至此工程创建完毕:
file:///C:\Users\JIGUOS~1\AppData\Local\Temp\ksohtml6432\wps8.jpg
9. 通过设备管理器查看STM32 USB的硬件ID,为INF编写做准备:
file:///C:\Users\JIGUOS~1\AppData\Local\Temp\ksohtml6432\wps9.jpg
10. INF文件第21行的USB\VID_vvvv&PID_pppp修改为USB\VID_07E5&PID_07E5:
file:///C:\Users\JIGUOS~1\AppData\Local\Temp\ksohtml6432\wps10.jpg
file:///C:\Users\JIGUOS~1\AppData\Local\Temp\ksohtml6432\wps11.jpg
11. 右击“解决方案WinUSB”,选择“属性”->“配置属性”->“配置”,设置编译平台:
12. 至此根据微软官网的教程,工程创建与设置全部完成,可以编译运行了。可是实际编译却报错,错误代码MSB8040:此项目需要 Spectre 缓解库。
13. 查阅微软官网https://docs.microsoft.com/zh-cn/visualstudio/msbuild/errors/msb8040?f1url=%3FappId%3DDev16IDEF1%26l%3DZH-CN%26k%3Dk(MSB8040)%26rd%3Dtrue&view=vs-2019发现要禁用Spectre Mitigation
file:///C:\Users\JIGUOS~1\AppData\Local\Temp\ksohtml6432\wps14.jpg
14. 以为不用Spectre不会报错了,可事实证明我太年轻了,编译后依然报相同的错误。。。。。。好吧,按照提示安装所需的文件,并使能Spectre Mitigation
file:///C:\Users\JIGUOS~1\AppData\Local\Temp\ksohtml6432\wps15.jpg
file:///C:\Users\JIGUOS~1\AppData\Local\Temp\ksohtml6432\wps16.jpg
file:///C:\Users\JIGUOS~1\AppData\Local\Temp\ksohtml6432\wps17.jpg
file:///C:\Users\JIGUOS~1\AppData\Local\Temp\ksohtml6432\wps18.jpg
file:///C:\Users\JIGUOS~1\AppData\Local\Temp\ksohtml6432\wps19.jpg
file:///C:\Users\JIGUOS~1\AppData\Local\Temp\ksohtml6432\wps20.jpg
15. 编译终于成功了,并生成了相应的文件:
file:///C:\Users\JIGUOS~1\AppData\Local\Temp\ksohtml6432\wps21.jpg
file:///C:\Users\JIGUOS~1\AppData\Local\Temp\ksohtml6432\wps22.jpg
16. 设置WinUSB应用工程的调试器为本地Windows调试器:
file:///C:\Users\JIGUOS~1\AppData\Local\Temp\ksohtml6432\wps23.jpg
17. 安装INF
file:///C:\Users\JIGUOS~1\AppData\Local\Temp\ksohtml6432\wps24.jpg
file:///C:\Users\JIGUOS~1\AppData\Local\Temp\ksohtml6432\wps25.jpg
file:///C:\Users\JIGUOS~1\AppData\Local\Temp\ksohtml6432\wps26.jpg
file:///C:\Users\JIGUOS~1\AppData\Local\Temp\ksohtml6432\wps27.jpg
file:///C:\Users\JIGUOS~1\AppData\Local\Temp\ksohtml6432\wps28.jpg
file:///C:\Users\JIGUOS~1\AppData\Local\Temp\ksohtml6432\wps29.jpg
file:///C:\Users\JIGUOS~1\AppData\Local\Temp\ksohtml6432\wps30.jpg
点击“下一步”,本以为可以大功告成,结果第二个坑出现了:
file:///C:\Users\JIGUOS~1\AppData\Local\Temp\ksohtml6432\wps31.jpg
百度一下,有网友说需要通过添加过时硬件来添加INF
file:///C:\Users\JIGUOS~1\AppData\Local\Temp\ksohtml6432\wps32.jpg
file:///C:\Users\JIGUOS~1\AppData\Local\Temp\ksohtml6432\wps33.jpg
file:///C:\Users\JIGUOS~1\AppData\Local\Temp\ksohtml6432\wps34.jpg
file:///C:\Users\JIGUOS~1\AppData\Local\Temp\ksohtml6432\wps35.jpg
点击确定,结果又出现了另一个问题:
file:///C:\Users\JIGUOS~1\AppData\Local\Temp\ksohtml6432\wps36.jpg
明明是x64平台编译呀?怎么报这个错误呢?在微软官网https://docs.microsoft.com/zh-cn/windows-hardware/drivers/install/creating-inf-files-for-multiple-platforms-and-operating-systemshttps://docs.microsoft.com/zh-cn/windows-hardware/drivers/install/inf-file-platform-extensions-and-x64-based-systems有“创建适用于多个平台和操作系统的 INF 文件”与“INF 文件平台扩展和基于 x64 的系统”的介绍,按其中要求修改,还是会出现上述错误。
后来仔细查看USBVIDPID,猛然发现这以前用过呀,赶紧修改,新增一个INF工程:
file:///C:\Users\JIGUOS~1\AppData\Local\Temp\ksohtml6432\wps37.jpg
file:///C:\Users\JIGUOS~1\AppData\Local\Temp\ksohtml6432\wps38.jpg
结果仍然不能安装驱动。
没办法,因为文件被改的乱七八糟,只能按照步骤1-16重新新建工程。
因为WINUSB根据GUID来识别USB设备,所以STM32端usbd_desc.c内的USBD_WINUSB_OSPropertyDesc需要根据INF文件修改:
file:///C:\Users\JIGUOS~1\AppData\Local\Temp\ksohtml6432\wps39.jpg
file:///C:\Users\JIGUOS~1\AppData\Local\Temp\ksohtml6432\wps40.jpg
之后就是INF安装问题,步骤17的错误是因为VIDPID与之前的一个USB驱动的VID/PID冲突,修改过后无此错误,但是会出现驱动数字签名的问题。
这又是一个坑,明明生成了安全证书,却出现驱动数字签名的问题。file:///C:\Users\JIGUOS~1\AppData\Local\Temp\ksohtml6432\wps41.jpg
只能禁用数字签名,强制安装INF,这回成功了:
file:///C:\Users\JIGUOS~1\AppData\Local\Temp\ksohtml6432\wps42.jpg
上位机也识别了STM32USB
file:///C:\Users\JIGUOS~1\AppData\Local\Temp\ksohtml6432\wps43.jpg
至此WINUSB的上位机模板制作成功。
因为工程文件太大,只能上传主要文件:
win_usb.zip (21.84 KB)

使用特权

评论回复
沙发
纪国圣|  楼主 | 2021-7-25 19:51 | 只看该作者
本帖最后由 纪国圣 于 2021-7-25 19:54 编辑

吐槽一下,上传图片居然FLASH插件崩溃,害得我只能一张张图片复制到编辑框中。


使用特权

评论回复
板凳
纪国圣|  楼主 | 2021-7-25 19:57 | 只看该作者
@21小跑堂  @21小跑堂  @21小跑堂

使用特权

评论回复
地板
li880wert| | 2021-7-26 08:17 | 只看该作者
本帖最后由 li880wert 于 2021-7-26 08:19 编辑

WIN  USB 我就说一个WIN7 和WINXP 你这驱动怎么装吧,很久之前想把DAP 加个WINUSB 就是WIN7 装不上这驱动说是免驱也只是相对 WIN10来说,其他系统还有要装驱动,嵌入式单片机 开发的程序 受众的用户还有大把都是用的WIN7系统,更不要说是用WINXP的了

使用特权

评论回复
5
稳稳の幸福| | 2021-7-26 11:14 | 只看该作者
看的不是很明白。

使用特权

评论回复
6
纪国圣|  楼主 | 2021-7-27 18:44 | 只看该作者
li880wert 发表于 2021-7-26 08:17
WIN  USB 我就说一个WIN7 和WINXP 你这驱动怎么装吧,很久之前想把DAP 加个WINUSB 就是WIN7 装不上这驱动说 ...

确实驱动是个问题。还有看官方的文档WINUSB在WIN7下的INF和WIN8/10的INF是有一些差异的,32位与64位的系统还要加NTx86与NTamd64等等,如果考虑跨系统,开发要考虑的东西就更多了。确实麻烦。感觉比较起来还是用libusb相对方便一点。

使用特权

评论回复
7
纪国圣|  楼主 | 2021-7-27 18:47 | 只看该作者

哪里有疑问欢迎提出来。

使用特权

评论回复
8
纪国圣|  楼主 | 2021-7-28 06:55 | 只看该作者
改了一下标题,阐明一下本帖的主旨。

使用特权

评论回复
9
菜鸟电工wei| | 2022-10-20 17:12 | 只看该作者
楼主,你好,我想验证我的winusb设备数据是否通信成功,想用一下你的这个上位机

使用特权

评论回复
10
wenfen| | 2022-10-20 22:05 | 只看该作者
驱动是个问题

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

77

主题

401

帖子

5

粉丝