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

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

[复制链接]
STMCU小助手 发布时间:2021-12-21 22:16
83.1 初学者重要提示
/ @7 k+ W4 s* y  操作本章配套例子前务必先将QSPI Flash的下载算法放到MDK安装目录。$ J7 q) F, E; K3 O, i" B
  本章节与第28章的时间关键代码在ITCM执行的设置思路是一样的,可以让大家对本章节的方法有个更全面的认识。
- d4 [) \2 L3 n  w! k! B
( k  S& I' E' k3 k83.2 内部Flash和QSPI Flash混合执行程序的优势
' l2 T& m  ?; k7 g2 d9 W+ D现在大家使用H750或H743在外置QSPI Flash执行程序,都倾向于制作个BOOT,再制作一个运行在外置QSPI Flash的APP程序。即本教程第82章讲解的内容。
. |$ i1 \+ T; b- V* K0 }9 t* g- s( D* z) x6 J
本章要实现的这种方式对于我们想外置QSPI Flash运行程序,在调试测试阶段更加方便,甚至是项目使用,可以性能最大化。. Q. n$ ^; W- V$ @9 p5 }1 s) s

) e0 Z$ `. \, v: c& X2 h0 C83.3 下载算法存放位置4 U0 b# U& p2 [  i) I0 K
编译例子:V7-060_QSPI Flash的MDK下载算法制作,生成的算法文件位于此路径下:
7 V. ?: u: f3 f) D6 L3 L6 A* ]1 h' c$ b% s: E% y% a
4e104a5ffb1a810a2deb37350c125c80.png

3 I. m$ N1 V4 @& H3 n9 i0 K' i' J& k9 b' {7 V
生成算法文件后,需要大家将其存到到MDK安装目录,有两个位置可以存放,任选其一,推荐第2种:
! z+ k7 Y+ `3 }3 J2 h3 g8 t5 N0 `- |1 K9 f# H& p: C
  第1种:存放到MDK的STM32H7软包安装目录里面:\Keil\STM32H7xx_DFP\2.6.0\CMSIS\Flash(软包版本不同,数值2.6.0不同)。1 L! a# K- J! A7 p4 p
  第2种:MDK的安装目录 \ARM\Flash里面。4 r2 O& q% \% ]8 I3 @

. W9 g( W' S; e4 o3 U
408325991a13d158563aafc445666cf1.png
0 f1 X8 a' Q" |
, n0 v& R' D& a  O6 O
83.4 内部Flash和QSPI Flash混合执行程序说明) p$ _5 f- j* e+ D! u
混合程序的设置注意以下两点即可。' ?& `6 o8 x# _2 B% t6 V

