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

【IAP更新设备】STM32CubeProgrammer DFU功能实现设备固件升级

[复制链接]
STMCU-管管 发布时间:2020-10-10 09:44
【IAP更新设备】STM32CubeProgrammer DFU功能实现设备固件升级
- J3 M  Q1 x* O8 G% q  Z

: G, d6 C! P4 b9 j4 R- V清单' X* ]+ R  x3 l6 g7 |' h
软件:
" k9 k$ e5 d- j  I9 Y, J) r 16.png 1 ]( j: W! W/ P3 r
硬件:
3 U  c" O5 \. ~3 M8 {1 a1 Y0 r 17.png
+ n- A1 i# x9 N, z
3 ?% [. A$ q' h' n& s  D7 A( _
: d! V3 N0 e  v  n# x/ E 18.png 7 I* c- n* Y7 j% f9 ~: l- U4 Y
19.png 4 |% Z+ m) E1 O, b2 y1 [
( I+ p& H3 g+ j
一、先用STM32CubeMX生成 dfu工程8 J& M5 K% a. i* q/ X7 t6 Y
        图文演示的usb的配置步骤:
8 f  d( I2 @+ k5 c% N9 V6 R+ n- F 20.png
) k; u/ f! {% j" ^; d1 H 21.png 1 K) a8 `6 F- @3 N% i
22.png
5 w8 L& [- j' u$ l3 ~7 p 前面1,2项默认。/ b: p& \1 [* Y. s0 `4 A
        第3项USBD_DFU_APP_DEFAULT_ADD (Base Address 0x)是指定dfu_app开始存放代码的flash地址,也是说明dfu代码最大占用空间,不能超过这个大小。stm32f401ccu6内置flash大小是256kb,所以我任性使用48Kb来存dfu代码,实际上生成的简单dfu代码是很小的,几kb量级。具体型号具体设置这个地址。stm32默认flash启动地址是0x08000000,0x0800C000 - 0x08000000 = 0xC000,0xC000 ÷ 1024 = 48kb;1 c! A* K5 u# a8 e

; ~/ M0 ^) ^8 Z9 [8 k$ [        第4项USBD_DFU_MEDIA Interface   @Internal Flash   /0x08000000/03*016Ka,01*016Kg,01*064Kg,01*128Kg
  B' Y; c7 J. T& A2 E& x. I
; O0 P5 {) [! j3 C3 ]
0 X1 y& Y- v3 A4 j5 M0 w
@之后是特殊的映射描述符(解码标准描述)---------Internal Flash 8 W$ Y' J! g5 d% W3 h* I+ I8 X
/0x之后是芯片flash起始地址------------------0x08000000: z0 K% r! D1 w* ^  H% p
/后面是描述这个芯片flash的Sector的使用---------03*016Ka,01*016Kg,01*064Kg,01*128Kg
6 Y  Z6 w! O' ~* R$ a* u7 ~5 g' l. k
* I' O$ y. r; {/ N0 m
        Sector具体是如何分块的要从数据手册(RM0368)中得知:6 _. p2 }1 i+ @% \
9 r2 Y  ]. }, x0 o
; Q* ?8 r: y4 x: J) O- a4 X
        不同型号的stm32,其flash大小可能不同,具体看对应手册。stm32f401ccu6的flash大小是256kb,包含的Sector0-Sector5所以03*016Ka的意思是Sector0-Sector2共48kb,a代表是只可读。01*016Kg,01*064Kg,01*128Kg是分别描述剩下的Sector,g代表可读写。
# G( s6 |; {- F7 E6 v6.jpg- ]9 L& @# O  o
USB标准通信时钟48MHz
1 f! i! i9 g# }7.jpg
# R1 ?. ]9 ?5 D+ n9 K        堆栈Heap,Stack要设置大一点,否则usb设备枚举不成功(出现感叹号或者无法识别设备)
; y- v& v5 O: W, _1 O" I        然后就是生成Keil MDK5工程了,补充:我们的工程应避免中文路径或者空格,否则生成工程失败。
# M2 G1 c4 W4 d
+ d; {8 Y1 ?( x2 T
$ r% B0 Z0 m% `/ r) S
二、修改dfu工程
0 K! s, d& F( q3 V6 |' K    具体修改是usbd_dfu_if.c,usbd_dfu_if.h和main.c三个文件。(参考链接在本文最后,若想复制代码到最后链接原文中复制)
+ {$ x; p8 l7 v* n' ~    usbd_dfu_if.c中修改如下:4 n2 F. D$ {0 C3 P1 b/ j) O
2.png
* g$ W+ c6 J4 {# i, Q8 ~) W& v 3.png
; t+ M$ M. m, f" ^0 [0 H 4.png 4 p( Y, _3 p, q/ k- f( N
5.png - A2 x, P$ a# U( X  Q- |
  pEraseInit.NbSectors = 1;//即可,HAL_FLASHEx_Erase函数会遍历erase的。
3 D+ t6 [" ^+ |0 B6 ` 6.png
4 V4 R2 H# \; \: K. S 7.png
, _5 K4 {) f3 T5 n 8.png
* n) K! `( r- ~5 C 9.png
& v, X1 Z# ]  ^0 q# ^: f    usbd_dfu_if.h中修改如下:; D3 F+ y( r- B
10.png . s! _6 l$ H2 K! ]/ x% X+ z
    main.c中修改如下:; z' G! Y' }: x. D% h, O5 Y2 D
11.png + n( v8 n7 F3 Z- @
        主函数意思是Key_IAP默认上拉,即默认跳转app程序,要通过dfu方式下载程序先将Key_IAP拉低。
/ e( w5 I$ Y" D        编译成功后用stlink烧录到核心板上。
8 U  o6 _+ O9 R  }! F7 O三、生成dfu_app工程
$ x' L! b* O9 A! @9 H: f    万物从点灯开始!. E  C. P! d' s7 J/ b- `% d7 Q
    编写好LED程序后,我们只需修改三处地方就可以了。
& y+ b! T' ?/ M. p; R 12.png
0 w5 M( a. t, L2 N. w修改app flash启动地址和剩余size大小2 K. C. k1 q, p  [$ p
        打开system_stm32f4xx.c 文件,修改中断向量偏移量,注释上说明偏移量要是0x200的整数倍。我们修改和app的启动地址偏移一致0xC0007 j  B1 j4 R' y0 m6 G3 U: m1 g/ a8 i
13.png 8 v6 H: H, }2 r- `
        生成.hex文件: s2 s( h' t7 K! G
14.png
8 C- `; f& O4 Z- i6 g        编译工程。
& X$ D& h8 R: ]' l2 |5 n* v: M& K四、用stm32CubeProgrammer下载dfu_app程序5 z9 y- e1 o' n  H$ x5 U  U
15.png
' ~6 }0 i& S$ \' r    下载完成有个error表示无法软重新启动设备,需要重新上电,核心板会自动跳转执行app程序, r# |. |( ]3 r9 |" f4 F/ E
6 x: g6 |- O+ h5 D' E
文章出处: Tkwer望远镜
5 N, N& [) Q$ H" O: C" ~: \2 B: v
收藏 评论0 发布时间:2020-10-10 09:44

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版