STM32 软件复位并模拟USB拔插

Posted xingboy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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了。


以上是关于STM32 软件复位并模拟USB拔插的主要内容,如果未能解决你的问题,请参考以下文章

stm32如何软件复位

stm32 软件复位和上电复位的区别

stm32为啥都用软件模拟协议

stm32 复位问题

stm32 上电复位 和软复位有啥区别.该如何解决

stm32 上电复位 和软复位有啥区别.该如何解决