! O/ V; t+ b. f3 N83.4.1 初始化QSPI Flash并设置内存映射模式
/ B8 Q" O# A& y$ b在bsp.c文件中初始在bsp.c文件中初始QSPI Flash并设置为内存映射模式。注意,配置好时钟后,优先初始化QSPI Flash并设置为内存映射模式:
& U  Z' P9 o4 n5 {9 [
& H3 Q, s6 ?6 }# B' S
  1. /*
    3 d5 W! @- W3 m; x' Y# p( }. ?7 s
  2. *********************************************************************************************************
      ?8 J: c( \1 T+ x
  3. *    函 数 名: bsp_Init
      t, h  ]5 }. D6 l4 d% X0 T
  4. *    功能说明: 初始化所有的硬件设备。该函数配置CPU寄存器和外设的寄存器并初始化一些全局变量。只需要调用一次
    " E4 R. m. p( s0 T" `
  5. *    形    参:无
    $ J7 o: C" ^* z7 e2 {8 a) J
  6. *    返 回 值: 无
    1 c/ T4 M4 `8 [! W
  7. *********************************************************************************************************
    ; E$ G. u( v9 v" z9 u; r1 n; r* A: v  }
  8. */
    / ]: W6 j& l1 c6 s7 ]
  9. void bsp_Init(void)% n3 d9 U6 O$ J/ q6 b+ W: E
  10. {
    ) t9 T* F0 a* i4 x. {" X5 \* x# x6 w
  11.     /* 配置MPU */
    : L% o3 k* C# s( I- i
  12.     MPU_Config();
    2 z& ~8 n. _% r( b
  13. # t" |) I0 n  K
  14.     /* 使能L1 Cache */
    2 @# Q: e- w" \7 U7 J/ m
  15.     CPU_CACHE_Enable();
    % W9 t3 {4 i' Z& t2 @
  16. % V) I0 V7 J  w* C
  17.     /* * C, X' d" U1 V, ]: I  L
  18.        STM32H7xx HAL 库初始化,此时系统用的还是H7自带的64MHz,HSI时钟:
    5 {* i5 x( p6 a0 c& p
  19.        - 调用函数HAL_InitTick,初始化滴答时钟中断1ms。) Z& n( G( I2 j, T( K8 n
  20.        - 设置NVIV优先级分组为4。
    " f/ v4 F8 `, t( R9 z
  21.      */5 j7 E# I: V# }% a% O+ n8 ^
  22.     HAL_Init();
    + d5 o0 P, F& O. D0 v

  23. ! _$ J5 J4 ?4 p. j" y& {
  24.     /*
    * [1 C  U" a4 Y; l. u; |: y6 @
  25.        配置系统时钟到400MHz
    - c. W' Z" d6 S
  26.        - 切换使用HSE。
    & A4 F2 r: I( V6 M- E" n
  27.        - 此函数会更新全局变量SystemCoreClock,并重新配置HAL_InitTick。
    ' C, }) y. t, I
  28.     */" _* H; p7 \- M1 \6 [
  29.     SystemClock_Config();1 f0 P0 d0 K" L
  30. ) r8 ?2 }8 x/ E; H
  31.     /*
    " M0 }, x9 T8 H
  32.        Event Recorder:* X8 I1 }/ s3 {
  33.        - 可用于代码执行时间测量,MDK5.25及其以上版本才支持,IAR不支持。
    6 G. j( U; I+ G3 h+ z# J1 P
  34.        - 默认不开启,如果要使能此选项,务必看V7开发板用户手册第8章
    8 C# o3 B9 V0 M' G
  35.     */    ) A, U6 x  l8 W! }$ R$ q
  36. #if Enable_EventRecorder == 1  
    / ^; w$ P& R) K# i1 T
  37.     /* 初始化EventRecorder并开启 */
    / s" S' h, |  o' j
  38.     EventRecorderInitialize(EventRecordAll, 1U);
    ! H. R3 p1 t$ M8 L* Y9 M3 T
  39.     EventRecorderStart();! K$ ~' u1 v1 o4 P0 X$ S% G( I
  40. #endif/ v5 g# q) [, V
  41. 4 w+ @: q) B$ n  j6 C- g
  42.     /* 针对不同的应用程序,添加需要的底层驱动模块初始化函数 */
    & {+ |0 I1 U5 e+ o3 r, x
  43.     bsp_InitQSPI_W25Q256();  /* 配置SPI总线 */   ) b" G0 S9 I/ E  v: f3 u& w
  44.      QSPI_MemoryMapped();+ o! H' N. x7 X$ p3 _

  45. : L1 Y) L. b1 [% B  G+ ], S
  46. bsp_InitDWT();      /* 初始化DWT时钟周期计数器 */       # S9 ^, ?' f9 w& d
  47.     bsp_InitKey();        /* 按键初始化,要放在滴答定时器之前,因为按钮检测是通过滴答定时器扫描 */$ o. ?6 c7 V7 [3 \
  48.     bsp_InitTimer();      /* 初始化滴答定时器 *// M& N4 o8 X0 h5 k8 Q
  49.     bsp_InitUart();        /* 初始化串口 */
    ) d* U7 l% k) h' e. Y
  50.     bsp_InitExtIO();    /* 初始化FMC总线74HC574扩展IO. 必须在 bsp_InitLed()前执行 */    5 O3 j7 }3 t& K# d/ y: T5 j/ Y
  51.     bsp_InitLed();        /* 初始化LED */   
    $ P' t" z5 x) U
  52.     bsp_InitExtSDRAM(); /* 初始化SDRAM */
    , }; q9 ]2 i, ]: P5 }- x/ X/ s
  53. % s$ Z8 R2 S3 `2 F3 l, |
  54.     bsp_InitI2C();        /* 初始化I2C总线 */
    / k" m- ^  v7 H; k4 x9 E2 R: M
  55.     TOUCH_InitHard();   /* 初始化触摸芯片,LCD面板型号的检查也在此函数,所以要在函数LCD_InitHard前调用 */ . j  j/ w( u/ m. o( V8 C. q
  56.     LCD_InitHard();     /* 初始化LCD */
    * q8 w" A) N' w5 l7 `: l
  57. }
