|
发表于 2021-2-22 17:07:57
|
显示全部楼层
大佬的重复枚举是怎么实现的?
我这边在使用 USB 之后,软件关闭 USB (不拔USB线)。
参考你的例程:
1、停止USB外设。
2、反初始化和卸载 USBX 。
3、反初始化USB外设,关闭时钟,关闭中断。
4、重新初始化 USB 引脚为 GPIO 功能,DM 和 DP 拉低。
前 3 步执行之后,电脑检测不到USB,但不是正常的关闭,而是显示 “不能识别的USB”。
第 4 步之后,DP 引脚不能被拉低。 这就导致了重新初始化 USB 时, DP 不能上升沿跳变,所以不能重新枚举。。。
代码如下:
void usb_slave_close(void)
{
/* 停止 USB 外设 */
HAL_PCD_Stop(&pcd_hs_handle);
/* 反初始化 USB 任务 */
_ux_dcd_stm32_uninitialize((ULONG)USB_OTG_HS, (ULONG)&pcd_hs_handle);
_ux_device_stack_class_unregister(_ux_system_slave_class_storage_name, _ux_device_class_storage_entry);
_ux_device_stack_uninitialize();
/* 关闭 USB 外设 */
HAL_PCD_DeInit(&pcd_hs_handle);
__HAL_RCC_USB_OTG_HS_CLK_DISABLE();
HAL_NVIC_DisableIRQ(OTG_HS_IRQn);
/* DM DP 信号线置低 */
usb_otg_gpio_deinit();
}
void usb_otg_hs_gpio_deinit(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
HAL_GPIO_DeInit(GPIOB, GPIO_PIN_14|GPIO_PIN_15);
/**USB_OTG_HS GPIO Configuration
PB14 ------> USB_OTG_HS_DM
PB15 ------> USB_OTG_HS_DP
*/
GPIO_InitStruct.Pin = GPIO_PIN_14|GPIO_PIN_15;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14|GPIO_PIN_15, GPIO_PIN_RESET);
}
|
|