客戶產品中使用STM32F401RB,產品本身已經燒錄固件,並在功能實現上無問題。在想更新固件時,PC軟體無法識別設備,DFU功能失敗。
- 首先檢查USB硬體線路問題。
客戶反饋,本身產品已經有固件,在正常模式下(BOOT0 = 0 ,BOOT1 = 0時)功能完整,USB功能可以正常使用。說明USB線路是正常。
備註:如果沒有現成固件作為測試,可以使用STM32CubeMX工具生成一個HID測試程序代碼來驗證。如果運行正常,說明不是USB線路問題。2. 檢查Bootloader版本
打開應用文檔 AN2606-STM32 microcontroller system memory boot mode.pdf,通過此應用文檔可知,不同的 Bootloader 版本可用於固件升級的方式不盡相同,如 4.2 節如下內容:
並且通過表3可以確認,STM32F401RB對應的BID版本以及其支持的Bootloader支持的接口。
在上述可能性都排除外,客戶提出懷疑晶片本身或 Bootloader 燒錄的代碼有問題,於是找出一塊開發板進行 MCU 替換,替換後的結果為 STM32F401RB 在放到開發板上則能正常通過 Bootloader 的 DFU 方式進行固件升級,因此,這就明確排除了晶片本身問題的可能性,因此,只可能是用戶板子外圍電路的問題。
3. 檢查MCU外圍電路
再次回到 AN2606 這個應用文檔,在 29.2節找到 Bootloader 的工作流程圖,如下所示:
通過上圖可知,Bootloader 是依次檢查 USART ->DFU ->I2C -> SPI 的方式,懷疑 Bootloader 程序在 DFU 之前由於某種未知原因是否已經進入到 USART的方式中而一直沒有出來?
為了排除這種可能性,我們針對 USART1 的 RX 腳 PA10,USART2 的 RX 腳 PA3, USART6 的 RX 腳 PC7拉高,I2C 的SDA腳拉高,SPI的MISO腳上拉。結果還是無法檢測到 DFU 設備。
再次回到上圖進行分析,如上圖,若 USART 和 CAN 都沒有檢測到的話,Bootloader 程序會檢測 USB 線是否連接,然後檢測外部 HSE,若 HSE 不存在,則產生系統復位,否則將會重現配置系統主頻到 60M。
由於我們是連著 USB 線且在正常運行模式下 USB 是能正常工作的,因此,這裡檢測 USB 線結果應該是通過的,於是按照程序流程,接下來檢測外部 HSE,若檢測失敗則復位系統。
與是用示波器查看VDD 與 NRST 腳的波形,發現系統在 VDD 上電後有 3 次復位,如此,可以得出 Bootloader 程序在檢測外部 HSE 時結果為失敗,如下:
為什麼會檢測外部 HSE 失敗? 用戶使用的 HSE 是 8M 晶振,與開發板一樣都是 8M 外部晶振,對比用戶的外部晶振電路與 DISCOVERY 的對應電路,如下圖所示:
如上圖,左邊為客戶板子的晶振電路,右邊為 DISCOVERY 板的晶振電路,對比可知,用戶的負載電容使用的是 33pF,且多了個 1M 的反饋電阻。
首先將反饋電阻去掉後測試,結果還是一樣。進一步將客戶板子的晶振負載電容換成 20pF 後進行測試,結果可以正常檢測到 DFU 設備,如此可見,正是因為這個負載電容的原因造成 Bootloader 的 DFU 無法正常工作!
- 總結
此問題是由於晶振負載電容過大,導致內置 Bootloader 程序在檢測外部 HSE 的時間點與實際 HSE 穩定震盪所需的時間不同步造成,結果就是檢測不到HSE,進而引起系統復位,最終無法使用Bootloader 的 DFU 方式進行固件升級。
評論