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

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

[复制链接]
STMCU小助手 发布时间:2022-2-20 14:51
1 前言
3 D: i  i. y& `' ?2 y2 f本文将针对客户无法使用内置 Bootloader 的 DFU 方式进行固件升级的问题进行分析。
2 W* x6 B. ?; i" [9 P- ]
5 o. e* e2 K' @2 问题描述
- Z+ h4 u- z7 O" ^# T- G9 n客户使用的是 STM32F205VET6,做了个最小系统测试板,在 BOOT0=1,BOOT1=0 的情况下连接PC,使用 PC 端软件 DfuSeDemo 无法检测到 DFU 设备,但是同样在 Bootloader 模式下,却可以通过串口 1 进行固件升级。
- u4 R1 I4 Q! A" T6 W
/ x! l( ]7 F5 i3 z3 问题分析! S9 Y" N- M4 Q; @4 ]2 v- d0 V
首先怀疑的是 USB 线路问题,因此,在却换到正常模式(BOOT0=0,BOOT1=0)时,使用 CubeMx 做了个简单的鼠标 HID 测试程序验证,结果发现在正常模式下测试程序是能正常运行的,从这点可以说明USB 不存在线路不通的问题。
7 ~: }7 _8 D) H, E1 |; K
/ a( F/ `- ~% x" q) m' ~其次,检查各个管脚的电平,VDD,BOOT0,BOOT1 均未发现异常。
2 w0 U& d2 ?% L4 `9 K0 [于是打开应用文档 AN2606-STM32 microcontroller system memory boot mode.pdf,通过此应用文档可知,不同的 Bootloader 版本可用于固件升级的方式不尽相同,如 3.2 节如下内容:
; d) [7 W9 p' u0 b/ D1 z* y: n. N' @  `. |* |
WSBI7(AA9S$@HZB9TSDC7JN.png
& h7 H- I" ?5 }4 x- Y' `- {  u6 n! i2 ?, N4 h3 G$ u# e& C
因此怀疑此 MCU 的 BID 是否会不支持 DFU?通过上图可知,BID 可以通过 SWD 直接读取,因此我们需要找到保存此 BID 信息的地址。
. v) n* i- D1 P& E; z通过应用文档 AN2606 3.2 节的表 3:
; m9 [. Q% h. D! b0 V" e, U9 N: A: H
)%KH~PASJK78X5~2ELUUI(0.png
% M$ Q1 u& }: s
, ^! M3 x5 D5 {  H: f如上图可知,STM32F2 的 Bootloader 存在两种 BID,可以通过地址为 0x1FFF77DE 这个地址的值来获取,如为 0x20 则只支持 USART,若为 0x33,则支持 USART,CAN,DFU 这 3 种方式。于是使用PC 端软件 STM32 ST-LINK Utility 通过 SWD 读取 0x1FFF77DE 这个地址的值,如下图所示:
- u: ?) ?% x" \" ?+ M# ]2 Q9 R* x- c9 k
HT$GZ7KR_8Y764~O8FZ`6]P.png 3 @1 \. F, d+ V  k9 F1 H# R
% u6 V/ x2 o( E. u
如上图,可见客户使用的 STM32F205 的 BID 为 0x33,是同时支持 USART,CAN 和 DFU 这 3 种方式的,因此,排除 Bootloader 版本问题的可能性。; q' J7 S5 Y% J+ a6 O0 i

2 G% \+ o: M6 j4 }在上述可能性都排除外,客户提出怀疑芯片本身或 Bootloader 烧录的代码有问题,于是找出一块STM32F4-DISCOVERY 板进行 MCU 替换,替换后的结果为 STM32F205 在放到 DISCOVERY 板上则能正常通过 Bootloader 的 DFU 方式进行固件升级,因此,这就明确排除了芯片本身问题的可能性,因此,只可能是用户板子外围电路的问题。
- \) W4 f/ o. F7 `: W8 C5 v$ j* {& }$ Q4 }0 m
再次回到 AN2606 这个应用文档,在 15.2.2 节找到 Bootloader 的工作流程图,如下所示:
: [7 }! [9 t' I) t% H
- f+ t  _4 a- d2 z 23K_{MM{{SIF88J]0)BW@T1.png % |. \; c1 n6 B+ L0 D
  _+ ~) X# n( n; P! h2 H
通过上图可知,Bootloader 是依次检查 USART->CAN->DFU 的方式,怀疑 Bootloader 程序在 DFU 之前由于某种未知原因是否已经进入到 USAR 或 CAN 的方式中而一直没有出来?
' a. \$ i' J( l+ F9 @
2 F, [* z( j% o" A$ J1 @/ s1 K# U' S# W1 r: Z: [
为了排除这种可能性,我们针对 USART1 的 RX 脚 PA10,USART3 的 RX 脚 PB11 和 PC11 拉高,同时将 CAN2 的 RX 脚 PB5 拉低进行测试,结果还是无法检测到 DFU 设备。! i) F4 d2 m  M$ i, J) j. L
9 b+ q$ E; \5 e) p$ t
. X0 B. n* v- q  ]4 o: a
再次回到上图进行分析,如上图,若 USART 和 CAN 都没有检测到的话,Bootloader 程序会检测 USB线是否连接,然后检测外部 HSE,若 HSE 不存在,则产生系统复位,否则将会重现配置系统主频到60M。0 U+ h9 a5 S9 H9 C. L/ V+ D
$ `; Y0 b5 h- Z" k1 e. A( P2 R: I
, L6 b2 F2 X+ P  I$ f! E7 x
由于我们是连着 USB 线且在正常运行模式下 USB 是能正常工作的,因此,这里检测 USB 线结果应该是通过的,于是按照程序流程,接下来检测外部 HSE,若检测失败则复位系统。与是用示波器查看VDD 与 NRST 脚的波形,发现系统在 VDD 上电后有 3 次复位,如此,可以得出 Bootloader 程序在检测外部 HSE 时结果为失败,如下:
: c0 ]7 |* Z2 A7 o' i! ^3 y4 N4 t. {1 `7 \4 C4 s2 j
* m' c- }- s  c+ u2 G' Y2 A6 p
YJI1V6[C4568ZYQ0XM4OO7Q.png ' Q, q0 H, W) E+ ?- _. ^2 h8 D
% U) U& S( d" p
为什么会检测外部 HSE 失败? 用户使用的 HSE 是 8M 晶振,与 DISCOVERY 板一样都是 8M 外部晶振,对比用户的外部晶振电路与 DISCOVERY 的对应电路,如下图所示:( K" X( s: I5 B. Q/ U4 r

2 W5 J+ z1 @* X% T* G# L' F+ q9 G4 T8 [
H}AI_]2B6@[_RJHBLTZ6BYQ.png / _2 ?0 p. z2 {
. x' q6 g+ Q/ S* ]
如上图,左边为客户板子的晶振电路,右边为 DISCOVERY 板的晶振电路,对比可知,用户的负载电容使用的是 33pF,且多了个 1M 的反馈电阻。7 j% Y/ P1 e6 S( I$ b5 r% N

/ B1 x( M: l/ n; d; Q2 E( M首先将反馈电阻去掉后测试,结果还是一样。进一步将客户板子的晶振负载电容换成 20pF 后进行测试,结果可以正常检测到 DFU 设备,如此可见,正是因为这个负载电容的原因造成 Bootloader 的 DFU 无法正常工作!. g& H& E+ H: p* _

" e" D( {) x- h# S4 总结$ [8 }8 g2 i$ R3 v& V: A( W
此问题是由于晶振负载电容过大,导致内置 Bootloader 程序在检测外部 HSE 的时间点与实际 HSE 稳定震荡所需的时间不同步造成,结果就是检测不到 HSE,进而引起系统复位,最终无法使用Bootloader 的 DFU 方式进行固件升级。
0 v' H3 G* E$ `  h' w) r2 |0 n
9 I: p+ v" ]/ _5 J+ u+ d& a
9 P" y# M$ q3 M  q$ B
赞 收藏 评论0 发布时间:2022-2-20 14:51

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版