STM32 軟件復位並模擬USB拔插
阿新 • • 發佈:2018-10-29
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拔插