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

【经验分享】STM32H7代码运行在外置flash的部分总结

[复制链接]
STMCU小助手 发布时间:2021-12-28 23:00
场景* }$ Y) e9 ~7 C. J
项目中需要用到STM32H750这款ARM cortex-M7内核的单片机,它作为H743的阉割版,它的内置flash只剩下128K。但是对于我们需要有IAP升级的项目来说,这128K(一个扇区)完全不够用,所以需要外置QSPI Flash。但是使用外置QSPI Flash又引入了新的问题。
0 o2 g, x# V4 v4 j5 L; K- L
( e/ H! C: X9 s  F问题一:需要自己写分散加载文件

3 W5 o) J$ @3 o% F! @0 z8 ~+ n首先介绍一下什么是分散加载文件:我们的代码在编译以后,需要由编译器链接到指定内存地址上,平时我们在STM32内置的flash上可以直接使用keil生成的分散加载文件就可以,但是keil并不知道我们外置的flash,所以需要我们自己来完成这部分工作。
, |: E( ^" [$ A) @; b
% X, W, p/ x1 Z( _, d  Nkeil中的配置如下图所示:
. G" u, P" Z1 V
9 l5 q) A: L9 S$ K/ v& |
20210601102703723.png
( {. J0 U3 Q1 B
) S9 m9 x- `0 t2 D
分散加载文件如下图所示(了解了ro、rw、zi代表了什么,就可以自己定义下面的各个地址空间):2 f9 N! `" \0 X# T# m2 d, W5 r
" v. C$ r% ]& ^4 u* K
20210601102901962.png
& U& _) @& @3 w  l
" F" Z4 T. O. }* \7 S& U6 s3 g

& `7 L& z) c8 L问题二:运行在STM32片内flash速度比QSPI Flash要快多少

+ t: x* j# w: e( @. e运行速度的差异是很重要的,不能因为外置flash就让我的高性能芯片效率变低,所以我测试了两种代码运行方式的运行速度进行对比,如下图:9 ?6 x, J) p) f5 V) e6 |: h/ J

/ y: c: O! }5 C# Q- U9 T
20210601102922170.png

5 C, J& \/ z6 t5 N) Q) }- w& m; z( C4 W
​ 左图为QSPI Flash的运行时间,右图为片内flash的运行时间,由此我们可以看出,两种运行方式的速度差距不大。" E2 D+ o! e* |3 x* @, z$ E

7 G+ f/ ]9 W; z/ u. H既然一种是外置的一种是内置的,而且外置的QSPI 芯片时钟频率最高才100多M,为什么速度差距不大呢?
8 h/ r2 K7 ~* _% v
4 j" N. ^! u1 f% Y  d' F我的分析是:因为我们使用的是H750芯片,这款芯片带了一个一级缓存,由于这个缓存的存在,让两者的速度差距不是那么大。* ]+ Z( q! q8 C* G. H: l, f$ m
问题三:MDK对应的下载算法怎么写?
1 W& ~5 @& x' M3 {- S首先我们来说一下什么是下载算法:我们在配置keil工程时,会在魔法棒里面的debug选项处选择我们的下载方式(一般为jlink),然后再setting里面我们会选择flash download来add一个选项,这个选项就是下载算法。如下图中②所示,那些选项就是我们要的下载算法。
7 a/ C8 {7 _6 B' ^$ x6 \3 ^, K5 U  X& @% f6 _
2021060110302059.png

" `# u2 o. z9 U
. {8 I: ^0 O/ D0 g# J+ ]下载算法的本质:下载算法其实就是一段加载到sram里面运行的STM32程序,这段程序的作用就是和keil通信,接收keil发过来的数据,然后把它写到对应的flash中。上图①所示就是这段程序的加载地址以及它的大小。因为每款芯片的外设不一样,外挂的flash型号不一样,所以没有一款算法可以兼容所有的芯片,我们得学会根据自己的硬件环境来写对应的下载算法。
9 x0 A" }- Y/ g5 r
" I* b5 _. y4 ^) G) D如何写下载算法:: a" u% X5 k7 p! o

' l$ {4 c/ H; d% G: i" n: J4 Z首先我们找到我们的keil安装目录下(比如D\keil5\ARM\Flash\ _Template),这是keil官方给的一个模板工程,我们按照这个模板工程把需要的驱动加入其中。/ R' d3 y& X& C- `5 C4 i
* W! E" m) O7 g
如下图所示,我们自己添加一个HARDWARE文件夹,把需要用到的驱动放入工程中。上面三个文件是标准接口文件,不能动。
# `! r* G+ M6 F; G2 V  ?1 j& _/ D% b' C; W8 O% o7 e
20210601103107860.png
/ c0 o! y( }- t

5 y% A* a" k8 F模板工程FlashPrg.c文件接口函数如下图所示,我们只需要在他们给定的函数接口中实现自己的逻辑即可。: A* E! z6 k. W, P0 \& D

/ l4 C+ F$ E3 U& B
20210601103205494.png

4 l- R) G1 l9 S, N- i5 y/ s! Q+ c# G: m1 F' m1 \: [' D
模板工程FlashDev.c文件接口函数如下图所示,它是给keil进行识别的文件,对照进行修改就行。& z+ }! x7 w9 f4 F
. J7 K! `. K9 R- [* m
20210601103234589.png
* T1 [1 P' p0 Z6 k- `3 W3 s

$ m9 C: z( i, e: }' R在全部修改完成后,进行编译,会在根目录下生成一个.FLM的文件,这个就是我们上面所选的下载算法,我们把它复制到D\keil5\ARM\Flash目录下,然后我们就可以在keil中选择到我们自己写的下载算法了,如下图所示:
. i$ h. d1 ]' J2 H# n
. [) {1 l! i  o, f1 ?
20210601103307396.png

# y; j9 n8 g, c) f1 v/ R8 d3 J, d, H2 X) g8 E7 E/ \
+ q: a: c' T5 Q5 R" Z/ B
收藏 评论0 发布时间:2021-12-28 23:00

举报

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