zoukankan      html  css  js  c++  java
  • 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了。

  • 相关阅读:
    stl学习笔记—set/multimap
    2013 杭州站 hdoj4778 Gems Fight!
    矩阵加速数列递推
    暑假写的两个数据结构
    AC自动机模板 hdoj2222 UVA-11468
    树莓派安装3.5英寸触摸屏幕
    树莓派设置NTP同步
    在树莓派上设置无线静态IP
    运行tomcat7w.exe未安装指定的服务
    LoadRunner 11安装Micosoft Visual C++ 2005 SP1时提示命令行选项语法错误
  • 原文地址:https://www.cnblogs.com/xingboy/p/9872381.html
Copyright © 2011-2022 走看看