stm32f3' USER USB'没有检测到

时间:2016-02-05 07:13:50

标签: embedded stm32

我正在使用stm32f3发现板。对于我目前的项目,我计划在电路板上编写一个简单的UART程序,我碰巧在互联网上的某个地方读到要使用电路板进行UART与PC通信的用户USB'必须使用。

我的问题如下

  • 首先,当我使用' USER USB'将我的主板连接到PC时。 PC拒绝识别电路板。(F.Y.I-OS使用的是Windows 7 64位)。即使在我更新驱动程序后,此问题仍然存在!如何解决这个问题?
  • 是"连接USER USB"部分正确?因为我无法在船上看到任何RS232芯片
  • 我应该在船上使用添加物吗?

P.S我已经安装了ST网站上所有必要的驱动程序,并且在使用ST-Link界面时可以完美地工作。董事会的一部分

2 个答案:

答案 0 :(得分:1)

几周前我开始使用STM32F3迪斯科舞厅。用户USB的事情有点棘手。 为了弄清楚:电路板有2个USB端口。

  • 主要用于编程和调试。它连接到第二个ST芯片,用作编程适配器。
  • 秒(称为USER USB)连接到您编程的STM32F303芯片

所以你可以做的是配置你的STM32来实现CDC over USB。安装Windows驱动程序(自动或从ST,取决于操作系统版本),您应该在设备管理器中获得虚拟COM端口。如果您没有驱动程序,您还会获得一个标记为虚拟COM端口但带有黄色感叹号的设备。

所以,如果我对你提出问题,这就是你要做的事情吗?然后是,"连接USER USB"是正确的。不,你不需要扩展板。

如何解决?这取决于: 您是否已将设备管理器中的设备视为通信设备或串行接口?然后只有ST的CDC驱动程序丢失。

或者你得到一个"未知设备"在你的设备管理器?这就是我的经历。

  1. 在STM32CubeMX中,您需要启用USB设备(Peripehrals-> USB)
  2. 在STM32CubeMX中,您需要选择USB堆栈(MiddleWares-> USB_DEVICE->通讯设备类)
  3. 生成代码。如果您使用HSI作为时钟源,CubeMX将生成一条您现在可以忽略的错误消息。对于真正的产品,您应该使用外部时钟。
  4. 请注意is a bug in CubeMX version 4.20。代码生成器生成的代码如果选择HSE作为时钟输入源,则可能无效。即使你回到HSI,错误仍然存​​在。
  5. 编译运行代码。您可能需要重置电路板,移除BOTH USB插头
  6. Windows现在应该检测到主板。
  7. 额外问题:董事会......好吧。棘手。如果您只将USER USB插入PC,应该工作,但Windows也可能会通知您有一个未知的设备,因为枚举失败。
  8. 再次取下插头。现在,先插入另一个ST-LINK USB接通电路板。等1-2秒。现在插入USER USB。似乎有一个启动问题。仅使用USER USB供电和CDC似乎在启动和USB之间的竞争条件下运行并且USB枚举失败。首先给电路板供电然后插上电源会消除这种竞争条件(至少在我的电路板上)
  9. 现在Windows应该枚举设备并为您提供虚拟COM端口。实际上你应该得到其中两个:一个" ST ... STLink虚拟COM端口"和一个" ST ...虚拟COM端口"。第二秒是你要找的那个。

    我希望这就是你的问题的答案。

答案 1 :(得分:0)

感谢帖子,有同样的问题,这是我添加的内容 方法:通过改变输入到输出,强制它为零并在大约1秒钟后重新启用它来以编程方式关闭USB线 还可以使用ST USB Libs断电和开机

<小时/>

// Force Re-Enumeration by the USB Host
//
int     aux_retrigger_usb()
{
        GPIO_InitTypeDef  GPIO_InitStructure;

        // ST USB Function
        PowerOff();

        // Program Pin 12 USB_DP from Input to Output
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;

        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;

        GPIO_Init(GPIOA, &GPIO_InitStructure);
        // Set USB_DP to 0

        GPIOA->BRR  |= GPIO_Pin_12 ;

        // Wait for for minimum 32* 50msec ,  1,6 secs
        while(tim3_cnt%32!=0) ; while(tim3_cnt%32!=31) ;

        // ST USB Functions
        PowerOn();
        USB_Init();
        Virtual_Com_Port_Reset() ;

        // Program Pin 12 USB_DP from Output to input

        GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_12;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
        GPIO_Init(GPIOA, &GPIO_InitStructure);

        return 1 ;
}

所以基本上为了避免上电竞争状态,可以对端口进行编程 先输出然后在1秒后释放。

相关问题