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

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

[复制链接]
STMCU小助手 发布时间:2021-12-21 22:16
83.1 初学者重要提示
2 T* v$ m% B8 b) j( a1 G8 l+ u  操作本章配套例子前务必先将QSPI Flash的下载算法放到MDK安装目录。% k) o' a; ^6 t& [" W" w
  本章节与第28章的时间关键代码在ITCM执行的设置思路是一样的,可以让大家对本章节的方法有个更全面的认识。
: `# F9 \2 t: U0 i- P! W- F9 m2 u
83.2 内部Flash和QSPI Flash混合执行程序的优势+ ]# C% P7 o7 ^4 @
现在大家使用H750或H743在外置QSPI Flash执行程序,都倾向于制作个BOOT,再制作一个运行在外置QSPI Flash的APP程序。即本教程第82章讲解的内容。
' y' C7 e* ~0 ]+ T# l/ w9 n/ a+ b7 P9 m3 B2 C& c2 K% ~
本章要实现的这种方式对于我们想外置QSPI Flash运行程序,在调试测试阶段更加方便,甚至是项目使用,可以性能最大化。( ^2 t: _& J3 Y" h: u8 Z' j6 m

) b$ ^5 J' I; h5 }: T, N; E83.3 下载算法存放位置+ {5 o  a, ]6 O5 s
编译例子:V7-060_QSPI Flash的MDK下载算法制作,生成的算法文件位于此路径下:4 x1 k# W( Q" P8 G0 o5 v' e2 E

  z4 ]+ x, {) ?: I2 `$ r5 M7 W
4e104a5ffb1a810a2deb37350c125c80.png
, ~6 g7 K$ H4 U! I, A7 t

5 i+ g: z! T: I3 A生成算法文件后,需要大家将其存到到MDK安装目录,有两个位置可以存放,任选其一,推荐第2种:' W1 t( f; N# ]# J, v
3 e! K1 M9 t! U
  第1种:存放到MDK的STM32H7软包安装目录里面:\Keil\STM32H7xx_DFP\2.6.0\CMSIS\Flash(软包版本不同,数值2.6.0不同)。
