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

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

[复制链接]
STMCU小助手 发布时间:2021-12-28 23:00
场景
2 K9 c3 R% b4 x" m: T; v项目中需要用到STM32H750这款ARM cortex-M7内核的单片机,它作为H743的阉割版,它的内置flash只剩下128K。但是对于我们需要有IAP升级的项目来说,这128K(一个扇区)完全不够用,所以需要外置QSPI Flash。但是使用外置QSPI Flash又引入了新的问题。2 A2 X5 o( |; ]
0 i) e" _) |5 B& z
问题一:需要自己写分散加载文件

) |& V; ?( {- C) Y首先介绍一下什么是分散加载文件:我们的代码在编译以后,需要由编译器链接到指定内存地址上,平时我们在STM32内置的flash上可以直接使用keil生成的分散加载文件就可以,但是keil并不知道我们外置的flash,所以需要我们自己来完成这部分工作。
6 N3 Z3 u# t* C+ G/ t. J* E
/ a! o/ O# }4 F+ n& t/ Pkeil中的配置如下图所示:
0 s6 Y( c( A- b. L& Z) q, c0 [( B& w) q$ N4 G
20210601102703723.png

" x, t. z0 J$ s3 v5 D' `3 G! J$ F. {3 J/ x( G" D- Q/ J, |
分散加载文件如下图所示(了解了ro、rw、zi代表了什么,就可以自己定义下面的各个地址空间):- i3 Y* i  y; r4 \3 b% g

( `& ^* y: m( S$ A4 m
20210601102901962.png
" k. \. ^! {( J: n
) \0 o3 I/ `$ M
  x: O& o9 @9 l: O7 L# S
问题二:运行在STM32片内flash速度比QSPI Flash要快多少
- h5 O3 z% Q( v# M& g% B) p/ ~
运行速度的差异是很重要的,不能因为外置flash就让我的高性能芯片效率变低,所以我测试了两种代码运行方式的运行速度进行对比,如下图:. c  F+ g$ g- I  L

% w5 G- P  r* D9 p- p2 T$ z% [
20210601102922170.png
5 l; G, v, R% t4 H0 z7 w
( K4 s& y# Q" i5 e* J" i
​ 左图为QSPI Flash的运行时间,右图为片内flash的运行时间,由此我们可以看出,两种运行方式的速度差距不大。0 L" X0 ?' m5 V* @( z  k
" ~& ?& l5 E4 }- Q' l+ _' d3 w- x
既然一种是外置的一种是内置的,而且外置的QSPI 芯片时钟频率最高才100多M,为什么速度差距不大呢?
, L+ M+ z* F( ~1 o
* D' d# }) O  D# R# W9 p- Z我的分析是:因为我们使用的是H750芯片,这款芯片带了一个一级缓存,由于这个缓存的存在,让两者的速度差距不是那么大。
6 {& l5 t1 N+ }; h$ Y问题三:MDK对应的下载算法怎么写?
8 E3 X/ ?/ |" o0 M首先我们来说一下什么是下载算法:我们在配置keil工程时,会在魔法棒里面的debug选项处选择我们的下载方式(一般为jlink),然后再setting里面我们会选择flash download来add一个选项,这个选项就是下载算法。如下图中②所示,那些选项就是我们要的下载算法。- d4 W; S" q+ U4 M! e% v
; V$ Z8 ^0 v9 \' t5 R, ~: z
2021060110302059.png
6 ?+ Y7 B6 d# A* T  _3 V
2 z* C0 y. L5 p% H& S
下载算法的本质:下载算法其实就是一段加载到sram里面运行的STM32程序,这段程序的作用就是和keil通信,接收keil发过来的数据,然后把它写到对应的flash中。上图①所示就是这段程序的加载地址以及它的大小。因为每款芯片的外设不一样,外挂的flash型号不一样,所以没有一款算法可以兼容所有的芯片,我们得学会根据自己的硬件环境来写对应的下载算法。
7 k) a, V: a8 _+ O: \8 R
; e1 z) ?) ]0 j/ P$ n7 v如何写下载算法:
: \. w8 Z4 t5 [/ ]8 T0 x4 o% l$ t0 B3 ?8 m" h& |5 x
首先我们找到我们的keil安装目录下(比如D\keil5\ARM\Flash\ _Template),这是keil官方给的一个模板工程,我们按照这个模板工程把需要的驱动加入其中。
$ ?( i, _+ F: `5 A# A$ j
& C: G; D$ L+ B/ A如下图所示,我们自己添加一个HARDWARE文件夹,把需要用到的驱动放入工程中。上面三个文件是标准接口文件,不能动。
: @8 [; m% A+ l8 z% Z. ^$ b
6 c, e: L9 {5 l3 a. Y. H
20210601103107860.png
# `# m  z' d7 ~, Q5 e% x4 `
3 t) n' |3 @7 L5 Y
模板工程FlashPrg.c文件接口函数如下图所示,我们只需要在他们给定的函数接口中实现自己的逻辑即可。; l( \: \4 W. r9 d' ~3 [( Q
6 Z! P0 Y7 R( C  a% r
20210601103205494.png
( N$ }! a4 w  |: |' a

" q& R) S* J7 U4 A$ }6 z+ N模板工程FlashDev.c文件接口函数如下图所示,它是给keil进行识别的文件,对照进行修改就行。3 p4 q1 Q6 U( d  g  U" V% X
' P7 e9 ]' [) }8 u/ `, a6 R
20210601103234589.png
) s) }8 p; B* M5 C6 @2 z
2 b+ ~0 @3 s1 o/ I0 ?: J7 O( B
在全部修改完成后,进行编译,会在根目录下生成一个.FLM的文件,这个就是我们上面所选的下载算法,我们把它复制到D\keil5\ARM\Flash目录下,然后我们就可以在keil中选择到我们自己写的下载算法了,如下图所示:$ @/ p  w# s3 D& w! n

' d1 o+ ~8 E/ ~' N, z& @
20210601103307396.png

! `4 h3 ~* t6 y1 A/ g% U( r& t; M* x

: S, v. Q# Q) S3 S( M9 p' r
收藏 评论0 发布时间:2021-12-28 23:00

举报

0个回答

所属标签

相似分享

官网相关资源

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