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

【经验分享】无法使用内置 Bootloader 的 DFU 方式进行固件升级

[复制链接]
STMCU小助手 发布时间:2022-2-20 14:51
1 前言) p' G5 y4 W2 t
本文将针对客户无法使用内置 Bootloader 的 DFU 方式进行固件升级的问题进行分析。5 a. u4 x) ^. h1 m

" P  A' u+ ]4 ]! T2 问题描述- h, o3 p: z- h: _6 G0 w5 B
客户使用的是 STM32F205VET6,做了个最小系统测试板,在 BOOT0=1,BOOT1=0 的情况下连接PC,使用 PC 端软件 DfuSeDemo 无法检测到 DFU 设备,但是同样在 Bootloader 模式下,却可以通过串口 1 进行固件升级。
/ m0 l, p2 R5 A  M) |
0 k0 H& E* m2 ^( [! K: j0 g9 t  C) l3 问题分析" V" L  N) r/ V3 Z1 |* h3 m; e9 ~
首先怀疑的是 USB 线路问题,因此,在却换到正常模式(BOOT0=0,BOOT1=0)时,使用 CubeMx 做了个简单的鼠标 HID 测试程序验证,结果发现在正常模式下测试程序是能正常运行的,从这点可以说明USB 不存在线路不通的问题。5 F# D% y- S0 c. l! r

