【问题标题】:STM32f107 usb re-enumerateSTM32f107 usb重枚举
【发布时间】:2013-12-10 07:16:40
【问题描述】:

我有一块板子通过以下引脚连接到 STM32F107 上的 USB

USB_OTG_VBUS : PA9 USBDM : PA11 USBDP : PA12

我有一个项目需要同时使用虚拟 Com 端口和 USB 大容量存储。它需要重新枚举 USB,然后进行软件重置以启用不同的 USB 类。

我已经尝试了各种不同的方法让它重新枚举,但到目前为止一直无法,重新枚举的唯一方法是拔下 USB 电缆。

这些是我尝试过的一些功能,但没有成功

USB_OTG_DisableGlobalInt(&USB_OTG_dev);
USB_OTG_WRITE_REG32(&USB_OTG_dev.regs.GREGS->GINTSTS, 0xBFFFFFFF);
USB_OTG_CoreReset(&USB_OTG_dev);
USBD_DeInit(&USB_OTG_dev);
DCD_DevDisconnect(&USB_OTG_dev);
NVIC_SystemReset();

如果为 STM32F107 仅配置了这 3 个引脚,有没有人知道如何让 USB 重新枚举?

【问题讨论】:

  • 做个USB复合设备会不会容易很多?

标签: usb stm32


【解决方案1】:

如果您使用的是演示板,它具有通过微控制器引脚断开 USB 的功能。如果您不使用演示板,则需要自己提供该功能,方法是断开 USB_DM/USB_DP 线上的上拉电阻...

【讨论】:

    【解决方案2】:

    遇到了类似的问题。试试这个:

    USB_OTG_dev.regs.GREGS->GCCFG = 0;
    

    稍等片刻,然后重新初始化 USB。

    【讨论】:

      【解决方案3】:

      在初始化 USB 外设之前,将 D+ 引脚 (USBP) 配置为 GPIO 输出推挽并置低 (0V) 5ms。然后启动标准 USB 配置,包括 GPIO。在此过程之后,USB 主机识别新设备并开始枚举。

      GPIO_InitTypeDef GPIO_InitStructure;
      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
      GPIO_Init(GPIOA, &GPIO_InitStructure);
      GPIO_ResetBits(GPIOA, GPIO_Pin_12);
      delay_ms(5);
      
      //call your USB Init here
      

      为我工作。

      source

      【讨论】:

        【解决方案4】:

        我使用了来自@viteo 的答案并对其进行了一些调整,因为我遇到了一些编译错误。此代码适用于 Blue Pill 开发板 (STM32F103C8),它在 PA12 (USB_DP) 线上包含一个 1.5k 上拉电阻。因此,这段代码将USB_DP线短时间强制为低电平,就像USB线被拔掉重新连接一样,从而迫使主机在后续配置USB时重新枚举总线。

        编辑USB_DEVICE/App/usb_device.c 并在USB_DEVICE_Init_PreTreatment 块内添加代码

        void MX_USB_DEVICE_Init(void)
        {
          /* USER CODE BEGIN USB_DEVICE_Init_PreTreatment */
          GPIO_InitTypeDef GPIO_InitStruct = {0};
          GPIO_InitStruct.Pin = GPIO_PIN_12;
          GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
          GPIO_InitStruct.Pull = GPIO_PULLDOWN;
          GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
          HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
          HAL_GPIO_WritePin(GPIOA, GPIO_PIN_12, GPIO_PIN_RESET);
          HAL_Delay(100);
          /* USER CODE END USB_DEVICE_Init_PreTreatment */
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-07-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-08-31
          • 2016-03-05
          相关资源
          最近更新 更多