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中怎么配置