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

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

[复制链接]
STMCU小助手 发布时间:2021-12-21 22:16
83.1 初学者重要提示( c5 i. h- z  g, I
  操作本章配套例子前务必先将QSPI Flash的下载算法放到MDK安装目录。# d' ?1 L$ J2 @" b
  本章节与第28章的时间关键代码在ITCM执行的设置思路是一样的,可以让大家对本章节的方法有个更全面的认识。
2 u" F" @6 E& K4 c3 t1 w) e4 o
$ |5 E6 g$ F7 v* C1 h* S, x83.2 内部Flash和QSPI Flash混合执行程序的优势, O* q0 \: x3 g) B3 o
现在大家使用H750或H743在外置QSPI Flash执行程序,都倾向于制作个BOOT,再制作一个运行在外置QSPI Flash的APP程序。即本教程第82章讲解的内容。
# i0 v2 I  N$ T# G- X/ M
6 _" p- V, J) e6 n; u本章要实现的这种方式对于我们想外置QSPI Flash运行程序,在调试测试阶段更加方便,甚至是项目使用,可以性能最大化。, c9 ]5 }& C  c2 ^3 H" R
0 b2 |& a2 s  v; A4 W5 ]9 b$ R6 u2 ]
83.3 下载算法存放位置9 a7 ]( f: |1 O* x" j
编译例子:V7-060_QSPI Flash的MDK下载算法制作,生成的算法文件位于此路径下:
0 m  g% e, J2 t0 V# K9 E7 v3 ~! N) A5 C! Z$ A
4e104a5ffb1a810a2deb37350c125c80.png
2 h7 |2 g! }7 d

