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

【经验分享】利用 USB DFU 实现 IAP 功能

[复制链接]
STMCU小助手 发布时间:2022-2-20 14:25
前言
" }- o% P/ W% v, L伴随着固件升级需求的增加,STM32 提供了灵活的升级方式。本文一步一步介绍如何利用 USB DFU Class 以及 ST 提供的DfuSe demo 软件工具实现 IAP(In Application Program)功能,但并不涉及到 DFU class 移植。  G: w! `- n, f7 F9 w. @

- h/ r; j7 C: V# \: ~5 Z$ l一 实现环境0 {4 P+ t4 O+ }. c2 L7 w$ F9 r
开发板:STM32F746G-DISCO
* _3 P; `2 A5 V4 ~! d7 D& F开发库:STM32CubeF7 v1.3.0
; j5 f1 W) H3 [' M' l  a  [集成开发环境:IAR v7.70.1.11486
% x+ x% q6 ~1 K& Z1 r: f* W) w                   :MDK-ARM Plus v5.20.0.0 (只需两者中一种)
6 f9 P) t# l) c  {3 m8 [优化级别 : High (IAR)& \! u: w1 }4 O( d/ I  V6 O
                Level 3 (-O3) (MDK-ARM)" S; k$ K7 s. V. J
DFU 演示软件: Dfu file manager v3.0.5
$ d% J1 ]* c- _                      DfuSeDemo v3.0.5
( z1 c( v* c2 k1 m9 r, }
' t0 n( I) \3 m7 r' Z( a实现过程在 STM32F7 系列上展开,但 USB DFU 实现的 IAP 功能并不只局限于 STM32F7 系列,可以通过用户手册判断所采用微控制器型号是否支持 USB 以及 IAP 功能。STM32Cube 开发库为各系列 STM32 提供了齐全的 USB DFU 例程可供参考。
+ ?3 D7 h, Q" V+ z8 u. f
+ c( P9 g9 j+ b; `, H二 IAP 介绍2 h' Q- Y: [5 j% y6 P2 ]9 e5 I- I" n
IAP(In application program)主要为使用者提供了一种更加灵活的固件升级方式,可以根据应用需要定义何时、何种情况发生时进行固件升级。在介绍步骤前,需要对 IAP 原理有一定认识。结合下图(仅供参考,IAP 实际应用方式更加灵活),IAP 的应用中,用户程序与 IAP 驱动程序位于不同的存储区域。在应用过程中,利用 IAP 驱动程序将用户固件加载到固定位置,完成升级。更多关于 IAP 应用介绍请参考 AN3965。
& H$ l3 h- z# ^# K7 F其中,IAP 驱动程序首先烧录固化,并不会随着用户程序的升级而改变。用户固件升级完毕后,在 IAP 驱动程序引导下,跳转到用户固件对应 Flash 位置,执行用户程序。
. f: [; L( x3 j9 D8 a. O7 Z: d: s' Z8 h
4X{N76K062T]FPM`U]WBTUV.png
( M! s/ t6 R/ z" F* g' @/ M
# U: }) A! M: B) k三 实现步骤  [9 {2 G  g8 T0 L' d; I7 v% u
3.1 DFU 工具安装

+ t( m6 U2 M" y1 B2 ?安装 DFU demo 工具 DfuSe v3.0.5,主要提供了驱动、Dfu file manager 和 DfuSeDemo。关于 DfuSe 的详细内容(安装步骤、使用介绍)请参考 UM0412。; ~) W$ g8 G8 D

  A+ l4 }- Q3 A; N8 |3.2 IAP 驱动固件生成与装载
) ?4 @7 w" O) b' j7 x% _1 s利用 STM32CubeF7 v1.3.0 开发库提供的 USB DFU 例程生成 IAP 驱动固件(文件夹路径: …STM32Cube_FW_F7_V1.3.0\Projects\STM32746G-Discovery\Applications\USB_Device\ DFU_Standalone)。/ f& c: w2 D7 u+ p( W  W9 d3 S
利用烧录工具烧录到开发板中。本例程实现重启后,如果板上 User 按键按下或者没有有效的用户应用程序,则进入 USB DFU 模式,等待升级;否则,进入用户应用。" B" R$ K  T' w
下面是摘取的部分例程。: I- k7 ^$ S# g9 T2 ^5 j7 a3 G
  1. @usbd_conf.h/ C4 H# t' A8 y0 Z. X
  2. /* The first sector (32 KB) is reserved for DFU code */) e" ~5 J  w1 M4 q: C
  3. #define USBD_DFU_APP_DEFAULT_ADD 0x08008000. c& }0 b& L/ x; I/ \  G
  4. @usbd_dfu.c
    ( K6 D2 K+ k2 t% R( F0 V5 y
  5. USBD_DFU_Init(…)) w$ g- D7 z7 `5 t# P; c  y
  6. {% q, u3 m8 R/ t+ O
  7. …5 D, c4 ]+ y1 u: o
  8. hdfu->data_ptr = USBD_DFU_APP_DEFAULT_ADD;3 X% P( O2 Z) e2 N( e
  9. …# A' G4 e" N" ~% S& M
  10. }0 J0 R( Y' J0 T
  11. @main.c
复制代码
  1. /* Test if user code is programmed starting from USBD_DFU_APP_DEFAULT_ADD address */$ f  U& h0 }$ T6 n
  2. if(((*(__IO uint32_t*)USBD_DFU_APP_DEFAULT_ADD) & 0x2FFE0000 ) == 0x20000000)0 O3 q4 F5 h$ F! s( J+ g
  3. {; f- v( V3 C& w) _! C8 f1 ^. R
  4. /* Jump to user application */, _8 o8 M. S/ A" Y
  5. JumpAddress = *(__IO uint32_t*) (USBD_DFU_APP_DEFAULT_ADD + 4);7 v; ?7 o: V3 V! P+ F3 Z  F/ |) m: t
  6. JumpToApplication = (pFunction) JumpAddress;6 U/ ]/ [1 [, |
  7.   J9 E' Z2 Y' l6 G8 t. z% ]3 J
  8. /* Initialize user application's Stack Pointer */  i+ x& g8 F2 j2 A; T- e; k
  9. __set_MSP(*(__IO uint32_t*) USBD_DFU_APP_DEFAULT_ADD);% j  k  I: l+ h$ `( r
  10. JumpToApplication();
    1 J& P" O8 c5 S. Z
  11. }
复制代码

( Z  m3 A# z) G+ x# _用户固件对应的首地址被定义在 0x08008000。用户也可以自定义地址,需要注意如下几点:6 r- m+ N! m) B; O6 c+ a* ?
1. 禁止定义在 0x08008000 地址前(STM32F7 系列,0x0~0x0800FFFF 属于 Sector0,已经开辟为 IAP 驱动程序区域)
6 s% i$ n- I, k1 b4 p! Q: C5 X% u2. 自定义地址所属 Sector 在升级时会全部擦除,即使定义地址并不位于对应 Sector 的首地址
% H( Z' h2 T: E8 E& m3. 自定义地址需要保持 512-byte 对齐* f: B6 M: T) E' J) |' N
4. 自定义地址需要与用户固件对应的装载地址以及用户中断向量表地址保持一致
  K, V# l- A* I4 k   在实现跳转到用户程序的代码中,将用户中断向量表中第一个 4 字节指向的栈首地址分配给 MSP。第二个 4 字节为复位中断向量,指向执行首地址。' b- a. I1 F! O, J
   在开发 IAP 驱动程序时,需要避免 PC 指针跳到用户程序区域。同时,充分考虑 Stack & Heap 大小,避免出现 USBDFU 正常识别,但不能正常工作情况,如下图所示。
* S( c3 k# g# f7 {
+ i* P4 N+ L2 R 00DDRWT97L(AB5B(_BUX)$N.png
( Y! f' e+ t0 I9 I' f1 m8 L, B
' g/ F" j- V3 v/ c! j6 Y   3.3 用户固件生成
/ [: G* V: v; m7 F   本文采用 STM32CubeF7 v1.3.0 开发库中 TIM_TimeBase 例程作为用户程序(文件夹路径:STM32Cube_FW_F7_V1.3.0\Projects\STM32746G-Discovery\Examples\TIM\TIM_TimeBase)。
2 J+ H; d" v, R0 i   IAP 升级所需用户固件,主要有两处需要变动:
# D5 c1 _* w9 e& O( c# Q' ^, M9 N  m; z# o1. 在链接工具中,程序装载地址
! {, V- [8 O, G7 M/ w3 j2. 中断向量表首地址
: \1 j$ u+ b" P, Q2 L5 {   上述两种变动需要保持一致,并且与 IAP 中定义的用户区域首地址保持一致。
' [7 w" A) c3 }: ^   本 IAP 驱动程序中,用户固件装载地址相对于 0x08000000 偏移地址为 0x8000。在 MDK 中,改动前后比较如下图所示。# L6 H$ S( L6 @# w9 c+ t
! u& U# J# z) |. n9 \/ q- `
D4{{FXBTGOCM30J)B_87G72.png # i# q" X; L- L* `
) Z8 F0 m* Z4 x2 A1 m3 U
   在 IAR 中,更改步骤如下所示。6 h2 G* _# f8 ]4 K$ m5 L" f: I0 _
( Y$ |5 Q2 i9 c9 d5 H8 `! H$ ~
H[@B$R%UM}JFKFVO@WJYV5C.png
$ W5 A0 f3 I6 o3 T/ @. _- }4 [3 t5 i6 |. b
   修改完毕后,生成 hex 文件(STM32746G_DISCOVERY.hex)。3 r% O& C5 y8 I& u+ D

6 h8 @7 a  e6 C- J( C9 h. ^   3.4 用户固件转换与升级
" s- g$ F, x* f   打开 Dfu file manager 工具,点击 OK,进入转换工具主界面。( z: T+ Z6 C: `8 U  P/ `+ `
3 Z5 b" o/ z9 S0 v5 r# b" W) X
02@L_D(W((W}J88}X(99FP5.png
1 ^' x* Y- S! |2 y+ \9 @% b( m- t- `9 B
   按照下图步骤,首先载入生成的 HEX 文件(STM32746G_DISCOVERY.hex);然后在 Target ID、 Target Name、Device properties 中自定义内容,这部分内容在 DfuSe Demo 工具中选择.dfu 文件时会予以显示,并不影响烧录文件内容。最后,点击 Generate 完成 HEX 文件DFU 文件转换。
5 m1 i3 y% _0 G1 e( t
/ W2 @: r9 A7 ^9 H )29NEDWRMWUCO]})VXTW}_T.png
& b3 M, a, E: j) A; Q' y; R% y4 N6 I$ \7 n- p# j# Q
   为 STM32F746G-DISCO 板供电,通过 USB 线将板上 USB_FS 接口与电脑相连。由于 ST Discovery 板已经加载了 IAP应用程序,并且没有有效的用户应用程序,因此在 IAP 应用程序中,直接进入 USB DFU 模式,以供电脑识别 USB DFU 器件。正常识别情况如左下图。7 u- d! L/ \0 P3 L1 ^
   右下图情况是由于没有正确装载 Driver 导致,可以通过右击“DFU in FS Mode”选择更新驱动程序软件\浏览计算机以查找驱动程序软件(驱动文件位于 DfuSe v3.0.5 安装目录\ DfuSe v3.0.5\Bin\ Driver)。5 ^; J; N: q6 N9 u, E& n0 B
   打开 DfuSeDemo,结合下图步骤,点击’Choose’加载之前转换的.dfu 文件;选择配置;点击’Update’完成擦除与下载;另外,可以通过点击’Verify’验证是否下载成功。更多关于 DfuSe 内容,请参考 UM0412。
# q9 w6 a6 d% b1 w, i$ @0 R. u- t$ B; }! J: N
EHGCO~$E`A[6A7(J%)5982K.png 4 p, q8 C6 H' F: V

/ c# B; z' B) {6 Q% ]& Z& s" j   用户固件升级完成。重启后,正常进入用户应用。如果重启过程中,板上 USER 键按下,进入 USB DFU 模式,等待升级。; c8 s3 Q- Y! T+ ~; l6 M
   9 D; ]2 m0 I4 @
四 小结. |3 K1 ]5 S# M$ d' n. E
   介绍了利用 USB DFU 实现 IAP 过程,以及实现过程中注意事项。在 DfuSe v3.0.5 安装目录中包含了必要的文档,介绍如何使用 DfuSe 工具,以及如何开发基于 STMicroelectronics DFU 方案的上位机应用。
% F/ Z" \; r; m" ]9 e) z; R2 o* [4 d: j+ y/ Z
9 _( b7 f, B. `

! P% W, d  E+ K: w" }$ \
UYDEWJC2~}CTD{AZ5{HEA~Q.png
赞 收藏 评论0 发布时间:2022-2-20 14:25

举报

0个回答

所属标签

相似技术帖

官网相关资源

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