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

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

[复制链接]
STMCU小助手 发布时间:2021-12-28 23:00
场景8 M, [$ M6 W. A5 @+ h: R2 H
项目中需要用到STM32H750这款ARM cortex-M7内核的单片机,它作为H743的阉割版,它的内置flash只剩下128K。但是对于我们需要有IAP升级的项目来说,这128K(一个扇区)完全不够用,所以需要外置QSPI Flash。但是使用外置QSPI Flash又引入了新的问题。
4 a3 k' i" `8 X& k
$ R/ w- N( ~0 H8 V0 s问题一:需要自己写分散加载文件

6 c: h+ w* S! k6 X% ]0 \6 _; Z首先介绍一下什么是分散加载文件:我们的代码在编译以后,需要由编译器链接到指定内存地址上,平时我们在STM32内置的flash上可以直接使用keil生成的分散加载文件就可以,但是keil并不知道我们外置的flash,所以需要我们自己来完成这部分工作。& }% N& _* b9 ?$ }+ t9 Z
4 O2 @: q- V7 }0 @* T
keil中的配置如下图所示:% q7 x8 b+ @, t+ o  R
+ d9 m' K" E9 r2 {7 ]
20210601102703723.png
$ Z4 ~) q5 ]7 b& S2 S  S) m

& N% {% I! a) f分散加载文件如下图所示(了解了ro、rw、zi代表了什么,就可以自己定义下面的各个地址空间):1 S# ^8 L; ~3 S) g* H3 j
8 h- L& [% C* z! R5 Q
20210601102901962.png

0 Y# W& M# b# z; T/ }- X6 S7 T0 t

8 u; W9 L; F* O问题二:运行在STM32片内flash速度比QSPI Flash要快多少

! H4 j2 j$ B0 E0 g5 f运行速度的差异是很重要的,不能因为外置flash就让我的高性能芯片效率变低,所以我测试了两种代码运行方式的运行速度进行对比,如下图:
. M  Z, q0 n+ W3 C% T) f6 k
6 r( q* a, S1 G, t' N
20210601102922170.png
- q8 N% P: S0 d
+ p3 l! Q: S5 W1 u2 i$ }" b
​ 左图为QSPI Flash的运行时间,右图为片内flash的运行时间,由此我们可以看出,两种运行方式的速度差距不大。/ F- I) A' R. B4 X% j  c
0 _5 M  m% x8 O6 B3 t$ Z
既然一种是外置的一种是内置的,而且外置的QSPI 芯片时钟频率最高才100多M,为什么速度差距不大呢?6 G& A5 o; |+ y4 ?3 \. t6 z

" n% V8 c4 S& H1 X0 a, h  K/ w# x我的分析是:因为我们使用的是H750芯片,这款芯片带了一个一级缓存,由于这个缓存的存在,让两者的速度差距不是那么大。) e5 H: B$ o2 R& V! ^9 J  R
问题三:MDK对应的下载算法怎么写?5 C+ V7 I+ [$ @3 A4 u4 o1 t& T
首先我们来说一下什么是下载算法:我们在配置keil工程时,会在魔法棒里面的debug选项处选择我们的下载方式(一般为jlink),然后再setting里面我们会选择flash download来add一个选项,这个选项就是下载算法。如下图中②所示,那些选项就是我们要的下载算法。
" Y; F" A2 o( Y! B. S1 I% q5 S' i# Y
, Q9 b, o& b, B. r) G6 Z
2021060110302059.png

* M$ @3 ?! Z: E8 I
5 ^9 T. m( W2 O% |; j  D9 V下载算法的本质:下载算法其实就是一段加载到sram里面运行的STM32程序,这段程序的作用就是和keil通信,接收keil发过来的数据,然后把它写到对应的flash中。上图①所示就是这段程序的加载地址以及它的大小。因为每款芯片的外设不一样,外挂的flash型号不一样,所以没有一款算法可以兼容所有的芯片,我们得学会根据自己的硬件环境来写对应的下载算法。1 d8 o/ `5 H7 L* z' N5 a4 ]

+ f. j3 l3 J! {7 C8 W如何写下载算法:
4 ^9 p1 m6 f& g, S) t8 }; f5 r9 B; P4 [
首先我们找到我们的keil安装目录下(比如D\keil5\ARM\Flash\ _Template),这是keil官方给的一个模板工程,我们按照这个模板工程把需要的驱动加入其中。
2 s/ }& [# ?, j9 [# B+ L6 r  k
+ ?5 E7 X, l. G( c0 J如下图所示,我们自己添加一个HARDWARE文件夹,把需要用到的驱动放入工程中。上面三个文件是标准接口文件,不能动。6 C! n( Z4 x3 K8 i6 j$ I8 g; x

. O4 X  K' H: o# o) W
20210601103107860.png
' S5 M- T3 \% W$ `: ~

  ?1 @6 M9 i# S$ f6 Q6 g模板工程FlashPrg.c文件接口函数如下图所示,我们只需要在他们给定的函数接口中实现自己的逻辑即可。" H+ a: V: C" C+ b  T8 i

2 Y% i, w$ w$ \- D
20210601103205494.png

, j: E1 V" f$ l4 F' C$ ^- C* t. h$ J( e, R; }, f/ A# o/ B" _
模板工程FlashDev.c文件接口函数如下图所示,它是给keil进行识别的文件,对照进行修改就行。
" [+ H) h+ c6 c8 H! A# t+ [. R+ e( f2 v9 h2 g! a
20210601103234589.png

- t$ J( g7 g2 v& f
, D% w3 S5 S6 x7 p+ b在全部修改完成后,进行编译,会在根目录下生成一个.FLM的文件,这个就是我们上面所选的下载算法,我们把它复制到D\keil5\ARM\Flash目录下,然后我们就可以在keil中选择到我们自己写的下载算法了,如下图所示:
* x/ [6 r6 k7 L0 J& w/ j/ P; g1 ^& A8 w$ e, S% M1 f
20210601103307396.png

: t2 F9 {4 j/ {
7 q) u- G( c( J+ ~! y+ K4 s3 Q' g! N$ ?* @7 F; y# G7 a
收藏 评论0 发布时间:2021-12-28 23:00

举报

0个回答

所属标签

相似分享

官网相关资源

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