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

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

[复制链接]
aimejia 发布时间:2018-5-17 13:05
本帖最后由 aimejia 于 2018-5-17 13:28 编辑   g" g7 T0 _+ M8 c  l& D
: `* l+ `& I( J5 F2 q4 i9 _
前言
% q/ K4 z6 e+ n! d9 x7 F* m; |( e. P# u) ^6 _- Z1 y% J
很多 STM32 的 System Memory 中所带的 Bootloader 都支持 USB DFU 功能,可以使用 USB 更新代码,详见《AN2606:9 d. ]3 |9 S" C% r+ h0 C
STM32™ 微控制器系统存储器自举模式》。
9 [1 ~: ]* q" x  C# T) {/ M/ Y( b: E1 l; z  h, e( R
问 题: u# z; n4 u  ~6 c# }
1 r1 Y  `) g7 @! |- [' w: }
某客户在其产品的设计中,需要使用了 STM32F072RBT6。客户在使用过程中,使用 System Memory 中的 USB DFU 功能对; U( s2 B* ?3 h/ v+ V
代码进行更新,并直接使用“Leave DFU mode”跑用户代码,进行功能观察。但是,发现 STM32F0 在点击“Leave DFU
( x$ r8 M* H( h) Lmode”按钮后,用户代码并没有正常工作,这是为什么呢?
% A* k/ q( n( t! s. z9 ^3 i# W8 _
调 研
% l# p; T' ?: o+ Z7 Y+ L
- A, ]* l0 e) _: ?+ g8 @3 P2 W5 a1.了 解 问 题
  ]7 Q: j% q; I8 |! L客户使用了 STM32F072B-Discovery 板进行调试的。在使用\STM32F072B-: t( @1 F4 f9 ~2 }" ^" q5 C( u& H
Discovery_FW_V1.0.1\Projects\Peripheral_Examples\TIM_TimeBase 例程进行测试,先使用 IAR 将此例程进行编译,生成
8 W3 m; r6 {# W8 \  `TIM_TimeBase.hex 文件。使用 STM32 ST-Link Utility 软件进行烧写,烧写后可见 Discovery 板上 4 个 LED 灯在闪烁,确认
. Y! s# u& p6 L6 }  o" g例程及 hex 文件的正确性。, F2 H# w. i5 N0 g& x' V" S$ Q, N
使用 Dfu file manager 软件将 TIM_TimeBase.hex 文件生成 TIM_TimeBase.dfu 文件。将 STM32F072 的 Boot0 引脚拉高,对
; ^6 I0 c4 r  F+ U, M$ P0 I+ g8 x; W芯片进行复位,进入 System Memory 运行 Bootloader,使用 Mini USB 线连接 USB USER 口(CN2)和 PC,打开 Dfuse
$ A( l! Z4 s4 y* _: ZDemo 软件,可发现 STM32F072 已经进入 DFU mode,如下:* T. ], y! C0 Z% _& d/ P
4.png 4 v2 j4 E; Y0 s$ y
点击右下的“Choose”按钮选择 TIM_TimeBase.dfu,勾选“Verify after download”后点击“Upgrade”进行代码烧写,烧
4 \# p8 p% N3 ]; a* W! m! y) m' D" X写成功后,点击“Leave DFU mode”离开 DFU 模式,发现 Discovery 板确实没有任何变化,4 个 LED 灯并没有闪烁,也就7 u4 [- o2 Y% H  n2 G
是说,用户代码没有正常运行。
; S8 O7 A4 q3 W* A2 F8 x6 C% W但是客户使用 STM32F4-Discovery 板进行测试的时候,使用\STM32F4-5 x( m9 `7 i3 N- S
Discovery_FW_V1.1.0\Project\Peripheral_Examples\TIM_TimeBase 例程,点击“Leave DFU mode”离开 DFU 模式后却可
& H) g" o, V+ L3 L/ R以正常运行程序。. I; k- V: g) P% j/ Q  w3 j
' Q7 p* Z# t' {7 F4 U
2. 分 析 问题
  l/ W. }% m; P* t  j# ^3 [8 ]先来看一下《AN3156:USB DFU protocol used in the STM32 bootloader》中对 Leave DFU mode 的描述:, g. R+ ~: B- T/ K2 B* k! \
5.png - \  f  F% T+ z) o) A. @8 o
此处描述了离开 DFU 模式时,STM32 所执行的一些操作:  z$ F) S9 l7 z  l& K' ^- D" K9 L& J
1.  断开连接7 b6 A6 f; `" S) r
2.  初始化 Bootloader 所使用过的外设寄存器,并复位到默认值
, W: g0 x9 M  P  ~) s7 Q) m, H7 x3.  初始化用户应用程序主堆栈指针* h7 _* Y4 E" V  P  \0 y2 s
4.  跳转到“地址+4”的位置,运行代码。; L' y* ^7 ^$ T
再看一下底下的注意:
; k4 x8 D, B( s+ o- m 6.png ; {" b& a+ {7 z7 h" f" G/ Q
此处说明,跳转到应用程序,只有在用户代码有正确的向量表设置,才能正常工作。
# y9 t+ l. q8 u现在开始检查\STM32F072B-Discovery_FW_V1.0.1\Projects\Peripheral_Examples\TIM_TimeBase 例程中,跟设置向量表相  F1 N- b- Z0 [3 H" f" B/ d
关的代码,并没有找到。也就是说这个例程,当使用 USB DFU 功能进行升级后,使用“Leave DFU mode”离开 DFU 模式
3 m$ Q* ^9 S( X; D进入用户代码,由于没有重新设置向量表,所以向量表还停留在 System Memory 中,开始运行程序没问题,但是一旦产生中
" `( T9 k" i) r断,需要进入向量表的时候,就会跳错向量表而出错。(注:如果使用的是 GPIO_IOToggle 则不会有问题,因为这个例程没
; b& ]# d% U$ [. L- e( R) ]; s有使用中断). f, I: ]6 w! O; A1 n# z
再来看一下为什么 STM32F4-Discovery 板跑\STM32F4-Discovery_FW_V1.1.0\Project\Peripheral_Examples\TIM_TimeBase
- E% C6 D8 X, {* r1 z例程就没有问题呢?同样我们来搜索一下关于设置向量表的代码。在 system_stm32f4xx.c 的 SystemInit()函数中,可以找到" \* i% G7 @# w/ A% x
以下代码:3 d9 C' g, Z+ L! C. B5 C4 M9 j( l# ?
7.png
/ h: v) p8 G2 J; C9 j5 I( d: E+ M% J此处为设置向量表,如果没有定义 VECT_TAB_SRAM,则设置向量表到 Main Flash Memory 中。这个函数在程序的最开始' L, b3 U% Z9 U) H& l+ ]% Q/ Q
被运行,所以向量表得到了正确的设置,也就是为什么这个例程不会有问题的原因。
& k2 [" A5 z" w% H) a: y( E/ f( g8 N+ M1 ?" Z+ U5 s  j
...
- R1 f4 W9 I0 L0 J1 N+ O! u8 d) D8 d9 R$ j4 |
了解更多,请下载后阅读
5 I# x( h3 C' {* i7 A) }7 @* @% L& z# ]" @
下载地址1>>     下载地址2>>      更多实战经验>> " {' E: a- ?2 E6 j

- }9 Y3 Y! s. P( Z% ?) A
收藏 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 手机版