最近做了個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了。
上一篇:STM32 Cubemx 配置定時器定時1mS
下一篇:STM32 HAL庫利用DMA實現串口不定長度接收方法
推薦閱讀最新更新時間:2025-04-01 23:58

設計資源 培訓 開發板 精華推薦
- ADR3450 5V 輸出微功率、高精度電壓基準的典型應用
- 使用 ON Semiconductor 的 TND027TD 的參考設計
- MC33982CHFK 33982單路智能大電流自保護高邊開關典型應用電路
- LT4276BHUFD 13W (TYPE 1) PoE 電源在反激模式下的典型應用電路,具有 5V、2.3A 輸出
- 用于鹵素燈和低功耗燈的數字墻調光器
- 具有外部 3.3V 芯片電源管理器的 LTC2980IY 16 通道典型應用電路
- 使用 NXP Semiconductors 的 FXOS8700CQ 的參考設計
- L99DZ100G評估板
- DC2402A,基于 LT6237 軌到軌 SAR ADC 驅動器放大器的演示板
- #第七屆立創電賽#USB電流計
- 泰克MDO系列:1招搞定6大儀器,輕松穿越模擬、數字、頻域測量
- 2018開“芯”學:Mentor兩場知識有獎問答邀你新年充電
- 瑞薩電子MCU全國技術研討會開放報名!覆蓋上海、南京、杭州、合肥等10大城市!
- 分享、評論《Vishay光電子博文》盡享精彩好禮!
- 電源小課堂 | 新電氣架構激發電動汽車高壓系統潛能,答題贏好禮!
- 有獎直播:Keysight World Tech Day 2024 汽車分論壇|汽車自動駕駛與新能源
- 有獎直播|相約Keysight World 2019“汽車電子及新能源汽車測試”論壇
- 一起哇:基于國產芯、便攜烙鐵系統IronOS(FreeRTOS)的智能烙鐵
- 福祿克有獎直播|數據采集器的基礎知識及其應用和校準