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

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

[复制链接]
STMCU小助手 发布时间:2021-12-28 23:00
场景1 o/ Y6 `. O" c% c/ I2 n7 M
项目中需要用到STM32H750这款ARM cortex-M7内核的单片机,它作为H743的阉割版,它的内置flash只剩下128K。但是对于我们需要有IAP升级的项目来说,这128K(一个扇区)完全不够用,所以需要外置QSPI Flash。但是使用外置QSPI Flash又引入了新的问题。
6 ~2 K% C+ r$ Y& y2 q- S5 I0 t- S" F3 C% G& J% ~& E
问题一:需要自己写分散加载文件

% J& E+ z: r1 y3 ^6 e2 v6 m首先介绍一下什么是分散加载文件:我们的代码在编译以后,需要由编译器链接到指定内存地址上,平时我们在STM32内置的flash上可以直接使用keil生成的分散加载文件就可以,但是keil并不知道我们外置的flash,所以需要我们自己来完成这部分工作。
4 c" P+ y5 e; H- e# s. \% p) }. P, u4 C0 E6 k/ H* r
keil中的配置如下图所示:
* b0 g, i$ X0 M# J! _' a3 y' V2 x
5 D. T2 A! n- ]% r
20210601102703723.png
# E; q0 q& c: Y0 h9 T8 P9 }: @+ \& g

! E9 _$ D* Z" w# `分散加载文件如下图所示(了解了ro、rw、zi代表了什么,就可以自己定义下面的各个地址空间):
! ~) o6 k1 f( U) ?& T; A$ h, L8 e9 @# t) H# S
20210601102901962.png
- L/ i' z; Y! J8 k3 j& X$ b
3 n! J& c- A& o! Y5 u
  V& F- R( Q8 w8 v" a" s- Y/ L
问题二:运行在STM32片内flash速度比QSPI Flash要快多少
7 o/ m+ \1 w- i, i2 ~, W% _
运行速度的差异是很重要的,不能因为外置flash就让我的高性能芯片效率变低,所以我测试了两种代码运行方式的运行速度进行对比,如下图:
# u  {. b0 m0 U; l) H  O" h0 J' t; A7 ]/ F
20210601102922170.png

4 m$ E4 a9 P, w% S4 b1 s; S& i0 D2 D
​ 左图为QSPI Flash的运行时间,右图为片内flash的运行时间,由此我们可以看出,两种运行方式的速度差距不大。
5 T  u  |# I! X0 Y' n/ i% o3 v% C2 _/ n: I2 r, _  R- {. ^1 a0 ]( C8 T! v
既然一种是外置的一种是内置的,而且外置的QSPI 芯片时钟频率最高才100多M,为什么速度差距不大呢?
8 W) x( F% y' ?) p! F+ X4 v  q
  L$ x4 ^: W8 `6 B, p: N6 Q; }6 z8 P我的分析是:因为我们使用的是H750芯片,这款芯片带了一个一级缓存,由于这个缓存的存在,让两者的速度差距不是那么大。
. Y4 x) j2 r  I: {! M问题三:MDK对应的下载算法怎么写?% V; w& i$ A5 M& V' b' k9 Q; K
首先我们来说一下什么是下载算法:我们在配置keil工程时,会在魔法棒里面的debug选项处选择我们的下载方式(一般为jlink),然后再setting里面我们会选择flash download来add一个选项,这个选项就是下载算法。如下图中②所示,那些选项就是我们要的下载算法。
5 W) U# X. Q  s% P3 C
5 [9 P* G% v8 w6 Q
2021060110302059.png

: A1 Y4 d1 o" ?2 t. c( v2 j4 C
' Y! Y9 R. w8 h) f  J下载算法的本质:下载算法其实就是一段加载到sram里面运行的STM32程序,这段程序的作用就是和keil通信,接收keil发过来的数据,然后把它写到对应的flash中。上图①所示就是这段程序的加载地址以及它的大小。因为每款芯片的外设不一样,外挂的flash型号不一样,所以没有一款算法可以兼容所有的芯片,我们得学会根据自己的硬件环境来写对应的下载算法。# Q* M# d5 ?, d' z% q" D
& A+ m# d: a! ^% A, b& F  I. [* `
如何写下载算法:3 W+ G. r" A# e' d

8 h& @" S! d- C2 G首先我们找到我们的keil安装目录下(比如D\keil5\ARM\Flash\ _Template),这是keil官方给的一个模板工程,我们按照这个模板工程把需要的驱动加入其中。
9 h8 e( n+ i8 o3 M# a0 v2 m. {3 `5 A  Q
如下图所示,我们自己添加一个HARDWARE文件夹,把需要用到的驱动放入工程中。上面三个文件是标准接口文件,不能动。+ H8 z. T& q- Q( d

9 p# ]2 x2 z" d" n$ t8 A
20210601103107860.png

# w! Z0 \3 K! K' h% V. _& J/ C- R
模板工程FlashPrg.c文件接口函数如下图所示,我们只需要在他们给定的函数接口中实现自己的逻辑即可。
: F& {. x% E( U# Z
9 ?0 d, A! n6 Y- p8 {% b
20210601103205494.png

2 A0 d# I8 Z6 ?7 e' D4 k# S8 a* F* I
3 g2 r4 J$ [" R& h8 d& F# g' d$ {模板工程FlashDev.c文件接口函数如下图所示,它是给keil进行识别的文件,对照进行修改就行。* s4 E9 G4 q: a  u

* p& ^/ n- P* L) [: N
20210601103234589.png

; c- r0 E% K; Q4 E$ y; Y0 T3 y
( q1 \9 B/ s  X7 S4 b在全部修改完成后,进行编译,会在根目录下生成一个.FLM的文件,这个就是我们上面所选的下载算法,我们把它复制到D\keil5\ARM\Flash目录下,然后我们就可以在keil中选择到我们自己写的下载算法了,如下图所示:
8 P: v) v" V! l% H
# {- h! S7 Z9 c5 Q
20210601103307396.png
5 g9 S: H6 L1 Q& w( T: u

0 f# A% o7 Z: E. o$ i! Q0 _) r& F3 A; [! N2 \/ p
收藏 评论0 发布时间:2021-12-28 23:00

举报

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