無法使用內置Bootloader的DFU方式進行固件升級

1 前言

本文將針對客戶無法使用內置Bootloader的DFU方式進行固件升級的問題進行分析。

2 問題描述

客戶使用的是STM32F205VET6,做了個最小系統測試板,在BOOT0=1,BOOT1=0的情況下連接PC,使用PC端軟件DfuSeDemo無法檢測到DFU設備,但是同樣在Bootloader模式下,卻可以通過串口1進行固件升級。

3 問題分析

首先懷疑的是USB線路問題,因此,在卻換到正常模式(BOOT0=0,BOOT1=0)時,使用CubeMx做了個簡單的鼠標HID測試程序驗證,結果發現在正常模式下測試程序是能正常運行的,從這點可以說明USB不存在線路不通的問題。

其次,檢查各個管腳的電平,VDD,BOOT0,BOOT1均未發現異常。
於是打開應用文檔AN2606-STM32 microcontroller system memory boot mode.pdf,通過此應用文檔可知,不同的Bootloader版本可用於固件升級的方式不盡相同,如3.2節如下內容:

BID定義

圖1 BID定義

因此懷疑此MCU的BID是否會不支持DFU?通過上圖可知,BID可以通過SWD直接讀取,因此我們需要找到保存此BID信息的地址。
通過應用文檔AN2606 3.2節的表3:
F2的BID的BID地址

圖2 F2的BID地址

如上圖可知,STM32F2的Bootloader存在兩種BID,可以通過地址爲0x1FFF77DE這個地址的值來獲取,如爲0x20則只支持USART,若爲0x33,則支持USART,CAN,DFU這3種方式。於是使用PC端軟件STM32 ST-LINK Utility通過SWD讀取0x1FFF77DE這個地址的值,如下圖所示:
F2的BID值

圖3 F2的BID值

如上圖,可見客戶使用的STM32F205的BID爲0x33,是同時支持USART,CAN和DFU這3種方式的,因此,排除Bootloader版本問題的可能性。

在上述可能性都排除外,客戶提出懷疑芯片本身或Bootloader燒錄的代碼有問題,於是找出一塊STM32F4-DISCOVERY板進行MCU替換,替換後的結果爲STM32F205在放到DISCOVERY板上則能正常通過Bootloader的DFU方式進行固件升級,因此,這就明確排除了芯片本身問題的可能性,因此,只可能是用戶板子外圍電路的問題。

再次回到AN2606這個應用文檔,在15.2.2節找到Bootloader的工作流程圖,如下所示:

Bootloader的工作流程圖

圖4 Bootloader的工作流程圖

通過上圖可知,Bootloader是依次檢查USART->CAN->DFU的方式,懷疑Bootloader程序在DFU之前由於某種未知原因是否已經進入到USAR或CAN的方式中而一直沒有出來?

爲了排除這種可能性,我們針對USART1的RX腳PA10,USART3的RX腳PB11和PC11拉高,同時將CAN2的RX腳PB5拉低進行測試,結果還是無法檢測到DFU設備。

再次回到上圖進行分析,如上圖,若USART和CAN都沒有檢測到的話,Bootloader程序會檢測USB線是否連接,然後檢測外部HSE,若HSE不存在,則產生系統復位,否則將會重現配置系統主頻到60M。

由於我們是連着USB線且在正常運行模式下USB是能正常工作的,因此,這裏檢測USB線結果應該是通過的,於是按照程序流程,接下來檢測外部HSE,若檢測失敗則復位系統。與是用示波器查看VDD與NRST腳的波形,發現系統在VDD上電後有3次復位,如此,可以得出Bootloader程序在檢測外部HSE時結果爲失敗,如下:

HSE 檢測失敗

圖5 HSE 檢測失敗

爲什麼會檢測外部HSE失敗? 用戶使用的HSE是8M晶振,與DISCOVERY板一樣都是8M外部晶振,對比用戶的外部晶振電路與DISCOVERY的對應電路,如下圖所示:
HSE對比

圖6 HSE對比

如上圖,左邊爲客戶板子的晶振電路,右邊爲DISCOVERY板的晶振電路,對比可知,用戶的負載電容使用的是33pF,且多了個1M的反饋電阻。

首先將反饋電阻去掉後測試,結果還是一樣。進一步將客戶板子的晶振負載電容換成20pF後進行測試,結果可以正常檢測到DFU設備,如此可見,正是因爲這個負載電容的原因造成Bootloader的DFU無法正常工作!

4 總結

此問題是由於晶振負載電容過大,導致內置Bootloader程序在檢測外部HSE的時間點與實際HSE穩定震盪所需的時間不同步造成,結果就是檢測不到HSE,進而引起系統復位,最終無法使用Bootloader的DFU方式進行固件升級。

5 本文所涉及到的文檔與軟件下載鏈接

AN2606 http://www.stmcu.org/document/detail/index/id-200918
DfuSeDemo http://www.stmcu.org/document/detail/index/id-214339
STM32 ST-LINK Utility http://www.stmcu.org/document/detail/index/id-215840

注:本文來自:http://www.stmcu.org/module/forum/thread-607934-1-1.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章