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

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

[复制链接]
aimejia 发布时间:2018-5-17 13:05
本帖最后由 aimejia 于 2018-5-17 13:28 编辑
; W8 h" b/ @/ ~2 U
% B' n0 G# a" x# J- [* |% L) [前言
7 g7 X# J+ L8 }' |5 q/ {1 W; D
6 C) i6 ~: D/ q' i9 T很多 STM32 的 System Memory 中所带的 Bootloader 都支持 USB DFU 功能,可以使用 USB 更新代码,详见《AN2606:
: _& X% P3 t2 V. hSTM32™ 微控制器系统存储器自举模式》。9 [- V: E" O5 X$ g/ {4 I
: p9 H' n+ y6 S/ c& m) K
问 题6 i( t( t# [3 k2 L9 L
) t4 z1 I0 z4 S6 R, P
某客户在其产品的设计中,需要使用了 STM32F072RBT6。客户在使用过程中,使用 System Memory 中的 USB DFU 功能对4 R3 J# y) y) Z# B) Q: q9 ~# m5 y5 [8 t
代码进行更新,并直接使用“Leave DFU mode”跑用户代码,进行功能观察。但是,发现 STM32F0 在点击“Leave DFU
! ?7 `5 @7 l% B: Y2 T! Amode”按钮后,用户代码并没有正常工作,这是为什么呢?
( L3 |3 z$ m4 w2 Q1 T
  u% n1 x$ ^! e) E+ @) i& A调 研
! p/ g# y* H9 Y& A
3 s3 r& o2 i' K$ r% b2 W4 X1.了 解 问 题
; \4 D" ^4 a( y' n客户使用了 STM32F072B-Discovery 板进行调试的。在使用\STM32F072B-
7 G0 ?, r" J7 v2 S( KDiscovery_FW_V1.0.1\Projects\Peripheral_Examples\TIM_TimeBase 例程进行测试,先使用 IAR 将此例程进行编译,生成- `4 S, g0 K  c+ J# M
TIM_TimeBase.hex 文件。使用 STM32 ST-Link Utility 软件进行烧写,烧写后可见 Discovery 板上 4 个 LED 灯在闪烁,确认: K. F% ~: P9 z* H! F: t
例程及 hex 文件的正确性。% w' H' i) k1 m4 ^, I
使用 Dfu file manager 软件将 TIM_TimeBase.hex 文件生成 TIM_TimeBase.dfu 文件。将 STM32F072 的 Boot0 引脚拉高,对
! W  Y5 N& I- P, B' ~) b9 e7 ?芯片进行复位,进入 System Memory 运行 Bootloader,使用 Mini USB 线连接 USB USER 口(CN2)和 PC,打开 Dfuse+ A: \; A  l& z) R% D
Demo 软件,可发现 STM32F072 已经进入 DFU mode,如下:4 N, r$ l6 l  L9 ^" X( f
4.png   _& ]- i" T2 Y7 v! b& u
点击右下的“Choose”按钮选择 TIM_TimeBase.dfu,勾选“Verify after download”后点击“Upgrade”进行代码烧写,烧
5 k+ y0 N& z) J$ Z. ]$ R8 ]写成功后,点击“Leave DFU mode”离开 DFU 模式,发现 Discovery 板确实没有任何变化,4 个 LED 灯并没有闪烁,也就1 |8 k+ Q2 u2 ^
是说,用户代码没有正常运行。
7 W9 u3 {! e; A7 ]+ Z* W2 u但是客户使用 STM32F4-Discovery 板进行测试的时候,使用\STM32F4-
" X$ b4 H" c" RDiscovery_FW_V1.1.0\Project\Peripheral_Examples\TIM_TimeBase 例程,点击“Leave DFU mode”离开 DFU 模式后却可/ Z& b5 H$ G8 e' S
以正常运行程序。7 W5 l; ]" s9 S4 n4 ?' e

* {5 Z, h3 a! A6 ^6 F3 p5 F2. 分 析 问题
* |, Y% K) r* ~' Z% ?8 z* T* }+ M先来看一下《AN3156:USB DFU protocol used in the STM32 bootloader》中对 Leave DFU mode 的描述:+ H( h8 J* _# U8 `9 x
5.png - c" ?( ]7 r' J3 ]0 u3 D
此处描述了离开 DFU 模式时,STM32 所执行的一些操作:
& D( A5 ^" M- w/ m6 w' v  r1.  断开连接
7 y+ w& x6 K, R! i5 k$ P; U# }2.  初始化 Bootloader 所使用过的外设寄存器,并复位到默认值
' M/ ~$ g& Q8 q) P3.  初始化用户应用程序主堆栈指针* [% r/ b9 V& l' C- a
4.  跳转到“地址+4”的位置,运行代码。- o( S! m- \8 ^- x6 F( s
再看一下底下的注意:
' I4 j6 Y# }2 l0 ~1 { 6.png
4 H4 D# d/ I, Y: R此处说明,跳转到应用程序,只有在用户代码有正确的向量表设置,才能正常工作。, u% e4 K( i8 f8 ?% M
现在开始检查\STM32F072B-Discovery_FW_V1.0.1\Projects\Peripheral_Examples\TIM_TimeBase 例程中,跟设置向量表相
& s5 ?( l6 I; T3 |* [  j关的代码,并没有找到。也就是说这个例程,当使用 USB DFU 功能进行升级后,使用“Leave DFU mode”离开 DFU 模式9 u! N- m5 A- ~% W$ A" \
进入用户代码,由于没有重新设置向量表,所以向量表还停留在 System Memory 中,开始运行程序没问题,但是一旦产生中- x; I( X1 q7 ?" s% N, W
断,需要进入向量表的时候,就会跳错向量表而出错。(注:如果使用的是 GPIO_IOToggle 则不会有问题,因为这个例程没
" h( w6 O0 G; V- I9 t有使用中断)" s9 C7 T; I! {1 \- P8 J& R
再来看一下为什么 STM32F4-Discovery 板跑\STM32F4-Discovery_FW_V1.1.0\Project\Peripheral_Examples\TIM_TimeBase
1 h# W! b* Y, j例程就没有问题呢?同样我们来搜索一下关于设置向量表的代码。在 system_stm32f4xx.c 的 SystemInit()函数中,可以找到
& J5 @2 K9 [" i; S以下代码:* i) X$ t6 i1 ?) Y
7.png
2 Q4 ~+ a/ x! \( A此处为设置向量表,如果没有定义 VECT_TAB_SRAM,则设置向量表到 Main Flash Memory 中。这个函数在程序的最开始
3 U6 @$ E3 O4 S" O被运行,所以向量表得到了正确的设置,也就是为什么这个例程不会有问题的原因。
. F$ l& K8 A8 u) a
! m5 W9 W! O* e& s1 K...
) {1 L1 K5 x" G" w9 W% C, l
; W5 l/ m& @1 _. V( a2 K1 Y了解更多,请下载后阅读
; Q* l* S, H# o* m' Y+ b6 F7 |+ Z% n, _
下载地址1>>     下载地址2>>      更多实战经验>>
# u; f- b: A' p# e" i% r! ~$ ^$ C
. `& B$ o, s- t% v3 y
收藏 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 手机版