6 V$ F6 \5 D$ X6 `% E. }. P其次,检查各个管脚的电平,VDD,BOOT0,BOOT1 均未发现异常。. [  H" r8 Z& I$ c8 c# B0 J
于是打开应用文档 AN2606-STM32 microcontroller system memory boot mode.pdf,通过此应用文档可知,不同的 Bootloader 版本可用于固件升级的方式不尽相同,如 3.2 节如下内容:
+ j5 f; V. q! z) c) Q1 Z( `  W! h4 B- f! S, @( u
WSBI7(AA9S$@HZB9TSDC7JN.png
3 x# n; y. C4 x) B; y
0 F* F  q: }3 R2 V6 S7 B, v因此怀疑此 MCU 的 BID 是否会不支持 DFU?通过上图可知,BID 可以通过 SWD 直接读取,因此我们需要找到保存此 BID 信息的地址。7 F5 O' l* A$ D
通过应用文档 AN2606 3.2 节的表 3:2 n/ c  N& Q( ~9 Z  `& a- e. t

& y; S0 x- C) d  W )%KH~PASJK78X5~2ELUUI(0.png ( ~7 n7 j/ G  h, r" O
1 B$ X9 E& ?% k- V5 p
如上图可知,STM32F2 的 Bootloader 存在两种 BID,可以通过地址为 0x1FFF77DE 这个地址的值来获取,如为 0x20 则只支持 USART,若为 0x33,则支持 USART,CAN,DFU 这 3 种方式。于是使用PC 端软件 STM32 ST-LINK Utility 通过 SWD 读取 0x1FFF77DE 这个地址的值,如下图所示:, {/ d' d" n! \
0 ~( K: |; }: M7 Q2 j7 b4 Y
HT$GZ7KR_8Y764~O8FZ`6]P.png
& _# K+ p6 G5 p5 F" b6 e1 M1 @5 r0 C- Y5 P2 `
如上图,可见客户使用的 STM32F205 的 BID 为 0x33,是同时支持 USART,CAN 和 DFU 这 3 种方式的,因此,排除 Bootloader 版本问题的可能性。
5 `! {& o& j4 }% h, C: E
7 B1 f" t' P" N9 n+ ^在上述可能性都排除外,客户提出怀疑芯片本身或 Bootloader 烧录的代码有问题,于是找出一块STM32F4-DISCOVERY 板进行 MCU 替换,替换后的结果为 STM32F205 在放到 DISCOVERY 板上则能正常通过 Bootloader 的 DFU 方式进行固件升级,因此,这就明确排除了芯片本身问题的可能性,因此,只可能是用户板子外围电路的问题。% R' S  T3 F3 y6 b
7 A: P! Y' h3 E7 R
再次回到 AN2606 这个应用文档,在 15.2.2 节找到 Bootloader 的工作流程图,如下所示:
! I+ E3 }- h: E8 A; ?7 X1 }& D0 R5 Z
23K_{MM{{SIF88J]0)BW@T1.png : @) Z$ v% w+ B$ m! @. \5 Y* Y
1 u# ~0 K& d3 i, N/ _/ d6 }
通过上图可知,Bootloader 是依次检查 USART->CAN->DFU 的方式,怀疑 Bootloader 程序在 DFU 之前由于某种未知原因是否已经进入到 USAR 或 CAN 的方式中而一直没有出来?
. L2 ^: X$ G9 }! V; j2 W6 l$ ~' R) W# P  t- |

1 Y: L# U5 V  h: P4 [1 }为了排除这种可能性,我们针对 USART1 的 RX 脚 PA10,USART3 的 RX 脚 PB11 和 PC11 拉高,同时将 CAN2 的 RX 脚 PB5 拉低进行测试,结果还是无法检测到 DFU 设备。2 O& L- p: `& J5 e" F5 @

- ]: k1 c. K6 h/ r
& M+ Z7 Z: }' e# J* q) Y5 Q再次回到上图进行分析,如上图,若 USART 和 CAN 都没有检测到的话,Bootloader 程序会检测 USB线是否连接,然后检测外部 HSE,若 HSE 不存在,则产生系统复位,否则将会重现配置系统主频到60M。
* l; _1 a) p+ k' n
1 \% j3 `* n& U: H8 H0 A, a
, u, @( p. @! B' _" v由于我们是连着 USB 线且在正常运行模式下 USB 是能正常工作的,因此,这里检测 USB 线结果应该是通过的,于是按照程序流程,接下来检测外部 HSE,若检测失败则复位系统。与是用示波器查看VDD 与 NRST 脚的波形,发现系统在 VDD 上电后有 3 次复位,如此,可以得出 Bootloader 程序在检测外部 HSE 时结果为失败,如下:$ J# X. |5 r& e5 P$ Z3 ^% E3 f8 G
; [# b# a/ z# c: O  H
' {6 y4 G1 i3 |6 y
YJI1V6[C4568ZYQ0XM4OO7Q.png 2 o/ y0 h. n, ?9 [. o  y: ?

- V  `* j5 x8 O* ~' b* Q1 I! Q8 w为什么会检测外部 HSE 失败? 用户使用的 HSE 是 8M 晶振,与 DISCOVERY 板一样都是 8M 外部晶振,对比用户的外部晶振电路与 DISCOVERY 的对应电路,如下图所示:
9 f! E( j# G2 Q: z. v
0 Z  K+ i0 ^9 q
, |- K0 H4 N# `$ `! H7 Z4 k# u0 r H}AI_]2B6@[_RJHBLTZ6BYQ.png & Z' Q; G0 `6 L
- M% ~* d' N: @, W/ }
如上图,左边为客户板子的晶振电路,右边为 DISCOVERY 板的晶振电路,对比可知,用户的负载电容使用的是 33pF,且多了个 1M 的反馈电阻。
+ [2 A7 I+ P2 i$ ?+ U! f1 u7 K
- y1 r, k" G- ]4 j首先将反馈电阻去掉后测试,结果还是一样。进一步将客户板子的晶振负载电容换成 20pF 后进行测试,结果可以正常检测到 DFU 设备,如此可见,正是因为这个负载电容的原因造成 Bootloader 的 DFU 无法正常工作!- K. B  b. g' `

, r" P: I( J  ?5 |3 i1 @4 总结( X7 e# o" L6 U9 p+ m* ]& `
此问题是由于晶振负载电容过大,导致内置 Bootloader 程序在检测外部 HSE 的时间点与实际 HSE 稳定震荡所需的时间不同步造成,结果就是检测不到 HSE,进而引起系统复位,最终无法使用Bootloader 的 DFU 方式进行固件升级。
4 G# v$ Q! l* H/ J' D+ h! [* _
  F5 c9 ^2 _& u( B- k  E  m) o3 j/ E8 T: @2 u2 M
收藏 评论0 发布时间:2022-2-20 14:51

举报

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