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了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM