無法使用內置Bootloader的DFU方式進行固件升級
1 前言
本文將針對客戶無法使用內置Bootloader的DFU方式進行固件升級的問題進行分析。
2 問題描述客戶使用的是STM32F205VET6,做了個最小系統(tǒng)測試板,在BOOT0=1,BOOT1=0的情況下連接PC,使用PC端軟件DfuSeDemo無法檢測到DFU設備,但是同樣在Bootloader模式下,卻可以通過串口1進行固件升級。
3 問題分析首先懷疑的是USB線路問題,因此,在卻換到正常模式(BOOT0=0,BOOT1=0)時,使用CubeMx做了個簡單的鼠標HID測試程序驗證,結果發(fā)現(xiàn)在正常模式下測試程序是能正常運行的,從這點可以說明USB不存在線路不通的問題。
其次,檢查各個管腳的電平,VDD,BOOT0,BOOT1均未發(fā)現(xiàn)異常。
于是打開應用文檔AN2606-STM32 microcontroller system memory boot mode.pdf,通過此應用文檔可知,不同的Bootloader版本可用于固件升級的方式不盡相同,如3.2節(jié)如下內容:
因此懷疑此MCU的BID是否會不支持DFU?通過上圖可知,BID可以通過SWD直接讀取,因此我們需要找到保存此BID信息的地址。
通過應用文檔AN2606 3.2節(jié)的表3:
如上圖可知,STM32F2的Bootloader存在兩種BID,可以通過地址為0x1FFF77DE這個地址的值來獲取,如為0x20則只支持USART,若為0x33,則支持USART,CAN,DFU這3種方式。于是使用PC端軟件STM32 ST-LINK Utility通過SWD讀取0x1FFF77DE這個地址的值,如下圖所示:
如上圖,可見客戶使用的STM32F205的BID為0x33,是同時支持USART,CAN和DFU這3種方式的,因此,排除Bootloader版本問題的可能性。
在上述可能性都排除外,客戶提出懷疑芯片本身或Bootloader燒錄的代碼有問題,于是找出一塊STM32F4-DISCOVERY板進行MCU替換,替換后的結果為STM32F205在放到DISCOVERY板上則能正常通過Bootloader的DFU方式進行固件升級,因此,這就明確排除了芯片本身問題的可能性,因此,只可能是用戶板子外圍電路的問題。
再次回到AN2606這個應用文檔,在15.2.2節(jié)找到Bootloader的工作流程圖,如下所示:
通過上圖可知,Bootloader是依次檢查USART->CAN->DFU的方式,懷疑Bootloader程序在DFU之前由于某種未知原因是否已經(jīng)進入到USAR或CAN的方式中而一直沒有出來?
為了排除這種可能性,我們針對USART1的RX腳PA10,USART3的RX腳PB11和PC11拉高,同時將CAN2的RX腳PB5拉低進行測試,結果還是無法檢測到DFU設備。
再次回到上圖進行分析,如上圖,若USART和CAN都沒有檢測到的話,Bootloader程序會檢測USB線是否連接,然后檢測外部HSE,若HSE不存在,則產(chǎn)生系統(tǒng)復位,否則將會重現(xiàn)配置系統(tǒng)主頻到60M。
由于我們是連著USB線且在正常運行模式下USB是能正常工作的,因此,這里檢測USB線結果應該是通過的,于是按照程序流程,接下來檢測外部HSE,若檢測失敗則復位系統(tǒng)。與是用示波器查看VDD與NRST腳的波形,發(fā)現(xiàn)系統(tǒng)在VDD上電后有3次復位,如此,可以得出Bootloader程序在檢測外部HSE時結果為失敗,如下:
為什么會檢測外部HSE失??? 用戶使用的HSE是8M晶振,與DISCOVERY板一樣都是8M外部晶振,對比用戶的外部晶振電路與DISCOVERY的對應電路,如下圖所示:
如上圖,左邊為客戶板子的晶振電路,右邊為DISCOVERY板的晶振電路,對比可知,用戶的負載電容使用的是33pF,且多了個1M的反饋電阻。
首先將反饋電阻去掉后測試,結果還是一樣。進一步將客戶板子的晶振負載電容換成20pF后進行測試,結果可以正常檢測到DFU設備,如此可見,正是因為這個負載電容的原因造成Bootloader的DFU無法正常工作!
4 總結此問題是由于晶振負載電容過大,導致內置Bootloader程序在檢測外部HSE的時間點與實際HSE穩(wěn)定震蕩所需的時間不同步造成,結果就是檢測不到HSE,進而引起系統(tǒng)復位,最終無法使用Bootloader的DFU方式進行固件升級。
5 本文所涉及到的文檔與軟件下載鏈接AN2606http://www.stmcu.org/document/detail/index/id-200918
DfuSeDemohttp://www.stmcu.org/document/detail/index/id-214339
STM32 ST-LINK Utilityhttp://www.stmcu.org/document/detail/index/id-215840