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

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

[复制链接]
STMCU小助手 发布时间:2021-12-21 22:16
83.1 初学者重要提示& }. y3 P! L$ |& l" p% n7 U
  操作本章配套例子前务必先将QSPI Flash的下载算法放到MDK安装目录。5 [& S# a; Y6 x' ^. y
  本章节与第28章的时间关键代码在ITCM执行的设置思路是一样的,可以让大家对本章节的方法有个更全面的认识。' [. r4 p& R! D# l" M% {8 k" w
2 S4 X1 o. D5 w$ v6 f
83.2 内部Flash和QSPI Flash混合执行程序的优势$ _8 p& p' @9 \; Z6 b! @
现在大家使用H750或H743在外置QSPI Flash执行程序,都倾向于制作个BOOT,再制作一个运行在外置QSPI Flash的APP程序。即本教程第82章讲解的内容。% \! L: X( M) k6 M+ V

  m2 z5 R4 ]% i! j% `" r' j; J. H7 G本章要实现的这种方式对于我们想外置QSPI Flash运行程序,在调试测试阶段更加方便,甚至是项目使用,可以性能最大化。# ~) B' }9 ?( g

) q8 O0 i( h. p: v6 S83.3 下载算法存放位置
& }! i: \( [! a8 s2 S- `编译例子:V7-060_QSPI Flash的MDK下载算法制作,生成的算法文件位于此路径下:
. \3 C" ~, d2 |& V5 `
1 V: {) Y# ]6 y( d+ M
4e104a5ffb1a810a2deb37350c125c80.png
$ o5 V2 V2 g% ~4 i5 A

