请选择 进入手机版 | 继续访问电脑版

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

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

[复制链接]
STMCU-管管 发布时间:2020-10-10 09:44
【IAP更新设备】STM32CubeProgrammer DFU功能实现设备固件升级

7 ?! e2 {5 ]( {( k$ q
/ o' i0 L6 f" J) J! I: M
清单# N, K7 n4 Y: B. ^
软件:
7 Z; v! e3 [; o- `' {9 |$ B4 E4 u 16.png , A' t/ G" U0 E4 i4 G
硬件:* z3 o2 n2 U1 x
17.png   }+ q1 S6 f/ [0 Z
" E& a2 y$ K6 E# N. e* T( h3 Y. N$ B

- d& ^/ U$ e* u3 I3 Y 18.png
& P, Y6 e3 L( w* L$ }/ z 19.png
7 F0 L: M  C9 U/ {" A/ E& {+ \% O& F( B( G- ^1 F
一、先用STM32CubeMX生成 dfu工程
% X4 z6 A! p0 S+ r" ?9 J        图文演示的usb的配置步骤:$ P$ e7 `) h9 c$ {$ `
20.png
3 T0 \& P2 C% \/ @/ | 21.png
! x" |* Z- d: o! Q' R6 {- x 22.png # W( A' w& c" I
前面1,2项默认。# D, K2 e; B2 |$ |
        第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;
8 e6 f! d- o) b  F: @
8 M- j# R" q+ \  k        第4项USBD_DFU_MEDIA Interface   @Internal Flash   /0x08000000/03*016Ka,01*016Kg,01*064Kg,01*128Kg
! S4 Y% A& t. ~7 i+ I( v8 B1 c2 I; h

, N4 J" F; A. P  R- J$ {@之后是特殊的映射描述符(解码标准描述)---------Internal Flash % Y6 ]4 q# ]6 ?) t+ M
/0x之后是芯片flash起始地址------------------0x08000000
3 @0 }7 U  a1 C/后面是描述这个芯片flash的Sector的使用---------03*016Ka,01*016Kg,01*064Kg,01*128Kg
0 I+ d, k' p7 N3 {( f7 Y) u! M% Q) l) I8 B+ [
  ?. d4 N( A8 @3 ?
        Sector具体是如何分块的要从数据手册(RM0368)中得知:
) s2 ^2 d4 u. ?' x8 d: @# u  P, I3 K  c, V4 m

, h0 }1 \4 `9 U% g( N# I: Z, H$ G$ f        不同型号的stm32,其flash大小可能不同,具体看对应手册。stm32f401ccu6的flash大小是256kb,包含的Sector0-Sector5所以03*016Ka的意思是Sector0-Sector2共48kb,a代表是只可读。01*016Kg,01*064Kg,01*128Kg是分别描述剩下的Sector,g代表可读写。5 ?1 V2 {8 O4 o: u: @. Q9 }
6.jpg
" O; o/ V5 W5 \7 w! p6 \2 `5 l1 iUSB标准通信时钟48MHz
7 D1 m% Q9 \3 C$ u+ U7.jpg2 m2 Q% ~: j. R- y  x# v* m
        堆栈Heap,Stack要设置大一点,否则usb设备枚举不成功(出现感叹号或者无法识别设备)( n. I4 O3 e- g8 ^0 H) I" b6 O
        然后就是生成Keil MDK5工程了,补充:我们的工程应避免中文路径或者空格,否则生成工程失败。
) S) y2 s! w! ?7 I/ }
# Z: [3 B7 B" G4 x" n

' W  w4 W( X: F4 y二、修改dfu工程
/ j- @$ Z8 Z! v    具体修改是usbd_dfu_if.c,usbd_dfu_if.h和main.c三个文件。(参考链接在本文最后,若想复制代码到最后链接原文中复制)
4 W0 s2 z) c( _7 \    usbd_dfu_if.c中修改如下:, C$ S9 F0 u( G
2.png 2 e- O3 A) {3 r+ t
3.png
( @3 ]6 H+ a% S, Y& H 4.png + F$ V1 H& A& j: a
5.png
) p' V7 B: p, P) R7 N0 Y; Q- M- X  pEraseInit.NbSectors = 1;//即可,HAL_FLASHEx_Erase函数会遍历erase的。
6 y9 y$ R! P) Y! I6 t6 q 6.png $ `% q8 N9 M6 l' X+ V0 K
7.png & A8 |3 H* Z  b# `
8.png * q: r- T2 o7 m. J  Y; m" e
9.png
. X6 D' z* G: w, }0 u    usbd_dfu_if.h中修改如下:
/ e( a- u# b  \" d0 \ 10.png
- [' S0 b( p* A2 w: P    main.c中修改如下:
' j# H1 x1 I, `) c  F) N 11.png % y/ G; n; T! E4 I& P7 ]
        主函数意思是Key_IAP默认上拉,即默认跳转app程序,要通过dfu方式下载程序先将Key_IAP拉低。
9 t$ c: C7 V; e8 s- v* Z! c: u( C        编译成功后用stlink烧录到核心板上。' ], I; W+ @1 S- a$ g  A# F
三、生成dfu_app工程
( L( f* \2 P5 L0 g! J2 ?    万物从点灯开始!' j2 Q9 f0 P8 W
    编写好LED程序后,我们只需修改三处地方就可以了。
, G! q7 i& N4 y' C 12.png
  a  V1 y9 q: y* l# U修改app flash启动地址和剩余size大小
; m  k; J, \. B. t        打开system_stm32f4xx.c 文件,修改中断向量偏移量,注释上说明偏移量要是0x200的整数倍。我们修改和app的启动地址偏移一致0xC0004 h0 ?* g1 s! A  G6 n6 u4 R- z0 x: ~
13.png / ^: D6 u, j+ A1 o; H- t
        生成.hex文件1 @5 X% O$ G& \1 C: b7 |7 w
14.png
. h+ ?/ z# b# z/ e) l1 o) k        编译工程。
8 L! `% t$ o2 c) ?, L. n: S四、用stm32CubeProgrammer下载dfu_app程序8 t; ]8 k# H+ {# a' w% e8 @
15.png * e* c. v* T( J# B$ d1 D0 m
    下载完成有个error表示无法软重新启动设备,需要重新上电,核心板会自动跳转执行app程序! K7 o! L: w* i6 L

3 \0 i3 u- z% S) ~# L* N% Q文章出处: Tkwer望远镜
+ i: U7 h% N1 X7 _
/ d, `% Q$ [) N5 t& l
收藏 评论0 发布时间:2020-10-10 09:44

举报

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