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

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

[复制链接]
STMCU小助手 发布时间:2022-2-20 14:51
1 前言
) G1 h* b' G1 K; J2 \本文将针对客户无法使用内置 Bootloader 的 DFU 方式进行固件升级的问题进行分析。
$ r+ ^$ n2 L6 J2 G
# C) B$ U. ^; P6 k  j0 e( M( B# i( h! v2 问题描述5 N: o2 I5 o$ S4 W: U
客户使用的是 STM32F205VET6,做了个最小系统测试板,在 BOOT0=1,BOOT1=0 的情况下连接PC,使用 PC 端软件 DfuSeDemo 无法检测到 DFU 设备,但是同样在 Bootloader 模式下,却可以通过串口 1 进行固件升级。, `- Y" k: o5 A: R; n& L" q/ {% T4 N2 M6 q

0 {. @" ?7 t4 K- X6 w# b3 问题分析
2 Y0 u1 q$ K$ c: _: m8 {! I首先怀疑的是 USB 线路问题,因此,在却换到正常模式(BOOT0=0,BOOT1=0)时,使用 CubeMx 做了个简单的鼠标 HID 测试程序验证,结果发现在正常模式下测试程序是能正常运行的,从这点可以说明USB 不存在线路不通的问题。% d, {3 f* I, a$ F
: M  P2 n3 s7 ?% k- v
其次,检查各个管脚的电平,VDD,BOOT0,BOOT1 均未发现异常。
  o* e- A! n9 |2 |于是打开应用文档 AN2606-STM32 microcontroller system memory boot mode.pdf,通过此应用文档可知,不同的 Bootloader 版本可用于固件升级的方式不尽相同,如 3.2 节如下内容:
& u7 n# I$ S* Y; y7 p' x: P( z7 |' d4 F, s* {
WSBI7(AA9S$@HZB9TSDC7JN.png " M+ j. Z/ k/ B; b( H- m. h
, n5 t' D7 Z4 O4 K, @" W
因此怀疑此 MCU 的 BID 是否会不支持 DFU?通过上图可知,BID 可以通过 SWD 直接读取,因此我们需要找到保存此 BID 信息的地址。
& I4 N0 g& G9 e1 s1 b0 O5 V1 O/ g+ X通过应用文档 AN2606 3.2 节的表 3:
7 p' S0 V7 t! ]
) x" N7 K/ D& h# ]9 x6 W4 u/ p )%KH~PASJK78X5~2ELUUI(0.png
# a  Y9 E" o2 O& Y0 v& r# a( E
: S" ]. g) i% K- V0 S% x4 ~如上图可知,STM32F2 的 Bootloader 存在两种 BID,可以通过地址为 0x1FFF77DE 这个地址的值来获取,如为 0x20 则只支持 USART,若为 0x33,则支持 USART,CAN,DFU 这 3 种方式。于是使用PC 端软件 STM32 ST-LINK Utility 通过 SWD 读取 0x1FFF77DE 这个地址的值,如下图所示:
3 W* H* I# ]" ]3 w+ o: a! h/ ^. l: [; B7 g' Z* v
HT$GZ7KR_8Y764~O8FZ`6]P.png
5 ~1 G7 y( u& u2 n( z& o5 _* k3 m5 u) j4 A9 b. s
如上图,可见客户使用的 STM32F205 的 BID 为 0x33,是同时支持 USART,CAN 和 DFU 这 3 种方式的,因此,排除 Bootloader 版本问题的可能性。8 f- L2 g6 m: X4 L$ k  i& q+ m$ V
& g+ X# y9 O& e4 k+ _
在上述可能性都排除外,客户提出怀疑芯片本身或 Bootloader 烧录的代码有问题,于是找出一块STM32F4-DISCOVERY 板进行 MCU 替换,替换后的结果为 STM32F205 在放到 DISCOVERY 板上则能正常通过 Bootloader 的 DFU 方式进行固件升级,因此,这就明确排除了芯片本身问题的可能性,因此,只可能是用户板子外围电路的问题。' c/ z" k6 O9 k
# V; z: M5 Q8 K( Z
再次回到 AN2606 这个应用文档,在 15.2.2 节找到 Bootloader 的工作流程图,如下所示:
- ]4 H4 K" p: P- B+ n( R. l; m+ o5 x4 b# S
23K_{MM{{SIF88J]0)BW@T1.png 5 Q# u2 Q2 G; a6 o

6 _) B* l8 R5 r7 N$ A5 E2 y8 c通过上图可知,Bootloader 是依次检查 USART->CAN->DFU 的方式,怀疑 Bootloader 程序在 DFU 之前由于某种未知原因是否已经进入到 USAR 或 CAN 的方式中而一直没有出来?
- Z$ Q& l6 }1 \$ H- `! R$ N% A+ Z7 t: J3 J8 H: o# H

7 ~9 Y8 f, v- L( I3 H为了排除这种可能性,我们针对 USART1 的 RX 脚 PA10,USART3 的 RX 脚 PB11 和 PC11 拉高,同时将 CAN2 的 RX 脚 PB5 拉低进行测试,结果还是无法检测到 DFU 设备。% A. Q! f( K9 Y
7 V4 Y. x$ ~5 A; @, a* M5 }

9 A( B- F1 Z- M' _再次回到上图进行分析,如上图,若 USART 和 CAN 都没有检测到的话,Bootloader 程序会检测 USB线是否连接,然后检测外部 HSE,若 HSE 不存在,则产生系统复位,否则将会重现配置系统主频到60M。
. s* R  Y9 U9 \3 R8 _
8 U" c: R4 y" l/ K) c" t2 s7 d% a1 z7 Z5 O7 K" n
由于我们是连着 USB 线且在正常运行模式下 USB 是能正常工作的,因此,这里检测 USB 线结果应该是通过的,于是按照程序流程,接下来检测外部 HSE,若检测失败则复位系统。与是用示波器查看VDD 与 NRST 脚的波形,发现系统在 VDD 上电后有 3 次复位,如此,可以得出 Bootloader 程序在检测外部 HSE 时结果为失败,如下:
( ~( K5 A8 ~3 _) l( B7 f1 y
0 v0 ^% s; u7 t5 j% u6 N# v+ C0 H! l( |  V1 s9 j9 S
YJI1V6[C4568ZYQ0XM4OO7Q.png   G# T0 X% B; Q; h0 M

* _0 Y' U5 V% w为什么会检测外部 HSE 失败? 用户使用的 HSE 是 8M 晶振,与 DISCOVERY 板一样都是 8M 外部晶振,对比用户的外部晶振电路与 DISCOVERY 的对应电路,如下图所示:
2 P4 W7 @) I4 S6 U  |8 w9 j. a, E8 q
, }4 G. ~- W3 F
- W  E. i" D2 q H}AI_]2B6@[_RJHBLTZ6BYQ.png % ~7 D  Q  ~9 b# {2 B: Q) _

) }5 A$ H9 d4 U3 D) D. M6 g  m如上图,左边为客户板子的晶振电路,右边为 DISCOVERY 板的晶振电路,对比可知,用户的负载电容使用的是 33pF,且多了个 1M 的反馈电阻。0 a% ?& U! Z% r; V, K4 w+ f
0 x) b# P7 [2 H. L/ _  S" f
首先将反馈电阻去掉后测试,结果还是一样。进一步将客户板子的晶振负载电容换成 20pF 后进行测试,结果可以正常检测到 DFU 设备,如此可见,正是因为这个负载电容的原因造成 Bootloader 的 DFU 无法正常工作!1 i7 z4 I0 `' a3 B% ~/ W, J  J9 ?! J) N

8 @; o1 q) B- R4 总结
+ r/ [$ n5 x4 n3 T/ G此问题是由于晶振负载电容过大,导致内置 Bootloader 程序在检测外部 HSE 的时间点与实际 HSE 稳定震荡所需的时间不同步造成,结果就是检测不到 HSE,进而引起系统复位,最终无法使用Bootloader 的 DFU 方式进行固件升级。
3 U2 n9 i+ g3 E4 ^
- J/ |$ y! \: X  Y( p: d9 W* u, o( Z8 i5 q+ {; ^
收藏 评论0 发布时间:2022-2-20 14:51

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版