stm32 USB-CDC 硬件复位后

Posted

技术标签:

【中文标题】stm32 USB-CDC 硬件复位后【英文标题】:stm32 USB-CDC after hardware reset 【发布时间】:2019-07-23 05:02:23 【问题描述】:

我已经用 USB-CDC 协议对我的 stm32f103 blue-pill 板进行了编程

我可以在这个端口上读写

但是在执行硬件重置后,COM端口不可用 我必须拔掉 USB 连接并重新插入,然后 COM 端口出现。

是否可以避免这种情况?

-谢谢

【问题讨论】:

好吧,您正在重置插入 USB 端的设备,我认为 OS USB 适配器驱动程序还没有准备好。操作系统方面认为设备处于完全初始化状态,因为您已重置设备。您可以插入和拔出您的 USB 设备,这也会导致重置,但操作系统已准备好进行此类重置。 【参考方案1】:

如果您重置 bluepill,您需要将 D+ 线拉下几毫秒,让主机知道它必须启动枚举过程。

【讨论】:

USB 设备在这些线路上通常没有配备下拉菜单。 @DavidGrayson 是的,很难理解。将 gpio 设置为输出。调低等一下,再把自动对焦功能调回来。 不,您绝对不想将线路设置为输出,因为如果此时主机正在总线上发送数据包,您将导致短路。你可以让线浮起来,它会被主机侧的下拉下拉。 你不能害怕。它有外部上拉,它也有串行电阻,所以你不会烧销 好的,是的,我现在可以看到电路板设计得很糟糕。它应该使 D+ 上拉在这种情况下是可控的(除非你真的需要每条 I/O 线)。此外,当您应该只将 D+ 拉到 3.3 V 时,它会将 D+ 拉到 5 V。【参考方案2】:

但是在执行硬件重置后,COM端口不可用我必须拔掉USB连接

我在 Windows 7 中看到了这种确切的行为 - 当 COM 端口在重置期间打开时。当 COM 端口在应用程序中保持打开状态时,用户断开并重新连接 USB 设备时也是如此。

您有 2 种可能的解决方法:

在硬件重置之前关闭 COM 端口 升级到 Windows 10

请注意,您仍然需要在硬件重置(或 USB 重新插入)时关闭并重新打开 Windows 10 上的 COM 端口。

【讨论】:

主机不会重新枚举它。这是一个错误的答案,任何 Windows 升级都无济于事 @P__J__ 不正确,我在 STM 上使用 USB CDC 时观察到完全相同的行为。可能是 ST 驱动程序的问题。重现步骤:允许主机枚举设备,打开主机COM端口,完全断开设备(断电)而不关闭主机COM端口,重新连接设备。即使主机正确地重新枚举设备,COM 端口仍然不可用。您需要手动关闭并重新打开它,无论您在主机上打开它的任何位置。 @JacekŚlimok 这完全错了。您可能在代码中犯了很多错误,而这种伪变通方法只是偶然的。 stm32 can driver工作正常。 @P__J__ ST 在任何演示板上提供的任何示例都证明了这一点,即使使用他们较旧的 (SthPeriph) 示例也是如此。如果你继续假设我的代码质量是什么,甚至没有看到任何东西,那么继续这个对话是没有意义的。不过,我确实认为可以安全地假设您甚至没有费心自己尝试确切描述的场景。 @JacekŚlimok 很难理解你的意思。在我的设备上一切正常,没有任何“魔法”。如果您的代码需要一些奇怪的操作 - 这是错误的迹象 - 不在 USB 堆栈中。我在 STM32 uC 上使用 CDC 类设计了数十个设备。 ]

以上是关于stm32 USB-CDC 硬件复位后的主要内容,如果未能解决你的问题,请参考以下文章

stm32 复位问题

怎样找出产生stm32硬件错误的原因

简述STM32的复位方式。手动复位按键处的电容有啥作用?

STM32H7 LAN8742 LwIP只有上电后才能正常工作,复位后不行

stm32 上电复位 和软复位有啥区别.该如何解决

stm32异常复位重启