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

【经验分享】STM32H7的内部Flash和QSPI Flash都运行程序的混合方式(强烈推荐)

[复制链接]
STMCU小助手 发布时间:2021-12-21 22:16
83.1 初学者重要提示
' f' p/ a  ]5 }* }+ @  操作本章配套例子前务必先将QSPI Flash的下载算法放到MDK安装目录。
4 E% p" R# Y$ c% ^% ~7 s  本章节与第28章的时间关键代码在ITCM执行的设置思路是一样的,可以让大家对本章节的方法有个更全面的认识。7 F! w" w% G- g% _- T7 m' X: Z
9 r7 ^  `% ^5 j, Q
83.2 内部Flash和QSPI Flash混合执行程序的优势4 `+ j- z) f7 V" O- B1 |
现在大家使用H750或H743在外置QSPI Flash执行程序,都倾向于制作个BOOT,再制作一个运行在外置QSPI Flash的APP程序。即本教程第82章讲解的内容。
5 u% F% V( J) Y$ r" ~2 ]" ~9 H% [5 |7 k
本章要实现的这种方式对于我们想外置QSPI Flash运行程序,在调试测试阶段更加方便,甚至是项目使用,可以性能最大化。
, j; K9 V. O5 f2 g% M, t( ?6 y: T+ p5 Q7 f" f
83.3 下载算法存放位置% s% X8 O8 x% b8 X& k4 R
编译例子:V7-060_QSPI Flash的MDK下载算法制作,生成的算法文件位于此路径下:
1 ?/ z7 V0 ^: o- G$ ]$ M2 J5 [5 A" \3 g* w& M
4e104a5ffb1a810a2deb37350c125c80.png

* E6 r* d: c0 A$ x5 o& L4 a9 w8 Z9 [
生成算法文件后,需要大家将其存到到MDK安装目录,有两个位置可以存放,任选其一,推荐第2种:
6 ?7 s% F$ _: y) k8 b
4 n0 C. [9 q8 g3 x2 k1 ^! ^; h  第1种:存放到MDK的STM32H7软包安装目录里面:\Keil\STM32H7xx_DFP\2.6.0\CMSIS\Flash(软包版本不同,数值2.6.0不同)。
8 O) M4 l9 i( O3 j  第2种:MDK的安装目录 \ARM\Flash里面。
/ ?1 \0 H9 ?4 H( B% \# D- V5 j
1 Q2 H, y3 ~! X0 w- g. K2 Z7 A- _
408325991a13d158563aafc445666cf1.png

2 g3 S$ o; j* _( E) @, ]0 s
, |) U$ O0 K0 R: M83.4 内部Flash和QSPI Flash混合执行程序说明
: c. g( Y5 e1 |: v1 @1 w& b混合程序的设置注意以下两点即可。
8 C$ R& M, i0 K2 _- J$ n$ k5 x6 m
0 R" w/ i' A8 }' ^! K83.4.1 初始化QSPI Flash并设置内存映射模式/ O' D& _  \) C8 Q' j, E" f
在bsp.c文件中初始在bsp.c文件中初始QSPI Flash并设置为内存映射模式。注意,配置好时钟后,优先初始化QSPI Flash并设置为内存映射模式:8 B7 T* V! ~% w" A# c1 k
$ s2 v! }5 D0 d0 q
  1. /*5 u  i6 ~, B' D" b' x- [
  2. *********************************************************************************************************! J9 I2 N0 H, u5 A
  3. *    函 数 名: bsp_Init
    2 h" c# ^1 ?$ U
  4. *    功能说明: 初始化所有的硬件设备。该函数配置CPU寄存器和外设的寄存器并初始化一些全局变量。只需要调用一次. g# \+ S- @' v; Y" j: y% R# L
  5. *    形    参:无/ H2 |4 W; c- ]6 c6 Z) j
  6. *    返 回 值: 无
    ( G$ G+ @/ g/ c) v* x& L# R% p
  7. *********************************************************************************************************
    - N, T! S/ X# N: b! ?+ @" c
  8. */4 ^1 N+ A& s5 D# w4 S2 K
  9. void bsp_Init(void)! L) c) r. S( A5 L, C% y
  10. {2 c+ t, |! N. m9 z; X! h
  11.     /* 配置MPU */- z9 o: s! ~( X6 z
  12.     MPU_Config();( ]9 ~, l+ V* s8 f$ }1 {+ L
  13. ) E* D  o0 Q, u* Z/ J( {' A" r- y
  14.     /* 使能L1 Cache */  W3 @* V3 B% o. e' B
  15.     CPU_CACHE_Enable();" ]1 Z6 u  L+ ^& n: R

  16. 4 t6 R8 M3 s9 L) L, \$ _8 ]6 q
  17.     /*
    ! }/ s$ k+ l; M0 D6 m6 f
  18.        STM32H7xx HAL 库初始化,此时系统用的还是H7自带的64MHz,HSI时钟:
    : {6 I: [4 d) a+ a
  19.        - 调用函数HAL_InitTick,初始化滴答时钟中断1ms。5 o( M; t4 Z  C* T* M) M) p4 h
  20.        - 设置NVIV优先级分组为4。& I! l: ]* P% U+ z+ Z  w5 P
  21.      */8 ?# ~1 ]6 @) v3 h
  22.     HAL_Init();2 G' s2 z1 }. {2 n  i' v

  23. 0 [* l  N! D3 K2 v
  24.     /*
    0 Z) J: t: T- s9 X! e. r- o
  25.        配置系统时钟到400MHz
    3 I+ B( k% q8 i1 a9 U' e9 n
  26.        - 切换使用HSE。
    " A1 a+ r2 Y4 Q9 r4 U' ]0 a
  27.        - 此函数会更新全局变量SystemCoreClock,并重新配置HAL_InitTick。8 @% t0 ]* a3 t/ Q
  28.     */
      z& y+ ?0 `" C
  29.     SystemClock_Config();
    ) ?) J6 d1 e0 u; r5 ]
  30. 5 s. ?3 e) V* G# I1 ~% N
  31.     /* ; t2 @: M# t" i, k6 r) @$ `8 k+ F
  32.        Event Recorder:0 L  Y1 e1 ~0 j, R6 N  z
  33.        - 可用于代码执行时间测量,MDK5.25及其以上版本才支持,IAR不支持。
    1 ?: J& n9 ]9 f' X. K1 g9 J: ]
  34.        - 默认不开启,如果要使能此选项,务必看V7开发板用户手册第8章
    $ n( r& c& x$ s
  35.     */    1 N8 j2 ]8 o% ], `4 a- Q
  36. #if Enable_EventRecorder == 1  4 Z6 K! i8 X' J
  37.     /* 初始化EventRecorder并开启 */1 z# ~' }+ ~7 ~0 ?# p* _
  38.     EventRecorderInitialize(EventRecordAll, 1U);. \5 m6 C& ?( M. _! {" J2 e1 p
  39.     EventRecorderStart();
    $ s2 o8 ^5 o4 u1 |+ l; ?8 s/ c
  40. #endif
    : v$ O4 v. P9 q: W  H: @. _
  41. ) [" ]6 r: u9 M# L# N. ~
  42.     /* 针对不同的应用程序,添加需要的底层驱动模块初始化函数 */9 k& M, T1 [( K* X! ]: q5 D9 b- Y) `
  43.     bsp_InitQSPI_W25Q256();  /* 配置SPI总线 */   
    6 N" D  g% K: x6 _
  44.      QSPI_MemoryMapped();
    4 H; ~: G$ m3 x4 \

  45. & X# i' J  K. {* t; z" v
  46. bsp_InitDWT();      /* 初始化DWT时钟周期计数器 */       " |; G2 z$ H, F
  47.     bsp_InitKey();        /* 按键初始化,要放在滴答定时器之前,因为按钮检测是通过滴答定时器扫描 */: r$ Y( ~' T& g2 x( c: h1 F
  48.     bsp_InitTimer();      /* 初始化滴答定时器 */
    ; `/ L  c, x2 D* [4 b
  49.     bsp_InitUart();        /* 初始化串口 */
    4 c  g6 f$ R/ s+ `! n
  50.     bsp_InitExtIO();    /* 初始化FMC总线74HC574扩展IO. 必须在 bsp_InitLed()前执行 */   
    ' S. r  c- d; a# L: t4 t
  51.     bsp_InitLed();        /* 初始化LED */    8 ?# X; u7 K4 W" I- j
  52.     bsp_InitExtSDRAM(); /* 初始化SDRAM */0 M% `8 {) s! V/ w) K/ D/ B! K
  53. % E( W: f) G0 T0 Z; z
  54.     bsp_InitI2C();        /* 初始化I2C总线 */$ `, H! @0 ~( b5 X
  55.     TOUCH_InitHard();   /* 初始化触摸芯片,LCD面板型号的检查也在此函数,所以要在函数LCD_InitHard前调用 */
    0 e7 c$ D6 B( d. c
  56.     LCD_InitHard();     /* 初始化LCD */& L- b' m' M: e6 `5 o0 l
  57. }
复制代码

4 S0 x7 Q- U$ S7 \9 H83.4.2 设置运行在内部Flash和QSPI Flash的程序
6 Z* e, ]* e, I: N  e; d$ W
由于我们要把QSPI Flash初始化并设置为内存映射模式后才可以使用QSPI Flash运行程序,所以要在QSPI Flash运行程序之前的所有操作都在内部Flash里面实现,主要是滴答定时器,RCC,QSPI和HAL库等相关配置。其它所有程序都可以在外部QSPI Flash执行:3 ?; F: ?) d7 n/ V1 x" G% ~
) b. _' V" T$ x+ g% |8 E' P
5afe81e1cd5b95f9c13119726de64582.png
4 c7 q' s7 X! \
' E. m( J( W9 _9 k% J( Y
83.5 内部Flash和QSPI Flash程序调试下载配置
. j/ V/ Z2 b5 a4 K将下面两个地方配置后,就可以像使用内部Flash一样使用QSPI Flash进行调试了。并且这种方式可以方便的调试程序,内部Flash和外部Flash都做调试。/ M! S+ y5 N$ Z$ y! H; x: W
& o% k5 t" ~1 u  O
83.5.1 下载配置5 z, b% k# A* K& Y" X3 O
注意这里一定要够大,否则会提示算法文件无法加载:
/ a+ x9 B2 @; n2 @
2 p2 m$ y$ c' i1 v
6baa86337ba5b6fb5a805d2f1d1b18a2.png
. j- d# v5 T0 \$ u+ O
% X" p" k  [# d* N: ~5 {- c7 o5 _
我们这里是将其加到DTCM中,即首地址为0x20000000,大家也可以存储到任意其它RAM地址,只要空间还够加载算法文件即可。推荐使用AXI SRAM(地址0x24000000),因为这块RAM空间足够大。
- V& @* |9 t( A, Z( b3 V! {
2 U) T  H8 G. K/ e如果要下载程序到内部Flash和外部QSPI Flash里面,需要做如下配置,两个下载算法都要添加进来:. k% y7 T% \$ \7 h. M
1 E- z* c7 O) R
9c03364b94f34e5f8e8b1e9b708430a6.png
3 E4 q2 j) x! Z' b* G) b0 j) m
/ W% s- f9 e3 O* m8 n
83.5.2 调试配置
+ C- Y4 T% B+ B注意这里一定要够大,否则会提示算法文件无法加载:$ u- P. e$ ~9 X
3 H6 v( Z. o* e& g% \

* e% D. O; Z$ X+ V3 u+ n0 S9 L* `. `5 U
我们这里是将其加到DTCM中,即首地址为0x20000000,大家也可以存储到任意其它RAM地址,只要空间还够加载算法文件即可。. O% N- w) t. }) k+ q. ]: b

5 d5 |' N* w1 d. m* R如果要做调试下载,需要做如下配置:; X; Q+ M, T' }0 @, k9 A
* s( [# b8 B8 |! ]1 j# O7 ?5 e
93ce012aea4a1b38d8cd796b00fd7e32.png

3 a8 `) k4 I2 ]! C8 i. \9 i, `  w
83.5.3 程序调试效果8 }% d2 N# V. P) _8 \
调试效果如下:
5 Y# n0 C. g- y8 B" L, i' A: c3 L3 J* b
48019aea182ba08be716467429994567.png

- ^) E' K: [/ J2 W
: v$ r  x  t' _, F83.6 实验例程说明
* {  Q- C6 p7 q1 c2 x" t本章节配套例子:V7-064_内部Flash和QSPI Flash都运行程序的混合方式,无需单独制作BOOT和APP(强烈推荐), T' Y& ^; b$ u& |) u: u

* N# G: y" `1 o) `
1beb9dad80a6c5a7a1e6927282b23199.png
& r6 V, d# O9 J, y- Y9 E

3 z" Y6 R1 T- P9 a! N编译此程序弹出的警告不用管,可以选择屏蔽此警告:5 o5 F+ f9 H8 b% S$ b

0 u; D7 h7 M. h! c0 L9 a0 F
- _) T7 Y2 w3 s) l# m6 w3 t7 w6 _, R6 c# W
83.7 总结+ R0 x" ?; \. m: [
本章节就为大家讲解这么,为了熟练掌握,大家可以尝试自己实现一个内部Flash和外部Flash混合运行的程序。. q+ U6 y9 _" t3 R6 ?
6 [# z5 c$ m5 r' U: R, x' I
' f; H) w7 h: T8 `  [# e1 q
( M" w0 d: v% Y' e2 U, t% V
36e580d9d9e79756632fcf47c0fa92cb.png
赞 收藏 评论0 发布时间:2021-12-21 22:16

举报

0个回答

所属标签

相似技术帖

官网相关资源

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