$ A' M: A2 o+ b1 _. a生成算法文件后,需要大家将其存到到MDK安装目录,有两个位置可以存放,任选其一,推荐第2种:% J8 M2 J* Z3 ]
) g5 K" K! g0 e# w
  第1种:存放到MDK的STM32H7软包安装目录里面:\Keil\STM32H7xx_DFP\2.6.0\CMSIS\Flash(软包版本不同,数值2.6.0不同)。
) ~! @, P- i8 v9 G( i! f  第2种:MDK的安装目录 \ARM\Flash里面。" R8 S0 h8 H2 v* N9 P/ H6 c

9 R5 K% }9 p: o* }# h2 o8 E# f4 x
408325991a13d158563aafc445666cf1.png
2 c( k( H# n; G3 E/ k/ V4 G7 H
3 B7 f" o& E; h, B
83.4 内部Flash和QSPI Flash混合执行程序说明
% e; ?1 r* b0 b. G, m混合程序的设置注意以下两点即可。/ w2 Y! R6 m; H. f4 K4 `5 U5 x
( d' a: d5 t! b+ b* z2 g
83.4.1 初始化QSPI Flash并设置内存映射模式+ h0 i4 {. B6 j# [" S
在bsp.c文件中初始在bsp.c文件中初始QSPI Flash并设置为内存映射模式。注意,配置好时钟后,优先初始化QSPI Flash并设置为内存映射模式:
4 H5 }6 F1 h/ Q' r1 I8 e3 m) C7 p8 P0 g
  1. /*
    4 v" U; N. t' T$ P) I
  2. *********************************************************************************************************
    % ]3 Q' t; H* Z* Z4 s; K. j
  3. *    函 数 名: bsp_Init
    9 c1 p+ b# |) L4 r3 R! ^
  4. *    功能说明: 初始化所有的硬件设备。该函数配置CPU寄存器和外设的寄存器并初始化一些全局变量。只需要调用一次% b* g8 M* `5 W$ c2 C
  5. *    形    参:无3 }" u' E* j, H( e
  6. *    返 回 值: 无
    2 B5 a+ E1 Z3 i) H7 D1 u2 g/ Z$ ^/ s
  7. *********************************************************************************************************, E' a3 M9 }7 o) X- Z
  8. */
    3 F9 p0 n" D; i& a' Z
  9. void bsp_Init(void)
    ) @. v- c# [; z% b% l
  10. {1 O+ o7 i" M9 o! x; b+ ?" s
  11.     /* 配置MPU */
    ; j2 U1 _8 Z' A
  12.     MPU_Config();2 [% |( B5 i6 A% X

  13. ; T3 G) ^# o9 }
  14.     /* 使能L1 Cache */
    . Z: n/ q1 H" [0 `8 I
  15.     CPU_CACHE_Enable();) u- R) {. J- k/ U9 T+ M4 @/ b
  16. $ q, C0 s2 m0 X  N$ r+ e
  17.     /*
    5 p7 \* z+ S7 s' ]
  18.        STM32H7xx HAL 库初始化,此时系统用的还是H7自带的64MHz,HSI时钟:( U6 t* Z, g) c; l$ g. \
  19.        - 调用函数HAL_InitTick,初始化滴答时钟中断1ms。
    $ ]* f: O. Q: }. j" ]8 @  {( \3 s, K
  20.        - 设置NVIV优先级分组为4。* l& i6 i$ p  W: M' Z& E
  21.      */
    7 a, p6 z0 `/ J) {
  22.     HAL_Init();9 g, O: a& k1 z6 V( e

  23. 4 t3 U# c" Z5 F( ~, d. k. ?
  24.     /*
    $ m2 N" o6 l* w. Y4 r. ^
  25.        配置系统时钟到400MHz
    # N' z  ?5 M7 n$ Q4 s
  26.        - 切换使用HSE。
    " ^& I* J; I; U* W* z* G9 i- l, A
  27.        - 此函数会更新全局变量SystemCoreClock,并重新配置HAL_InitTick。5 d# [' p, |5 Y/ z" c/ }( o
  28.     */
    # J* ?6 O1 x, K  n* ^: y8 j
  29.     SystemClock_Config();8 V6 _0 r# `& H* E7 u& e
  30. $ R  ]9 H$ k1 @3 p
  31.     /* / q. a& l, u6 t5 |: j+ w* R
  32.        Event Recorder:" j/ `8 a2 m7 X5 `( w
  33.        - 可用于代码执行时间测量,MDK5.25及其以上版本才支持,IAR不支持。% F$ b% ?& r) d5 F7 e* E
  34.        - 默认不开启,如果要使能此选项,务必看V7开发板用户手册第8章1 L; ^1 @+ L  z3 Z
  35.     */    3 X; _/ }# h7 D% I- U" g
  36. #if Enable_EventRecorder == 1  1 k' b6 k) g' W  P4 S3 o3 ~' v
  37.     /* 初始化EventRecorder并开启 */
    1 A3 |" \9 m: ]9 z
  38.     EventRecorderInitialize(EventRecordAll, 1U);
    1 X2 \6 [$ ~6 N3 x, A, U
  39.     EventRecorderStart();4 y0 m1 c- o+ H- u, G
  40. #endif3 Y; ?- a, O, G
  41. * V! R6 X1 U8 @3 a* e
  42.     /* 针对不同的应用程序,添加需要的底层驱动模块初始化函数 */
    5 ^* w; _# r1 u/ m
  43.     bsp_InitQSPI_W25Q256();  /* 配置SPI总线 */   ! `& X4 O  T9 d* \2 b; ]  {- v
  44.      QSPI_MemoryMapped();
    " O7 W1 d( Q5 j+ J6 N! n$ w8 i

  45. ' T( {4 X  O( }; D
  46. bsp_InitDWT();      /* 初始化DWT时钟周期计数器 */       & e6 V: R6 w. V. J
  47.     bsp_InitKey();        /* 按键初始化,要放在滴答定时器之前,因为按钮检测是通过滴答定时器扫描 */
    - ?" r/ W; n) b2 T' j' Y3 c+ c2 \' H
  48.     bsp_InitTimer();      /* 初始化滴答定时器 */
    4 X2 Q2 g7 w+ h& o# \/ ?
  49.     bsp_InitUart();        /* 初始化串口 */
    $ k! s* a6 w7 b+ r- j
  50.     bsp_InitExtIO();    /* 初始化FMC总线74HC574扩展IO. 必须在 bsp_InitLed()前执行 */   
    9 |0 a  F' }; m* B% x, c
  51.     bsp_InitLed();        /* 初始化LED */    7 t/ P7 o8 |8 q! o! C
  52.     bsp_InitExtSDRAM(); /* 初始化SDRAM */
    - H* d3 j) @8 v% C; F
  53. - ~2 C5 y3 \; k& S" ^
  54.     bsp_InitI2C();        /* 初始化I2C总线 */8 @5 k" {5 h3 j0 O+ B
  55.     TOUCH_InitHard();   /* 初始化触摸芯片,LCD面板型号的检查也在此函数,所以要在函数LCD_InitHard前调用 */
    ; C9 ?; ]2 Y5 B
  56.     LCD_InitHard();     /* 初始化LCD */
    5 Z( S, R: V$ v. P" J8 h+ _
  57. }
复制代码

. i' s4 P, L! ~8 s( Z- z83.4.2 设置运行在内部Flash和QSPI Flash的程序
; d7 M8 K) Z/ b$ ?% n
由于我们要把QSPI Flash初始化并设置为内存映射模式后才可以使用QSPI Flash运行程序,所以要在QSPI Flash运行程序之前的所有操作都在内部Flash里面实现,主要是滴答定时器,RCC,QSPI和HAL库等相关配置。其它所有程序都可以在外部QSPI Flash执行:
5 B. L" k* [! B+ b5 @$ o& q
2 }8 W1 y1 m( N$ |2 d' l
5afe81e1cd5b95f9c13119726de64582.png

- B+ H9 @) E  L1 D, G4 W  [8 }. `
83.5 内部Flash和QSPI Flash程序调试下载配置4 n7 V6 y, P- D
将下面两个地方配置后,就可以像使用内部Flash一样使用QSPI Flash进行调试了。并且这种方式可以方便的调试程序,内部Flash和外部Flash都做调试。: H  e7 w& t  ^% C7 e

7 U2 W6 L1 K* |! c6 c. Y83.5.1 下载配置
8 ~' F6 j3 `7 R7 B. y; R注意这里一定要够大,否则会提示算法文件无法加载:
) ]$ }2 j% S3 B# N
! \* b8 j6 _3 o# z$ \( U) p5 Y
6baa86337ba5b6fb5a805d2f1d1b18a2.png

