用服务写USB的拔插程序。求详细源代码,能用能跑的啊
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用服务写USB的拔插程序。求详细源代码,能用能跑的啊相关的知识,希望对你有一定的参考价值。
在服务的MAIN函数中已经成功注册了,但是就是没有拔插消息进入回调Handle中,求解释....
参考技术A 这种情况也可能有,但是还有一个情况,还有一款USB设备也是自己做的,但是用了CYPRESS提供的一个USB类对下位机进行访问,这款USB设备的拔插是可以访问的。而我前面所说的不能识别拔插的USB设备是用IOCONTROL对下位机访问的,所以我怀疑可以在PC软件上下手解决这个问题。又因为那个USB类无法在我前面提到的设备上应用,所以只能自己想办法解决。中网互赢 手机客户端追问我用窗口写,都能识别啊。放在服务上就不行了,又不是特定的USB,就是任何USB的拔插消息而已。是根本就不进入回调函数。
STM32 软件复位并模拟USB拔插
最近做了个USB跟上位机的通信,需要软件对MCU进行复位,复位后如果USB没有拔插,PC就不会重新枚举USB为了解决这个问题,我做了软件复位跟,软件模拟USB拔插。
这里我用的是HAL库的软件复位,复位前先把中断关掉,再复位,代码如下:
__set_FAULTMASK(1); //关中断 NVIC_SystemReset(); //复位
至于怎么实现模拟USB拔插,则只需要在USB初始化前把PA12进行一个拉低——延时——拉高的操作即可,一般PC机可以通过检查USB的D+引脚来判断USB是否有变化的,对于STM32的PA12就对应了这个引脚,所以可以通过模拟这个引脚电平变化实现模拟USB拔插操作。先模拟拔插,再进行USB初始化,这样PC就可以重新枚举USB了,代码如下:
/** Configure pins as * Analog * Input * Output * EVENT_OUT * EXTI */ void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct; /* GPIO Ports Clock Enable */ __HAL_RCC_GPIOA_CLK_ENABLE(); /*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(GPIOA, GPIO_PIN_12, GPIO_PIN_RESET); /*Configure GPIO pin : PA12 */ GPIO_InitStruct.Pin = GPIO_PIN_12; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_PULLDOWN; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_12, GPIO_PIN_RESET); HAL_Delay(65); //先把PA12拉低再拉高,利用D+模拟USB的拔插动作
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_12,GPIO_PIN_SET); HAL_Delay(65); }
只有注意,模拟拔插放在USB初始化前,这样就可以在每次复位后都模拟拔插,并可以让PC重新枚举USB了。
以上是关于用服务写USB的拔插程序。求详细源代码,能用能跑的啊的主要内容,如果未能解决你的问题,请参考以下文章