
關(guān)鍵字:USBx, Azure, USB_HS, MSC Device, STM32U599
目錄預(yù)覽
1、前言
2、問(wèn)題調(diào)研與驗(yàn)證
3、問(wèn)題分析與解決辦法
4、小結(jié)
01
前言
某客戶(hù)在使用 STM32U599 開(kāi)發(fā)一款智能手表時(shí),需要使用 USB_OTG_HS 實(shí)現(xiàn) USB Storage 功能。建議客戶(hù)參考“STM32U575I-EV\Applications\USBX\Ux_Device_MSC”例程來(lái)實(shí)現(xiàn)。但是,客戶(hù)抱怨參考 U575 的例程也無(wú)法調(diào)試通過(guò),程序在 USB_CoreInit()無(wú)法初始化成功。在支持解決了客戶(hù)初始化失敗的問(wèn)題后,客戶(hù)反饋仍然無(wú)法調(diào)通 Azure USBx 的MSC storage 程序。
本文主要介紹使用 STM32U599 USB_HS 開(kāi)發(fā) USBx 應(yīng)用時(shí)的幾個(gè)問(wèn)題點(diǎn),詳細(xì)配置和移植過(guò)程,讀者可自行參考本文附件中的工程源碼。
02
問(wèn)題調(diào)研與驗(yàn)證
客戶(hù)在使用 STM32CubeMX 生成 USBx MSC Device 工程時(shí)采用的默認(rèn) RCC 時(shí)鐘樹(shù)配置如下:

USB_HS 外設(shè)初始化失敗,筆者在 STM32U599J_DK 板上也得到了同樣的結(jié)果。

03
問(wèn)題分析與解決辦法
USB 初始化失敗的問(wèn)題既然能夠穩(wěn)定復(fù)現(xiàn),那么問(wèn)題應(yīng)該比較好找,經(jīng)過(guò)查看 DS13633 和RM0456 對(duì)于 STM32U599 的 USB_OTG_HS 外設(shè)有如下相關(guān)描述。


根據(jù)文檔描述,也就是說(shuō) USB_OTG_HS 這個(gè) IP Core 工作于 60MHZ,它是由OTG_HS_PHY Clock 提供的,為了保證其精度必須使用外部晶振 HSE,且 OTG_HS_PHY 的時(shí)鐘頻率僅支持 16/19.2/20/24/26/32 這幾個(gè)頻率大小。
在 STM32CubeMX 里將 USB_OTG_HS 時(shí)鐘重新配置如下:

重新生成代碼,下載測(cè)試可以看到 USB_OTG_HS 已經(jīng)能夠成功初始化了。


到這一步看起來(lái)似乎問(wèn)題應(yīng)該解決了。然后,事實(shí)并非如此,下載程序插上 USB 后,Windows 仍然沒(méi)有出現(xiàn)任何提示。
其實(shí),STM32CubeMX 生成 Azure USBx MSC Device 應(yīng)用時(shí),只生成了相應(yīng)的用戶(hù)層級(jí)框架,并不是直接就可以工作的,application 層的部分接口還需要用戶(hù)去完成的。
但是,在 STM32Cube_FW_U5_V1.2.0 及以上的版本中,ST 提供了幾乎覆蓋了所有常見(jiàn)USBx 各種 USB 類(lèi)的例程,它們分布在不同型號(hào)的 ST 開(kāi)發(fā)版上的,這些例程是可以相互交叉參考的??蛻?hù) USB_OTG_HS MSC storage 參考的例程是 STM32U575IEV\Applications\USBX\Ux_Device_MSC。
查看 STM32U599J_DK 板原理圖,使用 STM32CubeMX 配置后發(fā)現(xiàn),ST 所有開(kāi)發(fā)板的USB_OTG_FS/HS 接口都是使能了 TypeC-PD 功能的,而客戶(hù)板子上是沒(méi)有使能 TypeC-PD,直接按照 USB_OTG_HS Device Only 模式接的。

通過(guò)單步調(diào)試和代碼跟蹤,最終發(fā)現(xiàn) USBx 里面使用了 TypeC CC 引腳來(lái)檢測(cè) Device 是否插入,當(dāng)檢測(cè)到有 Device 插入或拔出時(shí),發(fā)出設(shè)備狀態(tài)信息 USB_Device_State_Msg 的消息隊(duì)列,通知 USBx Device 線(xiàn)程入口函數(shù) app_ux_device_thread_entry(),并做相應(yīng)的 USB 啟動(dòng)和停止。客戶(hù)的板子和 STM32CubeMx 里面并沒(méi)有使能 USB Type C-PD 自然無(wú)法成功啟動(dòng) USB服務(wù)。
如下圖所示。

既然問(wèn)題是由于 USB TypeC-PD 引起,找到了原因就不難解決那個(gè)問(wèn)題了。只需要在USB_OTG_HS 外設(shè)初始化后,直接啟動(dòng) USB 服務(wù),代碼修改如下。

經(jīng)測(cè)試,經(jīng)修改后程序工作正常。
04
小結(jié)
筆者后期在 STM32U599J_DK 板上進(jìn)行測(cè)試,發(fā)現(xiàn) STM32U599 的 USB_OTG_HS 外設(shè)時(shí)鐘(OTG HS Clock Mux),對(duì)于頻率及時(shí)鐘源具有較強(qiáng)的選擇性,強(qiáng)烈建議 OTG HS Clock Mux 選擇 HSE(16MHZ)作為時(shí)鐘。