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

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

[复制链接]
aimejia 发布时间:2018-5-17 13:05
本帖最后由 aimejia 于 2018-5-17 13:28 编辑 : c+ K$ f. D. I+ i
+ J+ d/ ~2 J4 b2 E& J4 }& B8 N
前言% V* ^) g3 I: S0 Y9 o' O2 X" W' A( F- R

9 g6 d! I* ^& p/ g( V9 b很多 STM32 的 System Memory 中所带的 Bootloader 都支持 USB DFU 功能,可以使用 USB 更新代码,详见《AN2606:
! r- D* d7 @% R+ uSTM32™ 微控制器系统存储器自举模式》。
2 r. b5 G! T5 _' D$ r( w$ t  g2 j3 [$ F; b4 Q4 {
问 题1 Y4 O1 a  O& w

2 B5 G5 k( a# a% z5 F5 E某客户在其产品的设计中,需要使用了 STM32F072RBT6。客户在使用过程中,使用 System Memory 中的 USB DFU 功能对1 L+ ^" }! q' F5 ^  O- o
代码进行更新,并直接使用“Leave DFU mode”跑用户代码,进行功能观察。但是,发现 STM32F0 在点击“Leave DFU
# x& r$ G( N  x+ X3 r8 @0 A! L5 pmode”按钮后,用户代码并没有正常工作,这是为什么呢?' D* b7 o% o$ Z: R1 |! k" d

3 {- }* P9 }" V9 s! F) V  l调 研; Z, U, j" e; p% S( P  i/ t

7 f- o" y* Y0 m( }1.了 解 问 题2 l. F5 k+ ^5 c4 o8 x# B
客户使用了 STM32F072B-Discovery 板进行调试的。在使用\STM32F072B-
- |0 \' b7 d$ bDiscovery_FW_V1.0.1\Projects\Peripheral_Examples\TIM_TimeBase 例程进行测试,先使用 IAR 将此例程进行编译,生成
9 F1 m% w. [# uTIM_TimeBase.hex 文件。使用 STM32 ST-Link Utility 软件进行烧写,烧写后可见 Discovery 板上 4 个 LED 灯在闪烁,确认) B" n) `5 r. K% X! M
例程及 hex 文件的正确性。
# Y8 C2 l$ Y) W% ^0 x使用 Dfu file manager 软件将 TIM_TimeBase.hex 文件生成 TIM_TimeBase.dfu 文件。将 STM32F072 的 Boot0 引脚拉高,对/ Y) V' n: ^3 Z" m. e
芯片进行复位,进入 System Memory 运行 Bootloader,使用 Mini USB 线连接 USB USER 口(CN2)和 PC,打开 Dfuse) I) s) S6 O: c
Demo 软件,可发现 STM32F072 已经进入 DFU mode,如下:( L! r+ t8 A4 Z0 l# y# U
4.png 7 T6 i- r5 }! l  U
点击右下的“Choose”按钮选择 TIM_TimeBase.dfu,勾选“Verify after download”后点击“Upgrade”进行代码烧写,烧
" F1 x' Y* {* Q7 r  N' S写成功后,点击“Leave DFU mode”离开 DFU 模式,发现 Discovery 板确实没有任何变化,4 个 LED 灯并没有闪烁,也就) w3 x8 T5 {' p3 {% p4 n
是说,用户代码没有正常运行。, b5 t$ Z( p1 ^# T2 `! l- u2 I- Z# Q9 t
但是客户使用 STM32F4-Discovery 板进行测试的时候,使用\STM32F4-
' o# O  N% z, \8 i' GDiscovery_FW_V1.1.0\Project\Peripheral_Examples\TIM_TimeBase 例程,点击“Leave DFU mode”离开 DFU 模式后却可
0 B3 E4 l5 b4 P0 k# S4 U以正常运行程序。
: o2 v$ L# ?: P: J6 L8 f, x# ^4 _& A* m. S
2. 分 析 问题: S1 s4 x4 R' s1 `
先来看一下《AN3156:USB DFU protocol used in the STM32 bootloader》中对 Leave DFU mode 的描述:
! F1 Q- L; g) o: Y  [ 5.png
% `4 z; d% y1 e6 S* c7 I此处描述了离开 DFU 模式时,STM32 所执行的一些操作:
8 m; C0 @  p& K9 H4 {1.  断开连接
. V% N* p" b. r2.  初始化 Bootloader 所使用过的外设寄存器,并复位到默认值- N3 R" n# I/ E$ s" Z! h$ W
3.  初始化用户应用程序主堆栈指针
4 F5 S6 e: A: w( @# {4.  跳转到“地址+4”的位置,运行代码。
0 Y# E) J7 |5 W6 N2 r; Z2 c; {. F再看一下底下的注意:6 U7 M# L4 e2 S0 J2 i* X& q6 c
6.png
- \% Z4 K  _( H( G4 d; V此处说明,跳转到应用程序,只有在用户代码有正确的向量表设置,才能正常工作。/ T1 U/ T6 L+ m" b- t1 l- p
现在开始检查\STM32F072B-Discovery_FW_V1.0.1\Projects\Peripheral_Examples\TIM_TimeBase 例程中,跟设置向量表相! d; c2 q. F$ n" |" q% g
关的代码,并没有找到。也就是说这个例程,当使用 USB DFU 功能进行升级后,使用“Leave DFU mode”离开 DFU 模式) V5 O/ V$ T- r
进入用户代码,由于没有重新设置向量表,所以向量表还停留在 System Memory 中,开始运行程序没问题,但是一旦产生中
# t: m) {$ H5 x* j断,需要进入向量表的时候,就会跳错向量表而出错。(注:如果使用的是 GPIO_IOToggle 则不会有问题,因为这个例程没5 I; S4 d: ^2 H1 A. k
有使用中断)
  q1 l2 r) _- ^$ y! o再来看一下为什么 STM32F4-Discovery 板跑\STM32F4-Discovery_FW_V1.1.0\Project\Peripheral_Examples\TIM_TimeBase
8 @; d+ q) @0 D/ A1 V8 l例程就没有问题呢?同样我们来搜索一下关于设置向量表的代码。在 system_stm32f4xx.c 的 SystemInit()函数中,可以找到
+ C( r( L0 G! r3 ]9 F以下代码:
3 D1 m, P2 x9 X' p$ Z% j 7.png ' d0 t4 I6 X- [$ V7 Z* p) h  z- P
此处为设置向量表,如果没有定义 VECT_TAB_SRAM,则设置向量表到 Main Flash Memory 中。这个函数在程序的最开始
, c, W4 Q/ }/ f2 Y被运行,所以向量表得到了正确的设置,也就是为什么这个例程不会有问题的原因。
, {' E/ d- t5 V; K3 l1 h9 U( e* `! r5 P) P
.../ J7 J3 C/ F3 c
3 f% Z8 S/ T- P! q
了解更多,请下载后阅读
$ H: I1 U0 r" n* r/ i. j
+ I6 C) N9 e5 f- a下载地址1>>     下载地址2>>      更多实战经验>>
8 X2 v: S0 U9 [/ z! d/ d1 L
$ E5 u5 K' c# T5 n7 N2 k8 t" p
赞 收藏 1 评论2 发布时间:2018-5-17 13:05

举报

2个回答
samhong 回答时间:2018-6-6 07:09:09
谢谢楼主的分享!
robter 回答时间:2018-7-17 21:31:24
这个经验很好,学习了

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版