; h' N! H- g9 k7 L6 C  第2种:MDK的安装目录 \ARM\Flash里面。
8 H! o" p9 m2 G, ^
4 Y2 G$ F& `6 x* H( B# u
408325991a13d158563aafc445666cf1.png
+ \' d# j" H# h- R
" w  }% Z' e% p' o, J5 p
83.4 内部Flash和QSPI Flash混合执行程序说明
, r% \: |9 m- T; ~: ?混合程序的设置注意以下两点即可。! N' y. n; C8 p8 J8 K( L

, o8 j9 U' K) r4 x0 f83.4.1 初始化QSPI Flash并设置内存映射模式
* n0 u; C4 U7 s/ F4 a7 p5 N5 e- U/ T$ @在bsp.c文件中初始在bsp.c文件中初始QSPI Flash并设置为内存映射模式。注意,配置好时钟后,优先初始化QSPI Flash并设置为内存映射模式:
6 E, N3 R4 C6 E
( t, x) f$ P6 V, l( h& t
  1. /*0 G* k& Q. g; K( h
  2. *********************************************************************************************************
    " {) \( ?) j& x( W0 B
  3. *    函 数 名: bsp_Init( o5 |$ U7 \$ n, d7 F
  4. *    功能说明: 初始化所有的硬件设备。该函数配置CPU寄存器和外设的寄存器并初始化一些全局变量。只需要调用一次
    ( ^* u4 x8 D, f' w
  5. *    形    参:无$ u' o4 `* G8 ?& D. _
  6. *    返 回 值: 无
    ( E0 x: H4 E  M$ s* T* N
  7. *********************************************************************************************************# P+ {3 W$ M& L
  8. */
    ! T) ^+ X! _* H) X
  9. void bsp_Init(void)
    4 A5 _9 h( L$ u9 m9 C$ [" z
  10. {. a: L5 I* J& v8 t9 B
  11.     /* 配置MPU */
    2 Y: E2 V' r; h( `  G  P, l. v
  12.     MPU_Config();% V8 b1 O6 I  \3 t

  13. 4 r' `. Q% u8 }! v# ?6 W
  14.     /* 使能L1 Cache */2 ^$ c6 H! b. e! I5 j
  15.     CPU_CACHE_Enable();' l( ~0 Y% [9 G" u
  16. 9 ~2 A. V1 @' i$ K8 w! \# W
  17.     /* , H' S3 @; \/ ]8 R% O- _: v
  18.        STM32H7xx HAL 库初始化,此时系统用的还是H7自带的64MHz,HSI时钟:2 C* X' W2 ^. G+ L! O" C
  19.        - 调用函数HAL_InitTick,初始化滴答时钟中断1ms。
    3 [, k9 |9 b" G; x
  20.        - 设置NVIV优先级分组为4。
    : d7 I2 W$ W6 c) i: ]0 m4 B  U
  21.      */4 A; y( f0 g( K
  22.     HAL_Init();
    0 M% P- ~7 }; C* C4 `7 A0 K! r

  23. 3 m2 Q7 b0 k3 v+ l" O* r, s
  24.     /*   E) y+ t- I* B0 M; }" a* k* J
  25.        配置系统时钟到400MHz
    ; z! [: `/ |: d' w; z" e& z  @3 m
  26.        - 切换使用HSE。" P, s; ^3 G2 }) p
  27.        - 此函数会更新全局变量SystemCoreClock,并重新配置HAL_InitTick。. [0 a: k8 r$ T+ n5 X
  28.     */
    , m# v# }1 H; a( }  O5 S; E
  29.     SystemClock_Config();; D, E2 f/ K! w; @

  30. , Q1 q1 S3 \) k2 P8 _
  31.     /*
    9 Q, u: c& Z) G; C- x$ J' P- o
  32.        Event Recorder:
    . d3 C& _" ?( ~/ v
  33.        - 可用于代码执行时间测量,MDK5.25及其以上版本才支持,IAR不支持。
    ' w9 f/ V) W2 E. f& @+ I
  34.        - 默认不开启,如果要使能此选项,务必看V7开发板用户手册第8章
    2 }& r( \" ^2 X
  35.     */   
    ( o  W2 [& l8 e  E2 l; U
  36. #if Enable_EventRecorder == 1  1 @, m. U( D! L9 b$ j# z
  37.     /* 初始化EventRecorder并开启 */8 ^7 T: d, z8 V8 z! ^
  38.     EventRecorderInitialize(EventRecordAll, 1U);
    1 @1 E9 _  m% N7 a
  39.     EventRecorderStart();
    2 E3 e! W2 Y  ~  t# O2 t
  40. #endif
    . O6 O( F. N3 v
  41. ( _0 ^- d8 R, Y8 g
  42.     /* 针对不同的应用程序,添加需要的底层驱动模块初始化函数 */
    ( U" k5 |/ [  }  G
  43.     bsp_InitQSPI_W25Q256();  /* 配置SPI总线 */   
    ' h$ W% q9 N4 }% j; ~5 _9 c
  44.      QSPI_MemoryMapped();
    " @, Z: g: b& x2 X; [0 o" a# G% e& K7 G% s
  45. ; ]$ L9 v2 t4 c: B
  46. bsp_InitDWT();      /* 初始化DWT时钟周期计数器 */      
    + P: _/ x- L  d4 O( ^# ~
  47.     bsp_InitKey();        /* 按键初始化,要放在滴答定时器之前,因为按钮检测是通过滴答定时器扫描 */
    ; P# [) L; V# ?9 g# U* S! I3 w
  48.     bsp_InitTimer();      /* 初始化滴答定时器 */
    ( {2 ^/ E% ?  s/ U. m; U
  49.     bsp_InitUart();        /* 初始化串口 */) Z# w. x( L  z! O, l) J3 d4 f
  50.     bsp_InitExtIO();    /* 初始化FMC总线74HC574扩展IO. 必须在 bsp_InitLed()前执行 */    # V( `8 Y: V/ \* [5 x
  51.     bsp_InitLed();        /* 初始化LED */   
    1 y4 C' V( N, t6 X" Q
  52.     bsp_InitExtSDRAM(); /* 初始化SDRAM */
    . C% o) {+ h( k* O

  53. ) e3 E8 M6 [# g4 Z% r! `
  54.     bsp_InitI2C();        /* 初始化I2C总线 */7 N7 z  g' g0 c, B. Q2 ]2 U" T
  55.     TOUCH_InitHard();   /* 初始化触摸芯片,LCD面板型号的检查也在此函数,所以要在函数LCD_InitHard前调用 */ 3 C* V6 D5 F$ O# }4 u- |3 _
  56.     LCD_InitHard();     /* 初始化LCD */6 h! D' u! w3 T
  57. }
复制代码
% J; z" e; n# Y, _, A
83.4.2 设置运行在内部Flash和QSPI Flash的程序
0 M3 d" i. t& U3 ^% y% [
由于我们要把QSPI Flash初始化并设置为内存映射模式后才可以使用QSPI Flash运行程序,所以要在QSPI Flash运行程序之前的所有操作都在内部Flash里面实现,主要是滴答定时器,RCC,QSPI和HAL库等相关配置。其它所有程序都可以在外部QSPI Flash执行:
+ l* e, H% G# {* m3 f" X! V2 L8 ?9 ]* c5 Z6 O) W* J
5afe81e1cd5b95f9c13119726de64582.png

, b5 D1 y7 e3 }1 x8 Y
3 t+ H8 ^/ d. V1 `3 q- G6 u83.5 内部Flash和QSPI Flash程序调试下载配置
' h0 a; u9 F9 i# L将下面两个地方配置后,就可以像使用内部Flash一样使用QSPI Flash进行调试了。并且这种方式可以方便的调试程序,内部Flash和外部Flash都做调试。
$ s' R. |7 _% ]" F0 }9 V+ x$ V. e+ {- }4 B' M; v
83.5.1 下载配置
* I, S) t2 q! A4 a- k+ u2 m1 B注意这里一定要够大,否则会提示算法文件无法加载:- U* r5 Q$ W9 E+ b1 g# i
& n# x! M8 \  D* S4 ~' p# R
6baa86337ba5b6fb5a805d2f1d1b18a2.png

, o& |2 Y" h8 u$ |' n1 ], E$ D- W2 T9 Y& ^4 x# C- n" E( {3 J
我们这里是将其加到DTCM中,即首地址为0x20000000,大家也可以存储到任意其它RAM地址,只要空间还够加载算法文件即可。推荐使用AXI SRAM(地址0x24000000),因为这块RAM空间足够大。- _1 X3 P) O, {
# _4 k5 Y9 C3 x2 F& j( ]
如果要下载程序到内部Flash和外部QSPI Flash里面,需要做如下配置,两个下载算法都要添加进来:8 O2 I; G  x8 \
- |8 y$ ^/ j% H: L# Z! \4 o
9c03364b94f34e5f8e8b1e9b708430a6.png

% @6 B+ s7 c4 f0 r& p. G7 v+ r* m& Q6 K  F% A8 m% z
83.5.2 调试配置
$ s" B# k: C0 T, V+ _' b4 k注意这里一定要够大,否则会提示算法文件无法加载:( T7 p  k; Z7 \0 c4 `4 V3 a

* ~2 G0 ~3 G3 f; H' s

9 e* @9 e& s+ o4 _2 a
2 t1 \8 t8 Z8 e2 _  B9 p6 u我们这里是将其加到DTCM中,即首地址为0x20000000,大家也可以存储到任意其它RAM地址,只要空间还够加载算法文件即可。
* W- ?5 @. g( }: D1 S: @
( y) \- ?% s+ z8 U6 j$ g8 x如果要做调试下载,需要做如下配置:
- g1 `# r6 m$ d+ q. Y% U# x. E, M. f
6 T% v: A; `. C7 F- p7 X1 l
93ce012aea4a1b38d8cd796b00fd7e32.png
5 [7 g9 N0 x; a: V( y$ H" i
) U! \/ @7 K8 h: z& c3 w) V) h
83.5.3 程序调试效果+ o' t2 v/ d$ G. ^" z& X
调试效果如下:. k0 c3 Q. Z1 N

/ d5 d7 z' ]  V& F, i! C/ w
48019aea182ba08be716467429994567.png

" R, g8 B1 D# t
% O1 _; |- t2 R8 G  z$ n+ n83.6 实验例程说明7 `* W( K# Q6 P. G
本章节配套例子:V7-064_内部Flash和QSPI Flash都运行程序的混合方式,无需单独制作BOOT和APP(强烈推荐)9 G# l' P/ X4 j& d# I; \1 F; }3 Y) n
7 k; [( \2 J, O9 I  V; E9 k
1beb9dad80a6c5a7a1e6927282b23199.png
1 Y$ |  X/ n* G7 Q8 @( c* g; L
% _7 }+ F0 t) Z. c3 `7 U" f
编译此程序弹出的警告不用管,可以选择屏蔽此警告:
/ j2 m1 W2 u1 ~4 _( }& O8 t
# j0 n2 L  R0 j; |6 C: ?4 p$ Y# k; \
1 E( T/ [4 W  U! U2 `
83.7 总结
2 c$ S$ X" W' }$ a; _, a& |  Q3 d本章节就为大家讲解这么,为了熟练掌握,大家可以尝试自己实现一个内部Flash和外部Flash混合运行的程序。
7 f+ [' z/ Z4 Y! g* P' G$ U% h0 j
2 a- f+ `# }! m
6 X0 {8 P/ w" u$ D2 B$ i) p0 p7 l9 P# W
36e580d9d9e79756632fcf47c0fa92cb.png
赞 收藏 评论0 发布时间:2021-12-21 22:16

举报

0个回答

所属标签

相似技术帖

官网相关资源

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