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

STM32F0 使用 DFU 升级后 Leave DFU Mode 不能运行用户代码

[复制链接]
aimejia 发布时间:2018-5-17 13:05
本帖最后由 aimejia 于 2018-5-17 13:28 编辑
- p6 B1 ^3 d: t6 y1 g) U* ]) i+ X+ u
前言
: h0 i. {: j+ A' O
* T; @1 M. v8 Z- G很多 STM32 的 System Memory 中所带的 Bootloader 都支持 USB DFU 功能,可以使用 USB 更新代码,详见《AN2606:8 Z7 s/ s: ]8 b2 l9 ^' i
STM32™ 微控制器系统存储器自举模式》。
/ O% W3 z( w* i4 M4 y  _; ?1 k3 _5 |5 g) R# D
问 题
( Z, `$ N7 o( M6 k& k* j; N2 i6 f$ B$ D
某客户在其产品的设计中,需要使用了 STM32F072RBT6。客户在使用过程中,使用 System Memory 中的 USB DFU 功能对# H3 ^1 T9 M6 D) o. j9 r0 _
代码进行更新,并直接使用“Leave DFU mode”跑用户代码,进行功能观察。但是,发现 STM32F0 在点击“Leave DFU6 D  N, o4 |: Z1 Y- h* Y6 w
mode”按钮后,用户代码并没有正常工作,这是为什么呢?, _8 Q+ Q/ y* j! f  N

; }: F* D! ^! t调 研) @. A8 G5 d8 G& j4 H: x4 r( x  D( w

7 @3 c4 h+ G1 C1.了 解 问 题
( B" M/ b! R% J! d7 ^* [客户使用了 STM32F072B-Discovery 板进行调试的。在使用\STM32F072B-5 x" K2 N# h0 n9 n1 |
Discovery_FW_V1.0.1\Projects\Peripheral_Examples\TIM_TimeBase 例程进行测试,先使用 IAR 将此例程进行编译,生成# _& ~6 ?& n! l$ D5 `! y" k8 w
TIM_TimeBase.hex 文件。使用 STM32 ST-Link Utility 软件进行烧写,烧写后可见 Discovery 板上 4 个 LED 灯在闪烁,确认
6 S  x) N2 i( ]例程及 hex 文件的正确性。
% ]9 n. F( u8 f* J9 F+ H使用 Dfu file manager 软件将 TIM_TimeBase.hex 文件生成 TIM_TimeBase.dfu 文件。将 STM32F072 的 Boot0 引脚拉高,对$ B2 P+ Y. G9 p1 T
芯片进行复位,进入 System Memory 运行 Bootloader,使用 Mini USB 线连接 USB USER 口(CN2)和 PC,打开 Dfuse
- ?  ^, r6 w3 @# `" h) D! ?Demo 软件,可发现 STM32F072 已经进入 DFU mode,如下:. ]5 I5 j7 c; a% I
4.png $ }, j& [) r7 G0 J
点击右下的“Choose”按钮选择 TIM_TimeBase.dfu,勾选“Verify after download”后点击“Upgrade”进行代码烧写,烧6 W1 @7 M9 b4 L
写成功后,点击“Leave DFU mode”离开 DFU 模式,发现 Discovery 板确实没有任何变化,4 个 LED 灯并没有闪烁,也就) t& g( `& {; {# v6 u* g
是说,用户代码没有正常运行。
" g* W  w) r2 }0 |$ c$ q2 _但是客户使用 STM32F4-Discovery 板进行测试的时候,使用\STM32F4-
, n" F/ ?4 y* P; Z9 y9 g* bDiscovery_FW_V1.1.0\Project\Peripheral_Examples\TIM_TimeBase 例程,点击“Leave DFU mode”离开 DFU 模式后却可
) v% _7 D! d' a$ C3 u2 t以正常运行程序。
5 y8 x; D; J! P* V! ~. O- V2 f* T7 h1 Y  d2 G4 f  v9 ?' ~7 p5 i. M
2. 分 析 问题8 q5 ?! h6 A8 j) |/ q# L& [
先来看一下《AN3156:USB DFU protocol used in the STM32 bootloader》中对 Leave DFU mode 的描述:
2 ^/ `/ j0 e. ?7 i) _8 N* P 5.png ! E/ F& ^/ V2 Y) S7 Q
此处描述了离开 DFU 模式时,STM32 所执行的一些操作:2 E& C7 x. Y7 v2 P. x- ^
1.  断开连接
1 a: v0 q6 s8 d5 l6 i2.  初始化 Bootloader 所使用过的外设寄存器,并复位到默认值, d5 ?5 ^" n# G5 Q. {7 m
3.  初始化用户应用程序主堆栈指针
8 m1 B3 j- n" s4.  跳转到“地址+4”的位置,运行代码。  z+ [0 p# P$ R: x5 f# H4 F
再看一下底下的注意:
# P. N/ [5 K' w$ A2 E 6.png " o  j& h: W. R& E2 Y
此处说明,跳转到应用程序,只有在用户代码有正确的向量表设置,才能正常工作。
) w  ~+ M, M! w9 y现在开始检查\STM32F072B-Discovery_FW_V1.0.1\Projects\Peripheral_Examples\TIM_TimeBase 例程中,跟设置向量表相
6 k, M1 v" X5 O7 E& F/ f/ V关的代码,并没有找到。也就是说这个例程,当使用 USB DFU 功能进行升级后,使用“Leave DFU mode”离开 DFU 模式
7 F. K9 ^4 w' }( q进入用户代码,由于没有重新设置向量表,所以向量表还停留在 System Memory 中,开始运行程序没问题,但是一旦产生中% J) T) H* s; z
断,需要进入向量表的时候,就会跳错向量表而出错。(注:如果使用的是 GPIO_IOToggle 则不会有问题,因为这个例程没
7 O  L3 M% `7 M有使用中断)
* @' a! H7 x0 Y; J再来看一下为什么 STM32F4-Discovery 板跑\STM32F4-Discovery_FW_V1.1.0\Project\Peripheral_Examples\TIM_TimeBase1 U5 h6 _# z% ^8 W$ e
例程就没有问题呢?同样我们来搜索一下关于设置向量表的代码。在 system_stm32f4xx.c 的 SystemInit()函数中,可以找到0 Z" n' j% R) k) p9 z- N
以下代码:4 p% {% a5 @1 ]/ c
7.png 3 j# L, O0 I5 [7 i' ^! }
此处为设置向量表,如果没有定义 VECT_TAB_SRAM,则设置向量表到 Main Flash Memory 中。这个函数在程序的最开始
6 z2 }- f4 g; |8 {被运行,所以向量表得到了正确的设置,也就是为什么这个例程不会有问题的原因。
: O' U! d9 G4 A8 R2 B) ]! e$ T  }
...
5 ]9 h7 D# l, x5 [, e$ s% }2 t4 [% A8 `
了解更多,请下载后阅读9 C' l9 W7 M7 A9 x5 H
" h3 o: I, X5 _2 G) ~% ^
下载地址1>>     下载地址2>>      更多实战经验>>
; g, q' N1 E: U! |; U6 Z& Y" {7 n3 e/ u" Y0 ~" t
收藏 1 评论2 发布时间:2018-5-17 13:05

举报

2个回答
samhong 回答时间:2018-6-6 07:09:09
谢谢楼主的分享!
robter 回答时间:2018-7-17 21:31:24
这个经验很好,学习了
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版