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

手把手教你制作基于IAR、STM32H7的下载算法

[复制链接]
STMCU-管管 发布时间:2020-12-8 14:18
手把手教你制作基于IAR、STM32H7的下载算法
1环境
IDE环境:IAR EWARM 8.32( g$ j# o# T2 K3 j3 x% @  Q
单片机:STM32H750VBT6
5 ~' }: k9 X1 `* [$ R外部Flash:W25Q641 O  V- U  q, `

- F$ c) c" n1 Q7 ~# W

5 o' p6 S, e: u# \. E+ W5 Q嵌入式专栏
" x4 q% k4 A! q2 j! P. @
2背景、知识介绍
我们为什么需要下载算法?下载算法是在哪里使用的?7 ]8 c1 H& i3 x8 _* |3 H8 ^
11.png
如上图所示,我们想通过C-SPY将固件直接下载到Flash是不被允许的,那我们怎么才能实现将固件下载进Flash呢?
8 O# s6 u2 g! J" Q3 X- h
8 ?. `' p4 @5 v
5 t3 O1 w+ w; D  [# V% q. k$ y
IAR官方文档《FlashLoaderGuide.ENU.pdf》告诉我们说,我们需要先将固件放在RAM缓存里面,然后通过一个名叫"Flash Loader"的小程序,将代码不断的从RAM搬运到Flash(这里的Flash可以是内部Flash,也是可以是外部Flash)。/ L& u; u8 y+ N6 ]4 e1 Y2 J

7 g* p2 L6 H6 J' B
5 M; z$ Q( p6 |# c% y5 ^
上文中提到的"Flash Loader"就是需要我们针对不同的硬件去分别实现的代码,也就是所谓的Flash下载算法。2 C' B2 n- G& A* w+ [8 L6 _8 }

' d" l: P4 p6 ^' h' ^! p$ A, l7 _
7 B4 c- T. H3 _: h
知识介绍:, ]) h/ o9 E2 |% k* r% }
IAR下载算法一共包括4个文件(.out文件、.flash文件、.board文件、.mac文件)。$ {. T! k/ r2 b2 y, `) H2 G
1、.out文件是由"Flash Loader"代码生成的,里面包含了我们对QPSI管脚的定义,函数FlashInit()、函数FlashWrite()、函数FlashErase()的实现。) _7 p0 A' F% v# E! e; G" S& H

