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

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

[复制链接]
STMCU小助手 发布时间:2021-12-21 22:16
83.1 初学者重要提示, M' U7 Z, J1 e9 G  z) `& {. j$ i6 l
  操作本章配套例子前务必先将QSPI Flash的下载算法放到MDK安装目录。
$ n! P* x: u, L* u2 R  本章节与第28章的时间关键代码在ITCM执行的设置思路是一样的,可以让大家对本章节的方法有个更全面的认识。
) J! N/ N6 X4 m7 z) H3 [1 G; s, P: s9 W7 x% D, R
83.2 内部Flash和QSPI Flash混合执行程序的优势5 _7 ]7 u" ^' H+ Z
现在大家使用H750或H743在外置QSPI Flash执行程序,都倾向于制作个BOOT,再制作一个运行在外置QSPI Flash的APP程序。即本教程第82章讲解的内容。
/ h2 q# n( F( g3 |) ^7 G: i
. @" L- |3 M( y: b4 Z, t: O6 _* W本章要实现的这种方式对于我们想外置QSPI Flash运行程序,在调试测试阶段更加方便,甚至是项目使用,可以性能最大化。
  l+ }6 A$ J2 P7 W1 ]  ]6 x" _1 @8 S) \* s
83.3 下载算法存放位置
% y& R0 z1 D9 }7 p' f编译例子:V7-060_QSPI Flash的MDK下载算法制作,生成的算法文件位于此路径下:
3 W1 a2 {8 y/ W  M
2 e# c8 G, |7 i' g# C1 @7 o- L
4e104a5ffb1a810a2deb37350c125c80.png

9 k# [1 P3 I1 S
: q6 h& Y* o. p, P* r  p生成算法文件后,需要大家将其存到到MDK安装目录,有两个位置可以存放,任选其一,推荐第2种:
- q# l; Q$ |9 j& Y5 O8 P" T8 I: X  T6 I; o
  第1种:存放到MDK的STM32H7软包安装目录里面:\Keil\STM32H7xx_DFP\2.6.0\CMSIS\Flash(软包版本不同,数值2.6.0不同)。
. m$ y; }0 n5 g; P* D  第2种:MDK的安装目录 \ARM\Flash里面。2 D8 N+ _) y1 R' }- n0 U+ o
  I  x: h7 V3 P2 ]7 ]6 Z
