• 資料介紹
    • 1、引言
    • 2、問題
    • 3、原代碼為什么能運(yùn)行?
    • 4、小結(jié)
  • 資料預(yù)覽
  • 相關(guān)推薦
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

LAT1496 基于 USBD庫CDC Standalone例程中的一個(gè)Bug解析

03/06 15:10
462
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

LAT1496 基于 USBD庫CDC Standalone例程中的一個(gè)Bug解析

453.53 KB

1、引言

當(dāng)前越來越多的 STM32 芯片支持 USB-PD,目前新提供的 STM32 的 USB 例程中會(huì)把USB-PD 和 USB 合在一起。如果有客戶只需要 USB,那就需要?jiǎng)冸x USB-PD。另外,STM32U5 的 Cube 庫中只提供了基于 USBX 的例程,如果客戶要使用基于USB_USBD_Library 則需要到 GitHub 上去下載。

2、問題

2.1. 問題詳情

客戶在開發(fā)其產(chǎn)品過程中,使用了 STM32U575ZIT6Q。因?yàn)榭蛻魧?duì) USBX 不熟悉,所以希望 ST 能夠提供基于 ST_USBD_Library 的 CDC_Standalone 的例程,以實(shí)現(xiàn)虛擬串口功能。

建議客戶到 GitHub 上去下載:https://github.com/STMicroelectronics/stm32u5-classic-coremw-apps

客戶下載后發(fā)現(xiàn)里邊提供的 CDC_Standalone 的例程是帶有 USB-PD 的,客戶對(duì) USBPD 不熟悉,希望能夠提供給他們不帶 USB-PD 的,所以就需要從這個(gè)例程中對(duì) USB-PD 進(jìn)行剝離。

在對(duì) USB-PD 進(jìn)行剝離后,并在 usb_device.c 中的 MX_USB_Device_Init()函數(shù)中添加USBD_Start()函數(shù)啟動(dòng) USB。

按理說,進(jìn)展到這一步,USB 就應(yīng)該可以工作的。事實(shí)上,發(fā)現(xiàn)在 NUCLEO-U575ZI-Q板子上測試時(shí),當(dāng)通過 USB 連接到 PC 后,就會(huì)發(fā)現(xiàn)枚舉成功了,PC 可以正常識(shí)別到虛擬串口。但是,看起來無法工作,在線調(diào)試時(shí)發(fā)現(xiàn)其進(jìn)入了 Error_Handler(),也就是說,在什么地方出錯(cuò)了,工作不了。

2.2. 問題分析

查了很多遍,怎么都看不出 USB 的配置哪里有問題,看起來都還好,而且是從原例程剝離時(shí)并沒有動(dòng) USB 的代碼,覺得有點(diǎn)不可思議。后來實(shí)在沒辦法,只好挨個(gè)在進(jìn)入 Error_Handler 的入口處設(shè)斷點(diǎn),最后終于捕捉到進(jìn)入Error_Handler 的地方了,為在 CDC_Itf_Init()函數(shù)中以中斷方式啟動(dòng) TIM3 的地方出問題了。

覺得很奇怪,這只是以中斷方式啟動(dòng) TIM3 而已,為什么會(huì)出錯(cuò)?通過在線調(diào)試,查看上面的 TIM_Config()函數(shù)時(shí),發(fā)現(xiàn)了問題。TIM_Config()函數(shù)內(nèi)容。

2.3. 解決方法

問題找到了后,解決方法也很簡單,就是把 TIM_Config()函數(shù)中的調(diào)用HAL_TIM_Base_Start_IT()的語句去掉,避免重復(fù)調(diào)用就可以了。

3、原代碼為什么能運(yùn)行?

細(xì)心的朋友們可能就想到了一個(gè)問題:你說原代碼中就有這個(gè) Bug,那為什么原代碼運(yùn)行得好好的?

這個(gè)問題很好,主要是因?yàn)樵谶M(jìn)行 USB-PD 剝離后在編譯時(shí)編譯器提示 Error_Handler()重復(fù)聲明了,在 IAR 中只是警告,在 Keil 中就直接是錯(cuò)誤了。

4、小結(jié)

使用 GitHub 上的 https://github.com/STMicroelectronics/stm32u5-classic-coremwapps 軟件包進(jìn)行基于 USB_USBD_Library 的 STM32U5 的 CDC_Standalone 進(jìn)行開發(fā)的時(shí)候,需要注意到此 Bug。如果在開發(fā)過程中,遇到 Error_Handler(),可以看看是否這里沒有修改。

資料預(yù)覽

相關(guān)推薦