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

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

[复制链接]
aimejia 发布时间:2018-5-17 13:05
本帖最后由 aimejia 于 2018-5-17 13:28 编辑 ' g' ^! e, F5 X2 W9 T

: b/ m$ d+ ?" h8 x- q; r4 ^前言
0 \1 @  z( z$ w/ E/ |' z8 N$ G$ ~. d  C, M4 n& Z, B
很多 STM32 的 System Memory 中所带的 Bootloader 都支持 USB DFU 功能,可以使用 USB 更新代码,详见《AN2606:
- E0 s  L. \$ b0 fSTM32™ 微控制器系统存储器自举模式》。* \% w- y$ b0 }8 r. L7 a  O- n! j" C
9 ^4 L3 }/ t  P: \4 r8 _
问 题
5 X5 ~/ ^4 h' E- u
& `& m2 X' w6 W) `2 t* G$ ?6 E6 R2 j某客户在其产品的设计中,需要使用了 STM32F072RBT6。客户在使用过程中,使用 System Memory 中的 USB DFU 功能对
5 ]- x! m! J4 j$ c) \. `( g6 _代码进行更新,并直接使用“Leave DFU mode”跑用户代码,进行功能观察。但是,发现 STM32F0 在点击“Leave DFU
& s! h9 e: h( Z1 G# ]mode”按钮后,用户代码并没有正常工作,这是为什么呢?
5 Q1 a$ ^% A# x! w4 `% k# W5 b
4 F  ]8 r7 [  G  J! a& k* o- b调 研
$ R- |# I$ y6 H7 R, w' s3 y
6 W  j9 b& P  ~' C- ?1.了 解 问 题
0 B: }# s* u. M4 j3 c8 U% g% [客户使用了 STM32F072B-Discovery 板进行调试的。在使用\STM32F072B-0 X1 e0 D' U5 r
Discovery_FW_V1.0.1\Projects\Peripheral_Examples\TIM_TimeBase 例程进行测试,先使用 IAR 将此例程进行编译,生成$ z2 C4 E: }; \+ L* M
TIM_TimeBase.hex 文件。使用 STM32 ST-Link Utility 软件进行烧写,烧写后可见 Discovery 板上 4 个 LED 灯在闪烁,确认' D8 s2 S3 E8 B. Z" P: k
例程及 hex 文件的正确性。
( g/ W" ?3 t$ ?) g使用 Dfu file manager 软件将 TIM_TimeBase.hex 文件生成 TIM_TimeBase.dfu 文件。将 STM32F072 的 Boot0 引脚拉高,对
+ }# [" ^3 X% o% e芯片进行复位,进入 System Memory 运行 Bootloader,使用 Mini USB 线连接 USB USER 口(CN2)和 PC,打开 Dfuse& v5 B2 X8 ~) B  U+ R1 ~% \$ Q
Demo 软件,可发现 STM32F072 已经进入 DFU mode,如下:
+ w  N! Q) a3 {% S6 b 4.png . _. \! v+ |6 c2 d% M
点击右下的“Choose”按钮选择 TIM_TimeBase.dfu,勾选“Verify after download”后点击“Upgrade”进行代码烧写,烧
6 M( [/ A& C+ L- C/ o$ l7 D写成功后,点击“Leave DFU mode”离开 DFU 模式,发现 Discovery 板确实没有任何变化,4 个 LED 灯并没有闪烁,也就
3 ^% m) f" {0 m. A2 X' x是说,用户代码没有正常运行。2 F; O: @- ?; {: k. H
但是客户使用 STM32F4-Discovery 板进行测试的时候,使用\STM32F4-
0 `* d3 x6 ~* A- v- t1 {- ^' \2 BDiscovery_FW_V1.1.0\Project\Peripheral_Examples\TIM_TimeBase 例程,点击“Leave DFU mode”离开 DFU 模式后却可
" P; f( X: ]& {# _! x以正常运行程序。
; o* Q* }, b5 G1 H) [/ ]/ O
8 s& ^# @( s9 \9 h; j  B& `2. 分 析 问题3 Z* c5 z3 A# y/ t& F+ {
先来看一下《AN3156:USB DFU protocol used in the STM32 bootloader》中对 Leave DFU mode 的描述:
2 [6 `1 X% ]4 }1 H; J 5.png 7 X2 n* J2 K2 N# y" S& A6 F7 H2 i
此处描述了离开 DFU 模式时,STM32 所执行的一些操作:8 o$ e  t' i* L- f
1.  断开连接0 a8 {) I1 h" Z& P2 v
2.  初始化 Bootloader 所使用过的外设寄存器,并复位到默认值
( x1 o) t" z5 j1 ?' l2 m3.  初始化用户应用程序主堆栈指针
! O# s& l0 X& r: I* R4.  跳转到“地址+4”的位置,运行代码。
/ \! v, ?' G: O- i, y) o再看一下底下的注意:! x0 N) N  o' l3 k$ \# {- F% G, o# h  f8 b
6.png
* m5 s8 a4 G& C2 d0 [. }3 p此处说明,跳转到应用程序,只有在用户代码有正确的向量表设置,才能正常工作。
2 H$ U/ y! Y1 L: G现在开始检查\STM32F072B-Discovery_FW_V1.0.1\Projects\Peripheral_Examples\TIM_TimeBase 例程中,跟设置向量表相
' Y: m, s+ s4 M. s+ I, W关的代码,并没有找到。也就是说这个例程,当使用 USB DFU 功能进行升级后,使用“Leave DFU mode”离开 DFU 模式* O6 e' u& x+ i+ G0 m# h
进入用户代码,由于没有重新设置向量表,所以向量表还停留在 System Memory 中,开始运行程序没问题,但是一旦产生中
& ^) M0 o# K/ l7 J( l断,需要进入向量表的时候,就会跳错向量表而出错。(注:如果使用的是 GPIO_IOToggle 则不会有问题,因为这个例程没
5 D0 B! ^8 S/ |6 r7 h有使用中断)
' _" _1 ?' e8 u% H& S再来看一下为什么 STM32F4-Discovery 板跑\STM32F4-Discovery_FW_V1.1.0\Project\Peripheral_Examples\TIM_TimeBase2 }4 K4 n8 D8 N1 l
例程就没有问题呢?同样我们来搜索一下关于设置向量表的代码。在 system_stm32f4xx.c 的 SystemInit()函数中,可以找到/ ~3 e! I, Z/ s2 D  E
以下代码:
. l7 q/ w- Y4 U# v 7.png
# F' M& u' J  E* E此处为设置向量表,如果没有定义 VECT_TAB_SRAM,则设置向量表到 Main Flash Memory 中。这个函数在程序的最开始; e8 |8 Y* g2 R8 K6 u% o! \
被运行,所以向量表得到了正确的设置,也就是为什么这个例程不会有问题的原因。. I! K1 z+ @. [+ e6 g9 o$ I

% g* i) Z9 X# K, N4 [0 B# ~8 _...2 {' h! a) N' @  b% A- O

. \9 d3 w9 N. h1 y了解更多,请下载后阅读
% [* ~+ b1 k0 D
& a% O% A) g5 _. m6 d8 J) k下载地址1>>     下载地址2>>      更多实战经验>>
' U1 r) k& @% U& b+ H" L" l' \, U. l  ^# b+ h4 i& L( S" N- t7 N5 Q
收藏 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 手机版