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

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

[复制链接]
STMCU小助手 发布时间:2021-12-28 23:00
场景
( ]! g% f% U. Q' W2 @项目中需要用到STM32H750这款ARM cortex-M7内核的单片机,它作为H743的阉割版,它的内置flash只剩下128K。但是对于我们需要有IAP升级的项目来说,这128K(一个扇区)完全不够用,所以需要外置QSPI Flash。但是使用外置QSPI Flash又引入了新的问题。* J; d: J% \8 e8 v
  V2 j; Z( G$ ]5 d
问题一:需要自己写分散加载文件
/ @! T! z; r5 m7 ]
首先介绍一下什么是分散加载文件:我们的代码在编译以后,需要由编译器链接到指定内存地址上,平时我们在STM32内置的flash上可以直接使用keil生成的分散加载文件就可以,但是keil并不知道我们外置的flash,所以需要我们自己来完成这部分工作。
; p7 B- {% A% I9 {. d- j5 U7 V/ g5 G, Q$ u5 t9 W7 R
keil中的配置如下图所示:
3 j  a. `2 m; ^% I2 H
  j$ k+ W4 R8 n. i( c
20210601102703723.png
( P7 C' V, Y$ d# D4 A) U
# X2 U$ O+ e9 o# G  S2 ^
分散加载文件如下图所示(了解了ro、rw、zi代表了什么,就可以自己定义下面的各个地址空间):
5 p  N8 o2 V' U0 Y& w, F- n6 S* Y
2 {* U( a8 l' ?8 m/ Q0 w/ `0 G
20210601102901962.png

2 N# N, C3 l8 K& f$ W, g( e6 D4 Q6 [7 G0 s
/ e: _4 r6 T3 d- {* B
问题二:运行在STM32片内flash速度比QSPI Flash要快多少

9 b1 _$ d/ R, J6 l7 z运行速度的差异是很重要的,不能因为外置flash就让我的高性能芯片效率变低,所以我测试了两种代码运行方式的运行速度进行对比,如下图:$ |, t4 V0 x' N0 t1 |0 A$ c
1 j6 F, D2 G4 |3 Q3 ]5 V5 l
20210601102922170.png

$ m: q/ w1 O" w/ ~$ B% m0 i% \* U6 p0 V( e7 [7 S6 k. y
​ 左图为QSPI Flash的运行时间,右图为片内flash的运行时间,由此我们可以看出,两种运行方式的速度差距不大。; O% }9 E5 M* y2 @+ R

  g  O- h% c# y; A% F既然一种是外置的一种是内置的,而且外置的QSPI 芯片时钟频率最高才100多M,为什么速度差距不大呢?  M& Q1 W8 x4 J; B

) V, u$ O$ y& V& Y6 N' {7 h' }3 D我的分析是:因为我们使用的是H750芯片,这款芯片带了一个一级缓存,由于这个缓存的存在,让两者的速度差距不是那么大。; x) \% ]% B4 q4 n
问题三:MDK对应的下载算法怎么写?
+ o, H, d* R8 e3 g7 `首先我们来说一下什么是下载算法:我们在配置keil工程时,会在魔法棒里面的debug选项处选择我们的下载方式(一般为jlink),然后再setting里面我们会选择flash download来add一个选项,这个选项就是下载算法。如下图中②所示,那些选项就是我们要的下载算法。
+ [! v" H! \" y/ n( m% o0 N5 w3 l0 u
8 G, ]  T4 ~- C( G9 j' F( h: J& Y
2021060110302059.png
" P# A) ?$ ~; U; _8 k

4 ]1 e' K& v) v2 I  l下载算法的本质:下载算法其实就是一段加载到sram里面运行的STM32程序,这段程序的作用就是和keil通信,接收keil发过来的数据,然后把它写到对应的flash中。上图①所示就是这段程序的加载地址以及它的大小。因为每款芯片的外设不一样,外挂的flash型号不一样,所以没有一款算法可以兼容所有的芯片,我们得学会根据自己的硬件环境来写对应的下载算法。
) [' s1 [# d" ^' R# y
3 Z  m  a' n5 ]如何写下载算法:0 b. a* }! j9 B0 ^. l
& `( t9 k, j: d* f' S- i3 f. V
首先我们找到我们的keil安装目录下(比如D\keil5\ARM\Flash\ _Template),这是keil官方给的一个模板工程,我们按照这个模板工程把需要的驱动加入其中。& p  s: n' y! e* i" C  {
' W. V! h) w. @7 ]
如下图所示,我们自己添加一个HARDWARE文件夹,把需要用到的驱动放入工程中。上面三个文件是标准接口文件,不能动。
$ f$ c. s3 f! Y( o' C
0 _( `+ }# y6 {. I% N1 o
20210601103107860.png
1 s9 O1 u0 A1 Q+ L( }
: l7 R2 t' n# _5 |3 D; F1 x9 g
模板工程FlashPrg.c文件接口函数如下图所示,我们只需要在他们给定的函数接口中实现自己的逻辑即可。
- W/ c  x7 G2 @# i' ^  ^5 l  K7 s' m+ {7 F
20210601103205494.png
& F: B1 a% y& u0 x
" x8 \0 b  `: f; @- k
模板工程FlashDev.c文件接口函数如下图所示,它是给keil进行识别的文件,对照进行修改就行。
8 O8 J5 n+ E/ ~, C9 t
; W+ @1 H" ?+ i) [1 d3 V8 e
20210601103234589.png

) L# [. s; m8 N$ |5 p5 L: r
& x. k1 r4 k9 J. J1 J! O; H在全部修改完成后,进行编译,会在根目录下生成一个.FLM的文件,这个就是我们上面所选的下载算法,我们把它复制到D\keil5\ARM\Flash目录下,然后我们就可以在keil中选择到我们自己写的下载算法了,如下图所示:
( ]8 I3 n3 q$ i0 r7 J6 D( x* P8 a$ v( b. Z0 K
20210601103307396.png

% @; M3 g- g& j# M. k
. j# r3 Q& Z" v& h) L' i
) e# ?4 M  T+ ~% a* e/ i' q: ]0 g
收藏 评论0 发布时间:2021-12-28 23:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

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