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

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

[复制链接]
STMCU小助手 发布时间:2021-12-21 22:16
83.1 初学者重要提示+ \$ t+ {# \9 @- U/ O5 z# p' e4 z
  操作本章配套例子前务必先将QSPI Flash的下载算法放到MDK安装目录。* m7 q# A) E: L( q
  本章节与第28章的时间关键代码在ITCM执行的设置思路是一样的,可以让大家对本章节的方法有个更全面的认识。
" M1 ]  z2 P& f3 M1 o" ^; d3 P) b0 u9 ]8 ]4 V2 b& v. s* v- L; P( F0 p
83.2 内部Flash和QSPI Flash混合执行程序的优势* L/ C6 I6 f9 Y* V/ F/ U! d
现在大家使用H750或H743在外置QSPI Flash执行程序,都倾向于制作个BOOT,再制作一个运行在外置QSPI Flash的APP程序。即本教程第82章讲解的内容。
, W: {% f- [6 m, r/ g# K
, w- Y0 z. _5 Y* ~本章要实现的这种方式对于我们想外置QSPI Flash运行程序,在调试测试阶段更加方便,甚至是项目使用,可以性能最大化。' `: v- m1 q& ?/ p% r9 i

0 H1 Y" q1 y/ g' _* z) e6 H6 r83.3 下载算法存放位置& Z% V/ F. B! {' T, G- r
编译例子:V7-060_QSPI Flash的MDK下载算法制作,生成的算法文件位于此路径下:
! o/ L8 U! ]" f3 }$ P9 S* K4 l9 O6 V  D' }& [
4e104a5ffb1a810a2deb37350c125c80.png
8 U& b* ?  E( ?7 h( \% s
9 U, J2 z6 n3 X
生成算法文件后,需要大家将其存到到MDK安装目录,有两个位置可以存放,任选其一,推荐第2种:* R5 D3 w! I- [% |, N+ V# q, e2 I
; A& s  v; ^! o0 C! G
  第1种:存放到MDK的STM32H7软包安装目录里面:\Keil\STM32H7xx_DFP\2.6.0\CMSIS\Flash(软包版本不同,数值2.6.0不同)。
, j" o% e/ s/ u# N4 P" Q1 v& F  第2种:MDK的安装目录 \ARM\Flash里面。
' \, G8 g  d* l( h
1 |0 Z1 X5 ~) T, k
408325991a13d158563aafc445666cf1.png

* _+ n7 E! @; L' l( G, j/ ?% j; R; d; `7 _
83.4 内部Flash和QSPI Flash混合执行程序说明
1 \# h" F5 S3 B& Y$ ]* {混合程序的设置注意以下两点即可。, ^# P% b( p. h7 q3 T; v

5 A9 W/ z# a! n1 w) O83.4.1 初始化QSPI Flash并设置内存映射模式% G* x5 o' q9 a. N8 ~' {
在bsp.c文件中初始在bsp.c文件中初始QSPI Flash并设置为内存映射模式。注意,配置好时钟后,优先初始化QSPI Flash并设置为内存映射模式:% c! l' y$ `! _2 `4 H

+ F' ]3 G4 N9 l9 s
  1. /*# b: b0 \" w' T1 L( q1 c7 Z
  2. *********************************************************************************************************
    + k7 |$ r8 c: o3 H
  3. *    函 数 名: bsp_Init- b+ r) c$ ^% J" q
  4. *    功能说明: 初始化所有的硬件设备。该函数配置CPU寄存器和外设的寄存器并初始化一些全局变量。只需要调用一次
    7 p5 o& |# \- ~) N
  5. *    形    参:无
    # I8 R* h1 l$ o$ E, I
  6. *    返 回 值: 无
    " {, q$ ^' w7 T( t
  7. *********************************************************************************************************4 ~8 h! y: q3 _0 A3 F( ]
  8. */
    * c: I# Q# V' w: I
  9. void bsp_Init(void)& y% e, K. ?9 @2 j0 R6 r$ @
  10. {
    : }' B# G$ o4 \" Z9 Q
  11.     /* 配置MPU */6 u  |2 g# Y  E/ I
  12.     MPU_Config();
    % X8 r, N3 m2 D! H' F. K  \: R

  13. - ^2 e) Q+ K) D! n; V3 i& Q& ^: h
  14.     /* 使能L1 Cache */
    : k. G+ [. ?9 S1 y$ e0 I
  15.     CPU_CACHE_Enable();
    ' {% u& C( M3 q- Q

  16.   I. p$ {5 h( ^* A& V( o6 G
  17.     /* / S2 n) p- t5 n) c0 j
  18.        STM32H7xx HAL 库初始化,此时系统用的还是H7自带的64MHz,HSI时钟:# y, m: M# n2 G6 A8 _8 U4 G/ T4 w& U
  19.        - 调用函数HAL_InitTick,初始化滴答时钟中断1ms。2 ~8 Y3 ?' j2 m
  20.        - 设置NVIV优先级分组为4。
    3 ~' F  o7 e: Z2 P" a, Y. g0 U
  21.      */
    , H' _/ X3 o' l  g1 l, v
  22.     HAL_Init();
    : ]6 h7 Y- I3 R: L* P: N0 h

  23. 5 b2 a1 ^/ b! e& S, |
  24.     /*
    * f7 E* y/ V+ j; z
  25.        配置系统时钟到400MHz
    2 G, r1 ^; N* Y; Y
  26.        - 切换使用HSE。
    ; d7 \5 Q0 ?' `7 \" r1 P
  27.        - 此函数会更新全局变量SystemCoreClock,并重新配置HAL_InitTick。. }5 t6 i5 y5 r4 X2 |
  28.     */
    6 `1 I  a$ O/ L5 P
  29.     SystemClock_Config();
    ( T2 F5 q6 w" M& F' p0 J7 k  q

  30. : V# m1 D) T4 R2 ~; h& q3 ^
  31.     /*
    0 T$ a. D9 h, D& I6 e8 J/ U) ]
  32.        Event Recorder:
    2 t' O+ }4 M% U- y
  33.        - 可用于代码执行时间测量,MDK5.25及其以上版本才支持,IAR不支持。# r- }0 p/ W8 E) t
  34.        - 默认不开启,如果要使能此选项,务必看V7开发板用户手册第8章
    % o  n0 q8 o9 l2 V
  35.     */   
    ) M0 Q3 v  e! Y( j5 M; m! S. p
  36. #if Enable_EventRecorder == 1  5 n/ ^. r$ F" J1 ^
  37.     /* 初始化EventRecorder并开启 */
    ! n9 ]2 p2 d, b( w1 Z
  38.     EventRecorderInitialize(EventRecordAll, 1U);
    0 x0 J, J' X1 b* W; ^  c+ x0 }
  39.     EventRecorderStart();" e2 V/ z3 Y% H+ \
  40. #endif
    + ^9 \, ^4 w" q& r1 W' m

  41. : u! k, R" f, ]# g" s1 _# b
  42.     /* 针对不同的应用程序,添加需要的底层驱动模块初始化函数 */. X: K' C6 N3 \  k9 u* H* p' w, c
  43.     bsp_InitQSPI_W25Q256();  /* 配置SPI总线 */   - @: S; m* n3 a( p
  44.      QSPI_MemoryMapped();& y, p+ B5 H$ t" `& T

  45. 2 D- ?0 W6 A6 J
  46. bsp_InitDWT();      /* 初始化DWT时钟周期计数器 */       / H3 P8 W, {# M' d: T9 w/ s
  47.     bsp_InitKey();        /* 按键初始化,要放在滴答定时器之前,因为按钮检测是通过滴答定时器扫描 */" u0 l: P: h3 [% H+ H
  48.     bsp_InitTimer();      /* 初始化滴答定时器 */
    . U0 v0 o6 w0 I' z# v
  49.     bsp_InitUart();        /* 初始化串口 */  W* S" T1 ~7 }
  50.     bsp_InitExtIO();    /* 初始化FMC总线74HC574扩展IO. 必须在 bsp_InitLed()前执行 */   
    / w5 ^, R+ o1 C  m; |, y6 B
  51.     bsp_InitLed();        /* 初始化LED */   
    2 ?6 C; w  E0 N5 c+ b
  52.     bsp_InitExtSDRAM(); /* 初始化SDRAM */  K2 L+ `0 P/ D

  53. 1 ?; k0 |# h" a9 H9 u
  54.     bsp_InitI2C();        /* 初始化I2C总线 */
    8 Q5 P3 {  e6 K
  55.     TOUCH_InitHard();   /* 初始化触摸芯片,LCD面板型号的检查也在此函数,所以要在函数LCD_InitHard前调用 */ ' Q' {; z3 B' Q5 V7 d4 j8 Z
  56.     LCD_InitHard();     /* 初始化LCD */' T4 z4 ?: y# F7 D$ z0 y3 Y- v' H0 c
  57. }
复制代码

9 r/ r' L' d' ?8 k83.4.2 设置运行在内部Flash和QSPI Flash的程序
9 @7 \* W1 I+ H9 b9 c- n: O
由于我们要把QSPI Flash初始化并设置为内存映射模式后才可以使用QSPI Flash运行程序,所以要在QSPI Flash运行程序之前的所有操作都在内部Flash里面实现,主要是滴答定时器,RCC,QSPI和HAL库等相关配置。其它所有程序都可以在外部QSPI Flash执行:
6 V! m" i( u- P. u- k4 ]2 e3 F& f/ x6 \. ~- r
5afe81e1cd5b95f9c13119726de64582.png
" m' G7 ~  r3 ~- Z3 s" b  d! K
  W- F- T" o- R
83.5 内部Flash和QSPI Flash程序调试下载配置
4 Z* B' O- \" q3 z9 v6 ]$ {# W& n将下面两个地方配置后,就可以像使用内部Flash一样使用QSPI Flash进行调试了。并且这种方式可以方便的调试程序,内部Flash和外部Flash都做调试。% Y7 H5 l* V2 Q' j* [  f8 w3 Y+ q
5 K6 w. j7 _, @4 G# ?
83.5.1 下载配置: a" M6 ~0 S; e* S
注意这里一定要够大,否则会提示算法文件无法加载:
" t7 H+ ^$ F3 F8 ]5 b) K- s0 c- m' d' C6 e* I& X6 J6 {" y- ^" o
6baa86337ba5b6fb5a805d2f1d1b18a2.png
( k3 R$ I4 t3 v

1 Y" q( J; \6 \4 c, v我们这里是将其加到DTCM中,即首地址为0x20000000,大家也可以存储到任意其它RAM地址,只要空间还够加载算法文件即可。推荐使用AXI SRAM(地址0x24000000),因为这块RAM空间足够大。+ C; J5 Z- r& z% z6 P/ D7 O

" O* F9 J- n2 u7 U: \) C如果要下载程序到内部Flash和外部QSPI Flash里面,需要做如下配置,两个下载算法都要添加进来:+ z: O3 b8 G3 ]3 o

$ E% V5 s. Z! `! q: e5 ?
9c03364b94f34e5f8e8b1e9b708430a6.png

& h- I! {" O- B  j4 C/ I$ m% ^/ t: `( {' w0 D7 C) c  Y
83.5.2 调试配置, f6 Q! a& v* l) T( z4 k' _
注意这里一定要够大,否则会提示算法文件无法加载:2 X+ u/ E4 d1 G1 P# j! p9 n4 X
- P$ d5 k+ D8 C4 P/ Y6 c
8 f, C) C, X* t" U6 z8 ?

4 b2 ]  b  h, U% ^9 l$ a  v我们这里是将其加到DTCM中,即首地址为0x20000000,大家也可以存储到任意其它RAM地址,只要空间还够加载算法文件即可。5 Y0 B& J+ D5 @1 d0 C
& q; A8 S! V; x
如果要做调试下载,需要做如下配置:
+ v0 a2 I* P. \* g9 c5 @" g  O6 {; V! N5 i# |3 s- z) @
93ce012aea4a1b38d8cd796b00fd7e32.png
% [+ y5 ?3 U; T" A$ b6 ~

/ [5 p6 ^, o5 F- k( b83.5.3 程序调试效果
: _" }  Y- U$ `2 \; O, v调试效果如下:) c* Z, c+ H- l( ~
6 ?% o4 @) w! c' u7 z( {
48019aea182ba08be716467429994567.png

- G8 `) w$ m  Y5 p! h( J5 y  {: E, ~& `8 C  g- D
83.6 实验例程说明
& y; R% @/ f, J, U/ \本章节配套例子:V7-064_内部Flash和QSPI Flash都运行程序的混合方式,无需单独制作BOOT和APP(强烈推荐)
+ {% B4 Y2 W' b. J9 P$ ]( J3 K; C( K1 n7 K) A( ]
1beb9dad80a6c5a7a1e6927282b23199.png
9 u) \& t3 m0 V; Z8 b" u8 T
& `; X: ?2 h" T& g
编译此程序弹出的警告不用管,可以选择屏蔽此警告:
0 d. f+ R0 b/ U! z3 J$ W2 g8 X
( |9 S4 b: Z% g% p, ^* t% M3 N% e! I3 o: }; L1 Z, j
1 D3 _9 r: k" Y( s: ?
83.7 总结* G- x, R. l4 W7 ^
本章节就为大家讲解这么,为了熟练掌握,大家可以尝试自己实现一个内部Flash和外部Flash混合运行的程序。
; `0 i+ ~! z8 v4 C0 g; X
- H) Y) f2 {( r4 C; ]2 s
( `: r- F7 D/ B4 T( @7 S: J: b) v+ ~1 q8 |* H
36e580d9d9e79756632fcf47c0fa92cb.png
收藏 评论0 发布时间:2021-12-21 22:16

举报

0个回答

所属标签

相似分享

官网相关资源

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