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

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

[复制链接]
STMCU小助手 发布时间:2021-12-28 23:00
场景
) [( N( q) f1 g2 m/ M项目中需要用到STM32H750这款ARM cortex-M7内核的单片机,它作为H743的阉割版,它的内置flash只剩下128K。但是对于我们需要有IAP升级的项目来说,这128K(一个扇区)完全不够用,所以需要外置QSPI Flash。但是使用外置QSPI Flash又引入了新的问题。# {. W$ f9 E8 h# m/ l
, k2 @0 E* Y, b& w8 H
问题一:需要自己写分散加载文件

+ o, Z5 u/ ]( L4 Q首先介绍一下什么是分散加载文件:我们的代码在编译以后,需要由编译器链接到指定内存地址上,平时我们在STM32内置的flash上可以直接使用keil生成的分散加载文件就可以,但是keil并不知道我们外置的flash,所以需要我们自己来完成这部分工作。
$ s1 ^/ ]4 W+ z- r6 K8 i8 c. _; v% d7 o; i1 V, k6 z/ s" |
keil中的配置如下图所示:7 t- g7 w/ J2 W- w# `) V
- f( E4 |& w9 L7 |
20210601102703723.png

- U7 ]0 i7 g; O% F' x4 e
* y8 O9 \! W# Z- S4 W分散加载文件如下图所示(了解了ro、rw、zi代表了什么,就可以自己定义下面的各个地址空间):
" z  E% P. c0 K& \) n) B
3 E/ }6 ]' I6 |% r' _; p4 c
20210601102901962.png
" S  [$ q3 |9 F
5 `4 l4 t& j6 W6 m* I

( L3 n& S. \3 U$ F, ^. _问题二:运行在STM32片内flash速度比QSPI Flash要快多少

: m6 L! R8 x& K! H; o: U运行速度的差异是很重要的,不能因为外置flash就让我的高性能芯片效率变低,所以我测试了两种代码运行方式的运行速度进行对比,如下图:
& y/ y6 i9 A' f* x% o2 V2 |( y+ n8 i3 k
20210601102922170.png
7 ^) X1 ^3 z" X9 V

# a  l8 P! z* u! T* q! g​ 左图为QSPI Flash的运行时间,右图为片内flash的运行时间,由此我们可以看出,两种运行方式的速度差距不大。$ m; |. @4 ]# x8 k" b2 d7 l

& ~8 e6 C( L% Z7 Y既然一种是外置的一种是内置的,而且外置的QSPI 芯片时钟频率最高才100多M,为什么速度差距不大呢?, r- A4 n+ L- W5 A, q
7 \9 q9 z2 D0 C8 C
我的分析是:因为我们使用的是H750芯片,这款芯片带了一个一级缓存,由于这个缓存的存在,让两者的速度差距不是那么大。
' ~+ A2 k! O( L问题三:MDK对应的下载算法怎么写?' b& y0 Z' l# H
首先我们来说一下什么是下载算法:我们在配置keil工程时,会在魔法棒里面的debug选项处选择我们的下载方式(一般为jlink),然后再setting里面我们会选择flash download来add一个选项,这个选项就是下载算法。如下图中②所示,那些选项就是我们要的下载算法。
. y' ], F3 @0 [" w* h! s& \- C- N( O" T" `" B1 L
2021060110302059.png
3 K$ C  V9 N. J; h% \6 @& B
. q$ v) N$ ^1 c7 k  v8 Z2 o
下载算法的本质:下载算法其实就是一段加载到sram里面运行的STM32程序,这段程序的作用就是和keil通信,接收keil发过来的数据,然后把它写到对应的flash中。上图①所示就是这段程序的加载地址以及它的大小。因为每款芯片的外设不一样,外挂的flash型号不一样,所以没有一款算法可以兼容所有的芯片,我们得学会根据自己的硬件环境来写对应的下载算法。
! n5 x7 h8 U/ N8 }
; {- Z) R, S5 m+ y如何写下载算法:: X4 P# a' E3 x3 t0 P  y

9 i& t3 r% ~; {首先我们找到我们的keil安装目录下(比如D\keil5\ARM\Flash\ _Template),这是keil官方给的一个模板工程,我们按照这个模板工程把需要的驱动加入其中。
/ d, d: B; e5 v9 C: K% r" S. ^* z( R0 q/ s7 _( P
如下图所示,我们自己添加一个HARDWARE文件夹,把需要用到的驱动放入工程中。上面三个文件是标准接口文件,不能动。
9 S0 r- [! ~0 R& A7 O+ O& ~
/ a" ]7 j' k% [
20210601103107860.png
1 v9 r/ `! G6 f) M+ n; F3 `
( p9 u# j6 \: a1 W" M& X! e/ @8 P
模板工程FlashPrg.c文件接口函数如下图所示,我们只需要在他们给定的函数接口中实现自己的逻辑即可。
7 |7 M; c1 A+ j! E; A" t5 j. T' h( _& \& ]) H5 J* K1 X
20210601103205494.png

0 J: j& s! U6 n& h9 j2 C1 h! Y: E* L9 G' g. K, o
模板工程FlashDev.c文件接口函数如下图所示,它是给keil进行识别的文件,对照进行修改就行。8 H; I1 |. M) h  u- f
% `" n$ f8 D6 t+ x) G
20210601103234589.png

/ l0 @. z3 G/ Z# o" p; t" J+ {% R1 q$ A
在全部修改完成后,进行编译,会在根目录下生成一个.FLM的文件,这个就是我们上面所选的下载算法,我们把它复制到D\keil5\ARM\Flash目录下,然后我们就可以在keil中选择到我们自己写的下载算法了,如下图所示:% j' E6 v) v8 n  p7 @

) n  u% C! C/ E" E# f; e7 X: N: w
20210601103307396.png

5 |! l1 J4 w" v, Q: W" [- O
8 z# I# F% p3 z9 {8 W; e
; N2 E& V. F$ ^7 V. _  c
收藏 评论0 发布时间:2021-12-28 23:00

举报

0个回答

所属标签

相似分享

官网相关资源

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