; d% y* q% ?' ^7 Y; E5 W: w% ~* u
3 y" J3 _4 q* ~( X) l我们这里是将其加到DTCM中,即首地址为0x20000000,大家也可以存储到任意其它RAM地址,只要空间还够加载算法文件即可。推荐使用AXI SRAM(地址0x24000000),因为这块RAM空间足够大。
" x0 V' {2 _: |/ I+ [9 C# P/ e( q3 J9 g
如果要下载程序到内部Flash和外部QSPI Flash里面,需要做如下配置,两个下载算法都要添加进来:
" [# X2 D9 T! r* W& z2 Z$ T1 s. _$ b' q
9c03364b94f34e5f8e8b1e9b708430a6.png

0 n& ~$ i  W# G& a, D
/ L& H  L5 F5 G! {$ C( |83.5.2 调试配置& f. e- T/ }0 [: |4 o4 {. L
注意这里一定要够大,否则会提示算法文件无法加载:2 w  ^" C, \' j% u9 {
& [: {  f4 S- J! F1 G& P
4 S7 q6 v2 I5 O6 R$ r$ j! W
0 W2 k8 y. x. t
我们这里是将其加到DTCM中,即首地址为0x20000000,大家也可以存储到任意其它RAM地址,只要空间还够加载算法文件即可。7 _4 Y, j: g6 y. c
, u4 i1 z, L* L! s# g& W
如果要做调试下载,需要做如下配置:
; h) D: M0 b7 N' i, `$ Z
8 B7 y. @# T! P/ I
93ce012aea4a1b38d8cd796b00fd7e32.png

/ Q$ V5 s" h) E+ _
. t9 z. n  y. X83.5.3 程序调试效果
) z: P# x$ v3 Q' i; K8 H' }) j调试效果如下:% V' t3 N; N  O/ _

2 }+ J+ W" t0 D$ T& ^0 n
48019aea182ba08be716467429994567.png

& B9 B7 {+ l& K! W  C2 c/ ~8 \* P7 C% d9 B
83.6 实验例程说明
0 f1 c' A1 j! C本章节配套例子:V7-064_内部Flash和QSPI Flash都运行程序的混合方式,无需单独制作BOOT和APP(强烈推荐)$ O# w5 |+ j- v1 o* i% Q* |, F8 o
/ W/ A4 F# `  h8 a: n: R
1beb9dad80a6c5a7a1e6927282b23199.png
; M7 f8 z+ z. Q; w2 [5 H* F* y

2 S9 g' X1 X6 m3 o编译此程序弹出的警告不用管,可以选择屏蔽此警告:# D; a- c% B& n% k

1 J$ _" v' y0 k' g4 @' A1 W5 H/ P
: Q  b5 V: K: R/ r# f) Z8 D
83.7 总结
9 o3 P+ v& B- y5 T( u本章节就为大家讲解这么,为了熟练掌握,大家可以尝试自己实现一个内部Flash和外部Flash混合运行的程序。
2 B4 ^! |8 o9 I) g
  ?$ o( K' h+ ~: Q5 x" k9 [
: |, u# @- l. z3 h% e5 a0 Z
' P2 d/ h3 m) t6 K$ u5 N
36e580d9d9e79756632fcf47c0fa92cb.png
赞 收藏 评论0 发布时间:2021-12-21 22:16

举报

0个回答

所属标签

相似技术帖

官网相关资源

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