408325991a13d158563aafc445666cf1.png
' T1 {- c4 W0 F# ^
, U7 m* {  H$ `- s
83.4 内部Flash和QSPI Flash混合执行程序说明
2 o5 c( _' `2 r: a/ T, O混合程序的设置注意以下两点即可。
8 s) ^+ o) q* b! D6 m  V
1 V+ U  V2 n/ _3 L2 E. n6 N/ ~83.4.1 初始化QSPI Flash并设置内存映射模式
4 E, X! Z) [8 D( e! L1 o* o" u0 z/ l# |在bsp.c文件中初始在bsp.c文件中初始QSPI Flash并设置为内存映射模式。注意,配置好时钟后,优先初始化QSPI Flash并设置为内存映射模式:, A. h! [* ?9 c' X4 m4 C: d
0 _; U' z! S; _8 a
  1. /*7 ?# H# h" o4 {/ ?) S) D6 O
  2. *********************************************************************************************************5 G1 i4 R" m* }- H9 a+ y
  3. *    函 数 名: bsp_Init" V& |% |0 ?. W" e
  4. *    功能说明: 初始化所有的硬件设备。该函数配置CPU寄存器和外设的寄存器并初始化一些全局变量。只需要调用一次
    ; O6 ?! e7 i; g$ Q
  5. *    形    参:无
    7 e5 s1 Y# \( B' B# J
  6. *    返 回 值: 无
    % V: T4 N2 c0 p0 f1 c9 T  Z. o
  7. *********************************************************************************************************& ?8 Z" k2 x. b7 K5 Y
  8. */5 G/ R4 q# Z# I
  9. void bsp_Init(void)# U3 k6 _2 H- `, a: D6 q
  10. {
    7 v! k: M9 I- \6 m) o
  11.     /* 配置MPU */
    9 L' v# w5 P+ a
  12.     MPU_Config();
    4 k; ?1 F6 C! m- a) h$ R8 f
  13. ( N$ Z7 L" X( i) C) M1 m8 M
  14.     /* 使能L1 Cache */0 @( E" f) D5 G
  15.     CPU_CACHE_Enable();
    ' e- q. d$ H2 I" s9 `

  16. . q' Q# ]" z% G& E3 @
  17.     /*
    2 R3 Z" r6 o2 _, L
  18.        STM32H7xx HAL 库初始化,此时系统用的还是H7自带的64MHz,HSI时钟:
    ) Y/ I! P+ R  z" P' U9 t0 W
  19.        - 调用函数HAL_InitTick,初始化滴答时钟中断1ms。% P! i" U1 T8 X1 `2 [! N3 o9 g0 B6 e
  20.        - 设置NVIV优先级分组为4。
    " J$ p& {+ ?# L7 J3 t
  21.      */
    4 b% G, S, p4 p& @! J( N
  22.     HAL_Init();
    2 T' j8 X" A2 C  \7 T7 Z8 {
  23. % ~$ J5 H+ V- V
  24.     /*
    , a/ j* ]  g# m& o/ Y
  25.        配置系统时钟到400MHz* R" W2 z1 _, Y; w
  26.        - 切换使用HSE。- @  Y4 o7 O" w0 C  x
  27.        - 此函数会更新全局变量SystemCoreClock,并重新配置HAL_InitTick。$ O+ l+ _# }" t5 V
  28.     */
    0 q" i7 e$ g) d4 K
  29.     SystemClock_Config();7 g& D" h- U5 ]9 H- ^

  30. - H1 A& M, j) [+ `
  31.     /*
    4 J2 p% Z9 v  e/ k1 W
  32.        Event Recorder:
    8 g' ]7 q9 D! H7 t! [
  33.        - 可用于代码执行时间测量,MDK5.25及其以上版本才支持,IAR不支持。/ a- G. c4 m5 `5 y1 `
  34.        - 默认不开启,如果要使能此选项,务必看V7开发板用户手册第8章/ P# M" B3 R3 O; j
  35.     */   
    " V# H3 |% j7 u! L
  36. #if Enable_EventRecorder == 1  
    $ P5 P; l1 T. v6 u
  37.     /* 初始化EventRecorder并开启 */- F* q: N! {" z' u+ @$ j) w
  38.     EventRecorderInitialize(EventRecordAll, 1U);
    . v6 Q1 I/ q( F: X( h
  39.     EventRecorderStart();
    : v, X5 H2 U. t4 M9 `8 {
  40. #endif4 y$ Y* q2 N! ]8 l" c" {8 J

  41. 8 f0 \' t( }6 @  p9 h
  42.     /* 针对不同的应用程序,添加需要的底层驱动模块初始化函数 */
    ) o3 Q) G; c5 S: s# Q6 L9 J
  43.     bsp_InitQSPI_W25Q256();  /* 配置SPI总线 */   % G8 \5 M+ _6 W6 H3 b1 u
  44.      QSPI_MemoryMapped();/ B9 A$ q9 P2 i/ c3 F, s
  45. 9 L$ @) r# Z# _4 \, o1 g- o/ I6 r. k
  46. bsp_InitDWT();      /* 初始化DWT时钟周期计数器 */       5 V3 j, Q$ U/ T
  47.     bsp_InitKey();        /* 按键初始化,要放在滴答定时器之前,因为按钮检测是通过滴答定时器扫描 */
    $ S2 N  @+ {* D% ]3 ]) X6 l
  48.     bsp_InitTimer();      /* 初始化滴答定时器 */
    ' D$ c# i" f2 X- a
  49.     bsp_InitUart();        /* 初始化串口 */
    # @( J, C6 Q6 E/ C. c3 C
  50.     bsp_InitExtIO();    /* 初始化FMC总线74HC574扩展IO. 必须在 bsp_InitLed()前执行 */    % i9 B$ i$ p  {' |* Z& y+ c
  51.     bsp_InitLed();        /* 初始化LED */   
    + i$ f8 h1 Z" e: b3 N
  52.     bsp_InitExtSDRAM(); /* 初始化SDRAM */
    8 o6 [- c: l# A- x0 k2 H

  53. ) N4 M( j3 X8 k& C
  54.     bsp_InitI2C();        /* 初始化I2C总线 */- i0 I- Z! r/ p; f* J. ]
  55.     TOUCH_InitHard();   /* 初始化触摸芯片,LCD面板型号的检查也在此函数,所以要在函数LCD_InitHard前调用 */
    ( y# H/ h; r% q1 m7 B; W  m( F
  56.     LCD_InitHard();     /* 初始化LCD *// S; V* H" o, U. {* R! H* z  Q
  57. }
复制代码
" u; p6 i* D7 {) a
83.4.2 设置运行在内部Flash和QSPI Flash的程序
" k1 `3 t7 i; T* f# x6 K. B
由于我们要把QSPI Flash初始化并设置为内存映射模式后才可以使用QSPI Flash运行程序,所以要在QSPI Flash运行程序之前的所有操作都在内部Flash里面实现,主要是滴答定时器,RCC,QSPI和HAL库等相关配置。其它所有程序都可以在外部QSPI Flash执行:- O9 X' c7 f0 |

4 C9 a% q( g: R' `9 [7 p4 j8 r
5afe81e1cd5b95f9c13119726de64582.png

4 l6 a4 A3 f  _+ D: s  G
. _4 |+ {! m& D) T83.5 内部Flash和QSPI Flash程序调试下载配置
! F* q9 M# y6 b' i0 y9 ^将下面两个地方配置后,就可以像使用内部Flash一样使用QSPI Flash进行调试了。并且这种方式可以方便的调试程序,内部Flash和外部Flash都做调试。7 s! n; Z3 k2 n3 g+ L6 @% |

% K2 X; a+ W+ }3 j2 i6 J. i83.5.1 下载配置0 Y# `5 I, L9 w: d8 \( |
注意这里一定要够大,否则会提示算法文件无法加载:
0 ]; m& w0 i7 _; y+ M4 f" d( D
1 d6 Y! A- `  u) T3 s
6baa86337ba5b6fb5a805d2f1d1b18a2.png
  m1 M. R9 h8 }4 B

5 I' A0 O" T& D! p5 n/ m5 C% f我们这里是将其加到DTCM中,即首地址为0x20000000,大家也可以存储到任意其它RAM地址,只要空间还够加载算法文件即可。推荐使用AXI SRAM(地址0x24000000),因为这块RAM空间足够大。
8 D7 L5 {# v' `5 ]
4 X8 E4 t( L6 b9 L1 V! R如果要下载程序到内部Flash和外部QSPI Flash里面,需要做如下配置,两个下载算法都要添加进来:
  m1 M  R$ w; y- M# o4 O# S9 F- H
9c03364b94f34e5f8e8b1e9b708430a6.png

$ p/ f: ^5 |8 I% B0 T8 h) G( H3 [% e) Z7 A
83.5.2 调试配置) J4 x" C$ b, Y, ~
注意这里一定要够大,否则会提示算法文件无法加载:
! k  B) g! @% u2 S% T5 Z9 X5 G0 t9 b$ m( e! j

4 g$ t3 n( a1 p8 o0 f7 d; v$ [" P6 a. ], H  T& V
我们这里是将其加到DTCM中,即首地址为0x20000000,大家也可以存储到任意其它RAM地址,只要空间还够加载算法文件即可。( z- _+ c0 S0 y8 @2 v% h: t

2 X# ^! m: Y  H( D7 y5 Q如果要做调试下载,需要做如下配置:
$ _# G3 j4 Z8 P2 e  f" L5 [+ o# j4 q$ a$ j4 D, v7 S1 ~
93ce012aea4a1b38d8cd796b00fd7e32.png

8 h* {1 j5 ?  @3 t" @' ~4 h
& f3 @; J7 T; ?7 v! M83.5.3 程序调试效果
) i( j7 }$ }/ e# a- d9 T% J0 {" o调试效果如下:
' m7 F! ^  \4 U" m+ l1 ]
/ m( ^- A0 t/ U  v
48019aea182ba08be716467429994567.png
) L2 S) C$ u( |1 u4 H% ^

' ^9 L! w) ^0 q2 j* t2 Y- i& W. k5 u83.6 实验例程说明3 u) R- d, m5 d; B
本章节配套例子:V7-064_内部Flash和QSPI Flash都运行程序的混合方式,无需单独制作BOOT和APP(强烈推荐)- {' c1 `, u8 c+ d5 ^' J, t

" K6 n7 _' x" A/ H
1beb9dad80a6c5a7a1e6927282b23199.png

! ~& K8 l) I8 U7 T2 r7 ]9 V6 i; _$ y- n0 V7 \
编译此程序弹出的警告不用管,可以选择屏蔽此警告:% ]" K! Q! i( T# o9 a4 b
/ v! e. E$ b, w, {7 y

/ X% q8 Z# E0 }. Y$ ?
7 r& b2 m- i. `) Q83.7 总结
2 ]/ Y2 {. }: {  f本章节就为大家讲解这么,为了熟练掌握,大家可以尝试自己实现一个内部Flash和外部Flash混合运行的程序。
1 C2 ~6 |( x( k, v
, u" O. U6 e  [+ @
  h' B' `; m$ R  v$ m: v4 _' j' F, v7 m3 c
36e580d9d9e79756632fcf47c0fa92cb.png
收藏 评论0 发布时间:2021-12-21 22:16

举报

0个回答

所属标签

相似技术帖

官网相关资源

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