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

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

[复制链接]
STMCU-管管 发布时间:2020-10-10 09:44
【IAP更新设备】STM32CubeProgrammer DFU功能实现设备固件升级
: R2 [3 c+ G# ?( W
: Y7 v$ }5 \4 V  \+ r
清单( h& j. S5 @8 f( T  U; B
软件:
' _& @5 G1 R" o; G8 r2 b 16.png
0 I; w8 p; U. v) l  E/ |+ I0 z硬件:
8 F. s. g) D6 Q* P" }' r' M, J 17.png ! b+ T& l, @- h; O
% l: G2 \7 F9 U* r5 i/ V
. e  l8 n" w1 s4 ]" C  a- y
18.png % G! N6 g3 _' \
19.png $ D9 j/ q1 ~+ V

6 N: o% _! ^- C( {* }; ^& y
一、先用STM32CubeMX生成 dfu工程
% k7 [. y. F+ w5 \( s        图文演示的usb的配置步骤:
; ~% N$ B; w: t9 \ 20.png
; B( O  Q5 U. c  D  M' O* k 21.png
4 w8 R4 R  Q" f# n 22.png
8 M+ f, F& H1 w! j. e: Q, A 前面1,2项默认。# s( p8 Q) g/ ^" @
        第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;
7 a; M2 w, w: V3 t, a4 M3 j$ {4 F
# X: \0 \) G4 W8 M* n        第4项USBD_DFU_MEDIA Interface   @Internal Flash   /0x08000000/03*016Ka,01*016Kg,01*064Kg,01*128Kg
9 ~& V7 s8 J; D: U7 @
. j8 N- C% Q) I4 D6 {8 W
% ~8 t! U7 U# L/ ?
@之后是特殊的映射描述符(解码标准描述)---------Internal Flash " G  ?5 p) L/ h; B* n. a( U, i, e
/0x之后是芯片flash起始地址------------------0x08000000
1 `0 L' B% H, K3 f# R% n/后面是描述这个芯片flash的Sector的使用---------03*016Ka,01*016Kg,01*064Kg,01*128Kg
8 P4 @; ^: t0 Y' v6 T' x/ B3 ?9 N6 d: s: e. @5 @# w& @/ K/ |
& R3 Q! z  w  G7 v. r5 A3 Q
        Sector具体是如何分块的要从数据手册(RM0368)中得知:
- x3 n9 y% @- `7 g  y) c
, f5 m# i; _3 F4 o$ q! P0 B
6 a: l7 s0 [! N
        不同型号的stm32,其flash大小可能不同,具体看对应手册。stm32f401ccu6的flash大小是256kb,包含的Sector0-Sector5所以03*016Ka的意思是Sector0-Sector2共48kb,a代表是只可读。01*016Kg,01*064Kg,01*128Kg是分别描述剩下的Sector,g代表可读写。
" j- D; [, A7 c  M' u: ~6.jpg
( t8 b" }9 H- g: |+ WUSB标准通信时钟48MHz; e+ N- W+ r6 b" I1 N
7.jpg
& e7 |5 h' i2 z- C" L        堆栈Heap,Stack要设置大一点,否则usb设备枚举不成功(出现感叹号或者无法识别设备)' s' g3 v+ w  E! P# T
        然后就是生成Keil MDK5工程了,补充:我们的工程应避免中文路径或者空格,否则生成工程失败。  f! u; t  |3 k& S

' V* P% [9 m$ \" V: s0 ~* c  w8 t5 ~

$ B) O& o' e* [  ~& w, i二、修改dfu工程
/ I6 y: e/ Y* {* H    具体修改是usbd_dfu_if.c,usbd_dfu_if.h和main.c三个文件。(参考链接在本文最后,若想复制代码到最后链接原文中复制)
8 }' y' e! F+ n* L' X% Q  i    usbd_dfu_if.c中修改如下:# N7 t- j, s9 a. D1 m4 c- v/ Z
2.png
5 \1 ~; X4 Q6 ]4 ]0 @7 H$ z 3.png
% `7 e" v* `# \) n* a 4.png
- m  Y  `) |( a 5.png
8 {) {; K+ F* X* V9 W, G9 T  pEraseInit.NbSectors = 1;//即可,HAL_FLASHEx_Erase函数会遍历erase的。
9 v8 r9 }9 r- z# ]( t 6.png
  ]2 {# S. h/ f$ J5 ~3 i" \/ @ 7.png 3 }' Z* w( e( ~& \  W: {9 T
8.png
5 p+ ?3 a2 C2 W 9.png * ^; ~1 Y. K) |
    usbd_dfu_if.h中修改如下:
7 b2 _* W" Q, v' T' p 10.png
1 D7 {4 c0 F  A! Q( K7 z+ I" c% ]5 d    main.c中修改如下:, `7 ]3 |4 t% n4 a" M1 }- ?6 [
11.png + \# I$ z" Q2 y" k) U0 s+ E! o
        主函数意思是Key_IAP默认上拉,即默认跳转app程序,要通过dfu方式下载程序先将Key_IAP拉低。# C  {' E% w2 @' V& }9 b  E7 I
        编译成功后用stlink烧录到核心板上。% X; N* u( l" I! b' q4 E5 F8 v
三、生成dfu_app工程. T( D+ {) M. l% h0 V
    万物从点灯开始!
0 J# z' D  @( e9 ]" {$ Z    编写好LED程序后,我们只需修改三处地方就可以了。
; [) `) l7 i5 K& C5 G, F6 G 12.png
' Z4 `% c8 X% j4 O修改app flash启动地址和剩余size大小+ x0 Y- T' n! |. [9 N# {
        打开system_stm32f4xx.c 文件,修改中断向量偏移量,注释上说明偏移量要是0x200的整数倍。我们修改和app的启动地址偏移一致0xC000! T1 D5 J* U' v  t3 v, O, O7 r3 N. H
13.png
3 ?$ ~# r' [2 \) w+ `        生成.hex文件: }% @- C& a: }1 w/ L1 x
14.png
/ a& B! X" o4 ?2 h- X        编译工程。+ Z* o" o7 q% v7 ]% A' ]
四、用stm32CubeProgrammer下载dfu_app程序1 g0 i$ m3 i0 G5 n
15.png 6 F" t  A1 i8 s; V' w6 M
    下载完成有个error表示无法软重新启动设备,需要重新上电,核心板会自动跳转执行app程序
' S" C2 j- y' ~3 [+ T' V- t' A5 k( ?$ F4 M
文章出处: Tkwer望远镜
( C3 D' E: j' ], L' U% I5 J3 _3 @7 h; ?4 R, r
赞 收藏 评论0 发布时间:2020-10-10 09:44

举报

0个回答

所属标签

相似技术帖

官网相关资源

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