: g8 r. j- R% m2 ?, a- Y生成算法文件后,需要大家将其存到到MDK安装目录,有两个位置可以存放,任选其一,推荐第2种:
! z! M2 D- O* h
5 V; F' T( z. \8 k0 k! t% W  第1种:存放到MDK的STM32H7软包安装目录里面:\Keil\STM32H7xx_DFP\2.6.0\CMSIS\Flash(软包版本不同,数值2.6.0不同)。
4 C( a% d+ Q- w, L8 u  第2种:MDK的安装目录 \ARM\Flash里面。
) D% Y2 K4 T5 z& C
, Q0 Z! O/ F6 Z( K8 g
408325991a13d158563aafc445666cf1.png
8 I& o5 J9 s' l8 H; W
' L3 [4 v7 K5 M% B9 y
83.4 内部Flash和QSPI Flash混合执行程序说明
( Z! \6 |! `  n混合程序的设置注意以下两点即可。
7 z) a6 a' ]; T6 K0 q
+ t5 Y' x: [; o3 a! m8 P2 x! p83.4.1 初始化QSPI Flash并设置内存映射模式
1 M/ |  J5 X# ~! s$ S+ {: N在bsp.c文件中初始在bsp.c文件中初始QSPI Flash并设置为内存映射模式。注意,配置好时钟后,优先初始化QSPI Flash并设置为内存映射模式:; l9 B. v! Y; A( X: D
) {6 A7 K$ b0 d  }
  1. /*
    # O2 ^9 f% q& C& c
  2. *********************************************************************************************************
    ' ~% Q5 S1 S$ T0 m" X1 e
  3. *    函 数 名: bsp_Init
    ' @+ s% w7 M' U  g- Z
  4. *    功能说明: 初始化所有的硬件设备。该函数配置CPU寄存器和外设的寄存器并初始化一些全局变量。只需要调用一次# p* @$ q1 |5 r
  5. *    形    参:无
    9 w# r9 J2 V5 Y  F" C* s
  6. *    返 回 值: 无7 T. Y" P) \  Q6 C+ F
  7. *********************************************************************************************************
    / g9 g6 x+ n1 `4 m
  8. */
    7 p$ o' A* b* {0 K
  9. void bsp_Init(void), t$ \0 Y8 P6 u% G0 s, n2 E
  10. {
    7 U! s, V0 W! V) z* d1 F3 S/ H
  11.     /* 配置MPU */
    ' a- [; n6 R. a/ _
  12.     MPU_Config();
    " Y6 \: U6 d8 s3 F

  13. % l: U6 T; D- a: s$ [  q
  14.     /* 使能L1 Cache */$ o) N6 f2 X  @/ q
  15.     CPU_CACHE_Enable();  D, R( d) Y9 |

  16. 4 B# Z# f: J3 p$ g2 W+ ?2 G
  17.     /*
    * M/ t# g) r3 O% q
  18.        STM32H7xx HAL 库初始化,此时系统用的还是H7自带的64MHz,HSI时钟:
    / I4 u8 Q$ z9 X. |- J0 c( k
  19.        - 调用函数HAL_InitTick,初始化滴答时钟中断1ms。
    ; J4 r3 Q1 x0 ~1 }6 f+ ~# `: ^; @
  20.        - 设置NVIV优先级分组为4。9 \. U) [, E+ |3 Y! V
  21.      */
    & D, G: f9 Q' Y: k# |
  22.     HAL_Init();0 d' C- c& R  u* F  q

  23. 8 Q4 W8 j# \: b' ~+ T
  24.     /*
    . S7 R/ D. q$ S! m8 j& [
  25.        配置系统时钟到400MHz5 U2 A  O/ \5 U6 a, C5 _8 f
  26.        - 切换使用HSE。: M- m( i# y- P( U' s" j6 w+ S3 y6 T
  27.        - 此函数会更新全局变量SystemCoreClock,并重新配置HAL_InitTick。4 v% s+ z1 G! M( J, \
  28.     */( U3 Q+ r! O9 a, R2 S% q) E8 @+ A
  29.     SystemClock_Config();
    ! w. C) v: W9 c. q% B5 |$ n

  30. $ `6 j' N7 a" e+ \/ k3 W$ f
  31.     /*
    3 u. C4 z- X( u, K. G! `% w
  32.        Event Recorder:& S+ W  w- B" X  u# s
  33.        - 可用于代码执行时间测量,MDK5.25及其以上版本才支持,IAR不支持。
    ' o$ O0 J9 J: ]$ j# C- w
  34.        - 默认不开启,如果要使能此选项,务必看V7开发板用户手册第8章
    ( @; i- Q3 |4 |2 w& H+ h
  35.     */   
    # A2 n; x! t5 B& t
  36. #if Enable_EventRecorder == 1  ' o& i( n% X$ _% l. @
  37.     /* 初始化EventRecorder并开启 */
    1 I  v- B' _0 d7 L0 {. E2 [- C
  38.     EventRecorderInitialize(EventRecordAll, 1U);& k/ N- u9 O$ C1 A2 P
  39.     EventRecorderStart();% G6 J' l% G3 a! e! J% I4 Y- j- P
  40. #endif
    4 I. Y. \7 C. X
  41. - `; A: g1 z+ D
  42.     /* 针对不同的应用程序,添加需要的底层驱动模块初始化函数 */
    0 Y: W. H6 n8 q4 p+ f
  43.     bsp_InitQSPI_W25Q256();  /* 配置SPI总线 */   4 N! S. y% M5 y+ c
  44.      QSPI_MemoryMapped();/ |& Z# i: r/ m6 T* L  O
  45. # U; g% I; ?% `0 p( P" _3 u2 ~
  46. bsp_InitDWT();      /* 初始化DWT时钟周期计数器 */      
      H3 b7 K# x# t9 p' A3 G) k
  47.     bsp_InitKey();        /* 按键初始化,要放在滴答定时器之前,因为按钮检测是通过滴答定时器扫描 */  X* Z. w: i  }9 I, w6 E
  48.     bsp_InitTimer();      /* 初始化滴答定时器 */
    4 y9 P$ R" M' f* A1 p, |
  49.     bsp_InitUart();        /* 初始化串口 *// V* L+ p8 J% w8 z- o
  50.     bsp_InitExtIO();    /* 初始化FMC总线74HC574扩展IO. 必须在 bsp_InitLed()前执行 */   
    6 f! z/ r" J' y& Z3 F, s$ Y* I
  51.     bsp_InitLed();        /* 初始化LED */   
    1 h, Y; t3 Q" r/ e5 Y; `4 T
  52.     bsp_InitExtSDRAM(); /* 初始化SDRAM */
    " Q! j; X5 r5 U6 C/ K

  53. & P2 u: a  M: Y0 w
  54.     bsp_InitI2C();        /* 初始化I2C总线 */
    ( m" Q# ^) O2 b# t0 [+ c" J
  55.     TOUCH_InitHard();   /* 初始化触摸芯片,LCD面板型号的检查也在此函数,所以要在函数LCD_InitHard前调用 */
    + g9 V+ h7 l: i- ]9 N$ e
  56.     LCD_InitHard();     /* 初始化LCD */
    : H' ], v# E$ q
  57. }
复制代码

) q! I  b' ]- p# t) E( V83.4.2 设置运行在内部Flash和QSPI Flash的程序

