1、USB插入检测原理
2、分析
USB设备断开之后,主机D+和D-都被内部电阻拉低,插回之后根据设备的上拉电阻确定设备接入。
所以设备主动将D+和D-两线都拉低就等于设备被拔出了,间隔一定时间释放D+和D-就模拟一个热拔插动作了。
3、代码
模拟设备拔出
拉低D+,D- 50ms,
void USB_Reset()
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOA_CLK_ENABLE();
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_11|GPIO_PIN_12, GPIO_PIN_RESET);
/*Configure GPIO pin : PtPin */
GPIO_InitStruct.Pin = GPIO_PIN_11|GPIO_PIN_12;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
HAL_Delay(50);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_11|GPIO_PIN_12, GPIO_PIN_SET);//释放D+ D-
// HAL_Delay(100);
}
初始化之前复位
GPIO在USB_Reset后会被USB的相关初始化函数设置。
void MX_USB_DEVICE_Init(void)
{
/* USER CODE BEGIN USB_DEVICE_Init_PreTreatment */
USB_Reset();
/* USER CODE END USB_DEVICE_Init_PreTreatment */
/* Init Device Library, add supported class and start the library. */
if (USBD_Init(&hUsbDeviceFS, &FS_Desc, DEVICE_FS) != USBD_OK)
{
Error_Handler();
}
。。。。。。