单片机
返回首页

STM32 软件复位并模拟USB拔插

2025-02-18 来源:cnblogs

最近做了个USB跟上位机的通信,需要软件对MCU进行复位,复位后如果USB没有拔插,PC就不会重新枚举USB为了解决这个问题,我做了软件复位跟,软件模拟USB拔插。


1、软件复位

这里我用的是HAL库的软件复位,复位前先把中断关掉,再复位,在你需要复位的代码处添加下面代码即可,代码如下:


__set_FAULTMASK(1); //关中断

NVIC_SystemReset(); //复位   


2、模拟USB拔插

至于怎么实现模拟USB拔插,则只需要在USB初始化前把PA12进行一个拉低——延时——拉高的操作即可,一般PC机可以通过检查USB的D+引脚来判断USB是否有变化的,对于STM32的PA12就对应了这个引脚(我这里的USB的D+设定在这个脚上,所以就操作这个脚即可),所以可以通过模拟这个引脚电平变化实现模拟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了。


进入单片机查看更多内容>>
相关视频
  • 【TI MSPM0 应用实战】智能小车+工业角度编码器+血氧仪+烟雾探测器!硬核参考设计详解!

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

  • 直播回放: Microchip Timberwolf™ 音频处理器在线研讨会

  • 基于灵动MM32W0系列MCU的指夹血氧仪控制及OTA升级应用方案分享

精选电路图
  • 1瓦四级调频发射机

  • 500W MOS场效应管电源逆变器,12V转110V/220V

  • 12V 转 28V DC-DC 变换器(基于 LM2585)

  • 红外开关

  • 12V转110V/220V 500W逆变器

  • DS1669数字电位器

    相关电子头条文章