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

【经验分享】STM32H7的TCM,SRAM等五块内存的动态内存分配实现

[复制链接]
STMCU小助手 发布时间:2021-12-23 15:00
27.1 初学者重要提示- J* t+ D$ f4 r5 p; E! B
  学习本章节前,务必优先学习了解TCM,SRAM等五块内存区的基础知识,比较重要。
: d5 O' A5 Q% l, Y$ I6 t; {2 w  将RTX5系统的动态内存管理整理了出来,可以同时管理多个分区。如果其它RTOS中使用,记得做互斥保护或者加个调度锁均可。
( Y7 I" ?& Q; _9 M! ~  支持动态内存使用情况统计。' X9 a4 _2 T: x) S+ d; U
27.2 动态内存管理移植. [- T2 w( M2 _
移植比较简单,仅需添加两个文件到工程即可。
* ^: s/ |  Q9 f! T3 j% \$ A  m/ P8 l" I. ]$ ]* X% D: [
27.2.1 MDK版的移植
0 c' `1 c' |+ k5 n1 d4 o+ U  @  第1步,添加如下两个文件到MDK中
( F  s7 z2 N/ Y& @5 w9 g注,以本章配套例子为例,这两个文件的路径\User\malloc。1 y7 \- ^  q# b( w# R
2 z) o* E. A4 W) U7 q' h0 t
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDcvMTM3OTEwNy0yMDE5.png

$ Y) O# F; I/ k, \. h
4 I# Z2 q5 z6 ?3 @2 B3 Y3 h  第2步,添加路径。& R6 f+ n" u! _. {& [
  R+ R* C/ H- s- l# M7 C' c+ q
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDcvMTM3OTEwNy0yMDE5.png
5 _1 |9 d* H9 q/ I

4 ~" }. l$ t# q  第3步,添加头文件。2 q9 |5 r: B- g9 h1 }0 |
如果哪个源文件要用到动态内存,包含rtx_lib.h即可,本章配套例子是直接将其放在了bsp.h文件里面,哪个源文件要用到动态内存,直接包含bsp.h头文件即可。
! f6 j& j/ O, v7 \$ o* T1 k/ }0 g3 V- E; R/ L7 i- k0 W
通过这简单的三步就完成了MDK的移植。
& e* q# n5 _" p' T' }+ X9 ~' @6 U% w2 B) _9 R- I: [& U4 b
27.2.2 IAR版的移植% [: u" k. x& p6 d8 [" h
  第1步,添加如下两个文件到IAR中9 {; A9 p$ u  w# z
注,以本章配套例子为例,这两个文件的路径\User\malloc。( u5 f, \3 g! V2 J: i: G& G

+ Q; K% V5 h- L" |3 @4 X  P
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDcvMTM3OTEwNy0yMDE5.png
% \1 }& w4 n3 Q8 z$ B* W( S
: }4 o% K$ E! h2 k
  第2步,添加路径。
! H/ G! U) G1 g: L, `$ S- E: e* B
. h* _7 P/ M3 A6 f& s4 D
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDcvMTM3OTEwNy0yMDE5.png

% D: e) J/ w6 F6 j8 S3 c' O$ B0 t# v, x, l3 c
  第3步,添加头文件。
: z3 j/ w1 t( Z如果哪个源文件要用到动态内存,包含rtx_lib.h即可,本章配套例子是直接将其放在了bsp.h文件里面,哪个源文件要用到动态内存,直接包含bsp.h头文件即可。, E/ a0 c! F) g+ i5 c4 Q6 C& |
  J0 p" f9 e1 W; D: T
通过这简单的三步就完成了IAR的移植。  q, k7 C, `' {8 w7 I' r

# D& N2 Z2 `- y) L0 c# `27.3 动态内存的使用方法
9 k$ V2 z$ U4 a3 {3 t' P' [: N下面分别以MDK和IAR为例进行说明:2 Q$ v8 c6 u( y8 l1 C& P6 [2 z

; r8 `: Z% }5 w6 b: q27.3.1 MDK上的动态内存用法
) W7 ?$ }0 L% O! P  定义动态内存区
  G" q1 v! r' W' r, H比如当前的主RAM用的DTCM,我们就可以直接定义一块大的数组作为动态内存空间:
' O5 j6 a2 q3 w
. x+ t& t( \% [, t; f. S7 |
  1. /* DTCM, 64KB */9 g# P" \  V5 M, V, d6 k
  2. /* 用于获取当前使用的空间大小 *// }4 _7 v% W1 x4 m+ v, @, I4 ^
  3. mem_head_t *DTCMUsed; 7 h2 _: ^: [' q) G* ~
  4. /* 定义为64位变量,首地址是8字节对齐 */            
    - P( W% ~- u! X7 L  }+ @4 V# s; M
  5. uint64_t AppMallocDTCM[64*1024/8];
复制代码

( U+ \' h* m6 y, K如果要使用AXI SRAM作为动态内存空间,可以使用__attribute__((at( )))指定地址。$ I" K* R8 F+ P* v& z2 p

* @' B4 S& L" ]8 L: M
  1. /* D1域, AXI SRAM, 512KB */  @" T" Z: b, Q  ^+ w% O
  2. /* 用于获取当前使用的空间大小 */
    ( S  T; r3 P4 G  Y  k2 u6 i& L0 i. k
  3. mem_head_t *AXISRAMUsed;  / U" L/ S) m- p6 `$ F
  4. /* 定义为64位变量,首地址是8字节对齐 */
    . q4 Z* J6 d  l9 u0 M0 {# s( m
  5. uint64_t AppMallocAXISRAM[512*1024/8]__attribute__((at(0x24000000)));
复制代码

2 L8 A0 v4 N: M# _8 n; B9 A0 c" U  初始化动态内存区
1 B; I( X& v7 I) A调用动态内存管理提供的函数osRtxMemoryInit即可做初始化:
0 N! M! ~( l" S4 @8 E5 E/ k' ^5 ~* Q3 S, K4 |
osRtxMemoryInit(AppMallocDTCM,    sizeof(AppMallocDTCM));
4 X" T6 k/ R8 hosRtxMemoryInit(AppMallocAXISRAM, sizeof(AppMallocAXISRAM));2 w! |3 x" E. _' Y5 g. B& D

. M/ T$ o* ^/ t2 }  申请动态内存
/ T! X" Q! M9 L5 J- r通过函数void *osRtxMemoryAlloc (void *mem, uint32_t size, uint32_t type)做动态内存申请。1 K" s2 \, ~/ {, E2 C/ ~$ g+ _

. o2 [% m# U0 ^1 b0 o1 _第1个参数填写内存区首地址,比如申请的AppMallocDTCM,就填AppMallocDTCM即可。
2 i: Y% c" u) X8 C0 k3 X0 N. }: `5 A9 \; [- B, N
第2个参数填写申请的字节大小,单位字节。
" a1 i* x3 E  ]% a7 z: d1 T# F
" l( J, d3 V3 W* }% R, J: R第3个参数固定填0即可。
2 K" \' ~8 w( D% j
& e: I1 F0 \0 I" G返回值是所申请缓冲区的首地址,如果没有空间可用,将返回NULL,这点要特别注意!; W; E( Q2 \7 P0 t9 F
8 j7 G, ^. e) e1 a% y0 W& Y
举个例子:; s( ^( [# L! K" j: ^+ B  O/ K
5 u8 d- s: A! |5 R# N
  1. uint32_t *DTCM_Addres0, *AXISRAM_Addres0;# K7 i0 P. d! K4 w/ r. d) P- t$ j

  2. 4 a6 ~8 D' r6 S8 o, O% x; W4 J% B
  3. /* 从DTCM申请280字节空间,使用指针变量DTCM_Addres0操作这些空间时不要超过280字节大小 */        
    2 A! S2 d) l7 l) ]
  4. DTCM_Addres0 = osRtxMemoryAlloc(AppMallocDTCM, 280, 0);! T5 n- |* z# }- D
  5. DTCMUsed = MemHeadPtr(AppMallocDTCM);
    - l' I7 H" K' Y# J8 k) p/ U
  6. printf("DTCM总大小 = %d字节,申请大小 = 0280字节,当前共使用大小 = %d字节\r\n", , x$ e" @8 q7 l# s- S* `1 `  x) Z6 r
  7.                                                              DTCMUsed->size, DTCMUsed->used);
    , h1 G; w& S  T0 \! \- h, s: d, O
  8. 7 l- H7 F* W  [; S
  9. /* 从AXI SRAM 申请160字节空间,使用指针变量AXISRAM_Addres0操作这些空间时不要超过160字节大小 */        4 A) I9 s& C/ W
  10. AXISRAM_Addres0 = osRtxMemoryAlloc(AppMallocAXISRAM, 160, 0);
    ' C! O+ z* A, y: L: o, j/ K4 c' j" R
  11. AXISRAMUsed = MemHeadPtr(AppMallocAXISRAM);
    6 R0 I/ o0 d* h# }. B* |+ o+ L" U
  12. printf("AXI SRAM总大小 = %d字节,申请大小 = 0162字节,当前共使用大小 = %d字节\r\n", 6 z2 \8 V# F0 U1 Q3 Z
  13.                                                             AXISRAMUsed->size, AXISRAMUsed->used);
复制代码
$ g5 b' u4 G% m4 H) {- f: _
申请了空间后,就可以直接使用了。另外注意红色字体部分,通过DTCMUsed->used和AXISRAMUsed->used可以获取当前使用的空间大小。8 ~- W! `( K2 E
/ _6 W- n5 g/ Y! `6 o! Z1 c
  释放动态内存; h/ g4 ^/ F. T6 m+ s- r; u
通过函数uint32_t osRtxMemoryFree (void *mem, void *block)做动态内存释放。
" y4 X: |( ]/ ?% H
6 D9 |/ D* C( @0 p& m第1个参数填写内存区首地址,比如释放的AppMallocDTCM,就填AppMallocDTCM即可。
$ l" o9 y1 \& R! R+ ^: G- P
( M, E6 O3 |7 n/ W/ j8 A第2个参数填写申请内存时所获取的内存区首地址,这里用于释放。+ Z- |4 H2 ^7 L5 l5 a2 b3 C
$ E' ~+ ^) S( \. i( b. ^
返回值,返回1表示成功,返回0表示失败。
2 w, V. `' D3 f, q+ g2 \2 c) [1 e3 ?: m, n. l3 g/ M" z
举个例子:
/ y1 I! b- i! _$ k- W8 f* L  N/ e6 D
  1. /* 释放从DTCM申请的280字节空间 */
    & H4 ~9 I. [  v2 ^' U: |3 ], Z
  2. osRtxMemoryFree(AppMallocDTCM, DTCM_Addres0);" k2 S, `! {4 R  M/ F- y6 }9 ]
  3. DTCMUsed = MemHeadPtr(AppMallocDTCM);
    " E. z5 i* \# j! \, |, e! {
  4. printf("释放DTCM动态内存区申请的0280字节,当前共使用大小 = %d字节\r\n", DTCMUsed->used);
    + o# O* E; C& V& S

  5. 4 x# g8 e5 l' y3 D" l- h9 O
  6. /* 释放从AXI SRAM申请的160字节空间 */
    6 [, v  g, Z( c
  7. osRtxMemoryFree(AppMallocAXISRAM, AXISRAM_Addres0);; T9 C( U% f4 X  n" {! a! K' ?. Z
  8. AXISRAMUsed = MemHeadPtr(AppMallocAXISRAM);
    : Y+ A! E& p5 j
  9. printf("释放AXI SRAM动态内存区申请的0160字节,当前共使用大小 = %d字节\r\n", AXISRAMUsed->used);
复制代码

+ ?* s% X6 r* R  Z% H( s5 F, ~27.3.2 IAR上的动态内存用法
& u5 t  W0 m& F注:IAR使用这个动态内存管理,仅在定义时跟MDK略有不同,其它地方是一样的。5 H9 N! T  y! F
$ E$ [! z# Q7 e
  定义动态内存区
) R9 c- l+ T$ g$ ~% G7 Y比如当前的主RAM用的DTCM,我们就可以直接定义一块大的数组作为动态内存空间:6 G; q4 j. D2 `% t" n6 B" ^% H- S
* F6 d9 L( ]- t! [% t
  1. /* DTCM, 64KB */
    ' g0 L3 Y7 I& V$ J( o
  2. /* 用于获取当前使用的空间大小 *// y8 q7 |! m; H( e4 X: B$ r
  3. mem_head_t *DTCMUsed;
    - W# s, v- h( D- m+ c! @
  4. /* 定义为64位变量,首地址是8字节对齐 */            
    . g1 b  Y; q& p- N) y
  5. uint64_t AppMallocDTCM[64*1024/8];
复制代码
- d# z6 b3 ]# B/ \) Z
如果要使用AXI SRAM作为动态内存空间,可以使用__attribute__((at( )))指定地址。2 P( L* `- k' V! U0 V" `

( K' R. R& A+ S  H6 F
  1. /* D1域, AXI SRAM, 512KB */
    ; R; g8 G( y5 L
  2. /* 用于获取当前使用的空间大小 */- ?- u* V* V, k( Q) \+ v
  3. mem_head_t *AXISRAMUsed;  
    ) N3 Z' _* r8 G' _# |8 O2 X
  4. /* 指定下面数组的地址为0x24000000 */ " Z# F, b( m7 C1 s0 n+ B/ ?; ]4 O
  5. #pragma location = 0x24000000  [& }9 r0 J7 x4 ]0 @
  6. uint64_t AppMallocAXISRAM[512*1024/8];
复制代码

1 F4 |. B4 {  @: ?  初始化动态内存区0 f* d5 S/ X! j
调用动态内存管理提供的函数osRtxMemoryInit即可做初始化:
8 {; w) z$ w% a# r7 j9 l: P& ]) q& w1 E. k9 m! [: c
  1. osRtxMemoryInit(AppMallocDTCM,    sizeof(AppMallocDTCM));
    ) _$ g6 E8 D9 s& K6 ^( E
  2. osRtxMemoryInit(AppMallocAXISRAM, sizeof(AppMallocAXISRAM));
复制代码
) f* k7 L( T" F, _
  申请动态内存
7 y3 h' l; y, {& \0 a通过函数void *osRtxMemoryAlloc (void *mem, uint32_t size, uint32_t type)做动态内存申请。; Q6 q( j/ U+ y+ P: p
: b, D  U. I% Y, Q# s$ S
第1个参数填写内存区首地址,比如申请的AppMallocDTCM,就填AppMallocDTCM即可。
: `( \8 l8 s; I7 _
  [# b' O; u' q, m# N% h第2个参数填写申请的字节大小,单位字节。- N/ ?' j, o$ G; N6 p& z( ~
$ R1 z; ]4 M$ _4 }6 h
第3个参数固定填0即可。
; d$ P- U0 S" m- v8 b6 H# r! f+ ^
0 p0 R8 x3 o% f2 `# _9 m3 d返回值是所申请缓冲区的首地址,如果没有空间可用,将返回NULL,这点要特别注意!
) y6 g3 n% _/ {8 A; P/ u; N5 L$ D" K/ d/ Y: y. a2 Z/ s
举个例子:0 G3 x% H6 S' ]6 `2 t/ W, ]7 G& M1 ~
9 P. Y$ O3 U' {" G
  1. uint32_t *DTCM_Addres0, *AXISRAM_Addres0;
    0 ]$ I5 e& `2 [2 K$ Z
  2. * [  N; [9 s1 ~  q* M$ [
  3. /* 从DTCM申请280字节空间,使用指针变量DTCM_Addres0操作这些空间时不要超过280字节大小 */          A# H' G. t: |
  4. DTCM_Addres0 = osRtxMemoryAlloc(AppMallocDTCM, 280, 0);
    ( e/ x: u2 r/ D& k& `9 G7 g3 R; ^: X# D
  5. DTCMUsed = MemHeadPtr(AppMallocDTCM);
    ( V; B4 @8 h. ^( P' I% B
  6. printf("DTCM总大小 = %d字节,申请大小 = 0280字节,当前共使用大小 = %d字节\r\n",
    . z, t2 b4 ~4 `1 K3 U3 @
  7.                                                              DTCMUsed->size, DTCMUsed->used);; `' R: M1 }$ y$ O
  8. 6 z8 g4 \3 d4 s" L
  9. /* 从AXI SRAM 申请160字节空间,使用指针变量AXISRAM_Addres0操作这些空间时不要超过160字节大小 */        ; c2 _" Q" P" I- U& H
  10. AXISRAM_Addres0 = osRtxMemoryAlloc(AppMallocAXISRAM, 160, 0);1 V4 {  O% U, R9 J4 s( A
  11. AXISRAMUsed = MemHeadPtr(AppMallocAXISRAM);
    3 E6 [7 @; J/ k" a) \7 g* M
  12. printf("AXI SRAM总大小 = %d字节,申请大小 = 0162字节,当前共使用大小 = %d字节\r\n",
    # f6 n4 t+ M7 g8 Q/ x$ G6 t
  13.                                                             AXISRAMUsed->size, AXISRAMUsed->used);
复制代码
+ ]1 |- B  t8 g. @4 Y+ T
申请了空间后,就可以直接使用了。另外注意红色字体部分,通过DTCMUsed->used和AXISRAMUsed->used可以获取当前使用的空间大小。$ M2 ^, E4 g& |0 G3 F2 q

; t& N6 f# B# g  释放动态内存5 Y6 s" y, P5 f% J
通过函数uint32_t osRtxMemoryFree (void *mem, void *block)做动态内存释放。! |* l5 O9 x! A  u; y) o8 ?" A) M+ A

" T; L# r. Z, O8 X8 X8 ~第1个参数填写内存区首地址,比如释放的AppMallocDTCM,就填AppMallocDTCM即可。1 U' o8 r1 \& k1 W: W
, J" [% L; I" \- h
第2个参数填写申请内存时所获取的内存区首地址,这里用于释放。0 J2 |2 k5 B8 U! W
4 b, ]2 g5 s8 C. ~
返回值,返回1表示成功,返回0表示失败。
7 P0 y' x  W" F
& _" Q& {1 t: F" W# Q& D举个例子:: j+ ~& q7 \3 ?, T* W, M$ C# ]$ k# c

, L8 I6 {+ o" \( u
  1. /* 释放从DTCM申请的280字节空间 */' Q" C0 g+ M, |/ u
  2. osRtxMemoryFree(AppMallocDTCM, DTCM_Addres0);4 C6 W; I+ K- R( ^# E; c8 f
  3. DTCMUsed = MemHeadPtr(AppMallocDTCM);: w& h7 k/ F: O6 t' q7 ~; M+ Y- M
  4. printf("释放DTCM动态内存区申请的0280字节,当前共使用大小 = %d字节\r\n", DTCMUsed->used);
    % _8 B* {( u. f" S+ b! Y# \& F% r! v
  5. ; g0 O$ q$ l9 n! `
  6. /* 释放从AXI SRAM申请的160字节空间 */
    / n: Z) v7 U' J, Q
  7. osRtxMemoryFree(AppMallocAXISRAM, AXISRAM_Addres0);
    ( d3 j+ N6 B, t" h  E6 ~' q; T
  8. AXISRAMUsed = MemHeadPtr(AppMallocAXISRAM);
    4 S. N2 \1 K$ d, n1 A
  9. printf("释放AXI SRAM动态内存区申请的0160字节,当前共使用大小 = %d字节\r\n", AXISRAMUsed->used)
复制代码
% }6 p$ L5 [# N& J9 \7 w/ y& M
27.4 实验例程说明(MDK). }2 Y  J2 E. g! t8 _
配套例子:! y2 b; J0 y  [% W3 a
V7-006_TCM,SRAM等五块内存的动态内存分配实现2 i! n2 }6 ~, o4 Y  z$ f. S4 v" x

3 @3 X3 D: b/ [$ h% ~实验目的:) s6 e* \% `0 F/ O. W
学习TCM,SRAM等五块内存的动态内存分配实现。* g) H( x$ X& q4 C

6 T/ n- H% n- Y7 W7 ?6 g
4 n; n3 o- h, e实验内容/ w2 B: T) E6 q: t1 p/ t
启动自动重装软件定时器0,每100ms翻转一次LED2。
7 X: f" c$ b' V& M  Q4 P# C, R; |, K" s

$ z; r: B: {1 N/ }实验操作:
2 L8 }* D% a2 z& aK1键按下,从DTCM依次申请280字节,64字节和6111字节。
& t) |. i) J. U, BK1键松开,释放从DTCM申请的空间。+ g( V3 I* e) l& m( y
K2键按下,从AXI SRAM依次申请160字节,32字节和2333字节。( A, c, Q9 @, O; @* Z# ~. G
K2键松开,释放从AXI SRAM申请的空间。2 I: a$ D" G# v, I$ b
K3键按下,从D2域SRAM依次申请200字节,96字节和4111字节。
3 {% m8 L9 k: G* G3 E# g) X" w# a$ {* bK3键松开,释放从D2域SRAM申请的空间。. C; [+ x2 {' G; o, C
摇杆OK键按下,从D3域SRAM依次申请300字节,128字节和5111字节。
/ m. J% C# n( P摇杆OK键松开,释放从D3域SRAM申请的空间。+ s5 g! y9 B$ z9 R( O

( {/ B- ?8 D. K3 e
+ `! Q7 z5 A8 ^  j1 F$ B9 \上电后串口打印的信息:
3 W# K; Y- I/ b- u& r
: Y- ^/ d% J; ^8 h9 T3 O, z$ q波特率 115200,数据位 8,奇偶校验位无,停止位 13 V1 a6 z- w" X- \! J

) C4 g0 E: w; Z! g3 n# f
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDcvMTM3OTEwNy0yMDE5.png

/ ~  m6 ]4 U3 D$ t1 R- ?$ E% b$ j/ y& W: q  G5 u* Q- r. K2 y$ @
程序设计:
1 A6 @6 ~  H9 ?
5 F' n# i* }% t8 ?  系统栈大小分配:
( A& q& [% L7 r4 d
! ^; o, ?( m# M8 x$ F+ b0 W
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDcvMTM3OTEwNy0yMDE5.png

9 j$ }2 e) e" x. w7 P9 z' M8 _
. h  J% V, C. c1 l5 MRAM空间用的DTCM:7 l8 V2 g' T$ Z3 w+ @1 A0 I/ |
% h' q' K6 E( E! j7 `  c
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDcvMTM3OTEwNy0yMDE5.png

6 j6 D3 p, j3 a" S( E  @5 r. e, F' w- [. l& E2 E  J2 H( B
  硬件外设初始化$ @5 e$ p1 w( m+ U, y; H( j

" ^& U' |& U6 n! E4 w# E! d硬件外设的初始化是在 bsp.c 文件实现:
& H' ?, [- I" Y0 G5 c% b4 _, d  X$ n; Q" P
  1. /*3 E; J# V+ ~6 w- r* M7 A7 G1 t9 w
  2. *********************************************************************************************************
    ) t0 u! N4 G5 _: M6 M
  3. *        函 数 名: bsp_Init) h, P9 E5 V' ^
  4. *        功能说明: 初始化所有的硬件设备。该函数配置CPU寄存器和外设的寄存器并初始化一些全局变量。只需要调用一次/ z9 N* U5 ?1 G
  5. *        形    参:无$ ~) F+ {7 a4 C% z
  6. *        返 回 值: 无9 Y! U# c& ~) f8 u$ S, G
  7. *********************************************************************************************************( [2 a% \3 d$ d9 ^& R0 P7 B" j
  8. */
    4 a! g* i& C8 R3 `4 |  o/ m
  9. void bsp_Init(void)6 o7 g4 T8 B* z# a8 C: H- `
  10. {
    7 [; E7 d) @! e! H
  11.     /* 配置MPU */
    ) \9 J- n" f7 v* w( A* _2 b
  12.         MPU_Config();
    : {# P0 n- G; U$ L* U, k+ J$ j  q# T) Q/ n
  13.         
    7 e1 ^/ B' e2 S2 V
  14.         /* 使能L1 Cache *// R$ _0 g) K; E/ _) u
  15.         CPU_CACHE_Enable();" m4 @; U% l7 W
  16. ) x( a  ^! b- h; c
  17.         /*
      c- ^8 g: ^( F/ r
  18.        STM32H7xx HAL 库初始化,此时系统用的还是H7自带的64MHz,HSI时钟:
    6 a$ z  q' e* p, m* t
  19.            - 调用函数HAL_InitTick,初始化滴答时钟中断1ms。! P' u* o% C7 n: p. H, ~
  20.            - 设置NVIV优先级分组为4。
    + \3 W. Z4 @, o* I( X, H8 I
  21.          */$ `2 K7 T0 P( ^8 x9 O: L
  22.         HAL_Init();/ {# H8 o% F8 U% Z4 ~: o

  23. 9 A/ k3 k5 l4 ^: |( k
  24.         /*
    + T0 P1 j/ L  @. B  O
  25.        配置系统时钟到400MHz
    1 Z# C2 Q3 Y. U% ]2 A+ C$ F# h0 `
  26.        - 切换使用HSE。
    2 G; T+ m) X1 Q" U9 K# x' {7 G
  27.        - 此函数会更新全局变量SystemCoreClock,并重新配置HAL_InitTick。/ t5 I$ k  N3 g$ h! O% _% [
  28.     */2 J% l# f1 i! P, C: J
  29.         SystemClock_Config();' R. F) L; X1 _7 S. k0 H3 @1 a
  30. + z6 z' Q" k3 d6 ?
  31.         /*
    0 g8 ~! i3 k& `2 J: v; _7 q2 G4 e, W/ ^
  32.            Event Recorder:
    6 @5 C) f0 }. m0 ^
  33.            - 可用于代码执行时间测量,MDK5.25及其以上版本才支持,IAR不支持。
    ) y9 U  G. d' F$ |: m" A; B1 i% g
  34.            - 默认不开启,如果要使能此选项,务必看V7开发板用户手册第xx章
    5 p! y, W8 x) B# K/ Z
  35.         */        
    2 B3 W# h! S3 G9 g
  36. #if Enable_EventRecorder == 1  # |' Q! c6 c. g. Q& |" l- ~! J
  37.         /* 初始化EventRecorder并开启 */
    * t. _. h: \% i8 P
  38.         EventRecorderInitialize(EventRecordAll, 1U);3 \7 y4 }% Q2 O, F' F. R0 D( g
  39.         EventRecorderStart();2 \) F4 x* \2 c* l1 K
  40. #endif6 L  U$ Z# A8 B8 L6 v6 q
  41.         0 @) w! c/ I3 W1 l, {% {& [0 D7 j3 [5 Z
  42.         bsp_InitKey();            /* 按键初始化,要放在滴答定时器之前,因为按钮检测是通过滴答定时器扫描 */: U, d# l; z- a, R, ~6 O. Q
  43.         bsp_InitTimer();          /* 初始化滴答定时器 */
    7 V4 P6 S6 ~# v7 q3 h' @
  44.         bsp_InitUart();        /* 初始化串口 */0 M2 T' a- p0 d- H- d) i6 H
  45.         bsp_InitExtIO();        /* 初始化FMC总线74HC574扩展IO. 必须在 bsp_InitLed()前执行 */        ! h' a  `5 s* k( x
  46.         bsp_InitLed();            /* 初始化LED */        * l/ ]5 q: ]1 ?1 H# m8 ~
  47. }
复制代码

% z" F5 q, F5 J( ~% f1 ]  MPU配置和Cache配置:; L7 i6 p) \0 Q/ \/ b' [$ \
数据Cache和指令Cache都开启。
, d4 E% h  C# P9 h: a- `
6 ^4 Y3 N& I' U9 wAXI SRAM的MPU属性:0 X' X. g9 t: l7 p7 E3 t

( S: i* Z% |4 S, M* f. N0 nWrite back, Read allocate,Write allocate。
0 V. W4 N  {- ^7 l' N% r; g0 `( n
FMC的扩展IO的MPU属性:  l. A6 i5 b9 M, I8 J

3 N* ~+ A) U5 \% T4 n. S必须Device或者Strongly Ordered。* p! \3 j/ ]8 T: Y( Z
( k7 f/ G% e3 I5 s- g' _' F- j
D2 SRAM1,SRAM2和SRAM3的MPU属性:% U3 B, X' V9 n. P
9 g5 ]; S4 n1 o' \' X  A
Write through, read allocate,no write allocate。* \+ t6 P2 d7 G3 N& K
/ V8 u+ J/ t4 w& a! ^4 O
D3 SRAM4的MPU属性:2 A& u# \. d+ k
( e* q$ \1 s* j/ z/ W
Write through, read allocate,no write allocate。
5 r/ g5 U) W( I! U! S  p0 w0 X( L, M2 j  z8 [( e
  1. /*
      Z9 f! P0 e4 V7 d4 o" a9 p
  2. *********************************************************************************************************. i4 Y$ R+ {3 v% V) P  p
  3. *        函 数 名: MPU_Config7 |1 V6 o0 u& k
  4. *        功能说明: 配置MPU
    6 w. ]1 ]* M! Q$ F
  5. *        形    参: 无
    . r) r! ]1 o1 n! I% p& l% m. S
  6. *        返 回 值: 无' S$ j) `! E5 |, d8 ?) C
  7. *********************************************************************************************************( @! p' ], U1 i, `& P% i# v8 a
  8. */; r8 |- |$ Z3 e6 P$ P2 a, f
  9. static void MPU_Config( void ), ]$ S" A+ r* g# Y) S: x2 W+ B
  10. {
    8 F7 q# U; C7 O# ^) ~: w# K! ]7 {) Z
  11.         MPU_Region_InitTypeDef MPU_InitStruct;
    9 U* I+ E" T* Q! s$ j

  12. + Y1 T0 _  n5 n5 z5 t2 i2 j
  13.         /* 禁止 MPU */
    % {: ~$ w* ^7 ]' n! n8 `2 l% K1 a: h0 D
  14.         HAL_MPU_Disable();
    4 s3 p' p/ L; I3 @2 L7 w- T

  15. ' ^' e) i. u* ~) d+ l) k( }
  16.         /* 配置AXI SRAM的MPU属性为Write back, Read allocate,Write allocate */; y3 E+ a7 Y1 s
  17.         MPU_InitStruct.Enable           = MPU_REGION_ENABLE;; U; j+ E) i: i  i$ ]7 A7 u0 _( }
  18.         MPU_InitStruct.BaseAddress      = 0x24000000;
    7 p5 v9 w# Z& n0 U
  19.         MPU_InitStruct.Size             = MPU_REGION_SIZE_512KB;
      j5 |9 Q* g& @3 O4 G
  20.         MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
    0 v/ ^4 A$ R1 P. R) j" n
  21.         MPU_InitStruct.IsBufferable     = MPU_ACCESS_BUFFERABLE;- W# t" \( S) A5 R/ J0 I7 O6 \
  22.         MPU_InitStruct.IsCacheable      = MPU_ACCESS_CACHEABLE;
    ' v! W8 n) T/ x4 [3 {! j  B+ i
  23.         MPU_InitStruct.IsShareable      = MPU_ACCESS_NOT_SHAREABLE;
    1 |% o. r& s5 g1 B" N- V" R2 S
  24.         MPU_InitStruct.Number           = MPU_REGION_NUMBER0;7 z3 u( \; f2 n) _9 Q
  25.         MPU_InitStruct.TypeExtField     = MPU_TEX_LEVEL1;, U, T: K: w3 |  K
  26.         MPU_InitStruct.SubRegionDisable = 0x00;
    - o; s6 }; w5 c' _/ y5 j/ G
  27.         MPU_InitStruct.DisableExec      = MPU_INSTRUCTION_ACCESS_ENABLE;$ j" u/ R7 ?. ?
  28. 5 g" X& c3 G2 l3 H# q3 r
  29.         HAL_MPU_ConfigRegion(&MPU_InitStruct);
    / }5 H2 h( @( L" l0 T6 i* m6 v' \6 u
  30.         
    5 W1 z( y! S2 `) a, g
  31.         
    0 P8 H8 f" ~% R+ V
  32.         /* 配置FMC扩展IO的MPU属性为Device或者Strongly Ordered */
    4 `" r. B- O( n& i( h9 B7 a
  33.         MPU_InitStruct.Enable           = MPU_REGION_ENABLE;
    / h* j. L; k" n  o$ e
  34.         MPU_InitStruct.BaseAddress      = 0x60000000;
    # B0 W# A4 s# l9 w; g- s
  35.         MPU_InitStruct.Size             = ARM_MPU_REGION_SIZE_64KB;        : j/ q- J$ L* R# f$ n
  36.         MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;. R% X' N, I8 G. s! a7 W
  37.         MPU_InitStruct.IsBufferable     = MPU_ACCESS_BUFFERABLE;, P- @  i4 w+ I9 f# S
  38.         MPU_InitStruct.IsCacheable      = MPU_ACCESS_NOT_CACHEABLE;! R1 \+ d' X5 n" N  M
  39.         MPU_InitStruct.IsShareable      = MPU_ACCESS_NOT_SHAREABLE;) W, W& o* B! l8 ~4 k7 V$ q& k
  40.         MPU_InitStruct.Number           = MPU_REGION_NUMBER1;
    , h2 w& w, x: W1 ^
  41.         MPU_InitStruct.TypeExtField     = MPU_TEX_LEVEL0;. f! P: h( F9 a7 S  ~6 q  X
  42.         MPU_InitStruct.SubRegionDisable = 0x00;1 Z7 p6 O8 v. o- r
  43.         MPU_InitStruct.DisableExec      = MPU_INSTRUCTION_ACCESS_ENABLE;9 k; z3 `! t5 J
  44.         % _; p: F- P- T/ W5 r
  45.         HAL_MPU_ConfigRegion(&MPU_InitStruct);
    $ P' q; Y( U, |0 R  {0 |( v' f8 w! g
  46.         2 {: b/ ~! j3 q% u- k4 C/ g6 ]" F
  47.         /* 配置SRAM1的属性为Write through, read allocate,no write allocate */
    . [* w/ }; A8 X: g( X/ W
  48.     MPU_InitStruct.Enable           = MPU_REGION_ENABLE;
    * i5 l' _$ G9 b
  49.     MPU_InitStruct.BaseAddress      = 0x30000000;: G/ D' F2 a; D0 P" D
  50.     MPU_InitStruct.Size             = ARM_MPU_REGION_SIZE_128KB;        
    " h6 R- g( U* l# f. n0 ]! ]. V: D
  51.     MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;. d7 `" V  ^+ @! b5 Y3 b
  52.     MPU_InitStruct.IsBufferable     = MPU_ACCESS_NOT_BUFFERABLE;% V6 i. c6 j2 m" @( m' Q) o
  53.     MPU_InitStruct.IsCacheable      = MPU_ACCESS_CACHEABLE;. d5 M. u4 i- T" o5 h
  54.     MPU_InitStruct.IsShareable      = MPU_ACCESS_NOT_SHAREABLE;! k$ p5 o& s- C$ y, S: z1 O
  55.     MPU_InitStruct.Number           = MPU_REGION_NUMBER2;
    6 K2 |, `7 B! B; R5 J. r
  56.     MPU_InitStruct.TypeExtField     = MPU_TEX_LEVEL0;9 g) Z. C/ b- ?5 j, d; }
  57.     MPU_InitStruct.SubRegionDisable = 0x00;
    1 T7 U+ e1 W- ~* r8 z. V
  58.     MPU_InitStruct.DisableExec      = MPU_INSTRUCTION_ACCESS_ENABLE;
    % f7 T( c3 s+ x  r8 {

  59. 3 W' {% N% o5 ?6 r
  60.     HAL_MPU_ConfigRegion(&MPU_InitStruct);: m( n! n( m' R' r  H
  61.         7 j9 f5 ^2 b: N+ {. n! E- w
  62.         /* 配置SRAM2的属性为Write through, read allocate,no write allocate */
    8 j* E  c# Q* v" O) x
  63.     MPU_InitStruct.Enable           = MPU_REGION_ENABLE;* ?- M) {/ d/ R# s7 r  w
  64.     MPU_InitStruct.BaseAddress      = 0x30020000;/ s3 K, c0 N3 Q3 \) F
  65.     MPU_InitStruct.Size             = ARM_MPU_REGION_SIZE_128KB;        5 E! o6 A- e  s% X, b* I( O4 C
  66.     MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;3 o! b. z9 E' i0 o+ H1 v$ E! L
  67.     MPU_InitStruct.IsBufferable     = MPU_ACCESS_NOT_BUFFERABLE;
    8 w4 E; k3 W. U8 _6 w" L
  68.     MPU_InitStruct.IsCacheable      = MPU_ACCESS_CACHEABLE;2 g) x" ]  _  x- T+ i" r. r
  69.     MPU_InitStruct.IsShareable      = MPU_ACCESS_NOT_SHAREABLE;7 k7 a4 ?& I5 g7 U$ `* m$ c( o
  70.     MPU_InitStruct.Number           = MPU_REGION_NUMBER3;9 m! ^0 c" E* G3 f6 t
  71.     MPU_InitStruct.TypeExtField     = MPU_TEX_LEVEL0;
    9 }7 z% u: B% A% I6 p, `
  72.     MPU_InitStruct.SubRegionDisable = 0x00;( L: z7 G! ]: T6 ~" S- T
  73.     MPU_InitStruct.DisableExec      = MPU_INSTRUCTION_ACCESS_ENABLE;) Z1 R. g9 E/ q1 Q4 Y8 B, U& T

  74. ) S6 Z- s7 Z; K+ l3 A3 Q: A% J
  75.     HAL_MPU_ConfigRegion(&MPU_InitStruct);, e, C, q$ ]2 c
  76.   c% o$ r' _) K% [- t
  77. - Z: h( w- {+ X6 J
  78.     /* 配置SRAM3的属性为Write through, read allocate,no write allocate */
    : }. F( x( A, r& Z5 @. d- L
  79.     MPU_InitStruct.Enable           = MPU_REGION_ENABLE;: s) N. N. I2 n0 f! w, Q2 R
  80.     MPU_InitStruct.BaseAddress      = 0x30040000;
      L. `9 ?  c, d6 ~( N
  81.     MPU_InitStruct.Size             = ARM_MPU_REGION_SIZE_32KB;        
    3 u0 Y# E9 f* q4 B; R
  82.     MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
    9 H' |& s% g9 U" W
  83.     MPU_InitStruct.IsBufferable     = MPU_ACCESS_NOT_BUFFERABLE;! T0 H1 Y% R9 K+ l
  84.     MPU_InitStruct.IsCacheable      = MPU_ACCESS_CACHEABLE;
    ! b) |2 y+ s2 K* p9 ?
  85.     MPU_InitStruct.IsShareable      = MPU_ACCESS_NOT_SHAREABLE;2 k- g1 @  m( o  g3 Z
  86.     MPU_InitStruct.Number           = MPU_REGION_NUMBER4;
    5 K0 a4 V6 W6 B
  87.     MPU_InitStruct.TypeExtField     = MPU_TEX_LEVEL0;
    ' o. ~. j( _3 Z- e, c
  88.     MPU_InitStruct.SubRegionDisable = 0x00;7 M0 R3 q# Z' \( g
  89.     MPU_InitStruct.DisableExec      = MPU_INSTRUCTION_ACCESS_ENABLE;6 t6 n7 H) v8 ]* p' t' Y# x  ]/ l# D
  90. 5 N. L; o! @7 L$ w
  91.     HAL_MPU_ConfigRegion(&MPU_InitStruct);+ j+ y. Z1 A, j0 W" Y6 V0 P
  92.         
    ) C9 H8 i+ @2 `1 Y
  93.         
    0 u3 j) g2 v- j
  94.         /* 配置SRAM4的属性为Write through, read allocate,no write allocate */1 X) C/ o9 S, A. T6 G
  95.     MPU_InitStruct.Enable           = MPU_REGION_ENABLE;8 u' |/ R4 f% q# d5 r
  96.     MPU_InitStruct.BaseAddress      = 0x38000000;
    ( T" F& M$ [8 y4 @
  97.     MPU_InitStruct.Size             = ARM_MPU_REGION_SIZE_64KB;        $ Z( t9 p) K& o* F
  98.     MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
    & O# M  z9 X4 t) u- m- z" |
  99.     MPU_InitStruct.IsBufferable     = MPU_ACCESS_NOT_BUFFERABLE;
    7 K* A& ^1 I7 h$ C, g# i) Z
  100.     MPU_InitStruct.IsCacheable      = MPU_ACCESS_CACHEABLE;
    3 Z+ ]6 d3 K1 g1 u" Y* @
  101.     MPU_InitStruct.IsShareable      = MPU_ACCESS_NOT_SHAREABLE;$ x% b5 X+ v/ [5 ~+ `+ W& w5 c* H
  102.     MPU_InitStruct.Number           = MPU_REGION_NUMBER5;
    . z9 _9 w  L  r
  103.     MPU_InitStruct.TypeExtField     = MPU_TEX_LEVEL0;
    6 S4 p4 z4 S5 j& s# y5 I' n( D$ K- c
  104.     MPU_InitStruct.SubRegionDisable = 0x00;
    ( X* a8 g' C  ~: Z" h0 t
  105.     MPU_InitStruct.DisableExec      = MPU_INSTRUCTION_ACCESS_ENABLE;
    ! |$ z$ Q# o1 H% K8 {5 u
  106. % m8 }2 M; j& n7 ]- C
  107.     HAL_MPU_ConfigRegion(&MPU_InitStruct);
    3 |( d  |9 i+ Q* V; c
  108.         
    ) x! j6 v' B$ J2 h( P
  109.         /*使能 MPU */' {2 H" f! T8 `: w
  110.         HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);
    " t) H9 T5 O0 k1 l& O1 D% v
  111. }7 Z2 ~' K7 x# h' S1 f% X0 T
  112. 4 \4 }! P8 X5 [" A9 r  H0 V  A
  113. /*
    + N7 u  C" e0 g- @0 w( @& r
  114. *********************************************************************************************************: W* ^/ C: q4 ]+ ]; O8 g
  115. *        函 数 名: CPU_CACHE_Enable/ f) g2 X6 K5 c* s* h" S# M
  116. *        功能说明: 使能L1 Cache) Q# F6 g- r1 w" w
  117. *        形    参: 无6 Y0 d& U5 d0 c
  118. *        返 回 值: 无
    & j; B. Y; w( B; o6 O8 h$ [- k* O
  119. *********************************************************************************************************) P+ h; X9 [2 `# R- l
  120. */2 F5 S/ f+ O& i, V
  121. static void CPU_CACHE_Enable(void): \' u% d' m+ c0 C. j6 X
  122. {
    & t4 B% F9 i- J) C& T0 K
  123.         /* 使能 I-Cache */
    / S6 R8 M  X7 P! m% _: O& ]0 e# ~+ j6 N
  124.         SCB_EnableICache();
    " M1 D, p# Z5 T
  125. 1 u4 L6 e6 q" E6 k8 F2 ]1 l
  126.         /* 使能 D-Cache */! l1 T9 T6 n' j0 |
  127.         SCB_EnableDCache();
    ( E9 Q- R& y( |. N
  128. }
复制代码
: w! U4 H6 s+ Q9 L
  主功能:
5 q3 O" J  H7 K$ U- W% r0 G" \5 i' {1 q9 I! l; [1 I1 |0 Y
主程序实现如下操作:, X# K- l/ B! u  f/ n5 V. ~
/ N$ G& L) P$ w
  启动自动重装软件定时器0,每100ms翻转一次LED2。0 u1 _& {; Z# [) U
  K1键按下,从DTCM依次申请280字节,64字节和6111字节。& C$ i. u, F/ Z; B
  K1键松开,释放从DTCM申请的空间。
/ h" K$ b/ M6 [4 a6 n' s  K2键按下,从AXI SRAM依次申请160字节,32字节和2333字节。
! p! _# X5 H3 K7 c/ }+ o" K  K2键松开,释放从AXI SRAM申请的空间。. v, H. _; q9 j# P& d. b$ U
  K3键按下,从D2域SRAM依次申请200字节,96字节和4111字节。! [  s0 v8 y) B4 C) P5 \3 }1 P& a# T
  K3键松开,释放从D2域SRAM申请的空间。
: V8 C+ U' G" c. D, p, s7 _2 j) ?  摇杆OK键按下,从D3域SRAM依次申请300字节,128字节和5111字节。
8 W- F0 H9 w* P) H& x7 Z0 U  摇杆OK键松开,释放从D3域SRAM申请的空间。1 f2 @( v4 \7 y" I
  1. /*
    * q  r. b; a! x
  2. *********************************************************************************************************
    ) U/ n" W2 J9 m7 ^2 E
  3. *        函 数 名: main6 J0 R+ Q3 ]5 Q) n/ ]
  4. *        功能说明: c程序入口4 z: }9 R0 Z6 F+ G) S% [; z% C6 y
  5. *        形    参: 无
    1 w$ q8 X7 Z, D& u/ Q* m. M# w
  6. *        返 回 值: 错误代码(无需处理)
    , a2 M9 H# P/ t2 T. O" n6 J* s) X
  7. ********************************************************************************************************** E& w5 c( i6 F) T) q' w' f; w1 n
  8. */
    8 ]6 j+ L' j/ I0 a$ I
  9. int main(void)5 n# d' _  F0 n8 |, ?
  10. {8 z2 F7 k( x, W/ |4 X0 O
  11.         uint8_t ucKeyCode;                /* 按键代码 */
    9 f# L# j" k9 |& r
  12.         uint32_t *DTCM_Addres0, *AXISRAM_Addres0, *SRAM1_Addres0, *SRAM4_Addres0;
    4 B8 H" T) F  {( L- F# I
  13.         uint16_t *DTCM_Addres1, *AXISRAM_Addres1, *SRAM1_Addres1, *SRAM4_Addres1;; H* @( l8 V9 l9 O% I
  14.         uint8_t  *DTCM_Addres2, *AXISRAM_Addres2, *SRAM1_Addres2, *SRAM4_Addres2;
    , e7 M7 v/ i! `+ t$ z, }3 S, q  z0 Y/ n

  15. 8 I+ m" N) o4 Q6 j. M

  16. ! J7 D3 u9 _+ \; W% S. a8 R6 y
  17.         bsp_Init();                /* 硬件初始化 */8 t/ d( P6 s3 u& {: m% n
  18.         
    * A% \: z; S1 M  B* Q0 b
  19.         /* 初始化动态内存空间 */; s% }: v2 f: n# f1 \: z
  20.         osRtxMemoryInit(AppMallocDTCM,    sizeof(AppMallocDTCM));# n: u# V5 B, @
  21.         osRtxMemoryInit(AppMallocAXISRAM, sizeof(AppMallocAXISRAM));
    2 C) U9 |' V5 C9 Q# t5 d
  22.         osRtxMemoryInit(AppMallocSRAM1,   sizeof(AppMallocSRAM1));5 h. o" ~- S" _$ }$ p
  23.         osRtxMemoryInit(AppMallocSRAM4,   sizeof(AppMallocSRAM4));
    / M4 L% W" S* }) Q$ d9 _
  24.         ; G% a" \* q4 x
  25.         PrintfLogo();        /* 打印例程名称和版本等信息 */9 ~9 e' [9 y7 _6 P
  26.         PrintfHelp();        /* 打印操作提示 */8 w6 c/ {6 t5 V5 o

  27.   C' `3 s% F1 |6 z! L2 ?
  28.         bsp_StartAutoTimer(0, 100);        /* 启动1个100ms的自动重装的定时器 */, [2 W7 f9 F" S  @5 ^( i
  29.         , l( u( ^/ b6 H) `% I; q" x( R

  30. / Z  b7 N" h" s
  31.         /* 进入主程序循环体 */6 R/ v. X( h* s
  32.         while (1)* ~% z: f8 W  p& o4 J8 e, b
  33.         {
    . V& f4 i: C; p7 c* r3 u9 H
  34.                 bsp_Idle();                /* 这个函数在bsp.c文件。用户可以修改这个函数实现CPU休眠和喂狗 */
    : g, o, x$ }, N7 a' j- g7 J& d
  35. ) n1 a7 F8 W- r9 }) p
  36.                 /* 判断定时器超时时间 */7 L0 z7 R0 x5 w" L- O
  37.                 if (bsp_CheckTimer(0))        
    . M. I, g4 N' C7 K
  38.                 {
    1 T: Y7 X1 ^. h9 ?7 }! M
  39.                         /* 每隔100ms 进来一次 */  ! L) H$ W5 u+ v0 e! T% |6 ^* O
  40.                         bsp_LedToggle(2);  ?- O( w, i# ~1 h" ]
  41.                 }" o  ?* E) R' K3 Z

  42. ; r9 s# w2 {8 m6 j/ X$ r4 Y- G
  43.                 /* 按键滤波和检测由后台systick中断服务程序实现,我们只需要调用bsp_GetKey读取键值即可。 */
    1 p, E$ f% W' t9 b% }) d
  44.                 ucKeyCode = bsp_GetKey();        /* 读取键值, 无键按下时返回 KEY_NONE = 0 */* i3 J0 u( O" h2 Z
  45.                 if (ucKeyCode != KEY_NONE)
    ! v( x) b7 p) W+ {' k& C
  46.                 {
    " s8 [5 y  \4 D
  47.                         switch (ucKeyCode)
    ' o6 |. {5 ?8 }6 Z
  48.                         {9 l% ?! M; Y- j$ t  G5 [
  49.                 /* 从DTCM依次申请280字节,64字节和6111字节 */# c& y' D* o! f+ x7 D- j( i
  50.                                 case KEY_DOWN_K1:        9 Y. C2 d/ [, ~- I$ ^* s' V
  51.                     /* 从DTCM申请280字节空间,使用指针变量DTCM_Addres0操作这些空间时不要超过280字节大小 */
    ! s/ a7 g# Z( u2 M8 ?
  52.                                         printf("=========================================================\r\n");: v& l9 v' T$ p( `; g
  53.                                         DTCM_Addres0 = osRtxMemoryAlloc(AppMallocDTCM, 280, 0);8 o; c; A* Z! i/ D
  54.                                         DTCMUsed = MemHeadPtr(AppMallocDTCM);
    ) H$ r& n# K4 J8 r, d
  55.                                         printf("DTCM总大小 = %d字节,申请大小 = 0280字节,当前共使用大小 = %d字节\r\n",
    : n( O5 E6 Z' r/ P( C
  56.                                                                                 DTCMUsed->size, DTCMUsed->used);
    7 h! @, i$ A- g3 c7 d4 m. B; C
  57.                                 2 h4 `! m6 c; F- {1 T! |- F( A  r
  58.                         /* 从DTCM申请64字节空间,使用指针变量DTCM_Addres1操作这些空间时不要超过64字节大小 */        
    ! A* Y6 {0 G6 t' Y
  59.                                         DTCM_Addres1 = osRtxMemoryAlloc(AppMallocDTCM, 64, 0);
    ! a% p0 F3 h2 D' i3 Z
  60.                                         DTCMUsed = MemHeadPtr(AppMallocDTCM);, L- p5 _2 j; }- t
  61.                                         printf("DTCM总大小 = %d字节,申请大小 = 0064字节,当前共使用大小 = %d字节\r\n",
    1 {, M  H8 K/ d" {+ A0 W$ a( G, b. ^
  62.                                                                                                            DTCMUsed->size, DTCMUsed->used);
    $ f0 a9 n5 \$ T. Q  o) ?
  63.                                 9 P$ T0 i/ K' \; o
  64.                     /* 从DTCM申请6111字节空间,使用指针变量DTCM_Addres2操作这些空间时不要超过6111字节大小 */7 o9 |1 w! E, d; K
  65.                                         DTCM_Addres2 = osRtxMemoryAlloc(AppMallocDTCM, 6111, 0);
    : A' Z9 T+ K/ z2 i# O0 H
  66.                                         DTCMUsed = MemHeadPtr(AppMallocDTCM);
    4 h+ ~& p. I  g( r- d
  67.                                         printf("DTCM总大小 = %d字节,申请大小 = 6111字节,当前共使用大小 = %d字节\r\n",
    5 F/ n; ^, \2 ~8 b" p; z
  68.                                                                                 DTCMUsed->size, DTCMUsed->used);
    " P7 i# d* \* j4 G9 e" b# x" f
  69.                                         break;' J+ O+ ^8 P9 n
  70.                                 
    & ]/ W" I9 {1 E: l
  71.                                 /* 释放从DTCM申请的空间 */. i+ s1 ^9 e5 J
  72.                                 case KEY_UP_K1:        3 l# v# d, d- }+ e7 i7 v7 U# w
  73.                                         /* 释放从DTCM申请的280字节空间 */* J5 J; r& ]1 s2 c7 s& u0 o( y
  74.                                         osRtxMemoryFree(AppMallocDTCM, DTCM_Addres0);7 F/ A( T' d" f# Q5 @& V. L( U
  75.                                         DTCMUsed = MemHeadPtr(AppMallocDTCM);
    4 h. ?& [: g8 u5 o4 N1 D% f1 L3 Q
  76.                                         printf("释放DTCM动态内存区申请的0280字节,当前共使用大小 = %d字节\r\n",
    # Q7 s; n0 [7 `5 t& n- y
  77. DTCMUsed->used);
    - _3 N) m' B% `/ r  ^4 h
  78.                                 9 G( i' G9 j/ u
  79.                                         /* 释放从DTCM申请的64字节空间 */' W5 k% {# b; Z4 z3 }
  80.                                         osRtxMemoryFree(AppMallocDTCM, DTCM_Addres1);; q' r& e0 ]' c
  81.                                         DTCMUsed = MemHeadPtr(AppMallocDTCM);! q9 y3 Y/ q" c9 v9 [  ]; q8 x
  82.                                         printf("释放DTCM动态内存区申请的0064字节,当前共使用大小 = %d字节\r\n",4 V) t$ A; q6 i- V. |
  83. DTCMUsed->used);
    % {8 b  a8 a/ E7 Z
  84.                                 
    - B; ~( o  Q" x, x& |! Q2 X) w  E  Y
  85.                                         /* 释放从DTCM申请的6111字节空间 */
    9 u4 B2 f: h3 U* X" X' G6 a
  86.                                         osRtxMemoryFree(AppMallocDTCM, DTCM_Addres2);
    # Z+ @( m0 c" x9 M# \
  87.                                         DTCMUsed = MemHeadPtr(AppMallocDTCM);0 [; n+ F6 u! J% C* @0 z
  88.                                         printf("释放DTCM动态内存区申请的6111字节,当前共使用大小 = %d字节\r\n",7 F: V8 r( j! s6 u  c
  89. DTCMUsed->used);
    . _! a' j( W6 g! y3 V0 v! z
  90.                                         break;
    : v& y0 s7 ^. U! ]  Q1 a  j
  91.                                 ! L/ s0 S" h2 T/ m
  92.                                 /* 从AXI SRAM依次申请160字节,32字节和2333字节 */- A& x, S* V- e! H) }1 U4 I
  93.                                 case KEY_DOWN_K2:        
    4 U/ X9 A4 w- a
  94.             /* 从AXI SRAM 申请160字节空间,使用指针变量AXISRAM_Addres0操作这些空间时不要超过160字节大小 */% F! ^* Q1 O7 d. q0 E2 W+ O% m+ Y
  95.                                         printf("=========================================================\r\n");               
    % }, W7 ~* D1 w1 w/ ^0 y4 @; \
  96.                                         AXISRAM_Addres0 = osRtxMemoryAlloc(AppMallocAXISRAM, 160, 0);* d9 E5 X% S4 J7 [2 r
  97.                                         AXISRAMUsed = MemHeadPtr(AppMallocAXISRAM);
    9 K, i, d7 M7 `8 T) i( O+ m0 c
  98.                                         printf("AXI SRAM总大小 = %d字节,申请大小 = 0162字节,当前共使用大小 = %d字节\r\n", , I* o( t5 ?& z) T( B! @0 s' |5 W
  99.                                                                                 AXISRAMUsed->size, AXISRAMUsed->used);
    6 `* O2 _# C# q; O9 S- c* `
  100.                                 
    8 w5 Q1 W7 C8 a: c6 N
  101.                         /* 从AXI SRAM 申请32字节空间,使用指针变量AXISRAM_Addres1操作这些空间时不要超过32字节大小 */  m+ X# h& O9 J) X' O3 `9 t8 J
  102.                                         AXISRAM_Addres1 = osRtxMemoryAlloc(AppMallocAXISRAM, 32, 0);9 a2 j+ D, }& @* ]# P$ q$ C
  103.                                         AXISRAMUsed = MemHeadPtr(AppMallocAXISRAM);
    + n8 h8 ^# e% C6 i
  104.                                         printf("AXI SRAM总大小 = %d字节,申请大小 = 0032字节,当前共使用大小 = %d字节\r\n", / f/ x" v& i0 x2 d3 G
  105.                                                                                                       AXISRAMUsed->size, AXISRAMUsed->used);0 \" j; G3 B) w2 g, t8 m, L1 w
  106.                                 7 P$ w5 u$ W& n7 k* d! e3 {9 l1 h
  107. /* 从AXI SRAM 申请2333字节空间,使用指针变量AXISRAM_Addres2操作这些空间时不要超过2333字节大小 */        
    : C$ S) |6 y2 O- a# p  ?- o* s
  108.                                         AXISRAM_Addres2 = osRtxMemoryAlloc(AppMallocAXISRAM, 2333, 0);: e! `8 j/ q6 T) N+ \% W0 a
  109.                                         AXISRAMUsed = MemHeadPtr(AppMallocAXISRAM);
    ' Y6 ^, l7 n6 t2 I9 c$ h- h- M
  110.                                         printf("AXI SRAM总大小 = %d字节,申请大小 = 2333字节,当前共使用大小 = %d字节\r\n", 5 N" X* d) [' D) m
  111.                                                                                 AXISRAMUsed->size, AXISRAMUsed->used);
    6 l) r, w- `* s5 _% N
  112.                                         break;! e2 n5 F' @1 R0 G
  113.                                 
    * Z8 L9 V, {. M8 S% d
  114.                                 /* 释放从AXI SRAM申请的空间 */. y$ Z- O9 _2 n! ]5 \3 y0 [
  115.                                 case KEY_UP_K2:        $ q' ?0 V9 p: F/ E7 P% `
  116.                                         /* 释放从AXI SRAM申请的160字节空间 */# L* }7 o; k! Q" `) U( D" \
  117.                                         osRtxMemoryFree(AppMallocAXISRAM, AXISRAM_Addres0);1 j0 D( D  n# f- w
  118.                                         AXISRAMUsed = MemHeadPtr(AppMallocAXISRAM);
    1 U% [" r5 N) |* G: J
  119.                                         printf("释放AXI SRAM动态内存区申请的0160字节,当前共使用大小 = %d字节\r\n",
    : o1 d( r) [& a7 v8 {
  120. AXISRAMUsed->used);* q! Q8 u  n( W: `2 `
  121.                                 0 r3 I% F' w9 A2 Y( P7 K
  122.                                         /* 释放从AXI SRAM申请的32字节空间 */
    ) S6 g+ f; D/ R
  123.                                         osRtxMemoryFree(AppMallocAXISRAM, AXISRAM_Addres1);6 D+ S3 m4 _4 G% F' p2 b! w% ]
  124.                                         AXISRAMUsed = MemHeadPtr(AppMallocAXISRAM);! K4 [! g3 A& ~4 c0 }
  125.                                         printf("释放AXI SRAM动态内存区申请的0032字节,当前共使用大小 = %d字节\r\n",1 a9 i! h% @/ g$ b
  126. AXISRAMUsed->used);; K( H( N" m; b+ L
  127.                                 
    ' n: z& R4 [. a# P9 g0 ?- ^) ]
  128.                                         /* 释放从AXI SRAM申请的2333字节空间 */% X. c8 p' ^7 v! e7 c
  129.                                         osRtxMemoryFree(AppMallocAXISRAM, AXISRAM_Addres2);' H! e) T/ ~3 {" G5 ^( L; c
  130.                                         AXISRAMUsed = MemHeadPtr(AppMallocAXISRAM);
    : A  u3 L, o( K: _( q7 o* V
  131.                                         printf("释放AXI SRAM动态内存区申请的2333字节,当前共使用大小 = %d字节\r\n",
    , g% q9 ^& c% q: K* T/ I, S# Q# `
  132. AXISRAMUsed->used);
    4 O6 \1 m! ^! c
  133.                                         break;% n" R3 A- Q# e% ?
  134.                                 5 H( C' @9 e1 d$ l3 S
  135.                                 /* 从D2域SRAM依次申请200字节,96字节和4111字节 */: c/ B* T! y0 f) }: d
  136.                                 case KEY_DOWN_K3:        
    ) n* g: t$ p6 D# i+ ]
  137.         /* 从D2域的SRAM申请200字节空间,使用指针变量SRAM1_Addres0操作这些空间时不要超过200字节大小 */
    7 M. R" X4 x1 E4 b/ W: t- t
  138.                                         printf("=========================================================\r\n");                ( l" X& f& A/ ]% S* N$ J1 v% L% L! i/ L) }
  139.                                         SRAM1_Addres0 = osRtxMemoryAlloc(AppMallocSRAM1, 200, 0);' _. _- \, o" w6 ]. H. H7 ]$ W
  140.                                         SRAM1Used = MemHeadPtr(AppMallocSRAM1);' j$ Q6 {5 Q4 F! G
  141.                                         printf("D2域SRAM总大小 = %d字节,申请大小 = 0200字节,当前共使用大小 = %d字节\r\n", + L1 q' P" H* O+ G! m: K, {$ L- Q
  142.                                                                                 SRAM1Used->size, SRAM1Used->used);
    ; ]  u" ~0 Y; O! b# p  V$ I& h
  143.                                 
    , ?7 f9 y  k1 j. M! H& e  H; ^
  144.          /* 从D2域的SRAM申请96字节空间,使用指针变量SRAM1_Addres1操作这些空间时不要超过96字节大小 */        8 C$ W9 v7 J6 @+ D7 |! F& {
  145.                                         SRAM1_Addres1 = osRtxMemoryAlloc(AppMallocSRAM1, 96, 0);
    1 z; S! }1 z- v: {% h
  146.                                         SRAM1Used = MemHeadPtr(AppMallocSRAM1);
    $ j4 B, b( \0 e5 N
  147.                                         printf("D2域SRAM总大小 = %d字节,申请大小 = 0096字节,当前共使用大小 = %d字节\r\n", 3 }& ^7 h6 X7 h# X$ t+ X* b
  148.                                                                                                            SRAM1Used->size, SRAM1Used->used);
    ) v" z5 Q# B9 Z2 P4 a+ A
  149.                                 
    2 e+ ^- }' |5 {7 s5 ?* F
  150.          /* 从D2域的SRAM申请4111字节空间,使用指针变量SRAM1_Addres2操作这些空间时不要超过4111字节大小 */# q, ?4 X6 g: O- ~5 I
  151.                                         SRAM1_Addres2 = osRtxMemoryAlloc(AppMallocSRAM1, 4111, 0);
    # Z9 L8 `7 i( t7 T/ b# ^
  152.                                         SRAM1Used = MemHeadPtr(AppMallocSRAM1);4 o* R. L6 C) b
  153.                                         printf("D2域SRAM总大小 = %d字节,申请大小 = 4111字节,当前共使用大小 = %d字节\r\n",
    % c' d9 N' b' n+ r7 y0 C1 g- v8 y
  154.                                                                                 SRAM1Used->size, SRAM1Used->used);2 x( o9 Z# H  a8 T$ b  r
  155.                                         break;
    2 k1 F  \3 D4 K$ C7 G2 N) o# ]
  156.                                 
    3 Q* g( |# f: g8 E9 `, M
  157.                                 /* 释放从D2域SRAM申请的空间 */# S) x1 p8 r  N
  158.                                 case KEY_UP_K3:        3 b7 v$ c9 m3 G0 q" K5 {
  159.                                         /* 释放从D2域的SRAM申请的200字节空间 */
    2 G3 k% Z) H, C# c
  160.                                         osRtxMemoryFree(AppMallocSRAM1, SRAM1_Addres0);
    1 t% Z; k, ?& q6 T4 G
  161.                                         SRAM1Used = MemHeadPtr(AppMallocSRAM1);
    ; h1 z) X( n2 h! K0 k
  162.                                         printf("释放D2域SRAM动态内存区申请的0200字节,当前共使用大小 = %d字节\r\n",/ n' [8 x, a/ o) L0 Y; R& C
  163. SRAM1Used->used);% B4 u7 U9 w# E- X
  164.                                 
    3 D+ P/ g  c3 e# K
  165.                                         /* 释放从D2域的SRAM申请的96字节空间 */2 ?$ W. N- G5 ?4 x
  166.                                         osRtxMemoryFree(AppMallocSRAM1, SRAM1_Addres1);
    8 B* C# Z1 G' C: B* h* J
  167.                                         SRAM1Used = MemHeadPtr(AppMallocSRAM1);1 o+ m6 c- u2 Q/ \; C
  168.                                         printf("释放D2域SRAM动态内存区申请的0096字节,当前共使用大小 = %d字节\r\n",* H0 E0 ?, s& ]! D
  169. SRAM1Used->used);  x6 ?) R  X: T) L2 M
  170.                                   I# c( q1 G+ i
  171.                                         /* 释放从D2域的SRAM申请的4111字节空间 */
    , Y3 N4 l: b# B2 p1 ~* ?3 L( p
  172.                                         osRtxMemoryFree(AppMallocSRAM1, SRAM1_Addres2);
    ( }5 V) O  m6 b' p8 a3 P- E
  173.                                         SRAM1Used = MemHeadPtr(AppMallocSRAM1);! \2 q1 b5 Y! v& {8 m
  174.                                         printf("释放D2域SRAM动态内存区申请的4111字节,当前共使用大小 = %d字节\r\n",
    & l0 O4 _$ s9 a2 J7 p% z' x
  175. SRAM1Used->used);
    5 |( K" i! v( H8 B: E6 ~: U' s/ @
  176.                                         break;  Y# O5 x0 E$ V# N' ~; M  H$ m
  177.                                   N* a+ ]5 m' g" n
  178.                                 /* 从D3域SRAM依次申请300字节,128字节和5111字节 */
    ) h# H, V7 P8 \% C. T  z- k0 C
  179.                                 case JOY_DOWN_OK:        
    / `4 P, g$ O; L+ J4 h
  180.             /* 从D3域的SRAM申请300字节空间,使用指针变量SRAM4_Addres0操作这些空间时不要超过300字节大小 */
    0 ^( L/ W0 k0 `$ z6 t/ G; {
  181.                                         printf("=========================================================\r\n");                ) W+ h) R% p; d- S& B  y
  182.                                         SRAM4_Addres0 = osRtxMemoryAlloc(AppMallocSRAM4, 300, 0);$ w7 `, J7 f# j5 E( G
  183.                                         SRAM4Used = MemHeadPtr(AppMallocSRAM4);7 P" B* X1 U4 A# s/ p
  184.                                         printf("D3域SRAM总大小 = %d字节,申请大小 = 0300字节,当前共使用大小 = %d字节\r\n",
    2 P3 W! a) l9 Z4 W4 ]
  185.                                                                                 SRAM4Used->size, SRAM4Used->used);
    6 m9 p) D4 B2 m9 N8 H
  186.                                 % t" M! y) g* h: U  o& i( z9 B3 Z
  187.                 /* 从D3域的SRAM申请96字节空间,使用指针变量SRAM4_Addres1操作这些空间时不要超过96字节大小 */
    ; ~0 I1 Q1 w$ ]1 Z3 |! N% \; P
  188.                                         SRAM4_Addres1 = osRtxMemoryAlloc(AppMallocSRAM4, 128, 0);. M2 ]- T+ Y7 D# z* B
  189.                                         SRAM4Used = MemHeadPtr(AppMallocSRAM4);
    , m. e1 m0 t- o- V  M
  190.                                         printf("D3域SRAM总大小 = %d字节,申请大小 = 0128字节,当前共使用大小 = %d字节\r\n", ! d5 J+ T% n( L6 F, h; i1 Z
  191.                                                                                                            SRAM4Used->size, SRAM4Used->used);- ]( Q, B2 d8 I5 F; }9 I: Q
  192.                                 3 O( o/ n: G% F
  193.         /* 从D3域的SRAM申请5111字节空间,使用指针变量SRAM4_Addres2操作这些空间时不要超过5111字节大小 */$ T" P- F7 V1 d9 m1 Q" Z7 I
  194.                                         SRAM4_Addres2 = osRtxMemoryAlloc(AppMallocSRAM4, 5111, 0);
    3 E. n8 o4 O- N+ C/ c' f" B
  195.                                         SRAM4Used = MemHeadPtr(AppMallocSRAM4);, j8 \+ P# J( [  {% x
  196.                                         printf("D3域SRAM总大小 = %d字节,申请大小 = 5111字节,当前共使用大小 = %d字节\r\n", 4 g" U" f: S: F, m. k
  197.                                                                                 SRAM4Used->size, SRAM4Used->used);+ d0 [7 N2 h4 v0 w5 K! f
  198.                                         break;7 E8 r. v% T9 L2 W' z/ f+ n
  199.                                 / ]$ M+ n* _6 u
  200.                                 /* 释放从D3域SRAM申请的空间 */5 z3 P) S) F$ \8 W- |+ ^2 d
  201.                                 case JOY_UP_OK:        
    / }0 [1 t) I' ~! V, M$ @) y
  202.                                         /* 释放从D3域的SRAM申请的300字节空间 */& A2 D4 u/ {9 [0 _0 [
  203.                                         osRtxMemoryFree(AppMallocSRAM4, SRAM4_Addres0);4 J2 k4 e  A: ]- h7 s$ X2 O
  204.                                         SRAM4Used = MemHeadPtr(AppMallocSRAM4);
    8 l. P. p6 P) E
  205.                                         printf("释放D3域SRAM动态内存区申请的0300字节,当前共使用大小 = %d字节\r\n", 3 n9 l! v& I" C2 Z) X
  206. SRAM4Used->used);. x* T& ~$ `# ?( N) I1 v1 j& s, P
  207.                                 
    5 o7 \3 v4 a/ S; m; K9 i; N& F( W
  208.                                         /* 释放从D3域的SRAM申请的128字节空间 */
    * ]( {; T, j4 c5 A
  209.                                         osRtxMemoryFree(AppMallocSRAM4, SRAM4_Addres1);
    8 w0 {% l3 t6 Z
  210.                                         SRAM4Used = MemHeadPtr(AppMallocSRAM4);  F9 o% ^) j# M) f( G. D9 W
  211.                                         printf("释放D3域SRAM动态内存区申请的0128字节,当前共使用大小 = %d字节\r\n",
    0 O0 H% f2 L0 x+ J' F
  212. SRAM4Used->used);# S" }: ~& K# V4 {3 R
  213.                                 
    5 w2 {1 k* w* t
  214.                                         /* 释放从D3域的SRAM申请的5111字节空间 */+ d! c2 M! Z9 l, f8 z$ k
  215.                                         osRtxMemoryFree(AppMallocSRAM4, SRAM4_Addres2);
    4 C* `7 P' v2 R
  216.                                         SRAM4Used = MemHeadPtr(AppMallocSRAM4);! B' t: y$ A% C; ^8 l3 _2 q/ d5 p
  217.                                         printf("释放D3域SRAM动态内存区申请的5111字节,当前共使用大小 = %d字节\r\n",
    * q1 _4 C6 N- Q" O+ @) J! s
  218. SRAM4Used->used);6 H: a6 V6 s2 J1 P( q
  219.                                         break;
    8 H* Z1 v" e! r0 N: ^+ j- z, O
  220.                         * r  v( Q3 W) O
  221.                                 default:
    0 T5 P. c' x% {
  222.                                   /* 其它的键值不处理 */
    . q: q2 }0 Z8 k+ H+ ^
  223.                                   break;" U( E. P  e4 V: R. [& W& p$ r  x
  224.                         }
    ) F2 N' S: X' d; k  w; W, ]8 C+ h
  225.                 }1 q' Y; r5 O9 H+ ^
  226.         }* I( b" Y4 A! @3 U4 q
  227. }
复制代码

5 w! T  f3 V, P% e8 ^5 e1 m27.5 实验例程说明(IAR)
" |) i' J) ~! G  g配套例子:: I" L& l2 W+ b. y+ e2 B
V7-006_TCM,SRAM等五块内存的动态内存分配实现
* G) T1 [7 @+ H% l2 u) Q* c( Q$ V$ V8 w0 b
实验目的:
7 D! a) ~6 O/ ?1 O5 h学习TCM,SRAM等五块内存的动态内存分配实现。. n7 [! h0 a8 a& V
$ B9 i) a# y$ `" F+ X8 g) z8 o
  @" V0 E! \. T" S( m
实验内容:
1 S3 H* e: ~. K启动自动重装软件定时器0,每100ms翻转一次LED2。
* [; O/ e# o" m' K6 ^! X
( F: m- W+ e: ~5 k, C: C实验操作:! o) O3 y1 i& r" g9 Z
K1键按下,从DTCM依次申请280字节,64字节和6111字节。  d6 J4 S* V; k2 v0 q
K1键松开,释放从DTCM申请的空间。
) t+ i# o9 a9 ^$ ~8 k. }K2键按下,从AXI SRAM依次申请160字节,32字节和2333字节。
& R& i* A; J* h# S3 X- pK2键松开,释放从AXI SRAM申请的空间。
  k. A' a+ W5 z  h! q3 eK3键按下,从D2域SRAM依次申请200字节,96字节和4111字节。8 t, V! W) J4 n! m
K3键松开,释放从D2域SRAM申请的空间。
. O, S5 R& H2 K  z" i! S摇杆OK键按下,从D3域SRAM依次申请300字节,128字节和5111字节。
' i+ K" C0 A' w  i7 v. o% s. D# ~摇杆OK键松开,释放从D3域SRAM申请的空间。
2 X! `4 n: k) X. N) D1 g
4 }+ d' R' F; r$ N上电后串口打印的信息:/ z2 A9 M1 e% r9 c, T9 w
# B6 i( m. S, n; p
波特率 115200,数据位 8,奇偶校验位无,停止位 1
+ U' E: ~/ b+ H3 a# D" O+ g, o9 E  r6 `  |' ~
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDcvMTM3OTEwNy0yMDE5.png

; w" ~7 U+ Q  @" d" |% d; u5 C) z4 N7 b% o! E6 C9 p' H- q5 e( r  ]
程序设计:
* u# [% X; r2 {* J  R8 i3 j: W, Z# A* h: Y: i/ U
  系统栈大小分配:9 ?1 R3 x- }4 T9 h1 y2 |1 V
) s1 G$ U  N4 E7 G2 q9 ]
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDcvMTM3OTEwNy0yMDE5.png
1 r; Q3 p3 u2 p- d+ |! E% V
( T% p: L' @; v
  RAM空间用的DTCM:
+ O* @$ K; D$ \2 U( {( x
5 \7 R% V4 @; P+ g# C$ e
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDcvMTM3OTEwNy0yMDE5.png

& p0 M! l0 Y+ D- H$ p6 u# A9 M$ o+ m: a* f- R
  硬件外设初始化
1 y4 N$ {, S3 O0 F
, K! F& l8 [( e0 F
硬件外设的初始化是在 bsp.c 文件实现:
! \( ]$ R; h; `
* J, j2 M4 v1 t
  1. /*1 m! S  n( U5 u3 ^' O. |
  2. *********************************************************************************************************1 y3 U* k7 ^' r% b4 f) `* ?
  3. *        函 数 名: bsp_Init
    ; U0 m5 \4 q1 f- s" {$ x% B& h3 w* T
  4. *        功能说明: 初始化所有的硬件设备。该函数配置CPU寄存器和外设的寄存器并初始化一些全局变量。只需要调用一次
    ; a& e8 n7 T4 k
  5. *        形    参:无
    6 x4 o0 k: w, X. ?- v
  6. *        返 回 值: 无
    ' k% M+ E$ ]7 p" m. {* N
  7. *********************************************************************************************************
    1 w+ M; P9 t; P) U% j
  8. */# L8 h8 m% Y. H
  9. void bsp_Init(void)
    ' Z3 V/ H' G! q* S% B  p; z+ p+ `
  10. {/ {& Z+ @  h* r! g0 o0 h& l+ m
  11.     /* 配置MPU */# y# J& \8 y1 J+ A) W. s. u
  12.         MPU_Config();
      B1 M8 j3 d0 F
  13.         
    7 p) H. x6 R- x
  14.         /* 使能L1 Cache */
    ! K1 `) Q/ \) U; n
  15.         CPU_CACHE_Enable();
    4 b7 {, N; X5 r0 s3 R

  16. $ w- [4 X- @. k* a6 Q) i
  17.         /* 7 j' N; M  ?& K
  18.        STM32H7xx HAL 库初始化,此时系统用的还是H7自带的64MHz,HSI时钟:8 q$ U* W( T5 }, _( g
  19.            - 调用函数HAL_InitTick,初始化滴答时钟中断1ms。! W4 i- t7 |1 A; C
  20.            - 设置NVIV优先级分组为4。# R* e' @4 o, S, I, N6 x$ J4 E7 p
  21.          */+ M, `1 I' S$ W# C& U
  22.         HAL_Init();* c# m- p) N6 d8 o6 e& l
  23. % p+ t$ B& G0 Y, N
  24.         /*
    ) _: s2 j+ J+ o, C; n1 m8 P$ n% [
  25.        配置系统时钟到400MHz: L% m3 {! g' Z4 Y+ t1 k! C
  26.        - 切换使用HSE。
    6 `+ w4 C/ H$ @: f2 x
  27.        - 此函数会更新全局变量SystemCoreClock,并重新配置HAL_InitTick。! c8 \0 x4 n% H' ?+ ]
  28.     */
    3 Y% z5 a& M6 A- ?2 |$ P7 i3 _
  29.         SystemClock_Config();
    . N/ Z1 C0 Q" N* Q
  30. 2 F0 u3 v! `, u; R+ ?
  31.         /*
    9 @5 H* `# Z2 `$ L5 H" O. G
  32.            Event Recorder:# Y6 J% G7 I5 d2 O! `3 ?; |
  33.            - 可用于代码执行时间测量,MDK5.25及其以上版本才支持,IAR不支持。
    / S! U4 d  t6 T7 h" e
  34.            - 默认不开启,如果要使能此选项,务必看V7开发板用户手册第xx章0 j- }5 K/ T& \' D9 `# u/ W. Y
  35.         */        / G: W1 S& a$ q( y6 O2 S+ X; G" W
  36. #if Enable_EventRecorder == 1  
    : C) H  q+ d/ {- s4 r
  37.         /* 初始化EventRecorder并开启 */
    3 D( q) a4 u3 W, K% v2 C; r- n
  38.         EventRecorderInitialize(EventRecordAll, 1U);- M& c7 E' ^( u6 |, w' t
  39.         EventRecorderStart();7 H6 D9 }. s5 r% X
  40. #endif' [9 e! ]% w; c- ^& o
  41.         
    8 c* _2 l# o' N! D7 m0 F% L. p
  42.         bsp_InitKey();            /* 按键初始化,要放在滴答定时器之前,因为按钮检测是通过滴答定时器扫描 */
    + |* j( A+ N/ I0 r2 k
  43.         bsp_InitTimer();          /* 初始化滴答定时器 */" c3 R4 n7 v6 F. |: d& @2 v' k
  44.         bsp_InitUart();        /* 初始化串口 *// a. {0 V2 {! t. f6 v
  45.         bsp_InitExtIO();        /* 初始化FMC总线74HC574扩展IO. 必须在 bsp_InitLed()前执行 */        
    ' G% t3 r5 w" }4 G$ R. g# T7 R9 d
  46.         bsp_InitLed();            /* 初始化LED */        
    + V3 w; Y; M& m  `4 m1 r+ y4 u
  47. }
复制代码

* R9 E& \1 \9 \1 k6 s6 t, I  MPU配置和Cache配置:

3 Z9 M2 N, b; z" G- n6 X
1 j, U+ p% h4 z& `3 i8 A& t数据Cache和指令Cache都开启。2 F  ?7 a5 }9 {" e# R

" l2 C. ?) o+ T6 S* {4 ^2 a7 oAXI SRAM的MPU属性:' S' O4 F, @1 X, l
$ q/ }) r0 F. Q9 x9 y$ @5 l; M7 x( P9 l
Write back, Read allocate,Write allocate。
! V6 L6 q9 N! H1 l' O  K
# s7 f- g- T2 P( w3 \: D0 U/ `& ]FMC的扩展IO的MPU属性:
' ]! X. g3 U) G7 y; b9 p: W* B; ~) w4 n
必须Device或者Strongly Ordered。
$ d3 y- _' @+ L- ?6 \# {9 G& o" z6 d- ^# n4 @  `+ F& O# v
D2 SRAM1,SRAM2和SRAM3的MPU属性:; N, a7 M: ?5 L! F$ B* j$ s

! Q: V4 ~; M! u) l& Z( EWrite through, read allocate,no write allocate。/ }) N/ j/ S; {2 J) P
: N; H) h4 f3 M% S4 ~# T3 ]
D3 SRAM4的MPU属性:
$ V% R" l9 K- \
+ V( }# R4 g: K2 ~% o7 Z* _Write through, read allocate,no write allocate。
* q% a5 n0 }# m1 d1 [
3 r( q5 I" K5 [2 {' C2 w+ ^
  1. /*
    8 f9 }7 M, r2 K+ @) E8 ^' h
  2. *********************************************************************************************************( F- C) G: H: X# D
  3. *        函 数 名: MPU_Config
    ) b. q/ `3 t6 n# T; R- y& C
  4. *        功能说明: 配置MPU
    7 E) z3 u& V$ H* A! p9 D
  5. *        形    参: 无
    # U5 |+ N( a) L, X: Z4 \8 F# }3 {
  6. *        返 回 值: 无- U4 Z9 r. T; U: ?- F1 W
  7. *********************************************************************************************************
    $ w) f0 G+ U" r
  8. */
    & ]' a  q0 x8 B" r/ O* T
  9. static void MPU_Config( void )  w) U0 y2 b- [% q7 V$ K7 d! w
  10. {2 U! r4 R3 ~, Y
  11.         MPU_Region_InitTypeDef MPU_InitStruct;7 o7 I% F4 C8 [6 `% b

  12. ' l4 \- m% p  v8 }3 m
  13.         /* 禁止 MPU */
    ! l. }. d1 P# m% s$ a4 R
  14.         HAL_MPU_Disable();2 H: b+ v6 Z8 P/ K6 y" b& R

  15. * B! s# o( A) e: w! O
  16.         /* 配置AXI SRAM的MPU属性为Write back, Read allocate,Write allocate */
    7 K# W  u2 ]+ A9 _( J8 K# L6 M; Q
  17.         MPU_InitStruct.Enable           = MPU_REGION_ENABLE;1 ~. D$ T0 [* j1 l; n
  18.         MPU_InitStruct.BaseAddress      = 0x24000000;
    2 O: d' o# Q0 @) p! b
  19.         MPU_InitStruct.Size             = MPU_REGION_SIZE_512KB;2 a! d" z! f, |4 ]& s# \! K  ~
  20.         MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;( y# A& a5 U. ?" B5 X! E
  21.         MPU_InitStruct.IsBufferable     = MPU_ACCESS_BUFFERABLE;1 P5 \% F' ~2 O3 d( f
  22.         MPU_InitStruct.IsCacheable      = MPU_ACCESS_CACHEABLE;$ i9 X" J( O/ a! _; P1 b
  23.         MPU_InitStruct.IsShareable      = MPU_ACCESS_NOT_SHAREABLE;
    + c* R( F1 y* k. m# h7 u3 g
  24.         MPU_InitStruct.Number           = MPU_REGION_NUMBER0;
    ; ~* o( {  r! S9 q6 L" Z% n) [* h# X+ d
  25.         MPU_InitStruct.TypeExtField     = MPU_TEX_LEVEL1;( f- P" p9 j# ^) W
  26.         MPU_InitStruct.SubRegionDisable = 0x00;
    ; {3 }7 S. G, ?# H8 R# A* M
  27.         MPU_InitStruct.DisableExec      = MPU_INSTRUCTION_ACCESS_ENABLE;1 |( n" ^# w, h% j" k, z3 X5 j! X+ s

  28. % U- ?+ \. P& t6 X; o8 V
  29.         HAL_MPU_ConfigRegion(&MPU_InitStruct);7 h' @6 N& x9 o+ y" _' N% o
  30.         1 y' |# S/ k! Y! d
  31.         
    $ E' C" `4 L: n# u; p7 n
  32.         /* 配置FMC扩展IO的MPU属性为Device或者Strongly Ordered */
    " z/ \4 l, o) m3 r4 L' z
  33.         MPU_InitStruct.Enable           = MPU_REGION_ENABLE;' f* W: o5 G) D( m) i+ c! Z
  34.         MPU_InitStruct.BaseAddress      = 0x60000000;
    / a9 c4 `. b6 Y) Y
  35.         MPU_InitStruct.Size             = ARM_MPU_REGION_SIZE_64KB;        / m* J5 t; }8 c  p9 e$ p) K$ [
  36.         MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;" S2 Y% b' J" ]3 ?8 u8 m
  37.         MPU_InitStruct.IsBufferable     = MPU_ACCESS_BUFFERABLE;: u, N  @3 G# {7 m/ I& J2 T$ `" I
  38.         MPU_InitStruct.IsCacheable      = MPU_ACCESS_NOT_CACHEABLE;5 u) h$ U. l* w9 s0 H) ]7 ~/ g
  39.         MPU_InitStruct.IsShareable      = MPU_ACCESS_NOT_SHAREABLE;1 G3 a) m+ i% Y! D+ `' r
  40.         MPU_InitStruct.Number           = MPU_REGION_NUMBER1;. J. c# v3 o. E* u$ D+ o* }7 ^
  41.         MPU_InitStruct.TypeExtField     = MPU_TEX_LEVEL0;
    % s/ W4 Y. b5 o8 N  }/ X) r) t
  42.         MPU_InitStruct.SubRegionDisable = 0x00;6 e0 I, J7 A3 r* y
  43.         MPU_InitStruct.DisableExec      = MPU_INSTRUCTION_ACCESS_ENABLE;
    9 s) g- U+ t3 [6 Z
  44.         % q0 S  M/ Y/ X( U* ^
  45.         HAL_MPU_ConfigRegion(&MPU_InitStruct);* Z3 T; [7 b8 T; T3 e
  46.         / I% ~3 L& I4 R* _
  47.         /* 配置SRAM1的属性为Write through, read allocate,no write allocate */" x8 o2 w: u3 D& U& C8 {( o
  48.     MPU_InitStruct.Enable           = MPU_REGION_ENABLE;
    ) X& t5 t& |; R+ `
  49.     MPU_InitStruct.BaseAddress      = 0x30000000;/ b* J# W; t. N" T
  50.     MPU_InitStruct.Size             = ARM_MPU_REGION_SIZE_128KB;        + z* \6 s& V2 m- J/ ?/ ^0 R
  51.     MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
    7 l, q; k+ o. f3 J
  52.     MPU_InitStruct.IsBufferable     = MPU_ACCESS_NOT_BUFFERABLE;4 P# D9 n. N9 W
  53.     MPU_InitStruct.IsCacheable      = MPU_ACCESS_CACHEABLE;' r/ Q" Y: h2 x  S0 k' O% T, Y
  54.     MPU_InitStruct.IsShareable      = MPU_ACCESS_NOT_SHAREABLE;
    / ]) C1 @4 S* J9 M
  55.     MPU_InitStruct.Number           = MPU_REGION_NUMBER2;
    2 Q/ d' B9 W  r  {+ B1 C. W8 C0 s; ~
  56.     MPU_InitStruct.TypeExtField     = MPU_TEX_LEVEL0;
    # W& J" M$ ?  |/ J+ }% G- h
  57.     MPU_InitStruct.SubRegionDisable = 0x00;
    3 w: T" S; M$ O8 X, H/ S: f
  58.     MPU_InitStruct.DisableExec      = MPU_INSTRUCTION_ACCESS_ENABLE;
    : x6 z2 h+ X9 q: v4 f
  59. ; z2 v0 i+ H( {! @
  60.     HAL_MPU_ConfigRegion(&MPU_InitStruct);! ^+ X8 r1 o; Q2 E
  61.         ' |& ]# B6 B8 n. j) o9 z
  62.         /* 配置SRAM2的属性为Write through, read allocate,no write allocate */+ B5 E' J; v& F
  63.     MPU_InitStruct.Enable           = MPU_REGION_ENABLE;) l4 \9 d7 C- z4 E+ x6 n) ]
  64.     MPU_InitStruct.BaseAddress      = 0x30020000;
    ) b/ L0 ^, C% `2 T$ b/ Z3 j
  65.     MPU_InitStruct.Size             = ARM_MPU_REGION_SIZE_128KB;        
    0 c5 \$ ]. M) _7 f, `" R
  66.     MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;# O$ f, K# F" y2 L% o4 _
  67.     MPU_InitStruct.IsBufferable     = MPU_ACCESS_NOT_BUFFERABLE;
    7 Z3 B  b. d+ r. d2 r
  68.     MPU_InitStruct.IsCacheable      = MPU_ACCESS_CACHEABLE;
    9 l0 O! F8 j  h3 R; h% N* @, s9 f
  69.     MPU_InitStruct.IsShareable      = MPU_ACCESS_NOT_SHAREABLE;9 t1 z. [# }0 J( G
  70.     MPU_InitStruct.Number           = MPU_REGION_NUMBER3;
    ! {7 F# p0 w, l6 ]/ w: R& P+ c1 g
  71.     MPU_InitStruct.TypeExtField     = MPU_TEX_LEVEL0;$ X/ K& ^5 Q8 d/ D5 N" B# J
  72.     MPU_InitStruct.SubRegionDisable = 0x00;- f0 |9 B5 i# b) o, j4 @( A
  73.     MPU_InitStruct.DisableExec      = MPU_INSTRUCTION_ACCESS_ENABLE;- \6 s) ^: Z1 [  S5 |
  74. # A% F' N4 B* i4 r- g5 t
  75.     HAL_MPU_ConfigRegion(&MPU_InitStruct);: Q9 V/ Y2 S' t7 r
  76. ! S6 }& u# D' z; g' j% x
  77. + x. h1 F: R0 p' ]5 G- h6 g
  78.     /* 配置SRAM3的属性为Write through, read allocate,no write allocate */
    3 X1 b; `8 u/ M
  79.     MPU_InitStruct.Enable           = MPU_REGION_ENABLE;$ U; s" m) ]: Z7 x/ a: i' l
  80.     MPU_InitStruct.BaseAddress      = 0x30040000;0 D$ l  [2 ^0 {
  81.     MPU_InitStruct.Size             = ARM_MPU_REGION_SIZE_32KB;        & Q, T) Y8 d. }# {
  82.     MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
    % |/ m6 `  x/ y7 B0 b2 n# D! L
  83.     MPU_InitStruct.IsBufferable     = MPU_ACCESS_NOT_BUFFERABLE;
      J3 \4 e4 f: Y8 f, K4 D9 j
  84.     MPU_InitStruct.IsCacheable      = MPU_ACCESS_CACHEABLE;. j" V2 C8 N+ Z4 [& Q- e
  85.     MPU_InitStruct.IsShareable      = MPU_ACCESS_NOT_SHAREABLE;
    * X/ i8 F2 i0 o& C) D1 Y
  86.     MPU_InitStruct.Number           = MPU_REGION_NUMBER4;$ g' x6 u  t9 q
  87.     MPU_InitStruct.TypeExtField     = MPU_TEX_LEVEL0;
    ( n" ~/ @- k6 Q
  88.     MPU_InitStruct.SubRegionDisable = 0x00;3 W" L: y& D* d
  89.     MPU_InitStruct.DisableExec      = MPU_INSTRUCTION_ACCESS_ENABLE;3 L& v+ D9 T3 O+ \  x* ^* y/ K
  90. 4 J* n" _! \+ S7 h) t
  91.     HAL_MPU_ConfigRegion(&MPU_InitStruct);
    4 y9 Z7 s% Q4 a0 ~
  92.         
    5 g8 `/ _/ b. T$ m
  93.         
    ' T# [, d& j$ E2 Y8 v0 H4 q3 y+ b
  94.         /* 配置SRAM4的属性为Write through, read allocate,no write allocate */0 e1 ~8 l: A( R! q
  95.     MPU_InitStruct.Enable           = MPU_REGION_ENABLE;7 t" V, q0 _4 ^/ }  Q! F
  96.     MPU_InitStruct.BaseAddress      = 0x38000000;- _. _+ A6 ?0 i, c. o
  97.     MPU_InitStruct.Size             = ARM_MPU_REGION_SIZE_64KB;        3 c0 t2 |6 d* l$ l, u
  98.     MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;  M! r. o; _  ~$ Z
  99.     MPU_InitStruct.IsBufferable     = MPU_ACCESS_NOT_BUFFERABLE;
    6 |7 M' r4 U5 p. X' S/ x" L
  100.     MPU_InitStruct.IsCacheable      = MPU_ACCESS_CACHEABLE;. x* y. `& O" V$ S8 d4 D; v
  101.     MPU_InitStruct.IsShareable      = MPU_ACCESS_NOT_SHAREABLE;
    ( @+ x. r+ g# r7 N( m2 N: U0 d
  102.     MPU_InitStruct.Number           = MPU_REGION_NUMBER5;/ U2 G, J) j* G& K' Y1 Q
  103.     MPU_InitStruct.TypeExtField     = MPU_TEX_LEVEL0;
    ! V; z0 N4 J$ M- g8 w) p
  104.     MPU_InitStruct.SubRegionDisable = 0x00;
    8 G* `- f2 \" `8 U
  105.     MPU_InitStruct.DisableExec      = MPU_INSTRUCTION_ACCESS_ENABLE;' e5 K! Z5 ~8 k* \" z

  106. 4 D% {, w# I1 |% T1 x' k$ n7 B' k
  107.     HAL_MPU_ConfigRegion(&MPU_InitStruct);
    ) p# r- i! y8 r
  108.         : B- B" b5 m  H  a
  109.         /*使能 MPU */4 r! H' r! A/ @! G9 r+ y5 [5 n
  110.         HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);3 R. l9 \$ g. b7 H+ U
  111. }
    3 d/ K7 O. W) z; j% O
  112.   a: x7 I% m3 ~$ f- U/ a
  113. /*
      f, d  h8 l0 K( t
  114. *********************************************************************************************************: m* y' ?  M  K5 x) _7 r
  115. *        函 数 名: CPU_CACHE_Enable9 T: ?$ _. e2 t; |  w* W2 H; h/ y
  116. *        功能说明: 使能L1 Cache- B" S- G6 p" g4 y  X
  117. *        形    参: 无( O+ W' d5 o7 T$ D- o' T! Q, q
  118. *        返 回 值: 无
    1 q" z1 A' l  k9 _
  119. *********************************************************************************************************
    8 L: X* O7 o: b4 R( t
  120. */3 l/ s* b9 p9 U& [
  121. static void CPU_CACHE_Enable(void)8 Q5 k: |" O# A; x
  122. {* C4 R) |* K( D3 v9 E. @
  123.         /* 使能 I-Cache */
    8 {" K2 |# }  M# r) f
  124.         SCB_EnableICache();
    " j! D: p1 l; K: N9 m: |3 U6 |

  125. 1 q" L7 c$ L' U8 a, I3 ?
  126.         /* 使能 D-Cache */. P9 B! I6 {" c# U( _# `
  127.         SCB_EnableDCache();6 z/ d# w1 ^! Q9 {3 k8 x( g: m2 l# F1 ~
  128. }
复制代码
4 e) h9 Q$ ~# J: r
  主功能:0 ^; q8 D- d- x
0 X6 I( c! A1 @! J- \7 ?6 U" s) D
主程序实现如下操作:
( H! [1 `/ v) a- c+ G# Z9 ^( t2 p0 ~5 a; \9 r
  启动自动重装软件定时器0,每100ms翻转一次LED2。0 L' \4 g+ M# u0 B+ a3 G* E8 H
  K1键按下,从DTCM依次申请280字节,64字节和6111字节。
; U5 o2 h1 _% X: b( z  x  T. Y  K1键松开,释放从DTCM申请的空间。
9 J# w8 `& h+ X0 o. z, o0 ~  K2键按下,从AXI SRAM依次申请160字节,32字节和2333字节。- a3 U3 i' }  Q4 q6 j' M
  K2键松开,释放从AXI SRAM申请的空间。
9 n* z9 M; e( k& p  K3键按下,从D2域SRAM依次申请200字节,96字节和4111字节。
* N: x! i. n  u/ c3 ^, H  f  K3键松开,释放从D2域SRAM申请的空间。
" @7 `: f9 ^7 U8 k5 j( K( h9 |, Z2 p  摇杆OK键按下,从D3域SRAM依次申请300字节,128字节和5111字节。2 m* r" ~+ _, s8 M* `
  摇杆OK键松开,释放从D3域SRAM申请的空间。+ V4 e# r9 U* U8 p  V2 m  x& w! ~
  1. /*
    ; u3 y3 P, }- |6 |
  2. *********************************************************************************************************9 f- V; a; T3 R$ v& Z" a1 f
  3. *        函 数 名: main
    ; H3 W: @  S, g* S
  4. *        功能说明: c程序入口
    * [- i( \. M! V$ F. @5 ~
  5. *        形    参: 无8 e# `, C( E: P) |  ?6 ^
  6. *        返 回 值: 错误代码(无需处理)% u* A% a5 s3 P# h' Z
  7. *********************************************************************************************************& x- I; C) U! A" J
  8. */
    3 x' u4 d* Q6 p/ ?7 P: ?
  9. int main(void)3 W4 r9 \2 N+ c# K
  10. {( K- @% \% r: J
  11.         uint8_t ucKeyCode;                /* 按键代码 */
    ( x/ _- H4 v4 x. x. m- Y6 d) S
  12.         uint32_t *DTCM_Addres0, *AXISRAM_Addres0, *SRAM1_Addres0, *SRAM4_Addres0;
    " G. _" q9 W+ O0 J6 d
  13.         uint16_t *DTCM_Addres1, *AXISRAM_Addres1, *SRAM1_Addres1, *SRAM4_Addres1;2 z) X6 |0 l8 ~/ `0 w1 \! ~
  14.         uint8_t  *DTCM_Addres2, *AXISRAM_Addres2, *SRAM1_Addres2, *SRAM4_Addres2;
    - _* y& g# B* x; K. {

  15. 4 X' K- j1 V8 ^1 k
  16. , c+ D& Q4 U+ p+ h1 `& T
  17.         bsp_Init();                /* 硬件初始化 */
    . a) Y% g7 b% f* x" _3 ]& u; C
  18.         
      f# b5 t8 |7 Q: Z- _/ j* X8 G
  19.         /* 初始化动态内存空间 */
    " ]. T8 N& f( q' A8 q
  20.         osRtxMemoryInit(AppMallocDTCM,    sizeof(AppMallocDTCM));
    6 y1 X+ H$ k7 w
  21.         osRtxMemoryInit(AppMallocAXISRAM, sizeof(AppMallocAXISRAM));
    , q: M" ~) g5 }* U0 _3 e
  22.         osRtxMemoryInit(AppMallocSRAM1,   sizeof(AppMallocSRAM1));
    * E( x/ w8 a7 g3 d$ f" ~
  23.         osRtxMemoryInit(AppMallocSRAM4,   sizeof(AppMallocSRAM4));6 {: I  ^# _3 J- @
  24.         
    + c3 ^5 `) ]9 o2 f0 h; r
  25.         PrintfLogo();        /* 打印例程名称和版本等信息 */2 }: z' R: ?" Z$ r# q+ q! C/ w7 g
  26.         PrintfHelp();        /* 打印操作提示 */4 ?9 s9 f: z4 o+ R* e

  27. 2 s" G+ U! f" c* f- @3 e; I+ b  S
  28.         bsp_StartAutoTimer(0, 100);        /* 启动1个100ms的自动重装的定时器 */7 r( r% i  m* c, n# D( O1 r
  29.         # T5 Z2 Q  w0 |- P, m
  30. 1 ^# E# w2 `! D
  31.         /* 进入主程序循环体 */
    1 Q/ l# T% z; D% _/ W: m% x
  32.         while (1)8 j) T7 Y4 A" b1 R8 I, A) c5 ~
  33.         {( W# m) k! f  @* t+ P+ b
  34.                 bsp_Idle();                /* 这个函数在bsp.c文件。用户可以修改这个函数实现CPU休眠和喂狗 */% ^6 R) p3 A9 S4 K+ @
  35. ! F6 T" ^6 c2 R
  36.                 /* 判断定时器超时时间 */
    1 i5 x+ Y% g7 y6 F. W1 J% c7 m
  37.                 if (bsp_CheckTimer(0))        5 \" \, ~! \4 Q1 I. R3 [+ T, Q. A0 i
  38.                 {" W( e. j3 v7 N% M
  39.                         /* 每隔100ms 进来一次 */  
    0 D* ?: b0 U" y" y
  40.                         bsp_LedToggle(2);
    5 u( a: |* S0 x8 f
  41.                 }
    1 w) i9 e$ x  m& R" X
  42.   ]1 y/ j) v) S2 Q5 @: E9 z
  43.                 /* 按键滤波和检测由后台systick中断服务程序实现,我们只需要调用bsp_GetKey读取键值即可。 */
    3 V# T; o0 i* ]" X0 O& q- n' o1 y
  44.                 ucKeyCode = bsp_GetKey();        /* 读取键值, 无键按下时返回 KEY_NONE = 0 */% O; M4 Q  V3 t$ i. E4 x* U
  45.                 if (ucKeyCode != KEY_NONE), f5 n- J+ ~8 d$ L! k
  46.                 {
    $ B0 w( R* U: u5 [& g0 m* m, L% s
  47.                         switch (ucKeyCode)
    # e" }9 s9 r; o% O# I& I
  48.                         {8 o  _# x+ ^  B" `
  49.                 /* 从DTCM依次申请280字节,64字节和6111字节 */0 S( U) c. V7 e" P
  50.                                 case KEY_DOWN_K1:        
    : U, l6 B- [  z# b+ f4 U
  51.                     /* 从DTCM申请280字节空间,使用指针变量DTCM_Addres0操作这些空间时不要超过280字节大小 */
    ; g, m7 t. V, z1 ^1 I( W, G$ M
  52.                                         printf("=========================================================\r\n");
    5 v9 S" z$ D! r, t* O2 ^& L8 a
  53.                                         DTCM_Addres0 = osRtxMemoryAlloc(AppMallocDTCM, 280, 0);5 Q) e1 ]( c9 ^4 A" R
  54.                                         DTCMUsed = MemHeadPtr(AppMallocDTCM);
    : Y) O0 t% ~: H8 {/ H+ W# Q
  55.                                         printf("DTCM总大小 = %d字节,申请大小 = 0280字节,当前共使用大小 = %d字节\r\n", - J3 Q  Z' Y& z- W$ b; \
  56.                                                                                 DTCMUsed->size, DTCMUsed->used);6 [6 k" |7 Y7 }  x* _! M5 [0 Z
  57.                                 
    3 C- E3 i" {2 Q; C2 I
  58.                         /* 从DTCM申请64字节空间,使用指针变量DTCM_Addres1操作这些空间时不要超过64字节大小 */        9 D( [0 o4 ?- s( ~
  59.                                         DTCM_Addres1 = osRtxMemoryAlloc(AppMallocDTCM, 64, 0);" |: _1 d) G" G& f  Y
  60.                                         DTCMUsed = MemHeadPtr(AppMallocDTCM);9 K3 e4 v; O/ K- E* Z- {# E
  61.                                         printf("DTCM总大小 = %d字节,申请大小 = 0064字节,当前共使用大小 = %d字节\r\n", " R" g( U# p8 f; x# A+ |
  62.                                                                                                            DTCMUsed->size, DTCMUsed->used);- ?' h0 u7 r1 A" r' x9 z" W' P8 O
  63.                                 ( |5 ^# ~$ Q& c( ~1 K# Y/ Y- z
  64.                     /* 从DTCM申请6111字节空间,使用指针变量DTCM_Addres2操作这些空间时不要超过6111字节大小 */
    " R) Q; g! f  j$ R
  65.                                         DTCM_Addres2 = osRtxMemoryAlloc(AppMallocDTCM, 6111, 0);* y" ^# U9 ?' ?& W' ]
  66.                                         DTCMUsed = MemHeadPtr(AppMallocDTCM);8 p8 h% d6 M4 m0 s1 |" b
  67.                                         printf("DTCM总大小 = %d字节,申请大小 = 6111字节,当前共使用大小 = %d字节\r\n", 0 A' ?& x8 ^& ^9 @) x  F6 Q
  68.                                                                                 DTCMUsed->size, DTCMUsed->used);
    6 L9 z. W' F6 U
  69.                                         break;* D  {$ ^( d( C0 g
  70.                                 5 ]& M0 {" y, f/ c% M% P" @- H* V
  71.                                 /* 释放从DTCM申请的空间 */
    / A/ e9 g, w1 o; |: S5 x4 j
  72.                                 case KEY_UP_K1:        
    ) K3 c. g! j) B7 b" F' f! Q
  73.                                         /* 释放从DTCM申请的280字节空间 */
    5 ^0 i  S1 G6 u6 a5 B) l2 ?
  74.                                         osRtxMemoryFree(AppMallocDTCM, DTCM_Addres0);" c) }, t! k8 ?! `% g/ E; N# O
  75.                                         DTCMUsed = MemHeadPtr(AppMallocDTCM);
    % F: K: ~: J* E6 E
  76.                                         printf("释放DTCM动态内存区申请的0280字节,当前共使用大小 = %d字节\r\n",
    ! L. T+ a8 \: ?; L# Q1 Q
  77. DTCMUsed->used);+ o6 _' q1 Y3 z# y1 e. H! V$ \
  78.                                 ' @! p1 Q9 d/ J; y
  79.                                         /* 释放从DTCM申请的64字节空间 */3 C3 Z. E+ p; }# ^* C" J2 j
  80.                                         osRtxMemoryFree(AppMallocDTCM, DTCM_Addres1);; F8 F7 k% _7 H& X7 m# `& U
  81.                                         DTCMUsed = MemHeadPtr(AppMallocDTCM);
    2 P7 i' e4 `% f
  82.                                         printf("释放DTCM动态内存区申请的0064字节,当前共使用大小 = %d字节\r\n",, d! i2 B3 ~9 R$ S# q0 v) w
  83. DTCMUsed->used);9 o) Q. }& B6 v$ ^) E% t/ Y
  84.                                 
    : f$ i# D1 f" |" g+ a- f
  85.                                         /* 释放从DTCM申请的6111字节空间 */3 a! Q, @( e+ E/ ?
  86.                                         osRtxMemoryFree(AppMallocDTCM, DTCM_Addres2);
    # @. c% D/ |2 W% k! B3 _; c1 q
  87.                                         DTCMUsed = MemHeadPtr(AppMallocDTCM);* g$ I, J8 d, W! Y  A" |* T( i( E
  88.                                         printf("释放DTCM动态内存区申请的6111字节,当前共使用大小 = %d字节\r\n",6 @# a/ N* q( |' h3 n
  89. DTCMUsed->used);, _4 n: ^. s6 [, p) A
  90.                                         break;* f5 s) A2 X4 W. B$ e2 X
  91.                                 3 N, O' O- M- c
  92.                                 /* 从AXI SRAM依次申请160字节,32字节和2333字节 */* ^$ b/ M& W; `8 `: @( y/ M) u
  93.                                 case KEY_DOWN_K2:        
    6 N$ L/ z9 ?8 n+ }# Q
  94.             /* 从AXI SRAM 申请160字节空间,使用指针变量AXISRAM_Addres0操作这些空间时不要超过160字节大小 */3 G0 J! n& N9 r7 p' G0 f
  95.                                         printf("=========================================================\r\n");                1 _" p* \& n( s7 W* c
  96.                                         AXISRAM_Addres0 = osRtxMemoryAlloc(AppMallocAXISRAM, 160, 0);6 i* v! \* X* @' D( X
  97.                                         AXISRAMUsed = MemHeadPtr(AppMallocAXISRAM);" i5 |  Z% ]2 d  n/ |
  98.                                         printf("AXI SRAM总大小 = %d字节,申请大小 = 0162字节,当前共使用大小 = %d字节\r\n",   \$ c2 |* J; S& G, Z* q
  99.                                                                                 AXISRAMUsed->size, AXISRAMUsed->used);5 Z9 P, v7 L' a0 ]
  100.                                 
    , P! ]  ^4 t0 E8 m' Z
  101.                         /* 从AXI SRAM 申请32字节空间,使用指针变量AXISRAM_Addres1操作这些空间时不要超过32字节大小 */- i5 S. {* A5 ~0 a% v& a
  102.                                         AXISRAM_Addres1 = osRtxMemoryAlloc(AppMallocAXISRAM, 32, 0);
    ; c1 V1 A, c9 u$ S2 T) C- s/ U
  103.                                         AXISRAMUsed = MemHeadPtr(AppMallocAXISRAM);
    8 i: G9 B9 m; ?) Z; \9 Q
  104.                                         printf("AXI SRAM总大小 = %d字节,申请大小 = 0032字节,当前共使用大小 = %d字节\r\n",
    ) k: e/ ]2 |. |2 [4 s9 a+ o
  105.                                                                                                       AXISRAMUsed->size, AXISRAMUsed->used);
    9 ]% w( B$ z( o( G# m! Y8 V
  106.                                 1 d; M" @7 z! V4 i2 @2 ^
  107. /* 从AXI SRAM 申请2333字节空间,使用指针变量AXISRAM_Addres2操作这些空间时不要超过2333字节大小 */        . s' ~% p5 g' g
  108.                                         AXISRAM_Addres2 = osRtxMemoryAlloc(AppMallocAXISRAM, 2333, 0);. P  r4 `8 Y, Z$ L/ P
  109.                                         AXISRAMUsed = MemHeadPtr(AppMallocAXISRAM);
    9 W5 O" A# Z7 K. [+ Z
  110.                                         printf("AXI SRAM总大小 = %d字节,申请大小 = 2333字节,当前共使用大小 = %d字节\r\n", # R- k5 P* d0 K9 O4 k
  111.                                                                                 AXISRAMUsed->size, AXISRAMUsed->used);
    ; C4 @5 W! B, b" B
  112.                                         break;
    3 M1 ~) Q* W3 ]
  113.                                 
    . X. j, O& ^* @9 a) K+ Q
  114.                                 /* 释放从AXI SRAM申请的空间 */) A# c6 X" H5 b9 w
  115.                                 case KEY_UP_K2:        
    / ?6 d3 t# p; t* k0 Z+ Y
  116.                                         /* 释放从AXI SRAM申请的160字节空间 */
      w3 j7 S: U6 I# |6 N# O* x5 s
  117.                                         osRtxMemoryFree(AppMallocAXISRAM, AXISRAM_Addres0);( y% o! }0 H6 p. t
  118.                                         AXISRAMUsed = MemHeadPtr(AppMallocAXISRAM);
    . S8 ~& k' `& _; e
  119.                                         printf("释放AXI SRAM动态内存区申请的0160字节,当前共使用大小 = %d字节\r\n",
    , w& }# e% ^' `' q" j+ h
  120. AXISRAMUsed->used);. L+ D! Y: T+ ]- p9 F8 `
  121.                                 
    ; a$ A  ?; |8 i* J4 s3 ^
  122.                                         /* 释放从AXI SRAM申请的32字节空间 */" c" P0 ?, D& }& N2 H
  123.                                         osRtxMemoryFree(AppMallocAXISRAM, AXISRAM_Addres1);
    + U7 g, v5 n2 [9 K& y4 c, w
  124.                                         AXISRAMUsed = MemHeadPtr(AppMallocAXISRAM);
    # K$ D; R: w% V9 q2 ^
  125.                                         printf("释放AXI SRAM动态内存区申请的0032字节,当前共使用大小 = %d字节\r\n",
      W; v( C/ o" l& g* U/ \5 C7 s
  126. AXISRAMUsed->used);. P* B) a( R1 a1 `7 Y% j8 }
  127.                                 
    1 g, v6 h$ A% y5 J6 g; x. {- f
  128.                                         /* 释放从AXI SRAM申请的2333字节空间 */
    2 z1 |8 [8 T5 C9 n% J
  129.                                         osRtxMemoryFree(AppMallocAXISRAM, AXISRAM_Addres2);, p4 |) P* V6 j8 ?4 y
  130.                                         AXISRAMUsed = MemHeadPtr(AppMallocAXISRAM);
    - `1 i4 b% m- O
  131.                                         printf("释放AXI SRAM动态内存区申请的2333字节,当前共使用大小 = %d字节\r\n", ' Q* J# Q/ ]7 k0 J( P- b9 I8 z
  132. AXISRAMUsed->used);( m5 w" ~4 Y! r' A+ _- r
  133.                                         break;% A  w. o% M2 K
  134.                                 
    - K& I/ j3 k& X
  135.                                 /* 从D2域SRAM依次申请200字节,96字节和4111字节 */- Z, Q$ F7 L, z7 }4 J/ |$ G2 E$ P
  136.                                 case KEY_DOWN_K3:        
    - N( c  r) K0 f3 s: ?  ?* v
  137.         /* 从D2域的SRAM申请200字节空间,使用指针变量SRAM1_Addres0操作这些空间时不要超过200字节大小 */
    $ O- G: r' w' F4 M2 X( h/ i! l
  138.                                         printf("=========================================================\r\n");                # R7 Z6 Y0 U& W( c- q2 J
  139.                                         SRAM1_Addres0 = osRtxMemoryAlloc(AppMallocSRAM1, 200, 0);
    & q0 o, s- D) }5 H1 ~
  140.                                         SRAM1Used = MemHeadPtr(AppMallocSRAM1);
    $ a, E( A4 T8 V" t6 N# t; X  i
  141.                                         printf("D2域SRAM总大小 = %d字节,申请大小 = 0200字节,当前共使用大小 = %d字节\r\n",
    8 I+ `' d2 [2 I, j
  142.                                                                                 SRAM1Used->size, SRAM1Used->used);! G& `$ M4 e. g, P+ j7 c! l
  143.                                 
    7 o/ h! F: s6 u! I9 Q) a. R1 W
  144.          /* 从D2域的SRAM申请96字节空间,使用指针变量SRAM1_Addres1操作这些空间时不要超过96字节大小 */        ; ~& L  T- R& x) c7 x
  145.                                         SRAM1_Addres1 = osRtxMemoryAlloc(AppMallocSRAM1, 96, 0);3 t  O- Y; f  m
  146.                                         SRAM1Used = MemHeadPtr(AppMallocSRAM1);4 W  C, }) D: Y" n
  147.                                         printf("D2域SRAM总大小 = %d字节,申请大小 = 0096字节,当前共使用大小 = %d字节\r\n",
    6 h/ Z* s3 |# H0 N  @
  148.                                                                                                            SRAM1Used->size, SRAM1Used->used);2 q- M% l( {# u* Y0 K, S
  149.                                 
    ' n/ ?: j' y9 h3 g. H" h
  150.          /* 从D2域的SRAM申请4111字节空间,使用指针变量SRAM1_Addres2操作这些空间时不要超过4111字节大小 */
    9 x- Q2 Z, y: o6 c; x1 |5 G9 F
  151.                                         SRAM1_Addres2 = osRtxMemoryAlloc(AppMallocSRAM1, 4111, 0);$ C, q3 ]3 o# i3 [' j
  152.                                         SRAM1Used = MemHeadPtr(AppMallocSRAM1);
    $ g: D0 _# u% {) K% Z& R
  153.                                         printf("D2域SRAM总大小 = %d字节,申请大小 = 4111字节,当前共使用大小 = %d字节\r\n", , t3 ?- E/ |- K5 |
  154.                                                                                 SRAM1Used->size, SRAM1Used->used);
    ) ^- T$ J4 S* Y1 u, g* k. R
  155.                                         break;  y7 C9 m8 Q# f5 G2 [7 z
  156.                                 : s* |9 _' R8 k/ r4 {# A
  157.                                 /* 释放从D2域SRAM申请的空间 */
    : W3 x+ @  h" i: l
  158.                                 case KEY_UP_K3:        4 r. O2 Z* k9 {3 c
  159.                                         /* 释放从D2域的SRAM申请的200字节空间 */
    . o3 `3 g( a; p  G' l
  160.                                         osRtxMemoryFree(AppMallocSRAM1, SRAM1_Addres0);
    / G0 F/ r& V/ N1 W; W& e) q
  161.                                         SRAM1Used = MemHeadPtr(AppMallocSRAM1);- O. ~+ V/ j. b( {! N
  162.                                         printf("释放D2域SRAM动态内存区申请的0200字节,当前共使用大小 = %d字节\r\n",
    - o; L# p5 ~  H5 b" [8 T% r
  163. SRAM1Used->used);9 R. I+ V2 G4 K2 w* P+ _
  164.                                 
    8 \8 w+ H2 N0 p
  165.                                         /* 释放从D2域的SRAM申请的96字节空间 */) r- P4 w5 N; N* w6 T) C
  166.                                         osRtxMemoryFree(AppMallocSRAM1, SRAM1_Addres1);
    5 D) D0 m) K! z6 s4 |( F/ V# P
  167.                                         SRAM1Used = MemHeadPtr(AppMallocSRAM1);
    % p# m7 U+ V& B. F, }7 D
  168.                                         printf("释放D2域SRAM动态内存区申请的0096字节,当前共使用大小 = %d字节\r\n",
    ! M* k" i! W' f3 \0 A1 X
  169. SRAM1Used->used);
    6 N9 S; |5 n2 l2 j3 I9 t
  170.                                 ( j: d3 c2 `" m. x( x, P- g
  171.                                         /* 释放从D2域的SRAM申请的4111字节空间 */( p& \: Y  g9 W0 y1 j
  172.                                         osRtxMemoryFree(AppMallocSRAM1, SRAM1_Addres2);
    8 p. g6 u6 _1 e" g. F
  173.                                         SRAM1Used = MemHeadPtr(AppMallocSRAM1);
    ' e9 g; q. n6 L( J" U% @2 E6 r1 E
  174.                                         printf("释放D2域SRAM动态内存区申请的4111字节,当前共使用大小 = %d字节\r\n",
    & h7 w2 k1 w: n# U8 L8 R% ^
  175. SRAM1Used->used);
    ) s  L; v- {7 E8 T/ W/ |
  176.                                         break;- N& K6 ~* {( B; O3 E( {, g2 p' d
  177.                                 0 y+ j) A) E" J* s0 g
  178.                                 /* 从D3域SRAM依次申请300字节,128字节和5111字节 */  ]; V7 L0 F7 [: O! T6 G
  179.                                 case JOY_DOWN_OK:        * w8 ?9 C5 ?* ?% _  L8 M. v, q
  180.             /* 从D3域的SRAM申请300字节空间,使用指针变量SRAM4_Addres0操作这些空间时不要超过300字节大小 */
    * X  X, ^/ G$ `6 k
  181.                                         printf("=========================================================\r\n");               
      v9 g! Z6 j& c0 }& \! {
  182.                                         SRAM4_Addres0 = osRtxMemoryAlloc(AppMallocSRAM4, 300, 0);
    . O7 Q( X: g* \0 j9 \# W5 P
  183.                                         SRAM4Used = MemHeadPtr(AppMallocSRAM4);
    9 e8 N4 t- r( S: [3 O) C2 J6 @' b
  184.                                         printf("D3域SRAM总大小 = %d字节,申请大小 = 0300字节,当前共使用大小 = %d字节\r\n", ) Y3 s7 U/ r; \- V( a$ G: {) r! p5 a
  185.                                                                                 SRAM4Used->size, SRAM4Used->used);2 z% h0 M  w1 v% e, p. C  U4 M$ E
  186.                                 
    ; ~. n. L0 K) i; K. r2 C
  187.                 /* 从D3域的SRAM申请96字节空间,使用指针变量SRAM4_Addres1操作这些空间时不要超过96字节大小 *// E5 Z, [4 h7 I6 P" \- V6 Y
  188.                                         SRAM4_Addres1 = osRtxMemoryAlloc(AppMallocSRAM4, 128, 0);% v3 V5 O' r0 {
  189.                                         SRAM4Used = MemHeadPtr(AppMallocSRAM4);
    - L9 W+ Q( v9 z) G4 x
  190.                                         printf("D3域SRAM总大小 = %d字节,申请大小 = 0128字节,当前共使用大小 = %d字节\r\n", - n1 O- ]! y. a( Y4 I
  191.                                                                                                            SRAM4Used->size, SRAM4Used->used);6 z) @( [' c) u) G; p7 h1 g5 |
  192.                                 ' {+ Q1 b) ?+ H' Q2 X; ?
  193.         /* 从D3域的SRAM申请5111字节空间,使用指针变量SRAM4_Addres2操作这些空间时不要超过5111字节大小 */8 g( F! ?. y8 {! ?; y9 }
  194.                                         SRAM4_Addres2 = osRtxMemoryAlloc(AppMallocSRAM4, 5111, 0);
    / u! _: ]' o! Y3 S7 W
  195.                                         SRAM4Used = MemHeadPtr(AppMallocSRAM4);
    / A  c7 r% i/ S. c3 e( K7 K5 S0 ~
  196.                                         printf("D3域SRAM总大小 = %d字节,申请大小 = 5111字节,当前共使用大小 = %d字节\r\n", ; p! R' }9 Y% q* {
  197.                                                                                 SRAM4Used->size, SRAM4Used->used);
    ; a" ^) p! f  R. ]# o- [
  198.                                         break;6 q+ T9 N& x8 g
  199.                                 
    7 [$ x& h% ~; r7 @* M
  200.                                 /* 释放从D3域SRAM申请的空间 */, `. X# |- Q# c, r
  201.                                 case JOY_UP_OK:        
    7 C6 U% T/ M: f( j( w. r5 N
  202.                                         /* 释放从D3域的SRAM申请的300字节空间 */3 `8 l, v$ G" _! q
  203.                                         osRtxMemoryFree(AppMallocSRAM4, SRAM4_Addres0);
    $ C. F4 G/ C. Z3 t+ Y( a2 b
  204.                                         SRAM4Used = MemHeadPtr(AppMallocSRAM4);
    ' Y- O# W6 j! ^  p! l& U3 @
  205.                                         printf("释放D3域SRAM动态内存区申请的0300字节,当前共使用大小 = %d字节\r\n",
      u9 Y2 g7 A. e/ Y/ _9 G
  206. SRAM4Used->used);
    9 L: B  Q) \  g/ `2 v# g
  207.                                 
      Z# _9 s+ c* O( B
  208.                                         /* 释放从D3域的SRAM申请的128字节空间 */
    ( j/ i" y5 K0 `: n9 P) y
  209.                                         osRtxMemoryFree(AppMallocSRAM4, SRAM4_Addres1);( L% e) I9 D$ f! n' H
  210.                                         SRAM4Used = MemHeadPtr(AppMallocSRAM4);
    $ X0 U$ {- [$ D7 e; f3 E
  211.                                         printf("释放D3域SRAM动态内存区申请的0128字节,当前共使用大小 = %d字节\r\n",  P; u: I9 H! m  t- r) ^; o% J
  212. SRAM4Used->used);5 s; F+ [- X; g  W! p6 l6 v
  213.                                 
    8 o. D$ V% Q0 D/ |' o# C7 W
  214.                                         /* 释放从D3域的SRAM申请的5111字节空间 */0 L- Y& r. t( o& s! B% e4 y! W
  215.                                         osRtxMemoryFree(AppMallocSRAM4, SRAM4_Addres2);6 t  Y7 A3 M  p; I$ f
  216.                                         SRAM4Used = MemHeadPtr(AppMallocSRAM4);
    " E, t1 i- ?) ^' F; t4 O* S2 {
  217.                                         printf("释放D3域SRAM动态内存区申请的5111字节,当前共使用大小 = %d字节\r\n",
    . Q( u, G7 f  d2 E% N& u/ z  z
  218. SRAM4Used->used);' ]2 v* j, W& t& N& T9 y6 u
  219.                                         break;
    3 I6 r: o6 x" B
  220.                           N( }3 |' V. M7 d5 T* ]. F6 q# V
  221.                                 default:# m1 ~, A9 {! F8 K! l. s
  222.                                   /* 其它的键值不处理 */
    6 ^% C/ B0 ]) v% \+ n
  223.                                   break;
    ! F3 U) J; d  H
  224.                         }
    ; H! D# U9 V  j3 l; f9 {
  225.                 }
      N6 ^  C5 E- h/ w
  226.         }
    . p' V/ G" _3 O# E8 Q7 W5 _! A
  227. }
复制代码

! ?3 V* A% X+ }) ]. s/ c27.6 总结
; z/ Y; ^  M2 g4 i本章节就为大家讲解这么多,还是比较有项目实用价值的,特别是MP3编解码,JPEG编解码,视频播放器,矢量字体等需要动态内存的场合。9 q9 X' |& D3 e/ W9 a3 C
( g0 @1 A* M6 G5 p, m
8 h) \6 U* n' c3 k# ]
; _# R4 T8 m* v( t
收藏 评论0 发布时间:2021-12-23 15:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

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