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

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

[复制链接]
aimejia 发布时间:2018-5-17 13:05
本帖最后由 aimejia 于 2018-5-17 13:28 编辑 ) B2 r; e$ `* R  E, K

* {0 v# {3 g+ i" ?; F0 a前言# `5 d9 G# s& R( M6 M# s

+ B; |8 E  ~4 [8 e' Y7 {3 @( S$ o很多 STM32 的 System Memory 中所带的 Bootloader 都支持 USB DFU 功能,可以使用 USB 更新代码,详见《AN2606:
- u" |( ~# P& p0 C( pSTM32™ 微控制器系统存储器自举模式》。3 n( q$ m) e' K6 v- S/ J  d/ U; E
- f" e& o: [1 g3 a& x6 s; G0 o
问 题
! D$ Y1 o& z1 K, U- T4 v: m
7 }; j( h6 z& Y: f, ^( W$ J% \某客户在其产品的设计中,需要使用了 STM32F072RBT6。客户在使用过程中,使用 System Memory 中的 USB DFU 功能对
6 k; i* d) H/ x( v9 U+ C# \代码进行更新,并直接使用“Leave DFU mode”跑用户代码,进行功能观察。但是,发现 STM32F0 在点击“Leave DFU* a1 U0 }7 w! Q, b9 L! [
mode”按钮后,用户代码并没有正常工作,这是为什么呢?
) F! p9 c1 {  G
* U. l2 o6 P- \; ^5 g& a调 研
& ^. A& H4 I# t4 ^, d& @4 q$ @' j: h$ z
1.了 解 问 题
4 i- ?- C) R' N1 E. t' j客户使用了 STM32F072B-Discovery 板进行调试的。在使用\STM32F072B-
: x4 e8 H! i( ]; r6 p1 |Discovery_FW_V1.0.1\Projects\Peripheral_Examples\TIM_TimeBase 例程进行测试,先使用 IAR 将此例程进行编译,生成
8 x- z- Y0 {- y7 Q8 ~2 ~TIM_TimeBase.hex 文件。使用 STM32 ST-Link Utility 软件进行烧写,烧写后可见 Discovery 板上 4 个 LED 灯在闪烁,确认: ?* B* u) A+ s8 U, J
例程及 hex 文件的正确性。
5 [. K5 F$ N/ U' t使用 Dfu file manager 软件将 TIM_TimeBase.hex 文件生成 TIM_TimeBase.dfu 文件。将 STM32F072 的 Boot0 引脚拉高,对& f! [7 H0 @5 B6 ~) k1 N
芯片进行复位,进入 System Memory 运行 Bootloader,使用 Mini USB 线连接 USB USER 口(CN2)和 PC,打开 Dfuse0 h( }3 [/ t4 r7 Y0 x) z9 d
Demo 软件,可发现 STM32F072 已经进入 DFU mode,如下:3 m1 s$ ]! X5 E0 Y, j, t' W+ p
4.png
8 H$ _$ F0 Y0 R* z" a3 k+ g点击右下的“Choose”按钮选择 TIM_TimeBase.dfu,勾选“Verify after download”后点击“Upgrade”进行代码烧写,烧: }# p1 C# W' I2 A- m
写成功后,点击“Leave DFU mode”离开 DFU 模式,发现 Discovery 板确实没有任何变化,4 个 LED 灯并没有闪烁,也就9 Y5 K4 y( p3 l/ d  g4 U/ r
是说,用户代码没有正常运行。
/ v* a, M0 z# F  N9 f! b但是客户使用 STM32F4-Discovery 板进行测试的时候,使用\STM32F4-
1 O7 z/ E% J, N9 H$ Q8 a0 wDiscovery_FW_V1.1.0\Project\Peripheral_Examples\TIM_TimeBase 例程,点击“Leave DFU mode”离开 DFU 模式后却可
0 v4 x* j; u! p以正常运行程序。
" S# G' `. z2 c6 V7 P& r3 |" H" X2 V+ W  s, _) t* B
2. 分 析 问题! S, z+ s4 [# i/ Z- W6 m
先来看一下《AN3156:USB DFU protocol used in the STM32 bootloader》中对 Leave DFU mode 的描述:
( _$ ]; V, }! p0 b: U4 \ 5.png
) u- K7 {# a  y! p6 o1 i1 |/ l; v$ s此处描述了离开 DFU 模式时,STM32 所执行的一些操作:
4 J) ^- L& `& S* A% C1.  断开连接
2 w% q' b6 K1 i2.  初始化 Bootloader 所使用过的外设寄存器,并复位到默认值
# Q  }. M; c& p4 ~/ N9 p1 i8 ?6 p3.  初始化用户应用程序主堆栈指针
& x1 F, y; p1 X# V8 K2 [, M8 L4.  跳转到“地址+4”的位置,运行代码。, V5 b- }; V6 A$ u
再看一下底下的注意:6 Q  E' D: N  f( l, C
6.png : }6 |! i& I2 G  `1 y# S) B
此处说明,跳转到应用程序,只有在用户代码有正确的向量表设置,才能正常工作。
' q6 B3 R. t& x现在开始检查\STM32F072B-Discovery_FW_V1.0.1\Projects\Peripheral_Examples\TIM_TimeBase 例程中,跟设置向量表相- v+ y9 y- Z1 G$ k5 |
关的代码,并没有找到。也就是说这个例程,当使用 USB DFU 功能进行升级后,使用“Leave DFU mode”离开 DFU 模式6 L+ O% _3 \  Y0 {
进入用户代码,由于没有重新设置向量表,所以向量表还停留在 System Memory 中,开始运行程序没问题,但是一旦产生中1 L: R9 `9 j5 I" }* P( N1 L+ ~5 h
断,需要进入向量表的时候,就会跳错向量表而出错。(注:如果使用的是 GPIO_IOToggle 则不会有问题,因为这个例程没( f* g& \9 c7 d) @& J# x
有使用中断)! X8 r+ ^* \+ r4 ^
再来看一下为什么 STM32F4-Discovery 板跑\STM32F4-Discovery_FW_V1.1.0\Project\Peripheral_Examples\TIM_TimeBase
( l( l' W! A4 b/ E- e$ h! t例程就没有问题呢?同样我们来搜索一下关于设置向量表的代码。在 system_stm32f4xx.c 的 SystemInit()函数中,可以找到$ J0 Z) b+ F) b$ |- l
以下代码:
& l: T# f" T, u% `: h. J& @ 7.png
  Z$ ?2 s, J( }7 l! x1 |, a1 `8 y0 V* X此处为设置向量表,如果没有定义 VECT_TAB_SRAM,则设置向量表到 Main Flash Memory 中。这个函数在程序的最开始
. Q5 Y" P( I+ i: J4 \. W' h被运行,所以向量表得到了正确的设置,也就是为什么这个例程不会有问题的原因。
" v, h+ x, t* H) d& W
) y2 N7 W3 A1 `4 x...
- `; W# {& U% l7 ]0 `% A2 A* q8 P' h$ ?/ q0 i$ E4 K
了解更多,请下载后阅读  R( P9 \0 v; E$ T+ g

7 k5 f+ U; @" m下载地址1>>     下载地址2>>      更多实战经验>> 3 M& ], Y- B5 V( ~' P
' Y+ V2 h& P" A/ O6 P4 I% \
收藏 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 手机版