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

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

[复制链接]
STMCU小助手 发布时间:2021-12-21 22:16
83.1 初学者重要提示
9 [. z! Z2 _  t2 s, U/ T  操作本章配套例子前务必先将QSPI Flash的下载算法放到MDK安装目录。* i* h0 o( W0 r% m( d- M3 L
  本章节与第28章的时间关键代码在ITCM执行的设置思路是一样的,可以让大家对本章节的方法有个更全面的认识。! }" v% ~) ?9 B/ |, Z
0 k/ }3 R* w! W
83.2 内部Flash和QSPI Flash混合执行程序的优势
% y9 Q  f$ o+ c9 u' M: T- ^* S现在大家使用H750或H743在外置QSPI Flash执行程序,都倾向于制作个BOOT,再制作一个运行在外置QSPI Flash的APP程序。即本教程第82章讲解的内容。
; J! L5 e: C: L3 |1 s7 G& `; O/ N! Y' W' A6 [$ n1 N: \9 g
本章要实现的这种方式对于我们想外置QSPI Flash运行程序,在调试测试阶段更加方便,甚至是项目使用,可以性能最大化。/ t' k) s  b+ n5 }

5 G5 N( p9 U  X+ i83.3 下载算法存放位置( w6 T8 H. N: Z0 U! M
编译例子:V7-060_QSPI Flash的MDK下载算法制作,生成的算法文件位于此路径下:
) N0 y8 _, E4 I% h5 S4 d# q+ c
. ^- M+ s! _7 q, g! d# ?) [
4e104a5ffb1a810a2deb37350c125c80.png
) T3 [6 g+ c& {
- h& E$ ]: n5 K
生成算法文件后,需要大家将其存到到MDK安装目录,有两个位置可以存放,任选其一,推荐第2种:' e' p# z! N* G

/ V6 r5 J& L4 o/ P  第1种:存放到MDK的STM32H7软包安装目录里面:\Keil\STM32H7xx_DFP\2.6.0\CMSIS\Flash(软包版本不同,数值2.6.0不同)。
0 ?3 R1 j5 G: A2 B# h6 v5 e  第2种:MDK的安装目录 \ARM\Flash里面。
. {' N3 v6 i6 \. a6 m* Q( P) X% S! O. A* |- ~
408325991a13d158563aafc445666cf1.png
" o. |3 \* I3 P$ ]( b0 U

$ @. }. J( f6 o1 ]83.4 内部Flash和QSPI Flash混合执行程序说明
0 P( }* ?0 }' i/ h6 y# g混合程序的设置注意以下两点即可。
6 u, D0 a& Q% L. o3 }; A
' x  K  S" _- `$ v5 o' Z83.4.1 初始化QSPI Flash并设置内存映射模式
% V& [4 c6 K. j* v, B. c  _+ c1 f8 }在bsp.c文件中初始在bsp.c文件中初始QSPI Flash并设置为内存映射模式。注意,配置好时钟后,优先初始化QSPI Flash并设置为内存映射模式:
( ~  [: P5 d: i5 q4 N+ H$ p0 @4 y! |3 I
  1. /*" @  z' a3 h/ J0 ^, Y
  2. *********************************************************************************************************
    ' I5 O9 o! \) h8 f' B2 f
  3. *    函 数 名: bsp_Init
    9 L9 G% L# R5 V9 S
  4. *    功能说明: 初始化所有的硬件设备。该函数配置CPU寄存器和外设的寄存器并初始化一些全局变量。只需要调用一次) o% V1 _, p; c+ ]: }8 U
  5. *    形    参:无
    - L  c( f( r  ^  I+ [% d8 R
  6. *    返 回 值: 无) E  N. w/ m; X' E; n. u
  7. *********************************************************************************************************
    8 Y: n' n- v1 `+ ]$ d# y
  8. */
    # ?$ C) P8 t9 _7 I5 F5 y) `
  9. void bsp_Init(void)7 e# y. s4 F5 R% g, y# n9 D3 t
  10. {
    : `# F1 {' Q+ [8 b! O5 b! m
  11.     /* 配置MPU */' O: j. r, w' {% e
  12.     MPU_Config();2 J- R+ V6 p: h& Y6 F
  13. 7 h0 p; o: X) ^5 I7 @
  14.     /* 使能L1 Cache */- V% t: P3 P# u8 P* Q+ M3 m2 l% g
  15.     CPU_CACHE_Enable();5 C# U/ S& |$ o$ F6 X
  16.   r, d3 o+ O" I* [$ i! b6 L
  17.     /*
      W9 N0 X) B. e5 Z
  18.        STM32H7xx HAL 库初始化,此时系统用的还是H7自带的64MHz,HSI时钟:
    9 K6 _0 D( L6 C; |
  19.        - 调用函数HAL_InitTick,初始化滴答时钟中断1ms。
    $ ?6 v! `; z- X* C: s  W
  20.        - 设置NVIV优先级分组为4。
    ; c, U4 a$ p9 J  m  i
  21.      */
    0 l9 B, M2 }( g( K- Z: E* d/ f
  22.     HAL_Init();3 e" c  {, z+ K& ^5 P
  23. - W  G5 _* j  m# c4 T
  24.     /*
    1 @# _1 K  h" T/ K5 f* R. U
  25.        配置系统时钟到400MHz
    6 B6 ~$ S, i- }: \) L
  26.        - 切换使用HSE。1 j- N- B3 l( N9 [4 C1 S8 J
  27.        - 此函数会更新全局变量SystemCoreClock,并重新配置HAL_InitTick。- s% @) S$ A. G2 m( P; O9 ^
  28.     */, G* @7 J9 j% I& L
  29.     SystemClock_Config();
    # H9 ~2 E" a2 J0 b% j- [

  30. 0 F; w7 j  x0 Q! E8 }' p& t' @
  31.     /* 6 d0 |3 T$ A0 O) z. i0 I% ^2 v, {
  32.        Event Recorder:
    6 m  \& ]0 _6 i3 p- X& [
  33.        - 可用于代码执行时间测量,MDK5.25及其以上版本才支持,IAR不支持。
      N% F1 y; C5 g1 D5 K
  34.        - 默认不开启,如果要使能此选项,务必看V7开发板用户手册第8章
    $ [* D' D3 Y! k2 b+ e8 B- O
  35.     */    4 x  C; i  s& Y2 j- V$ E
  36. #if Enable_EventRecorder == 1  
    ; x9 @! g5 O( P+ W# ~
  37.     /* 初始化EventRecorder并开启 */- ^& u- D/ K* |9 Y
  38.     EventRecorderInitialize(EventRecordAll, 1U);
    $ n! b( e) W" h+ l
  39.     EventRecorderStart();
    7 H3 ]% }3 l( F' C  u: Z
  40. #endif
    5 w% q' b, ?! c* K0 W+ {6 s3 H

  41. 4 y: \3 i* X  o
  42.     /* 针对不同的应用程序,添加需要的底层驱动模块初始化函数 */
    7 H/ p, ~, i+ @% ~1 u; t
  43.     bsp_InitQSPI_W25Q256();  /* 配置SPI总线 */   . ^- t3 I% N! {! k) t. Q4 t4 u
  44.      QSPI_MemoryMapped();
    8 z. R6 P) W4 X8 G" y2 O
  45. * \9 i4 b$ r0 {7 q( s$ ^
  46. bsp_InitDWT();      /* 初始化DWT时钟周期计数器 */       3 ~- M5 U' F3 G. \
  47.     bsp_InitKey();        /* 按键初始化,要放在滴答定时器之前,因为按钮检测是通过滴答定时器扫描 */
    7 l' x% a+ @2 I  J8 t
  48.     bsp_InitTimer();      /* 初始化滴答定时器 */
    4 `- V& y4 x0 s( U4 v( A2 J. C
  49.     bsp_InitUart();        /* 初始化串口 */
    6 e4 v1 m1 [# ~% g& k. n
  50.     bsp_InitExtIO();    /* 初始化FMC总线74HC574扩展IO. 必须在 bsp_InitLed()前执行 */   
    : X9 Y+ L. m2 d+ w# P
  51.     bsp_InitLed();        /* 初始化LED */   
    4 t! Q9 v( V, P; |
  52.     bsp_InitExtSDRAM(); /* 初始化SDRAM */
    , i3 F6 N3 D3 Y; s; w/ N
  53. 5 _* B0 ~, R! J4 N
  54.     bsp_InitI2C();        /* 初始化I2C总线 */
    1 a7 Q( `* u2 t0 R6 {6 B: L( N
  55.     TOUCH_InitHard();   /* 初始化触摸芯片,LCD面板型号的检查也在此函数,所以要在函数LCD_InitHard前调用 */
    5 Z$ V- X/ t. V1 V2 n/ q! q
  56.     LCD_InitHard();     /* 初始化LCD */! \* D# @$ Y  K5 Z
  57. }
复制代码
! _/ {$ x4 G( I. R! [
83.4.2 设置运行在内部Flash和QSPI Flash的程序
( c7 X1 m3 R/ }1 j
由于我们要把QSPI Flash初始化并设置为内存映射模式后才可以使用QSPI Flash运行程序,所以要在QSPI Flash运行程序之前的所有操作都在内部Flash里面实现,主要是滴答定时器,RCC,QSPI和HAL库等相关配置。其它所有程序都可以在外部QSPI Flash执行:
9 K7 j- l8 P% b) Q; Q, ^* L) x
& \1 g  B/ w: I; f
5afe81e1cd5b95f9c13119726de64582.png

1 H  M" N2 i- V: j8 O6 q7 f9 s* x$ m/ w
83.5 内部Flash和QSPI Flash程序调试下载配置, A4 p8 G1 G& `
将下面两个地方配置后,就可以像使用内部Flash一样使用QSPI Flash进行调试了。并且这种方式可以方便的调试程序,内部Flash和外部Flash都做调试。8 c, M7 }) q: w" Y

' F1 Y) g; N& A9 b83.5.1 下载配置
4 Q* d' Y" k3 j* j" Y8 i注意这里一定要够大,否则会提示算法文件无法加载:
% _/ r/ G* F7 Z' v/ j; x% L& ]* N  W) h+ z' L( k5 g9 g
6baa86337ba5b6fb5a805d2f1d1b18a2.png
# `* d. t7 E' A
( p3 A: X5 v( z5 @
我们这里是将其加到DTCM中,即首地址为0x20000000,大家也可以存储到任意其它RAM地址,只要空间还够加载算法文件即可。推荐使用AXI SRAM(地址0x24000000),因为这块RAM空间足够大。2 B& g. Q  r: i/ g9 [/ D5 r; P
1 X/ U3 a4 i6 M+ o  u4 z
如果要下载程序到内部Flash和外部QSPI Flash里面,需要做如下配置,两个下载算法都要添加进来:& O' k# Q* _# o0 x+ ~
; o  E/ R- y% x
9c03364b94f34e5f8e8b1e9b708430a6.png
$ a7 e: \* O6 b6 K7 j* A

8 a- g" ~/ \1 u2 O5 ]9 W( j" t83.5.2 调试配置
- s! W& p6 E6 i1 x注意这里一定要够大,否则会提示算法文件无法加载:' z) Z- u' c" M) x
! Q& V7 P* l* S, U6 V- T
$ F/ J4 J+ Y. M8 i, I. s

4 U( q# L5 q: I. g3 |3 o我们这里是将其加到DTCM中,即首地址为0x20000000,大家也可以存储到任意其它RAM地址,只要空间还够加载算法文件即可。+ k# n4 W) l7 Q/ d

) \, {2 @4 O9 F: ]# N如果要做调试下载,需要做如下配置:2 v6 Y% v& D3 J- F& \1 m3 W4 n# e: ?

5 s. C; r) h2 g* t$ e! Y
93ce012aea4a1b38d8cd796b00fd7e32.png

+ [( ~4 T/ B0 Z3 h1 L) W+ v- Z: y( r8 _6 R
83.5.3 程序调试效果
8 ^2 ~; J# [) w8 {3 h调试效果如下:
6 a6 Q2 }, ^& D0 P1 S$ }1 L( d
" e% W3 x8 j6 i% u7 i- Q. q1 p
48019aea182ba08be716467429994567.png
# d* u) Y/ C! D  C4 `
% \% R: e& x+ ?) M7 @
83.6 实验例程说明! G+ |& \8 f$ E+ u/ z1 I5 I
本章节配套例子:V7-064_内部Flash和QSPI Flash都运行程序的混合方式,无需单独制作BOOT和APP(强烈推荐)
: [# e) q8 S; q& h; e0 v% g; C; Y( Q, Z8 U
1beb9dad80a6c5a7a1e6927282b23199.png

+ q- Z7 q: b2 L8 I# w2 a. L/ S* \) i+ i0 w! }; Z9 t0 r2 D  G- w
编译此程序弹出的警告不用管,可以选择屏蔽此警告:! L% q9 i( P' F1 ^9 h
8 ]% S: V- `- R
; b% Q0 W! x3 E% H

+ W/ G3 R" U6 y+ v5 l3 f, P: \83.7 总结* [# ~0 b$ o5 M; K1 h( V. `+ N: U
本章节就为大家讲解这么,为了熟练掌握,大家可以尝试自己实现一个内部Flash和外部Flash混合运行的程序。  ~) Z; v% j3 Y
1 V& I0 q& J; H( k
0 Q. B3 A$ {" Q. v  S7 b, x4 ~

1 a0 P& l% ^% w, N$ o4 N9 U
36e580d9d9e79756632fcf47c0fa92cb.png
收藏 评论0 发布时间:2021-12-21 22:16

举报

0个回答

所属标签

相似分享

官网相关资源

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