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

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

[复制链接]
STMCU小助手 发布时间:2021-12-28 23:00
场景
& f& u1 a- g- j% r项目中需要用到STM32H750这款ARM cortex-M7内核的单片机,它作为H743的阉割版,它的内置flash只剩下128K。但是对于我们需要有IAP升级的项目来说,这128K(一个扇区)完全不够用,所以需要外置QSPI Flash。但是使用外置QSPI Flash又引入了新的问题。  @. {6 k. K& d- H8 a2 e0 S
5 h0 A3 _5 t4 |( n
问题一:需要自己写分散加载文件

5 f5 l* J$ ]" e% E/ q" ]首先介绍一下什么是分散加载文件:我们的代码在编译以后,需要由编译器链接到指定内存地址上,平时我们在STM32内置的flash上可以直接使用keil生成的分散加载文件就可以,但是keil并不知道我们外置的flash,所以需要我们自己来完成这部分工作。
1 D+ R4 V3 M1 o' f! c% N) K% `& N- g3 X0 J' z- M
keil中的配置如下图所示:
! B& T1 Z5 z& x2 R! w8 O! O+ b4 x! U- l. ]
20210601102703723.png
1 ^  O8 m/ ]5 u2 L

9 f( i3 |1 v; m4 \( \. g分散加载文件如下图所示(了解了ro、rw、zi代表了什么,就可以自己定义下面的各个地址空间):
/ x  h1 w0 \) c5 P9 F& z7 f
* Y+ s/ d0 O0 b- G5 J. J: o
20210601102901962.png

% ]# O& a, N0 K8 d, l4 Q( p9 t4 c5 q7 i; [, m

9 R5 S9 j' U7 f1 l% N问题二:运行在STM32片内flash速度比QSPI Flash要快多少
, B/ U: h6 z% K5 H
运行速度的差异是很重要的,不能因为外置flash就让我的高性能芯片效率变低,所以我测试了两种代码运行方式的运行速度进行对比,如下图:
% i% {% d0 q- q2 I) x% m* S& J& P+ q9 p# B/ ~+ R
20210601102922170.png
- ~$ q/ |: ~/ j0 R

/ |! D9 P' F5 k​ 左图为QSPI Flash的运行时间,右图为片内flash的运行时间,由此我们可以看出,两种运行方式的速度差距不大。7 ^3 \5 l$ ^0 r

4 \: z  I7 h1 d* @: f既然一种是外置的一种是内置的,而且外置的QSPI 芯片时钟频率最高才100多M,为什么速度差距不大呢?
' v5 K; n8 c9 m  G5 o" ?! D' i3 y
# I& u2 h; @6 p! J6 N; V我的分析是:因为我们使用的是H750芯片,这款芯片带了一个一级缓存,由于这个缓存的存在,让两者的速度差距不是那么大。
2 A  p7 D& Y/ R0 W& [; h* a) _6 O问题三:MDK对应的下载算法怎么写?% T* n# ]7 [" k* h: O9 X$ Y
首先我们来说一下什么是下载算法:我们在配置keil工程时,会在魔法棒里面的debug选项处选择我们的下载方式(一般为jlink),然后再setting里面我们会选择flash download来add一个选项,这个选项就是下载算法。如下图中②所示,那些选项就是我们要的下载算法。& \4 z+ u+ a/ K6 m
: C& w) e- L* i8 h3 {: B3 A
2021060110302059.png

; i# j* C5 ?- O6 ~! g% h8 j, n5 Q% E' e* C% c1 Z) a3 u, l0 Q1 e
下载算法的本质:下载算法其实就是一段加载到sram里面运行的STM32程序,这段程序的作用就是和keil通信,接收keil发过来的数据,然后把它写到对应的flash中。上图①所示就是这段程序的加载地址以及它的大小。因为每款芯片的外设不一样,外挂的flash型号不一样,所以没有一款算法可以兼容所有的芯片,我们得学会根据自己的硬件环境来写对应的下载算法。& c! h( q* T7 X. N1 |. O+ [

/ N6 t  G7 x; R2 c如何写下载算法:1 a" T5 o9 `$ T% U% m
' h7 d8 Z+ I  I% O6 m2 c7 C8 L* i
首先我们找到我们的keil安装目录下(比如D\keil5\ARM\Flash\ _Template),这是keil官方给的一个模板工程,我们按照这个模板工程把需要的驱动加入其中。  C/ t* n' ~& [/ K$ U

# o* F/ |0 f% g( Q如下图所示,我们自己添加一个HARDWARE文件夹,把需要用到的驱动放入工程中。上面三个文件是标准接口文件,不能动。0 [& l& [$ I4 S/ W  {5 f
$ M8 ?1 k( E  R  i  i5 u, }
20210601103107860.png

2 v' x/ W3 J$ U
& o: N& D. ^* j2 s/ E, {- X1 t模板工程FlashPrg.c文件接口函数如下图所示,我们只需要在他们给定的函数接口中实现自己的逻辑即可。
4 B, {& R4 G' R/ h% }
) i" h( L8 Y; X8 u" ^
20210601103205494.png
. B3 X; N7 a# J6 A: q; T
2 V/ |$ \4 n5 w+ U! n* Y
模板工程FlashDev.c文件接口函数如下图所示,它是给keil进行识别的文件,对照进行修改就行。. }4 h* X6 k% _8 P  r$ O6 g
& r" W* |$ B6 A( X& \' O4 N
20210601103234589.png

# D  t$ M5 {7 w) F6 Z% y- ]$ U* s. V; y! `  L! n8 g. k
在全部修改完成后,进行编译,会在根目录下生成一个.FLM的文件,这个就是我们上面所选的下载算法,我们把它复制到D\keil5\ARM\Flash目录下,然后我们就可以在keil中选择到我们自己写的下载算法了,如下图所示:
* P& y# k; O  R0 d. s, R
. H' j2 c) m3 E/ x; e4 v
20210601103307396.png

" {' d' Z( I  r: K' C
5 e% c8 X- |/ K3 Z. e
9 t: x* U: G& h) C+ E9 h
赞 收藏 评论0 发布时间:2021-12-28 23:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

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