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

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

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

/ E, [1 @& T( O  W% g) {+ U# i1 前言: y0 z6 w; y+ n6 O- H/ T4 ^; t' V
本文将针对客户无法使用内置Bootloader的DFU方式进行固件升级的问题进行分析。6 K( n) u  [9 z5 F, `
) u- o. `: C( D

6 m- z" ]' C& h  t- |  w* H0 T2 问题描述8 C5 t3 h$ V+ R7 G0 Y0 @1 f* o
客户使用的是STM32F205VET6,做了个最小系统测试板,在BOOT0=1,BOOT1=0的情况下连接PC,使用PC端软件DfuSeDemo无法检测到DFU设备,但是同样在Bootloader模式下,却可以通过串口1进行固件升级。8 r8 B: v/ |4 O+ Q: e; _6 P

  O* g4 `# p5 O  Y. K; b4 c) |2 [% g; s; v( ^
3 问题分析
9 r" a0 M- f$ o2 @: E# ]% E$ f首先怀疑的是USB线路问题,因此,在却换到正常模式(BOOT0=0,BOOT1=0)时,使用CubeMx做了个简单的鼠标HID测试程序验证,结果发现在正常模式下测试程序是能正常运行的,从这点可以说明USB不存在线路不通的问题。
8 S' \7 |* w( y" G- q; a: Q+ a' p$ P# [/ R5 r! j
其次,检查各个管脚的电平,VDD,BOOT0,BOOT1均未发现异常。
; B% w9 N1 t% o6 x; N于是打开应用文档AN2606-STM32 microcontroller system memory boot mode.pdf,通过此应用文档可知,不同的Bootloader版本可用于固件升级的方式不尽相同,如3.2节如下内容:
, y# I5 R9 w; p. m 11.png
; h2 N2 o8 Y7 S3 D+ h7 K. b* p/ f! w! o& ~6 x8 p
因此怀疑此MCU的BID是否会不支持DFU?通过上图可知,BID可以通过SWD直接读取,因此我们需要找到保存此BID信息的地址。$ K6 o  N. D. T, W
通过应用文档AN2606 3.2节的表3:/ K4 Z, K$ ~4 S; h
12.png
/ r7 m& V8 J6 n4 F3 l/ D0 M6 A  e9 B' _% u) _- j0 E/ C7 |
如上图可知,STM32F2的Bootloader存在两种BID,可以通过地址为0x1FFF77DE这个地址的值来获取,如为0x20则只支持USART,若为0x33,则支持USART,CAN,DFU这3种方式。于是使用PC端软件STM32 ST-LINK Utility通过SWD读取0x1FFF77DE这个地址的值,如下图所示:
2 M6 m4 @$ ]1 p7 N. M 13.png 5 K$ ^' r7 V3 _) I0 P' d
如上图,可见客户使用的STM32F205的BID为0x33,是同时支持USART,CAN和DFU这3种方式的,因此,排除Bootloader版本问题的可能性。, P- k; S1 H9 K6 _" Q9 I
% g! {+ I4 u' Y. n. d; b, u. T
在上述可能性都排除外,客户提出怀疑芯片本身或Bootloader烧录的代码有问题,于是找出一块STM32F4-DISCOVERY板进行MCU替换,替换后的结果为STM32F205在放到DISCOVERY板上则能正常通过Bootloader的DFU方式进行固件升级,因此,这就明确排除了芯片本身问题的可能性,因此,只可能是用户板子外围电路的问题。
* j+ r, Y  J+ r再次回到AN2606这个应用文档,在15.2.2节找到Bootloader的工作流程图,如下所示:8 r6 ?  o% W2 q5 T
14.png
" ], V) t6 R  g! u3 d( V+ }
9 |+ ?. ~, z% @! \) l0 m8 n通过上图可知,Bootloader是依次检查USART->CAN->DFU的方式,怀疑Bootloader程序在DFU之前由于某种未知原因是否已经进入到USAR或CAN的方式中而一直没有出来?( l. q6 k8 I7 s2 {# @+ k5 I3 L; ^

1 ]' \# G) B; Z6 E: K9 i& v  T+ \2 Q为了排除这种可能性,我们针对USART1的RX脚PA10,USART3的RX脚PB11和PC11拉高,同时将CAN2的RX脚PB5拉低进行测试,结果还是无法检测到DFU设备。
0 [: \/ t2 {; I! e/ {& E9 v' R/ f& X- S; R  N. Z3 i8 B
再次回到上图进行分析,如上图,若USART和CAN都没有检测到的话,Bootloader程序会检测USB线是否连接,然后检测外部HSE,若HSE不存在,则产生系统复位,否则将会重现配置系统主频到60M。
) y+ Q2 H; C8 h9 O# k+ d/ X0 m+ E4 b
# n/ O* C9 Q0 V" L7 K8 z3 y由于我们是连着USB线且在正常运行模式下USB是能正常工作的,因此,这里检测USB线结果应该是通过的,于是按照程序流程,接下来检测外部HSE,若检测失败则复位系统。与是用示波器查看
0 E4 _1 P5 x8 z3 v# F% ]VDD与NRST脚的波形,发现系统在VDD上电后有3次复位,如此,可以得出Bootloader程序在检测外部HSE时结果为失败,如下:; o* c6 u9 n$ G3 \+ G6 T
15.png
7 E1 ]6 ^! E% `9 `8 h
/ c% `" g: v5 L3 b! I为什么会检测外部HSE失败? 用户使用的HSE是8M晶振,与DISCOVERY板一样都是8M外部晶振,对比用户的外部晶振电路与DISCOVERY的对应电路,如下图所示:$ X/ g! Z2 D+ _# t; a2 e2 Q
16.png ; l& ^. I1 }9 q) {- |

9 u% b& p: H1 j如上图,左边为客户板子的晶振电路,右边为DISCOVERY板的晶振电路,对比可知,用户的负载电容使用的是33pF,且多了个1M的反馈电阻。3 t7 c" A5 [$ u4 ^2 }. Y
首先将反馈电阻去掉后测试,结果还是一样。进一步将客户板子的晶振负载电容换成20pF后进行测试,结果可以正常检测到DFU设备,如此可见,正是因为这个负载电容的原因造成Bootloader的DFU无**常工作!
) f3 S( G$ x* B8 |- K) r( T) q$ f" P; V' \- I7 s
+ U$ {& }4 z. h$ G( A
4 总结
2 ]8 v5 |1 W  U# x7 b7 d此问题是由于晶振负载电容过大,导致内置Bootloader程序在检测外部HSE的时间点与实际HSE稳定震荡所需的时间不同步造成,结果就是检测不到HSE,进而引起系统复位,最终无法使用Bootloader的DFU方式进行固件升级。" t: A4 `/ `8 G

8 y0 V: S, ~! |& A2 f9 d% h9 r4 Z) h7 V1 B! b
5 本文所涉及到的文档与软件下载链接
7 E  a3 p$ U$ W' K# UAN2606 https://www.stmcu.org.cn/document/detail/index/id-200918
1 {0 b$ k* q! ^5 k# jDfuSeDemo https://www.stmcu.org.cn/document/detail/index/id-214339! N7 `/ a) Q4 \9 d# n4 g- [) G
STM32 ST-LINK Utility https://www.stmcu.org.cn/document/detail/index/id-215840
. @! o7 p8 ]: x/ r0 E) @! {  ~
+ A3 _5 ]" D4 n1 Y* ]' ^& B; G" a# X2 Z2 y
点击下载文档4 c) \/ W2 E$ S  G+ G, e& L
查看更多实战经验
% z# U) V# h! e% V' s& ^1 F9 r) F* d' 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 手机版