解决 STM32H750 USB 虚拟串口无法被识别

大家好,我是一哥,之前有同学私信我,USB串口老是无法识别,本文就是介绍这个情况的。

现象

板子和电脑联调的时候发现,USB线插入板子以后电脑不识别虚拟串口,通过禁用设备再启用,能够正常工作。也能够按一下复位键才能识别。

以前似乎没有这个问题,但记不清详细情况了。

电路

D+通过一.5K电阻上拉, 调试时整个板子通过与电脑连接的USB口供电, 即插上USB线才初始供电。

查找

由于通过禁用,启用能正常工作,于是有了上一篇文章

python–禁用、启用串口设备。

后来发现,如上操作之后,有时候依然不能正常工作,表现为设备管理器中该设备为未识别的设备,于是判断是板子上出了问题。

换板子发现,故障反复,所以排除硬件问题。

///插播一条:我自己在今年年初录制了一套还比较系统的入门单片机教程和毕业设计指导,想要的同学找我拿就行了免費的,私信我就可以哦~点我头像白色字体加我也能领取哦,记得口令一哥///

开发 STM32 的时候,须要串口、调试器等等外接设备来方便调试,可是对于我来说,那一大堆的线实在不够优雅。而通过 USB-DFU 下载程序、USB 虚拟串口打印信息,则只有一根 USB 即可搞定,非常简洁。

可是今天在用 CubeMX 开发 STM32H750VBT 的时候,USB 总是没法被识别。经过了一阵的探索,终于找得到了问题的理由——时钟配置。在此记录一下。

首先我先在网上查找了有关的资料,一般来说,STM32 USB 虚拟串口没法被识别可能有两种情况:

堆栈设置太小,USB 没法完成初始化,在 CubeMX 上设置大一点。

电脑端运用了 USB 分线器,把 USB 直接连接到电脑上。

两种方法我都尝试了,没效。其次我就初始思考,是不是由于 STM32H750 的时钟主频太高了(400MHz),导致时钟出错?其次我就把主频设置为了 100MHz,欸?结果能够了,终于被识别到了。但是把主频设置为 200MHz 就又不行了。可是我用 H7 不就是为了高主频吗?低主频还有什么意义?

进一步我猜想,USB 外设时钟有一个最高限速,说不定只有把 USB 外设时钟限制好就能够了。果真,在网上浏览有关信息的时候看到一篇文章,提到了 USB 时钟频次应该设置为 48MHz,我也才知道了原来 CubeMX 中 STM32H750 还能设置 USB 外设的时钟。

在 Clock Configuration 中配置 USB Clock Mux 为 RC48 ,能够获得精确的 48MHz,否则在其他频次时 USB 初始化会发生错误。

打开网易新闻 查看精彩图片

这一点在《STM32H750 Reference Manual》中 P2619 也有说明 ,即 USB OTG 的接收到的时钟应为 48MHz。

打开网易新闻 查看精彩图片

在USB设备连上主机以后, 主机检测到D+或D-上的电平变化, 识别出有设备接入。于是开始与从设备的握手过程。

但是我板子上的片上外设比较多,CubeMX生成USB的初始化代码又放在比较靠后的位置,造成USB初始化还未完成,主机已经等待超时,造成握手失败。

将初始化代码前移以后,即可正常工作。

CubeMX生成的代码有坑,不是一次两次了,甚至HAL库自带的初始化代码不能驱动硬件我也遇到过,平常心,问题解决就好

需要学习单片机的朋友 ,做毕业设计的同学,参加竞赛,关注我们,口令一哥,与导师一起学习成长,共同进步,还有更多资料领取。

说了这么多,大家记得留意下方评论第一条(或者私信我)有干货~

-END-

*本文系网络转载,版权归原作者所有,如有侵权请联系删除