# k. `0 S+ |3 l! R8 u由于我们要把QSPI Flash初始化并设置为内存映射模式后才可以使用QSPI Flash运行程序,所以要在QSPI Flash运行程序之前的所有操作都在内部Flash里面实现,主要是滴答定时器,RCC,QSPI和HAL库等相关配置。其它所有程序都可以在外部QSPI Flash执行:
, C/ H# x' x/ E
5 Y! n# P# ~: I" y9 S( J- n& g
5afe81e1cd5b95f9c13119726de64582.png
2 S  p4 ^" f) x2 R$ ]% n* L

: B4 P8 U6 n3 [- B83.5 内部Flash和QSPI Flash程序调试下载配置4 x( P: c( P1 @, w
将下面两个地方配置后,就可以像使用内部Flash一样使用QSPI Flash进行调试了。并且这种方式可以方便的调试程序,内部Flash和外部Flash都做调试。; G' c+ A' @1 [6 e; g

& Y; P0 t( s6 ?9 h9 S83.5.1 下载配置
! i! N( @. |' R0 N% O注意这里一定要够大,否则会提示算法文件无法加载:' I# _, e* p2 N: g' n8 f

% N) V5 E1 t- w8 X8 p( L
6baa86337ba5b6fb5a805d2f1d1b18a2.png

4 @3 p! {6 m( y% x
" S6 j8 R1 p. ?: b# Z: ^1 `5 s我们这里是将其加到DTCM中,即首地址为0x20000000,大家也可以存储到任意其它RAM地址,只要空间还够加载算法文件即可。推荐使用AXI SRAM(地址0x24000000),因为这块RAM空间足够大。
  A( t4 b; l/ ], I4 T% S6 ^0 y. O0 ^; L. c. g5 U8 K
如果要下载程序到内部Flash和外部QSPI Flash里面,需要做如下配置,两个下载算法都要添加进来:
! M( \3 m( K) _" W' i* j  N8 Q; g1 D* ~% M: W% b& m
9c03364b94f34e5f8e8b1e9b708430a6.png

- {8 ]& A' H9 ?
! K0 ?1 B1 C) u+ [83.5.2 调试配置* r4 `+ r# @+ M: }& s. p$ V
注意这里一定要够大,否则会提示算法文件无法加载:
4 v" T: a( D! Z2 i; |) z1 _
+ u' x; h3 d7 t) i, X
5 X% t! n1 f; \1 b# \5 P

' X. ~$ A$ H) z! G# p& @我们这里是将其加到DTCM中,即首地址为0x20000000,大家也可以存储到任意其它RAM地址,只要空间还够加载算法文件即可。
4 p  c9 y+ g# E
' C) z5 F' [5 E$ I( [& P2 K! L如果要做调试下载,需要做如下配置:
# K8 G# Z4 [0 K: `" E) x! G4 J1 Q3 R! h! W
93ce012aea4a1b38d8cd796b00fd7e32.png

) [, v7 M% L" T! ~7 u2 i* }2 ?4 N% M$ j0 N/ t7 j' j
83.5.3 程序调试效果
' O# x$ {" [, f/ w: j  {. V* \调试效果如下:8 [6 V# k4 E1 A

/ c. q4 ~- U  g. S% _/ z" F
48019aea182ba08be716467429994567.png
- }0 N! ]# A4 X' D0 C7 ?
. N1 T5 M3 o) v8 E% p
83.6 实验例程说明' ]" O: h* Q0 f
本章节配套例子:V7-064_内部Flash和QSPI Flash都运行程序的混合方式,无需单独制作BOOT和APP(强烈推荐)- U' Y1 w! h& m: F1 X* R

! E9 Y; c# t' e4 C: ~* Y
1beb9dad80a6c5a7a1e6927282b23199.png

& X$ d; w/ j  E5 k& s( l2 q7 m6 g5 y, l3 J# G
编译此程序弹出的警告不用管,可以选择屏蔽此警告:
0 Z& i3 f' h8 t/ O( P+ V
8 Z/ Q/ Z5 |9 }0 H1 X% z/ R* ?
  ?. [( h8 K! i& d$ f7 X5 _( s) a/ ?7 l; z  ^% [
83.7 总结
1 ?+ u) F! n" `5 m& f) s0 V本章节就为大家讲解这么,为了熟练掌握,大家可以尝试自己实现一个内部Flash和外部Flash混合运行的程序。: c6 @9 e% n/ \9 o
; s+ l/ R: i7 B! l; v( x6 N

9 _7 p7 K2 U) Z  k9 w5 W$ |: L6 @
  |0 s  ~1 f/ N+ S( K0 l3 `+ X( w! w
36e580d9d9e79756632fcf47c0fa92cb.png
收藏 评论0 发布时间:2021-12-21 22:16

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版