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

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

[复制链接]
STMCU小助手 发布时间:2021-12-21 22:16
83.1 初学者重要提示
' v/ c$ k4 B0 `* s, L7 c* i0 r8 f  操作本章配套例子前务必先将QSPI Flash的下载算法放到MDK安装目录。& q$ Q( B& A/ d* u: Q" d$ h* [
  本章节与第28章的时间关键代码在ITCM执行的设置思路是一样的,可以让大家对本章节的方法有个更全面的认识。3 X3 G. d' Z2 Q

; e, R5 a$ r  S: _( H! r# c4 }83.2 内部Flash和QSPI Flash混合执行程序的优势9 Q3 |5 {' w" |
现在大家使用H750或H743在外置QSPI Flash执行程序,都倾向于制作个BOOT,再制作一个运行在外置QSPI Flash的APP程序。即本教程第82章讲解的内容。
# A) _2 [* o1 b: P
% {+ y* S5 f% f; t0 Q% y$ c2 i本章要实现的这种方式对于我们想外置QSPI Flash运行程序,在调试测试阶段更加方便,甚至是项目使用,可以性能最大化。& Q$ U$ Q- k  Z. D+ j& i
9 @4 L0 r" Z/ W, z, E  B
83.3 下载算法存放位置+ t8 ]4 a6 x+ ]: {) K
编译例子:V7-060_QSPI Flash的MDK下载算法制作,生成的算法文件位于此路径下:
/ b* k* W' U, l; o. y( M0 ]' E( ~- D+ Z/ q, e" p% C% o# }
4e104a5ffb1a810a2deb37350c125c80.png

0 b, m9 p+ F; m8 u, \1 i2 U" S( g$ T& q: x! E  m
生成算法文件后,需要大家将其存到到MDK安装目录,有两个位置可以存放,任选其一,推荐第2种:! ~/ r" p! X4 j2 {' w
0 P9 o6 P0 |5 }0 c* [
  第1种:存放到MDK的STM32H7软包安装目录里面:\Keil\STM32H7xx_DFP\2.6.0\CMSIS\Flash(软包版本不同,数值2.6.0不同)。8 d0 Y5 r+ B& l: D/ B7 y/ `$ u9 Q
  第2种:MDK的安装目录 \ARM\Flash里面。! L5 b! u& E! A8 v9 j- ^
. Y) i) E! g) c% `% d# P1 ?" K( P1 q
408325991a13d158563aafc445666cf1.png

4 J! z3 K8 }3 t! h3 F0 p2 i* T4 B0 U3 f' z- ~1 ~1 k, K
83.4 内部Flash和QSPI Flash混合执行程序说明/ p4 V" r+ {4 G4 P2 a
混合程序的设置注意以下两点即可。
8 A# G, C' {, w. g' x! w* }- n9 x4 A: [, F/ A( i
83.4.1 初始化QSPI Flash并设置内存映射模式( C9 k# k, j+ K
在bsp.c文件中初始在bsp.c文件中初始QSPI Flash并设置为内存映射模式。注意,配置好时钟后,优先初始化QSPI Flash并设置为内存映射模式:
6 J2 b4 P1 o% ~# }$ a$ {: d& Q: B; ?5 ~/ W' A+ S0 s
  1. /*5 N/ Z6 A8 u2 h1 T4 V( L
  2. *********************************************************************************************************
    5 h9 X' u0 K" b, J" Y$ ^# u  ^4 X& v
  3. *    函 数 名: bsp_Init
    . r  {. Q+ G$ R/ Q
  4. *    功能说明: 初始化所有的硬件设备。该函数配置CPU寄存器和外设的寄存器并初始化一些全局变量。只需要调用一次3 T2 ~( ]0 F3 U1 ^- {! }( n
  5. *    形    参:无
    3 ~. D) U$ D8 Y. A" ]
  6. *    返 回 值: 无: [; M1 R8 N1 Q; ]: N
  7. *********************************************************************************************************
    & c  v$ I3 `7 x- h0 k; X* e
  8. */
    4 v) W) V/ E2 w) V' p8 q
  9. void bsp_Init(void)
    5 _0 a, d; Y1 _/ E
  10. {+ @4 F+ X% u" G" I8 e4 g; u
  11.     /* 配置MPU */
    ! |3 i' v( x7 D7 Z3 T
  12.     MPU_Config();1 p, j# b- c3 a
  13. / t# n' }  o; c& S
  14.     /* 使能L1 Cache */
    2 ~# [* _! j1 {3 Z, d( g
  15.     CPU_CACHE_Enable();" I5 w% Z6 A1 W4 j
  16. 9 \- T% h% A# x% D; R/ E' w
  17.     /* ) ^$ x2 W$ ^$ i
  18.        STM32H7xx HAL 库初始化,此时系统用的还是H7自带的64MHz,HSI时钟:
    $ d8 J9 J8 X; X' R
  19.        - 调用函数HAL_InitTick,初始化滴答时钟中断1ms。
      e8 e5 H: a! M, @! n
  20.        - 设置NVIV优先级分组为4。
    $ N8 e6 D5 j+ z4 S' R4 [$ m
  21.      */6 T& F5 E- N, h$ o. X* A
  22.     HAL_Init();
    * r& ^: @3 r3 l+ j

  23. ) L: T7 f1 {/ D; {$ A
  24.     /*
    0 T* n3 O, R& H8 N% Y
  25.        配置系统时钟到400MHz
    & w2 m9 K% A; ?
  26.        - 切换使用HSE。
    ( R; Y3 I6 _3 S2 [5 l0 h0 V
  27.        - 此函数会更新全局变量SystemCoreClock,并重新配置HAL_InitTick。
      j. k1 U! s  c- W: Q. `
  28.     */( k( O$ l  Y4 H7 \" Z$ B4 |3 _3 N7 H
  29.     SystemClock_Config();
    # p, n* N2 s1 D

  30. 1 [8 r' u' E9 c, d5 m% t$ [
  31.     /* 0 d: S3 Z+ k; Z3 B/ T. o
  32.        Event Recorder:/ G0 H  x+ P, p" y) f: E) T
  33.        - 可用于代码执行时间测量,MDK5.25及其以上版本才支持,IAR不支持。
    7 ^4 z) I% r0 e* f/ E6 A
  34.        - 默认不开启,如果要使能此选项,务必看V7开发板用户手册第8章
    7 i0 P6 R, W& ?
  35.     */    . W2 |0 ]6 g* H
  36. #if Enable_EventRecorder == 1  
    ( u' p$ F/ a0 G# a  E
  37.     /* 初始化EventRecorder并开启 */# ]8 p; T8 }6 o' I( h
  38.     EventRecorderInitialize(EventRecordAll, 1U);. q; r3 P" h9 e* P
  39.     EventRecorderStart();
    9 L* ^* ?( p7 {+ |) K$ r4 c! R
  40. #endif, Q5 Q; B$ r5 D* R! l- }  {

  41. 8 N) K" K1 Z/ y. \8 t
  42.     /* 针对不同的应用程序,添加需要的底层驱动模块初始化函数 */
    3 k6 l/ Z* z* e% U
  43.     bsp_InitQSPI_W25Q256();  /* 配置SPI总线 */     |4 I/ J6 B2 O' b% U
  44.      QSPI_MemoryMapped();, K% k0 C8 X/ X* w

  45. ! A% L) Z& s0 ?! t
  46. bsp_InitDWT();      /* 初始化DWT时钟周期计数器 */      
    3 V: f5 X; ]& P, h  R; n
  47.     bsp_InitKey();        /* 按键初始化,要放在滴答定时器之前,因为按钮检测是通过滴答定时器扫描 */
    4 ~- h# l: `, S3 D
  48.     bsp_InitTimer();      /* 初始化滴答定时器 */5 K. V2 c' Z# }9 E  H
  49.     bsp_InitUart();        /* 初始化串口 */
    6 P- T( o) g& E# j5 R  A$ v
  50.     bsp_InitExtIO();    /* 初始化FMC总线74HC574扩展IO. 必须在 bsp_InitLed()前执行 */    , {0 L# @8 u  K6 Q: p- j; p
  51.     bsp_InitLed();        /* 初始化LED */    1 N  y, `3 C. r- X+ \% w( `  f
  52.     bsp_InitExtSDRAM(); /* 初始化SDRAM */
      k8 z6 M% d) D( y3 |# _7 E+ l! |  B

  53. ; r! o& Q/ o2 l
  54.     bsp_InitI2C();        /* 初始化I2C总线 */3 g& Z- i: i) E- @' y$ B2 M- ~
  55.     TOUCH_InitHard();   /* 初始化触摸芯片,LCD面板型号的检查也在此函数,所以要在函数LCD_InitHard前调用 */ * _; V! N% U; f1 j
  56.     LCD_InitHard();     /* 初始化LCD */. K. C7 O1 J( a" m
  57. }
复制代码

4 C: B' }0 t, w4 ^83.4.2 设置运行在内部Flash和QSPI Flash的程序
9 k$ |; H$ ]. Y# E- y' `: g
由于我们要把QSPI Flash初始化并设置为内存映射模式后才可以使用QSPI Flash运行程序,所以要在QSPI Flash运行程序之前的所有操作都在内部Flash里面实现,主要是滴答定时器,RCC,QSPI和HAL库等相关配置。其它所有程序都可以在外部QSPI Flash执行:" S& `: G9 @! h3 p

0 w0 f% p  d- }" L- J7 @# }; e
5afe81e1cd5b95f9c13119726de64582.png

: ~. \* R4 E7 M% |1 g
) M$ T8 \! \- O' D/ [83.5 内部Flash和QSPI Flash程序调试下载配置8 _; W; F# C' p% Y- j0 ?) T- `) I
将下面两个地方配置后,就可以像使用内部Flash一样使用QSPI Flash进行调试了。并且这种方式可以方便的调试程序,内部Flash和外部Flash都做调试。
+ a" r; }  V2 l! x/ ]- d& u4 S. J) U7 W& C: e$ U
83.5.1 下载配置* J. B& c* S" j+ B# Y
注意这里一定要够大,否则会提示算法文件无法加载:, ]  v$ I' [, s) ]1 l4 E8 t) C
. G" c9 S% X! g( Y
6baa86337ba5b6fb5a805d2f1d1b18a2.png

0 x- h; B1 h9 u5 _- R' T0 Z5 E7 w
% f7 k; w) t2 G我们这里是将其加到DTCM中,即首地址为0x20000000,大家也可以存储到任意其它RAM地址,只要空间还够加载算法文件即可。推荐使用AXI SRAM(地址0x24000000),因为这块RAM空间足够大。% p! j, W9 O' V0 X# n& y- H# }
  h/ u$ }+ U8 F/ J! a( V
如果要下载程序到内部Flash和外部QSPI Flash里面,需要做如下配置,两个下载算法都要添加进来:" E5 B; p! N- F9 j7 u- C
3 l6 }5 D( ]7 [3 u5 f
9c03364b94f34e5f8e8b1e9b708430a6.png
# V0 P$ n' s% R. }
% Q5 |' H& e9 Z) l* S
83.5.2 调试配置
% D+ P# u8 D/ V7 w- b# `' F, r注意这里一定要够大,否则会提示算法文件无法加载:) p" u* W) @$ B% }* \
$ u- v+ T+ f2 j# N: S# D5 v5 b
9 h6 c3 |  C6 y/ h6 X' {

