1. 程式人生 > >STM32 軟件復位並模擬USB拔插

STM32 軟件復位並模擬USB拔插

del span str div tput 初始化 枚舉 typedef stm32

  最近做了個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拔插