我在STM32F107上有一块连接到USB的电路板,带有以下引脚
USB_OTG_VBUS:PA9 USBDM:PA11 USBDP:PA12
我有一个项目需要同时使用Virtual Com Port和USB Mass Storage。它需要重新枚举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有任何想法?
答案 0 :(得分:2)
如果您使用的是演示板,它具有通过微控制器引脚断开USB的功能。如果你没有使用演示板,你需要通过断开USB_DM / USB_DP线上的上拉电阻来自己提出这种能力......
答案 1 :(得分:1)
有类似的问题。试试这个:
ss
稍等一下,然后再次启动USB。
答案 2 :(得分:1)
在初始化 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
为我工作。
答案 3 :(得分:0)
我使用了@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 */