4 N% s4 z5 B7 a7 |( T我们这里是将其加到DTCM中,即首地址为0x20000000,大家也可以存储到任意其它RAM地址,只要空间还够加载算法文件即可。
7 D7 l4 l; F$ Q" S0 A+ P9 V0 w
" ^  o* @3 I8 v如果要做调试下载,需要做如下配置:
  y+ ]* p+ F/ K4 K2 }  A! d5 |; a% ~; U/ _# b2 V, P7 p9 Z! f
93ce012aea4a1b38d8cd796b00fd7e32.png
' C' y. k# O" K1 N
# E( e6 n8 X) p- w; W
83.5.3 程序调试效果
+ Q4 {# B, W5 z调试效果如下:7 r, p* n7 e+ p5 Y

/ O) T+ x: z* V" K/ O
48019aea182ba08be716467429994567.png

6 [  q1 S) J; r: O( v, P5 T  q9 z( o1 p+ U
83.6 实验例程说明
' Y! q7 G' n, N6 M% S本章节配套例子:V7-064_内部Flash和QSPI Flash都运行程序的混合方式,无需单独制作BOOT和APP(强烈推荐)
+ T3 J/ \% s0 _8 O7 E2 g9 [
) Z2 ?( B: t! \* M
1beb9dad80a6c5a7a1e6927282b23199.png
# |3 j$ G* X; T

* H) W/ z4 X) v; H9 E& f编译此程序弹出的警告不用管,可以选择屏蔽此警告:+ x: x3 l8 X# y2 y' z

$ M; f- ~' J5 w/ E, ~$ |5 N9 S+ C9 V3 [: _
9 \9 f$ h; f& l+ H: |
83.7 总结
1 c$ L; h3 o* G本章节就为大家讲解这么,为了熟练掌握,大家可以尝试自己实现一个内部Flash和外部Flash混合运行的程序。* X- {8 Y6 v! j8 F  `
0 ?" B4 n1 j8 l2 w
& y) S7 W1 V9 ^) a& K

  b! x) S+ C1 E  j4 R) c5 z
36e580d9d9e79756632fcf47c0fa92cb.png
收藏 评论0 发布时间:2021-12-21 22:16

举报

0个回答

所属标签

相似分享

官网相关资源

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