完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
皆様、こんにちは:
士别多日,我又回来啦,近期的话因为公司最近可能接到一个关于VR头戴设备的项目,我有幸得到参加的机会,然后加入了这个产品的开发,这次的话我就分享一下我关于STM32F3 USB的开发经验;学了那么久的STM32,实话说我的水平还停留在学校阶段,毕竟我除了常用的外设之外,像USB,IIS等我都没去主动接触过,所以说很高兴有这么一次学习的机会; 因为没有玩过USB,所以查找了很多资料,发现USB是个很高深的东西,要学精的话不是一两个月的事情,需要超长的时间;因为时间关系,了解了一番,发现了HID设备不用自己写驱动;故我毅然决然的选择了使用将STM32开发成HID设备; 那我就开始我的表演啦,作为新手,对于一个新的模块你可以按照 模仿,修改,创新这三个步骤走,以实现你可以学会该模块的使用;所以一开始我拿梁老师的例程来进行学习,但你别说,这个USB开发是个大工程啊,因为他整个项目加上自己的文件,起码有十个库文件,如果一个文件一个文件的去熟读,必须要花大把的时间,并且看完之后你可能还不知道是什么意思;所以我认为学习新模块的步骤除了三个阶段之外,你还要明确你的需求,我最终想实现什么功能; 故我整理了一番按一下步骤进行学习,首先我最终要实现的功能是做一款能够与PC进行数据传输的HID设备(那么问题来了,我要怎么去实现呢?);接着我开始通过梁老师的实例去观察其中的一些关键语句(了解到了固件自带的底层的收发语句);然而光知道这两条语句是远远不够的,因为USB是个大系统(这就是为什么ST公司提供的固件库会有那么多.c文件的原因),需要对每个.c文件的作用进行基础的了解;对这个系统文件组成了解了一番之后,我的第一感觉就是好多字符定义,没什么的(那是因为我对系统还不够熟悉),于是乎就开始了第一阶段模仿: 我完整了复制了ST公司给出的USB固件,按照梁老师的实例和我当时的认知,进行了初始化设置,解决了错误项完成第一次编译,通过;插上设备,PC表示无法识别;我的天,这就神奇了,于是我就开始了每份.c文件进行对比确认,看ST给出的库跟梁老师的库到底有哪些不同,然后仅仅发现梁老师将hw_config.c的所有外设都注释了,这可以理解,因为实际应用并没有用到这些外设,所以注释掉(我怕可能是真的会影响,所以也注释掉了)、u***_desc.c中的设备描述符中的VID和PID不同,报告表述符的内容也不同(我也通通改成与梁老师的一致);还有u***_endp.c里的回调函数文件里面的关于底层传输函数的长度不一;u***_prop.c设备的复位函数内也有不同,其他的两者一致;包括寄存器地址也一致;将自己新的一份完全改到跟实例一致之后,还是不行;又重复对比确认了之后,束手无策了;于是又去查找资料,这次找到了关键字 枚举,这个过程就是PC去识别USB的过程,所以说我的设备不能使用主要是处在这个部分;所以我开始去了解这个过程,并且在我的项目和实例项目中加入提示符;最终发现发现我的设备卡在响应USB中断这个环节,按道理是PC识别完设备之后,会通知设备,但是我此刻的设备状态是 卡死(因为我开了定时器令LED闪烁,但LED闪烁一段时间之后卡死了);故我进一步去检讨死机的原因,但是这次网上资料很少,也有一些小伙伴的情况与我的一致,检讨许久无果;决定重新新建项目,因为我考虑到可能是一开始时有些头文件的替换出现了问题,最后引起逻辑错误,但是我却又不能发现; 重新复制ST的固件,这一次可以较为娴熟的操作,对照实例,修改了两三处地方;注释了不需要的语句,编译通过,这一次的话,我成功了,PC能够识别出我的设备了,并且我应用起来跟实例一模一样,这宣布我的模仿阶段成功啦。 好啦,开始进入第二阶段-修改;我的这个demo是: 1) USB成功连接后,上位机开关灯点亮 3) 上位机可以控制单片机LED2的亮灭 知道了需求之后,就开始开干啦,首先我知道要进行数据传输其实最终要的就是报告描述符的编写,报告描述符是HID设备与PC设备进行沟通的最主要的文件,因为它规定了数据交换的格式,比如字节大小,设备类型,输入输出等;因为这个demo还要自己自定义上位机,所以我就先确认我的下位机到底能不能进行数据传输,如果STM32传输没问题,那么我上位机接收数据问题也不大;故我使用了实例中的HID软件来进行数据检测,观察它是否有接收到我发送的数据,果然是困难重重,HID软件的结果让我知道我根本就没有任何数据上传,又再次对照了一下实例项目,发现原来我的报告描述符的输入输出字节数由64kb改为了5kb(随便改的),但u***_prop.c内设备复位函数中的传输总数没有改,比5kb小,所以就发送不出去;而且如果使用了数据发送函数后没有使用SetEPTxValid(ENDPx)/ SetEPRxValid(ENDPx),会导致USB传输卡死(估计是清除标志);所以对这几个点修改完毕后,我的STM32可以给HID软件发送数据啦;下位机修改完成; 最后的话就进行上位机的编写,上位机的话我这边就不记录啦,因为网上有一个例程,我也是完全直接的复制下来,然后理解一些关键的语句,以实现能够与我HID设备进行通信的功能(是C#开发); 以上就是我的HID学习过程,当然我对于他的学习完成度没有达到100%,顶多80%;更别说USB了,他能做出很多设备,功能十分强大,但是独立开发的话会很困难,像我们以硬件为主的,对于驱动就感觉会有点难搞;最后的话再次感谢网上的资料,感谢那些愿意分享经验的前辈们,因为这个项目是跟公司项目挂钩的,所以调试记录就不公布了,demo的上位机和下位机是可以分享出来的; 希望我的这篇帖子可以帮助到,也在入门HID开发的你,请多多指教;
|
|
相关推荐
|
|
1307 浏览 1 评论
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
1234 浏览 3 评论
2313 浏览 0 评论
如何解决MPU-9250与STM32通讯时,出现HAL_ERROR = 0x01U
1404 浏览 1 评论
hal库中i2c卡死在HAL_I2C_Master_Transmit
1834 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-30 01:04 , Processed in 0.473842 second(s), Total 42, Slave 33 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号