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

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

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

( Y7 H, `& n4 K
2 x8 Y$ L7 \% [  G  u9 q% `1 ?6 g% D1 前言0 K& |( ]/ D2 }
本文将针对客户无法使用内置Bootloader的DFU方式进行固件升级的问题进行分析。
) _* y: p5 ?# x4 H1 W% W9 M: c! Z$ `6 z$ t$ K

- D) r3 Z# J7 J/ d* X+ N% g' Z2 问题描述2 C4 u7 t% [5 i$ `0 F6 S7 B
客户使用的是STM32F205VET6,做了个最小系统测试板,在BOOT0=1,BOOT1=0的情况下连接PC,使用PC端软件DfuSeDemo无法检测到DFU设备,但是同样在Bootloader模式下,却可以通过串口1进行固件升级。
5 \7 r9 T6 B2 N" s& f8 {! q4 ~5 ]4 v5 b4 a! @1 d
; v' Q5 I' q) q, [2 b1 V2 m0 I9 h4 Q
3 问题分析2 x( k3 L/ M; v, Y
首先怀疑的是USB线路问题,因此,在却换到正常模式(BOOT0=0,BOOT1=0)时,使用CubeMx做了个简单的鼠标HID测试程序验证,结果发现在正常模式下测试程序是能正常运行的,从这点可以说明USB不存在线路不通的问题。
4 U5 L/ o% V- W7 h4 r7 H3 x" t& h; q
其次,检查各个管脚的电平,VDD,BOOT0,BOOT1均未发现异常。
9 P3 p- ]' h6 U5 `0 @于是打开应用文档AN2606-STM32 microcontroller system memory boot mode.pdf,通过此应用文档可知,不同的Bootloader版本可用于固件升级的方式不尽相同,如3.2节如下内容:
) b4 h0 t& E2 T' q1 ^0 H  [ 11.png 1 I7 g+ n7 w3 Q

5 p$ R- i. L0 A4 ^5 v5 A9 o1 K因此怀疑此MCU的BID是否会不支持DFU?通过上图可知,BID可以通过SWD直接读取,因此我们需要找到保存此BID信息的地址。8 X- L2 K4 W; M: o5 _( E
通过应用文档AN2606 3.2节的表3:4 B5 I0 h# ]& W! e. C
12.png 4 P8 a2 U9 d7 k( b

+ Z* t# Z7 S/ }. @3 {如上图可知,STM32F2的Bootloader存在两种BID,可以通过地址为0x1FFF77DE这个地址的值来获取,如为0x20则只支持USART,若为0x33,则支持USART,CAN,DFU这3种方式。于是使用PC端软件STM32 ST-LINK Utility通过SWD读取0x1FFF77DE这个地址的值,如下图所示:% o/ O" F* i4 m: Y3 r
13.png ' N8 Q% z8 N: k
如上图,可见客户使用的STM32F205的BID为0x33,是同时支持USART,CAN和DFU这3种方式的,因此,排除Bootloader版本问题的可能性。5 I# d  b0 E9 ^

3 M' @. p6 _( i, F在上述可能性都排除外,客户提出怀疑芯片本身或Bootloader烧录的代码有问题,于是找出一块STM32F4-DISCOVERY板进行MCU替换,替换后的结果为STM32F205在放到DISCOVERY板上则能正常通过Bootloader的DFU方式进行固件升级,因此,这就明确排除了芯片本身问题的可能性,因此,只可能是用户板子外围电路的问题。) ~; ]7 g5 |% L9 Y! }
再次回到AN2606这个应用文档,在15.2.2节找到Bootloader的工作流程图,如下所示:
7 ~# B* j- S( @  c: G6 v 14.png
" g) K* w9 v' L- b. S7 I" a6 i  C; \: W" U- r
通过上图可知,Bootloader是依次检查USART->CAN->DFU的方式,怀疑Bootloader程序在DFU之前由于某种未知原因是否已经进入到USAR或CAN的方式中而一直没有出来?
5 [$ Y( G( l( F. w1 R
. I4 M7 Z3 h9 [# P4 Q为了排除这种可能性,我们针对USART1的RX脚PA10,USART3的RX脚PB11和PC11拉高,同时将CAN2的RX脚PB5拉低进行测试,结果还是无法检测到DFU设备。/ t5 L! J1 [- r

% M. d3 L$ B  v4 [( J/ j再次回到上图进行分析,如上图,若USART和CAN都没有检测到的话,Bootloader程序会检测USB线是否连接,然后检测外部HSE,若HSE不存在,则产生系统复位,否则将会重现配置系统主频到60M。% c6 F* l4 ~) n2 Y, D! a7 N6 B
3 [  S2 P# O% [! z8 I9 W
由于我们是连着USB线且在正常运行模式下USB是能正常工作的,因此,这里检测USB线结果应该是通过的,于是按照程序流程,接下来检测外部HSE,若检测失败则复位系统。与是用示波器查看
( ?! u% D1 c9 X3 {1 ^3 IVDD与NRST脚的波形,发现系统在VDD上电后有3次复位,如此,可以得出Bootloader程序在检测外部HSE时结果为失败,如下:
+ e, K7 I# A3 S# T! s 15.png - @& k6 h& _; D/ B  f  {5 j
* y' t! ]) Z8 Q
为什么会检测外部HSE失败? 用户使用的HSE是8M晶振,与DISCOVERY板一样都是8M外部晶振,对比用户的外部晶振电路与DISCOVERY的对应电路,如下图所示:3 f! ]# [6 q1 z# o" Q  Y% f" R  s; k
16.png 2 S) \3 S, L6 N0 r! J4 w
8 i; |8 Z' g" T5 l% J
如上图,左边为客户板子的晶振电路,右边为DISCOVERY板的晶振电路,对比可知,用户的负载电容使用的是33pF,且多了个1M的反馈电阻。
6 `: A5 W- A( r, L. I+ h) m首先将反馈电阻去掉后测试,结果还是一样。进一步将客户板子的晶振负载电容换成20pF后进行测试,结果可以正常检测到DFU设备,如此可见,正是因为这个负载电容的原因造成Bootloader的DFU无**常工作!- O0 j8 g% |. U8 w; f8 ]) Y! C7 b' ^! M4 F
7 j, R4 Z( y, Z
+ F  w, d/ ?! D% E3 n
4 总结
: e" S5 r  l" j7 x4 n5 V此问题是由于晶振负载电容过大,导致内置Bootloader程序在检测外部HSE的时间点与实际HSE稳定震荡所需的时间不同步造成,结果就是检测不到HSE,进而引起系统复位,最终无法使用Bootloader的DFU方式进行固件升级。
% N1 G: G) M0 t. P: I; U
" h' _' M) ~; N- C5 F/ A  Z5 p+ P3 e& O6 ^% k  Z0 t
5 本文所涉及到的文档与软件下载链接
  {" s% P( c  r& z- E( hAN2606 https://www.stmcu.org.cn/document/detail/index/id-200918
( ~# p. [1 \/ L2 Q" I6 U* p4 XDfuSeDemo https://www.stmcu.org.cn/document/detail/index/id-214339  P1 C) X( b- Y9 V" Q+ R7 z. T
STM32 ST-LINK Utility https://www.stmcu.org.cn/document/detail/index/id-215840: z8 f" x, |5 r  i0 @

# \2 B; G1 `4 A8 _1 J
. j+ `# j6 c- b$ f- T# X, Z! d5 x点击下载文档, c3 n, @: ~2 G8 \# x- I
查看更多实战经验
+ ~; T4 t( M- s
5 V/ _* z- X1 r' n% W' p: X. r
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 手机版