本帖最后由 纪国圣 于 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-systems和https://docs.microsoft.com/zh-cn/windows-hardware/drivers/install/inf-file-platform-extensions-and-x64-based-systems有“创建适用于多个平台和操作系统的 INF 文件”与“INF 文件平台扩展和基于 x64 的系统”的介绍,按其中要求修改,还是会出现上述错误。 后来仔细查看USB的VID与PID,猛然发现这以前用过呀,赶紧修改,新增一个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的错误是因为VID和PID与之前的一个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 上位机也识别了STM32的USB: file:///C:\Users\JIGUOS~1\AppData\Local\Temp\ksohtml6432\wps43.jpg 至此WINUSB的上位机模板制作成功。 因为工程文件太大,只能上传主要文件: |