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

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

[复制链接]
STMCU小助手 发布时间:2021-12-21 22:16
83.1 初学者重要提示
# `9 p! k9 A1 N" ?$ z% }2 _  操作本章配套例子前务必先将QSPI Flash的下载算法放到MDK安装目录。  H* V, ^. `( R
  本章节与第28章的时间关键代码在ITCM执行的设置思路是一样的,可以让大家对本章节的方法有个更全面的认识。5 F2 `1 T/ i! Y9 Z
- s" i9 t( D. P# @
83.2 内部Flash和QSPI Flash混合执行程序的优势. B* C5 r/ ]. Z8 b" D+ K
现在大家使用H750或H743在外置QSPI Flash执行程序,都倾向于制作个BOOT,再制作一个运行在外置QSPI Flash的APP程序。即本教程第82章讲解的内容。' B% }+ ]9 Z6 x5 b+ F5 ~) j
. k: O% X% t) r3 W, w
本章要实现的这种方式对于我们想外置QSPI Flash运行程序,在调试测试阶段更加方便,甚至是项目使用,可以性能最大化。
$ [1 j* }  D( @. d9 ^! n, d, ?) A# u$ u+ z! Y  i" q3 J
83.3 下载算法存放位置
2 S7 _$ m) |. v; ~+ x" ^9 S, V编译例子:V7-060_QSPI Flash的MDK下载算法制作,生成的算法文件位于此路径下:$ V  C; {  g3 T7 U) z- S; x0 W
9 I% f" ]/ g, f- v
4e104a5ffb1a810a2deb37350c125c80.png

7 m# \+ A$ c/ N
# ^5 E  p0 _! j) l生成算法文件后,需要大家将其存到到MDK安装目录,有两个位置可以存放,任选其一,推荐第2种:5 d2 \3 @- ]/ U: P1 _1 R7 ^
- [1 ~2 D2 \1 B- m  r9 ^9 Y  G6 R
  第1种:存放到MDK的STM32H7软包安装目录里面:\Keil\STM32H7xx_DFP\2.6.0\CMSIS\Flash(软包版本不同,数值2.6.0不同)。/ {; z, t8 B5 O2 x, i
  第2种:MDK的安装目录 \ARM\Flash里面。
& J+ n* A6 Y9 }) J* V1 U! T# w1 t1 O* z/ ]& d1 X- i: e% O  K
408325991a13d158563aafc445666cf1.png
' `9 m6 C( w* k) {, L, e) M
; n- H( a! l& K- o# u
83.4 内部Flash和QSPI Flash混合执行程序说明; s/ H( g  G& O& B8 q
混合程序的设置注意以下两点即可。
* `; r7 e) S  A. p2 p( t: a& j5 ?/ \
83.4.1 初始化QSPI Flash并设置内存映射模式
4 ]- S$ L, p7 m3 Y5 Q0 O在bsp.c文件中初始在bsp.c文件中初始QSPI Flash并设置为内存映射模式。注意,配置好时钟后,优先初始化QSPI Flash并设置为内存映射模式:* N* R  E/ q) {

, p' Z( C+ m- G* q
  1. /*0 J- I! Y8 R# h- C1 d) c5 D  Z6 i
  2. *********************************************************************************************************6 i" V( _4 o& H- g# D
  3. *    函 数 名: bsp_Init
    & h9 K$ N0 F& X
  4. *    功能说明: 初始化所有的硬件设备。该函数配置CPU寄存器和外设的寄存器并初始化一些全局变量。只需要调用一次
    & m% h+ K! E: F% M# A, f0 t
  5. *    形    参:无, {3 j9 n- ]8 E$ R. t
  6. *    返 回 值: 无9 D$ p1 ^8 z  M% d7 I
  7. *********************************************************************************************************5 {8 @+ K3 l5 y) r4 R, m+ C
  8. */
    1 j2 U/ \7 w* B0 v+ o# N* q
  9. void bsp_Init(void)
    # e, r5 E( g* Z/ X% c
  10. {
    # q: S  |0 X4 p- S2 D
  11.     /* 配置MPU */  h. G, Q4 e' W! W1 g: @
  12.     MPU_Config();# b; M5 M0 z3 d- b9 R- j. f

  13. 4 a" Y5 |3 u! M4 w" A1 y; `: [
  14.     /* 使能L1 Cache */, d3 ~7 x( [* e2 _# t# I; ?
  15.     CPU_CACHE_Enable();8 X- v( O/ V9 p* z9 \
  16. ( Q& S$ y8 v# K# o( D2 d
  17.     /* ; k+ R( J* K- @8 O; t
  18.        STM32H7xx HAL 库初始化,此时系统用的还是H7自带的64MHz,HSI时钟:
    / ~) w0 Q2 G" f3 W8 ~5 O
  19.        - 调用函数HAL_InitTick,初始化滴答时钟中断1ms。
    * {) m6 b, p! [7 r3 N
  20.        - 设置NVIV优先级分组为4。
    8 J+ [. C' p5 z6 j, h
  21.      */
    ) ?2 q! V3 e) l3 K$ E8 c% m6 {
  22.     HAL_Init();
    ) z% [1 u  O/ S7 _1 `" F  e
  23. & w, W! U# K/ i; n' l, e
  24.     /*
    " G/ i( f0 k. ~5 @- {
  25.        配置系统时钟到400MHz. h( }% ]( Q4 t! H+ E+ I
  26.        - 切换使用HSE。
    ; j* b, W6 v0 F: w1 [9 z& _
  27.        - 此函数会更新全局变量SystemCoreClock,并重新配置HAL_InitTick。
    * X" E4 x2 U6 |6 Z) F8 y3 w6 Q
  28.     */
    ; x$ u3 \2 Y2 B
  29.     SystemClock_Config();4 k' [3 t$ m/ S9 X5 @4 j  c
  30. ! G, y+ M% u9 d
  31.     /*
    9 i( T; ~' g' ~
  32.        Event Recorder:  {( K" J0 D; J/ j! ~9 s" `
  33.        - 可用于代码执行时间测量,MDK5.25及其以上版本才支持,IAR不支持。7 b( j: X5 W& E
  34.        - 默认不开启,如果要使能此选项,务必看V7开发板用户手册第8章& F' ?' ]2 f' |
  35.     */   
    5 C; q+ I5 p* E
  36. #if Enable_EventRecorder == 1  
    # b  R! d" r! e4 w0 ^! _8 r
  37.     /* 初始化EventRecorder并开启 */
    . D0 E  V0 d9 f# u1 W7 e
  38.     EventRecorderInitialize(EventRecordAll, 1U);
    " k" d5 N7 R4 P- m8 T$ g3 [: A
  39.     EventRecorderStart();" N8 q! ~$ f# m2 s7 E+ [6 a  I2 L! Z
  40. #endif
    & a$ Z  ]3 \$ t
  41. / G2 a9 A1 S# u4 `) f/ |& `" ~
  42.     /* 针对不同的应用程序,添加需要的底层驱动模块初始化函数 */2 m3 b' K6 l; d% `$ G5 U3 U( p+ |& A
  43.     bsp_InitQSPI_W25Q256();  /* 配置SPI总线 */   
      _. z  u* h& i7 X
  44.      QSPI_MemoryMapped();
    ( k6 V9 e9 V" k6 K9 t' o& L# _
  45. 5 o3 _  s# g) Z. G# C8 w0 p
  46. bsp_InitDWT();      /* 初始化DWT时钟周期计数器 */       0 K) x8 [8 Z! D6 l- ?# F8 J
  47.     bsp_InitKey();        /* 按键初始化,要放在滴答定时器之前,因为按钮检测是通过滴答定时器扫描 */
    ' @1 F$ i! m0 u. ^; V) d4 x8 E
  48.     bsp_InitTimer();      /* 初始化滴答定时器 */
    3 A' Z. ^0 K& ]% ?% [5 [
  49.     bsp_InitUart();        /* 初始化串口 */8 v& E1 ^# E6 M# a
  50.     bsp_InitExtIO();    /* 初始化FMC总线74HC574扩展IO. 必须在 bsp_InitLed()前执行 */    % j  {% `; ?" r" W( e4 n7 m
  51.     bsp_InitLed();        /* 初始化LED */   
    % s; L6 \  n1 e# d! B
  52.     bsp_InitExtSDRAM(); /* 初始化SDRAM */* A( N/ n) b' e- x
  53. ; S8 t# }  e: I' e& ~" E
  54.     bsp_InitI2C();        /* 初始化I2C总线 */7 _9 U% E( B" G% P  b% P& |3 H
  55.     TOUCH_InitHard();   /* 初始化触摸芯片,LCD面板型号的检查也在此函数,所以要在函数LCD_InitHard前调用 */ 3 I! p  e0 K7 J5 F
  56.     LCD_InitHard();     /* 初始化LCD */" W! C1 F5 [; {, P! C
  57. }
复制代码

' {& }. ~; M7 M$ x3 r83.4.2 设置运行在内部Flash和QSPI Flash的程序

, e; N+ f2 D) y  k0 w4 K2 g由于我们要把QSPI Flash初始化并设置为内存映射模式后才可以使用QSPI Flash运行程序,所以要在QSPI Flash运行程序之前的所有操作都在内部Flash里面实现,主要是滴答定时器,RCC,QSPI和HAL库等相关配置。其它所有程序都可以在外部QSPI Flash执行:. [- R; u- \. |
6 |- K( Z3 e/ t. B8 H
5afe81e1cd5b95f9c13119726de64582.png
) w) {( G, i2 @. ]* B) O( y
: s# u: t! \- z( |' @3 M0 W' C
83.5 内部Flash和QSPI Flash程序调试下载配置
; G+ U7 i) O, t2 p- i0 I将下面两个地方配置后,就可以像使用内部Flash一样使用QSPI Flash进行调试了。并且这种方式可以方便的调试程序,内部Flash和外部Flash都做调试。
  r8 T1 X  [2 {, x, v3 b2 s4 [" A" x5 R( t- z+ v- _  _( d* ~
83.5.1 下载配置' E; o1 K) c) M( l
注意这里一定要够大,否则会提示算法文件无法加载:9 A/ |$ s' ^6 l% `; D1 N

, ?4 J# l# R  v' M
6baa86337ba5b6fb5a805d2f1d1b18a2.png

8 {5 f: h/ l: L, I$ O, Y  r- x' e5 ?0 n
我们这里是将其加到DTCM中,即首地址为0x20000000,大家也可以存储到任意其它RAM地址,只要空间还够加载算法文件即可。推荐使用AXI SRAM(地址0x24000000),因为这块RAM空间足够大。7 N( A- V6 Q  d: ^
- x2 M1 ]( M0 |& i) a: X, Z/ n
如果要下载程序到内部Flash和外部QSPI Flash里面,需要做如下配置,两个下载算法都要添加进来:  T3 z$ J" J% T. \
0 A+ r7 p4 ^/ ?8 z
9c03364b94f34e5f8e8b1e9b708430a6.png
; t/ j* ~. Z* ~9 Q) \
/ j8 d9 J) _1 b  e5 J
83.5.2 调试配置+ l9 N5 c$ T; ?9 E% T. n8 h+ o
注意这里一定要够大,否则会提示算法文件无法加载:, c6 m! D" f) c6 n5 p- n  r; r$ C% c

& l% f. ^  y0 P' A4 {. a9 \
5 z/ `! A) M2 F6 {
, W5 F! X3 G. Y2 [% S
我们这里是将其加到DTCM中,即首地址为0x20000000,大家也可以存储到任意其它RAM地址,只要空间还够加载算法文件即可。% g8 R6 N" k# x9 C

% m. d6 Q) V- r5 C; e如果要做调试下载,需要做如下配置:
" D: P: Y2 s  ]3 G# i
9 s8 c( @2 v  I& N
93ce012aea4a1b38d8cd796b00fd7e32.png
) ~! q; G" }1 C9 V0 i) c
+ N& {  q/ w5 m  H0 ], @# Z
83.5.3 程序调试效果6 q8 T3 c; {0 {* Z8 i( ?% k
调试效果如下:) w; F1 H2 B7 ?+ x% j3 }

7 o6 h4 |8 }1 Z5 z( R/ Z) b* _
48019aea182ba08be716467429994567.png

* V- `6 e' y5 t8 C' p# V/ E. E# F* {  T  J7 Z
83.6 实验例程说明) O! r9 f; U$ p; M! T
本章节配套例子:V7-064_内部Flash和QSPI Flash都运行程序的混合方式,无需单独制作BOOT和APP(强烈推荐)0 ?* R* v7 A2 o( ^8 l1 B

) `3 [4 L1 ]. L$ I6 o9 P" ]
1beb9dad80a6c5a7a1e6927282b23199.png

7 ]1 j" J* D7 Z% a/ O4 p* v' k0 A+ @  V" o
编译此程序弹出的警告不用管,可以选择屏蔽此警告:
, B  `/ t0 R. _2 e$ Q2 v( P5 P$ r2 \! w1 d: J# @

$ K1 ?1 [" D9 ]9 |7 _- L
6 n& x% f6 O! t3 z# R83.7 总结
1 ^8 s$ i3 U' M本章节就为大家讲解这么,为了熟练掌握,大家可以尝试自己实现一个内部Flash和外部Flash混合运行的程序。
  D8 h+ T& L' p3 X: s8 j* @! I
; U8 v  [9 i6 O! Q2 C8 x1 e) V1 q" ^5 f4 Z' a) t  L
' C5 \4 t4 y( P$ F
36e580d9d9e79756632fcf47c0fa92cb.png
收藏 评论0 发布时间:2021-12-21 22:16

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版