, F: ?/ ?4 [, l- ?: X8 s
1 A8 C" f! R5 M
2、.flash文件是一个XML文件,里面包含了一些必要的元素和一些不必要的元素,仅针对必要元素做一个简单介绍! s* E# Q/ K1 L: P
exe:指向.out文件
. O: Z' r  @! @$ n0 U$ D5 Z3 v. yflash_base:Flash的基础地址  m. P, j0 F! v, U0 `9 Q6 `/ Y
page:Flash每页的大小0 @9 W- ]' e, ?9 `1 Y3 r" }
block:对应Flash有多少个扇区,每个扇区多大。(block元素对应Flash的扇区还是块,待考证)3 o8 X! m; a- d! Y$ e8 ~. v% [4 c
7 ~0 i9 X  ?6 u6 `" p

4 @3 U! z; g( T7 {) Z% K' d/ X! D3、.board文件同样也是一个XML文件。可以由<pass> *** </pass>进行多个.flash文件设置。每个pass内包含了两个必要的属性2 g& G' u! P3 b9 v* @7 U/ u0 L
range:表面了Flash的起始地址及结束地址
4 C: _/ g' s. K0 b0 c: P( ploader:当前pass调用那个下载算法的路径! J" _% I2 I: c4 y4 V- C
  ?* a+ E; @9 a# L6 q4 r2 n

* S) I$ T9 L! L4、IAR每次仿真下载完程序是从当前工程的main函数开始运行的。如果我们将代码下载到了0x90000000地址处,我们并没有开启内存映射,是不可以仿真的。这时候就需要采样.mac文件作为一个启动脚本,当程序仿真下载完成后,跳转到0x08000000处开始运行。在0x08000000处进行内存映射,然后马上跳转到0x90000000处,就可以进行仿真了。4 g3 E* s+ R1 a' z( N
- ~1 A0 L( J$ P' ?7 D) m$ z

# w  n7 N1 O: Y4 [0 L嵌入式专栏
$ D% Y$ m0 J+ _/ k
3制作思想
下载"Flash Loader"开源代码& D/ e) e% `! _
创建一个空工程,将"Flash Loader"开源代码里面的文件添加到工程
$ }/ W3 P: F' d" F3 G- z完成函数FlashInit()、函数FlashWrite()、函数FlashErase()。
# c8 h; Q8 h' o4 ~4 c, w( a) b' T生成.out文件
( I6 Q. L8 T$ ~* b) E制作.flash文件
2 }5 }& n- Y0 Z; F8 `! u制作.borad文件
6 U' Z4 E; e- s4 P根据需要制作.mac文件" m; a& ?: Q% J

+ q0 C# C; Q! X$ [! e# @
4源码说明
上面已经介绍了下载算法制作的一些基础知识及制作思想,下面我们正式开始动手制作下载算法。
9 t6 _8 L. x! w! _8 U& c% ]8 H3 P/ @9 b

$ D' N4 p3 m: Y: H1、下载FlashLoder开源代码。, r5 Z6 h) a$ ^# w& j, b# U1 ?+ [3 u
传送门:- m! B1 l9 }8 d
https://files.iar.com/public/cmsis/. j5 A( @8 l, M2 E0 ~; p, s0 {" r
3 u' c1 g" |7 i7 D  R

/ E. B" P& `: \9 T5 z下载后的文件内容如下图所示:! ^) |% |. x2 z
12.png
“flash_loader.c”、“flash_loader.h”、“flash_loader_asm.s”、"flash_loader_extra.h"四个文件是供C-SPY调用的,我们不应该去修改文件内容。真正需要我们去修改的内容是"template"文件夹下的"flash_loader_ram.c"文件。2 Z. `2 r8 e3 o# u$ U, Y( W4 Z/ N
7 b: o: d8 e# c+ _+ Y
6 r( X5 o5 O" Q8 N$ [2 ?. l, a
2、为了方便,我找到IAR安装路径(“C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.3\arm\src\flashloader\ST”)下的"FlashSTM32H7xx_QSPI"文件夹,对这个文件内容进行更改。我们将"FlashLoder"代码添加进去,并添加相应的路径。(注:“flash_loader_ram.c"文件当前工程下被改名为"FlashSTM32H7xx_QSPI.c”)。* e" E2 v+ b* |' p# F# ]4 H

6 O3 {) Q9 j3 R: v3 Q; i5 _

6 y5 T  s' t) u1 l) W* c4 ^) ]7 `3、补充函数内容- I: p; u2 g0 F! z7 y
A.补充FlashInit函数内容
* g5 P2 q! X  W. f, i  @  A0 u
13.png
B.补充FlashWrite函数内容
- Z$ O7 F, g' I/ y0 Y8 P* U
14.png
C.补充FlashErase函数内容+ ~1 Y; d" S# }9 g! i5 e
15.png
4、生成.out文件由三个需要注意的地方1 |$ d$ W9 V2 H/ @+ z5 x; Q7 H
A.我们需要将代码下载到RAM里面执行,IAR->Option->Linker->Config配置如下:
# \( S7 b3 f. p* `2 e7 `, }. D
16.png
B.IAR->Option->Linker->Output配置的是输出.out文件的内容:0 f/ @7 `& o+ c1 n
17.png
C.当前工程没有main函数,程序运行的第一个函数将是FlashInit函数,对IAR->Option->Linker->Library配置如下:! n7 H; j" J5 c0 J
18.png
5、制作.flash文件,如下图:' _9 D  \) ~% n$ G% p
19.png
6、制作.board文件,如下图:! u2 X  N" a  K. @. {% ^" v
20.png
7、对于H750内存映射外部Flash还需要制作.mac文件,内容如下:" `' l: G& ^4 Y# G( C7 F7 \* i4 k/ _* `
21.png
文件内容就很好理解了,下载完成后,pc指针指向中断向量表的Reset_Handler函数,堆栈指针指向程序运行的首地址。这样每次程序仿真下载完成后,就从0x08000000处开始运行。我们可以把Boot程序放在这个地址,Boot程序里面进行内存映射,然后跳转到0x90000000处。  C( l/ R- ^/ C. i

1 U( |: j! k* k- G% Y
5效果展示
我们制作好上诉四个文件过后,创建一个工程(该工程要运行在0x90000000处),对这个工程进行简单配置。& F  N) j1 ]. o, ]" b2 G# X% ^
0 x! O: [* G% Y/ S' o% q  l' F5 g! @
8 O1 s4 ?5 f. A3 u
IAR->Option->Debugger->Download下,配置如下:
# @6 ~/ A, t( }# ]6 t3 r( J$ x) l! e( f
22.png
IAR->Option->Debugger->Setup下,配置如下:
2 e/ |. G( f: N; L4 T! s
23.png
IAR->Option->Linker->Edit下,配置如下:' X: ~5 ?9 \6 D9 T7 `  V% A- J
25.png
在代码初始的地址,还需要加上中断向量表地址SCB->VTOR = 0x90000000;! b# }+ Q4 p. m* K. o8 c. a

/ H- M" X: p( A* \/ c

  `3 a& E; G& e! _做完上诉配置后,我们进行仿真下载,如下图所示,我们可以看到main函数已经存在与0x90003588处,并且可以进行仿真,说明我们配置是正确的。
" _. \3 q5 V6 v- B( q
26.png
将代码全速运行,可以看见串口显示正式我们程序设置的输出。
2 s2 a$ W/ o& W/ n9 ~7 c. {
27.png
至此,关于IAR下下载算法的制作与验证就全部介绍完了。
: D1 ^4 H2 l) `. s
$ d* y. L9 I3 y7 }8 Y3 r
收藏 1 评论1 发布时间:2020-12-8 14:18

举报

1个回答
Kevin_G 回答时间:2020-12-9 18:04:54
点赞

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版