复制代码
* y8 [9 ?5 ?% J/ y! _/ X9 p6 K
83.4.2 设置运行在内部Flash和QSPI Flash的程序

  {# _/ i' v) A  U由于我们要把QSPI Flash初始化并设置为内存映射模式后才可以使用QSPI Flash运行程序,所以要在QSPI Flash运行程序之前的所有操作都在内部Flash里面实现,主要是滴答定时器,RCC,QSPI和HAL库等相关配置。其它所有程序都可以在外部QSPI Flash执行:. H8 E2 C6 m& ?4 \: d

' l0 h: ~- c1 F# R" R% s' P  }4 k
5afe81e1cd5b95f9c13119726de64582.png
- v7 w1 N( t* W$ Y9 c! b" T- A' p

4 j* r! I7 s) @, v83.5 内部Flash和QSPI Flash程序调试下载配置
5 b$ Y$ v/ v: d. O7 v! N! |将下面两个地方配置后,就可以像使用内部Flash一样使用QSPI Flash进行调试了。并且这种方式可以方便的调试程序,内部Flash和外部Flash都做调试。& \( ]$ s" U; }$ l* H0 g7 e+ c. W+ p
- T4 L$ Z* k( g4 ~! N+ H' l9 [! O: l
83.5.1 下载配置1 i9 @. q4 @% v
注意这里一定要够大,否则会提示算法文件无法加载:
# ?- t  Y/ |% q4 L
/ T) B% o/ N% k5 L+ t4 \
6baa86337ba5b6fb5a805d2f1d1b18a2.png
* {. G7 W* G6 i) o9 w

0 b9 m5 d- P8 Y0 W3 ]我们这里是将其加到DTCM中,即首地址为0x20000000,大家也可以存储到任意其它RAM地址,只要空间还够加载算法文件即可。推荐使用AXI SRAM(地址0x24000000),因为这块RAM空间足够大。. J8 _9 V* b8 S. Z1 h1 r  _, H( r
9 s! Q0 W9 [+ C2 y" g, A
如果要下载程序到内部Flash和外部QSPI Flash里面,需要做如下配置,两个下载算法都要添加进来:) M7 n# h0 j: L( w2 M
9 b) t8 y' z  o2 a1 `" I# S! \
9c03364b94f34e5f8e8b1e9b708430a6.png
" a) g% Q6 F4 i' m& u, R' T

! ^# W. t% [! h83.5.2 调试配置
( Z4 F) z/ [. c注意这里一定要够大,否则会提示算法文件无法加载:
  U3 q! X2 F9 X$ [3 t8 w8 b; _5 ^7 Q  s+ q: Y7 T

; [8 ?; m$ j+ Q( ]* e
0 `7 N+ Z/ F1 K0 W( {! Z我们这里是将其加到DTCM中,即首地址为0x20000000,大家也可以存储到任意其它RAM地址,只要空间还够加载算法文件即可。
% {3 ^6 ?- I5 ?% J/ Y' ^/ p, B9 ^, U  y
如果要做调试下载,需要做如下配置:8 U1 J1 u% K! X

+ J- I  C0 e7 x1 |' N
93ce012aea4a1b38d8cd796b00fd7e32.png

! S( R3 @# t, X3 e; `# V6 d  V5 F6 [
83.5.3 程序调试效果
- ^$ ^2 M' r6 I4 L调试效果如下:% t9 ], j. s! v6 F' a3 C% U& B! N
9 G0 A" ]% n1 J; v
48019aea182ba08be716467429994567.png
6 X( a: T! d% w) ^% H7 V! N: _
9 V: Q) `# ?+ ?3 T* g
83.6 实验例程说明6 N8 x. h  X6 o6 w1 G8 S) b
本章节配套例子:V7-064_内部Flash和QSPI Flash都运行程序的混合方式,无需单独制作BOOT和APP(强烈推荐)
+ k* z5 R. V. C9 |6 X2 g' h2 a/ ~( C  |4 A# i# P
1beb9dad80a6c5a7a1e6927282b23199.png
( Q& P$ n: I4 v2 q
" V( N( Y4 \3 }% l
编译此程序弹出的警告不用管,可以选择屏蔽此警告:7 f( L  m# ~/ X3 Q# F
; C+ c' h" _' F0 A/ Z* R* w7 _/ d
9 n5 T2 e/ j, y/ M
! A; D: d  f. B7 Q6 Q) Y$ I/ H3 Z4 K
83.7 总结* L0 J& ?. Y3 m5 r
本章节就为大家讲解这么,为了熟练掌握,大家可以尝试自己实现一个内部Flash和外部Flash混合运行的程序。
5 F) ]! a1 ?# ?% W1 G) u
9 `* k$ h3 r- i9 ?2 H: p; F
" Q6 |, i6 ?4 H
# a) ~3 a( v# R
36e580d9d9e79756632fcf47c0fa92cb.png
收藏 评论0 发布时间:2021-12-21 22:16

举报

0个回答

所属标签

相似技术帖

官网相关资源

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