STM32f107 usb重枚举

Posted

技术标签:

【中文标题】STM32f107 usb重枚举【英文标题】:STM32f107 usb re-enumerate 【发布时间】: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复合设备会不会容易很多? 【参考方案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 */

【讨论】:

以上是关于STM32f107 usb重枚举的主要内容,如果未能解决你的问题,请参考以下文章

stm32f107vc的eth的时钟线在stm32cubemx中怎么配置

STM32F107VC 使用 TCP 运行 FreeRTOS

如何在 stm32f107 芯片上禁用/启用中断?

STM32F107的DAC配置

基于UCOSII的RS485通信(STM32F107)

STM32F107的SPI3不能使用的问题