请选择 进入手机版 | 继续访问电脑版

你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【实战经验】无法使用内置 Bootloader 的 DFU 方式进行固件升...

[复制链接]
zero99 发布时间:2016-9-20 16:02
无法使用内置 Bootloader 的 DFU 方式进行固件升级
" u7 O2 a& r; V

7 t/ T- |, c% Y4 I( `% S  e: Y+ `+ y- @1 前言
1 R" M5 U& X* e) q) Y- E本文将针对客户无法使用内置Bootloader的DFU方式进行固件升级的问题进行分析。' _4 K2 ~, R) h+ N9 N
* j5 Q# t  q3 d  Z; ]
2 ^. c$ b+ L( r3 F- R1 j9 g% U; @
2 问题描述! K1 B& R: G3 k
客户使用的是STM32F205VET6,做了个最小系统测试板,在BOOT0=1,BOOT1=0的情况下连接PC,使用PC端软件DfuSeDemo无法检测到DFU设备,但是同样在Bootloader模式下,却可以通过串口1进行固件升级。& ~- r$ M0 G* r& N, M- ]$ m

, ~& u3 D2 t& D# N3 z
3 E  c$ D: q& R0 E6 }. A1 K2 N3 问题分析8 h* a! U4 Y& e' H% ]
首先怀疑的是USB线路问题,因此,在却换到正常模式(BOOT0=0,BOOT1=0)时,使用CubeMx做了个简单的鼠标HID测试程序验证,结果发现在正常模式下测试程序是能正常运行的,从这点可以说明USB不存在线路不通的问题。
, y- j/ G: ~6 n7 Z+ X# Y! G2 n& D8 W
其次,检查各个管脚的电平,VDD,BOOT0,BOOT1均未发现异常。
. ?  ^# {) i) o8 N# f5 C于是打开应用文档AN2606-STM32 microcontroller system memory boot mode.pdf,通过此应用文档可知,不同的Bootloader版本可用于固件升级的方式不尽相同,如3.2节如下内容:
' e1 w6 u! t0 |7 K5 p: E9 b 11.png
8 l  q* w2 z6 D9 l# V+ C. M9 |$ [" }
因此怀疑此MCU的BID是否会不支持DFU?通过上图可知,BID可以通过SWD直接读取,因此我们需要找到保存此BID信息的地址。
8 e. f" h' ^/ N1 o通过应用文档AN2606 3.2节的表3:
7 o, |- G1 S5 T! e 12.png
4 E4 Z9 L' Y0 K' ?* D- Z* `5 M8 N- T) T
如上图可知,STM32F2的Bootloader存在两种BID,可以通过地址为0x1FFF77DE这个地址的值来获取,如为0x20则只支持USART,若为0x33,则支持USART,CAN,DFU这3种方式。于是使用PC端软件STM32 ST-LINK Utility通过SWD读取0x1FFF77DE这个地址的值,如下图所示:
$ V) k( c' ]# W# A7 k' B 13.png . a* [' w4 P* f' x3 q, H
如上图,可见客户使用的STM32F205的BID为0x33,是同时支持USART,CAN和DFU这3种方式的,因此,排除Bootloader版本问题的可能性。6 U% D8 K! V0 `
2 |8 Y4 N6 {* o- r
在上述可能性都排除外,客户提出怀疑芯片本身或Bootloader烧录的代码有问题,于是找出一块STM32F4-DISCOVERY板进行MCU替换,替换后的结果为STM32F205在放到DISCOVERY板上则能正常通过Bootloader的DFU方式进行固件升级,因此,这就明确排除了芯片本身问题的可能性,因此,只可能是用户板子外围电路的问题。
+ B' s+ z# ?5 R再次回到AN2606这个应用文档,在15.2.2节找到Bootloader的工作流程图,如下所示:
; V; ~# v' e+ ~) @' g 14.png
2 x8 U: n1 L/ [( Q! b3 K8 L! z6 N
* }9 O$ `- I: L* r, _7 h通过上图可知,Bootloader是依次检查USART->CAN->DFU的方式,怀疑Bootloader程序在DFU之前由于某种未知原因是否已经进入到USAR或CAN的方式中而一直没有出来?
& t  v6 \8 e% w6 `8 k' I$ X
7 o, Q3 C' D7 G7 }+ C0 Q: P- m/ n为了排除这种可能性,我们针对USART1的RX脚PA10,USART3的RX脚PB11和PC11拉高,同时将CAN2的RX脚PB5拉低进行测试,结果还是无法检测到DFU设备。
7 a# P: ?* C1 B4 f+ S# J  \3 p
% _/ Y! }3 P+ h* i: R: D$ M4 G1 E$ \再次回到上图进行分析,如上图,若USART和CAN都没有检测到的话,Bootloader程序会检测USB线是否连接,然后检测外部HSE,若HSE不存在,则产生系统复位,否则将会重现配置系统主频到60M。( g/ a* _; I; Z0 R& H
. u+ ~3 e, m  L6 x* a
由于我们是连着USB线且在正常运行模式下USB是能正常工作的,因此,这里检测USB线结果应该是通过的,于是按照程序流程,接下来检测外部HSE,若检测失败则复位系统。与是用示波器查看
! g+ u6 i3 s3 S, Y: l9 gVDD与NRST脚的波形,发现系统在VDD上电后有3次复位,如此,可以得出Bootloader程序在检测外部HSE时结果为失败,如下:. p) x: F+ H9 {/ A2 n8 h' |
15.png
1 ?+ T( K9 Z: }/ P) Y4 @* `$ Y, H' u) T: B6 j. s
为什么会检测外部HSE失败? 用户使用的HSE是8M晶振,与DISCOVERY板一样都是8M外部晶振,对比用户的外部晶振电路与DISCOVERY的对应电路,如下图所示:
. U9 y2 z# Z0 l 16.png
: [! z7 ?( m% T9 q' L9 m* a
5 ?8 [0 _7 P, N6 R: B0 e2 ~. v如上图,左边为客户板子的晶振电路,右边为DISCOVERY板的晶振电路,对比可知,用户的负载电容使用的是33pF,且多了个1M的反馈电阻。9 _2 i7 r' ^2 `3 Q; P' n* M
首先将反馈电阻去掉后测试,结果还是一样。进一步将客户板子的晶振负载电容换成20pF后进行测试,结果可以正常检测到DFU设备,如此可见,正是因为这个负载电容的原因造成Bootloader的DFU无**常工作!* Q  Z. k% l" h, @& w- u

: _( H* }0 f8 H6 O- m2 y4 w
! L0 g# v  P* K( J8 d" m/ ?4 总结
6 j& T/ i" k( T# [+ p( ]此问题是由于晶振负载电容过大,导致内置Bootloader程序在检测外部HSE的时间点与实际HSE稳定震荡所需的时间不同步造成,结果就是检测不到HSE,进而引起系统复位,最终无法使用Bootloader的DFU方式进行固件升级。
# |" U2 s7 k) x0 f' g+ T& G# Z1 s( e6 x; N" c; [3 W
$ Y3 E* F$ D8 w' Y0 F
5 本文所涉及到的文档与软件下载链接
6 q6 O' n& O3 h; n* U# TAN2606 https://www.stmcu.org.cn/document/detail/index/id-2009183 \* V5 i- M2 l( D; I  x  u( x. y
DfuSeDemo https://www.stmcu.org.cn/document/detail/index/id-214339
) c# I* w& u% P) [6 JSTM32 ST-LINK Utility https://www.stmcu.org.cn/document/detail/index/id-215840+ ^" U+ f$ [/ N+ c' C
6 y( z6 L/ N% @2 w, N1 i

" ^) G) ^5 v: a$ I点击下载文档& j: R4 m4 U, q$ O8 n2 a$ n5 \
查看更多实战经验
" w  K( o" p: d" B5 Z' k3 d2 b' h
1 收藏 3 评论3 发布时间:2016-9-20 16:02

举报

3个回答
天道酬勤DW 回答时间:2016-10-8 16:53:47
这个分析的好,厉害
wdshuang09 回答时间:2016-10-8 18:25:08
问题分析的很透彻,学习了
xiaoxiao0932 回答时间:2016-12-15 15:07:58
谢谢分享啊~

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版