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

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

[复制链接]
STMCU小助手 发布时间:2021-12-23 15:00
27.1 初学者重要提示
+ p3 s9 Y# `$ ?: C  学习本章节前,务必优先学习了解TCM,SRAM等五块内存区的基础知识,比较重要。
4 N: N, m7 ]1 j' e4 w. R7 V  将RTX5系统的动态内存管理整理了出来,可以同时管理多个分区。如果其它RTOS中使用,记得做互斥保护或者加个调度锁均可。, O  Q9 V2 \8 R0 u' G: ?
  支持动态内存使用情况统计。
+ m4 o% i' E5 Z. I27.2 动态内存管理移植
" w3 h# R$ V. }0 L) k9 L5 S7 J/ [移植比较简单,仅需添加两个文件到工程即可。
  M/ n) o! G. J& k, ?0 y
& n9 J' o% z( t- S27.2.1 MDK版的移植8 p" A3 Y4 g! Y) t; e
  第1步,添加如下两个文件到MDK中6 i& n/ _/ K- `$ f
注,以本章配套例子为例,这两个文件的路径\User\malloc。5 M7 O) \  r3 b- p

+ o2 ?: B4 K1 M1 q( F
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDcvMTM3OTEwNy0yMDE5.png

5 e% X, G8 I% E$ v* ]; P: b3 h8 P& n# H0 @7 Q* X; f
  第2步,添加路径。
7 I* N: Z* C0 r. C
) |! c) b. c5 ?" U: x0 J6 J
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDcvMTM3OTEwNy0yMDE5.png

- w  j( n! r7 o* a0 d. ]/ n# s: v/ P2 q$ r6 W& c  i8 n
  第3步,添加头文件。8 M# H+ H% k* F2 `+ E4 u7 k- E
如果哪个源文件要用到动态内存,包含rtx_lib.h即可,本章配套例子是直接将其放在了bsp.h文件里面,哪个源文件要用到动态内存,直接包含bsp.h头文件即可。3 Q. [# }/ U9 v; u( _% _- a

2 f( d: {, b3 x1 x/ z通过这简单的三步就完成了MDK的移植。
' p( Q' L0 F7 e- I+ a& y# g# i* \8 f8 ]1 I5 S6 f
27.2.2 IAR版的移植
5 A0 `/ ~% m; A; Z1 |  第1步,添加如下两个文件到IAR中
* ]; N9 [( [0 b0 X: _! E注,以本章配套例子为例,这两个文件的路径\User\malloc。
' v3 u& j7 W8 r, T+ Y# f1 E- l
# A" d" z2 O0 F) a( W
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDcvMTM3OTEwNy0yMDE5.png
. b( [4 z- A- S7 m" q8 c: \6 Q) b

7 {% V! W. j8 ?* b- T3 O; u* ^  第2步,添加路径。5 N; G5 Q3 D2 j% Y- a7 s

9 S; p% S" g" ^
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDcvMTM3OTEwNy0yMDE5.png
: X' Z( x2 M) z& [6 d( P  i
+ k7 G3 B5 e7 v( R2 p3 h  n8 j) }
  第3步,添加头文件。
! B2 j0 C- p& c( \: X, U; I/ c如果哪个源文件要用到动态内存,包含rtx_lib.h即可,本章配套例子是直接将其放在了bsp.h文件里面,哪个源文件要用到动态内存,直接包含bsp.h头文件即可。
7 I/ A$ p' n2 }; v  y4 d/ a
) h* L* ]. b# z/ ^+ F2 q' R. s通过这简单的三步就完成了IAR的移植。6 d0 K8 h) N! s
* H" h( D! J% m& t! e
27.3 动态内存的使用方法
0 i) W; X0 p  _9 \: t7 C% W下面分别以MDK和IAR为例进行说明:* O. I" a* R& X' [# l

: w- k5 r. V2 r3 h3 Q27.3.1 MDK上的动态内存用法
# J- y6 b. _3 K5 u( k  定义动态内存区$ m+ [$ q+ O0 R' S
比如当前的主RAM用的DTCM,我们就可以直接定义一块大的数组作为动态内存空间:. v( }0 Q; [+ ]
7 F- ~% u/ B, p3 p1 M  `
  1. /* DTCM, 64KB */- b" u2 [% z' ?
  2. /* 用于获取当前使用的空间大小 */
    . r: G6 y) c& V" u' r
  3. mem_head_t *DTCMUsed;
    6 F( t; Y& {) t8 N, B
  4. /* 定义为64位变量,首地址是8字节对齐 */            
    ) x$ n6 ~% T/ \, `6 I
  5. uint64_t AppMallocDTCM[64*1024/8];
复制代码
% C! X. @* }( h) w
如果要使用AXI SRAM作为动态内存空间,可以使用__attribute__((at( )))指定地址。+ N  E2 G( @3 p* Q. t9 M

$ P1 h3 q* S" w  ?2 S$ O
  1. /* D1域, AXI SRAM, 512KB */' j2 [" ~5 c3 j8 U. ]
  2. /* 用于获取当前使用的空间大小 */
    " C( O* c' F1 l
  3. mem_head_t *AXISRAMUsed;  : }: r" t& h4 n, y% V1 t) l9 S
  4. /* 定义为64位变量,首地址是8字节对齐 */ 5 V4 B$ c! I% J# O
  5. uint64_t AppMallocAXISRAM[512*1024/8]__attribute__((at(0x24000000)));
复制代码

" l; H8 f, d/ B+ [/ C  初始化动态内存区/ `& P2 `' @. I/ N. M4 q
调用动态内存管理提供的函数osRtxMemoryInit即可做初始化:
, q" i6 X6 w7 a" G$ O! v
) g! i' f3 A5 I- t4 r: a5 L; FosRtxMemoryInit(AppMallocDTCM,    sizeof(AppMallocDTCM));! M. q) y0 K8 D1 P( Q7 \! `; X8 L3 y
osRtxMemoryInit(AppMallocAXISRAM, sizeof(AppMallocAXISRAM));- f' T7 y2 q" s8 i8 u

+ d$ {+ V+ t# U4 w3 M  @  申请动态内存
' X4 N4 o  \2 `& q8 p, \2 ^通过函数void *osRtxMemoryAlloc (void *mem, uint32_t size, uint32_t type)做动态内存申请。
; B& `+ \, ^- t
3 s! i$ ]- g( e第1个参数填写内存区首地址,比如申请的AppMallocDTCM,就填AppMallocDTCM即可。! Z) G7 Y0 i: h
, w7 X/ \  ~7 V6 `) B
第2个参数填写申请的字节大小,单位字节。( Y, E6 j4 W" v
9 v1 S7 D" i8 q* y$ F, T2 A5 d) m: a, P
第3个参数固定填0即可。
$ z" z$ t. v+ c# g0 i+ R
1 n( i- q& K8 Y2 P. L返回值是所申请缓冲区的首地址,如果没有空间可用,将返回NULL,这点要特别注意!
! X0 _" L/ p2 a3 L2 d
+ {1 w& {& y* r* ~7 q举个例子:
, M4 G  `. j4 h! B- w3 g
5 t/ M2 K- ~! P9 h) o
  1. uint32_t *DTCM_Addres0, *AXISRAM_Addres0;4 P- ?3 \/ @0 a# w. Z
  2. 1 n8 ~7 h3 _2 |' u! h
  3. /* 从DTCM申请280字节空间,使用指针变量DTCM_Addres0操作这些空间时不要超过280字节大小 */        
    ) v  \3 q$ Y) y- Z/ e; R
  4. DTCM_Addres0 = osRtxMemoryAlloc(AppMallocDTCM, 280, 0);
    ) j+ |# \5 p* e6 [: u) ]
  5. DTCMUsed = MemHeadPtr(AppMallocDTCM);
    8 E/ W! w4 P& R2 ]1 a
  6. printf("DTCM总大小 = %d字节,申请大小 = 0280字节,当前共使用大小 = %d字节\r\n", / ]% c4 {2 g' [, }" f& t
  7.                                                              DTCMUsed->size, DTCMUsed->used);
    6 d$ G7 R& K. f4 T  N+ I

  8. , w; @- a# l$ z
  9. /* 从AXI SRAM 申请160字节空间,使用指针变量AXISRAM_Addres0操作这些空间时不要超过160字节大小 */        
    ! S1 y+ {8 I& \" N* [! K
  10. AXISRAM_Addres0 = osRtxMemoryAlloc(AppMallocAXISRAM, 160, 0);$ B; b4 B- Q+ u+ m& F( m( I
  11. AXISRAMUsed = MemHeadPtr(AppMallocAXISRAM);
    % ?' x, W- Y& T& i+ C0 {
  12. printf("AXI SRAM总大小 = %d字节,申请大小 = 0162字节,当前共使用大小 = %d字节\r\n",
    # X  p: z+ H3 J: s4 D7 q% ]8 R
  13.                                                             AXISRAMUsed->size, AXISRAMUsed->used);
复制代码

- M% K6 l# t) p# P- b' S; Q* r申请了空间后,就可以直接使用了。另外注意红色字体部分,通过DTCMUsed->used和AXISRAMUsed->used可以获取当前使用的空间大小。, }7 n4 O1 t! }! k# M1 a) k* \
6 G2 A) j8 @2 S1 T. K
  释放动态内存
: z( Z2 E2 p% j0 k通过函数uint32_t osRtxMemoryFree (void *mem, void *block)做动态内存释放。4 J8 K$ k$ ^1 \  C- I# v. E

1 M) z4 T) H( H; m7 {第1个参数填写内存区首地址,比如释放的AppMallocDTCM,就填AppMallocDTCM即可。& o/ N8 [0 f. v8 M/ X9 [

* G2 q( B2 i, h' j' `2 j+ Q; v: f第2个参数填写申请内存时所获取的内存区首地址,这里用于释放。  n1 @  |3 Z3 P# s; c

; T. w2 H" U+ r; I4 @6 D: Y  x返回值,返回1表示成功,返回0表示失败。
! P; t: Z9 U* o8 c! P2 v0 Y) g  T; D: S! Q
举个例子:. W5 _: z; M' U! v
  J7 j( R4 W( @" `9 u2 d% r1 C
  1. /* 释放从DTCM申请的280字节空间 */
    + D5 a1 r+ p# ?- L/ ^5 J" c
  2. osRtxMemoryFree(AppMallocDTCM, DTCM_Addres0);, f# |% R& ?, z$ U. A
  3. DTCMUsed = MemHeadPtr(AppMallocDTCM);- r+ Y7 ^% }. C0 _6 ]6 U1 F2 F
  4. printf("释放DTCM动态内存区申请的0280字节,当前共使用大小 = %d字节\r\n", DTCMUsed->used);; H+ {3 i% j& d0 K$ |' ?
  5. ) X6 _7 R& V  h
  6. /* 释放从AXI SRAM申请的160字节空间 */
    & u( q1 l, O9 A* m8 N
  7. osRtxMemoryFree(AppMallocAXISRAM, AXISRAM_Addres0);
    3 d' r: E. C* A8 k/ X
  8. AXISRAMUsed = MemHeadPtr(AppMallocAXISRAM);' v1 Y7 G5 E; {5 v& E
  9. printf("释放AXI SRAM动态内存区申请的0160字节,当前共使用大小 = %d字节\r\n", AXISRAMUsed->used);
复制代码
6 K2 o" z- o" U7 X9 E2 o4 l3 Q* K
27.3.2 IAR上的动态内存用法
5 S# @- ~& F! [* v, X% b注:IAR使用这个动态内存管理,仅在定义时跟MDK略有不同,其它地方是一样的。
/ P/ ^' Z/ x7 p& z0 j& T3 k6 {; v; M1 m! M' }+ |
  定义动态内存区  e; G0 a  N7 Z4 R, u6 e* ?
比如当前的主RAM用的DTCM,我们就可以直接定义一块大的数组作为动态内存空间:1 _1 T; b2 ~7 F0 a
% z7 A5 d& y; c$ Z
  1. /* DTCM, 64KB */
    ( ?" ]& w/ c) \* P& [! b, s( _) s
  2. /* 用于获取当前使用的空间大小 */" M4 \& @' g" C1 S' X
  3. mem_head_t *DTCMUsed;
    , X" l& j* h# z5 {
  4. /* 定义为64位变量,首地址是8字节对齐 */             2 R# c2 u3 {: U- l! F! n$ c
  5. uint64_t AppMallocDTCM[64*1024/8];
复制代码
/ k( d7 J: x* r* c: S
如果要使用AXI SRAM作为动态内存空间,可以使用__attribute__((at( )))指定地址。
; C- ?8 T) `1 _# n4 u. s1 W1 u  J. V; N! U* \' v2 h
  1. /* D1域, AXI SRAM, 512KB */  W' a7 G& g) w* d0 o
  2. /* 用于获取当前使用的空间大小 *// H' S+ f- {1 O8 j' k
  3. mem_head_t *AXISRAMUsed;  
    ) A$ r( Y# a3 D$ |
  4. /* 指定下面数组的地址为0x24000000 */ / z2 h; g9 l" C! i, ~: F3 w
  5. #pragma location = 0x24000000! j2 ?) C1 ?$ Q! q, v! I1 e
  6. uint64_t AppMallocAXISRAM[512*1024/8];
复制代码
  y& r6 ^; _0 @% Z: N, {0 T
  初始化动态内存区9 \0 @2 R, o# \+ _9 L
调用动态内存管理提供的函数osRtxMemoryInit即可做初始化:  m. O' ~' ^1 Q! S; h3 d/ D9 h

% }' R3 c1 s+ [, h7 s
  1. osRtxMemoryInit(AppMallocDTCM,    sizeof(AppMallocDTCM));! ~* `0 W' ]; f) _8 c" ]
  2. osRtxMemoryInit(AppMallocAXISRAM, sizeof(AppMallocAXISRAM));
复制代码
9 W/ u! g. o- L# B5 ]4 j' Q
  申请动态内存5 f% I% H8 Q- B& l
通过函数void *osRtxMemoryAlloc (void *mem, uint32_t size, uint32_t type)做动态内存申请。' s* d( C1 j2 F8 c5 U$ f' J: L
! j! R, h& o1 J! A% R
第1个参数填写内存区首地址,比如申请的AppMallocDTCM,就填AppMallocDTCM即可。+ w* S! Q3 Q; E2 d0 }" U' c
. R( V' Z' ~/ A( \
第2个参数填写申请的字节大小,单位字节。
- e. [. ^2 v. M' x% ]  g( D$ V5 L4 p2 u- e8 b: v1 A: r
第3个参数固定填0即可。0 x- w% `& M) f
0 _. f# u5 A2 t, @! o, j
返回值是所申请缓冲区的首地址,如果没有空间可用,将返回NULL,这点要特别注意!* e; F2 p4 t; |7 r6 }5 e" p5 R

0 |9 J3 p) |6 p5 O9 x4 d举个例子:
- m& ~/ }8 p9 }8 D1 L( e* D4 I2 l% }# l0 m4 a+ @
  1. uint32_t *DTCM_Addres0, *AXISRAM_Addres0;
    . w/ W( ]& p7 {, j+ t
  2. + F- h& U0 {* \0 i& r4 ?, F
  3. /* 从DTCM申请280字节空间,使用指针变量DTCM_Addres0操作这些空间时不要超过280字节大小 */        
    2 l7 B) J4 ?) D2 h3 S; W, `
  4. DTCM_Addres0 = osRtxMemoryAlloc(AppMallocDTCM, 280, 0);
    5 p! g% G  a2 R  R
  5. DTCMUsed = MemHeadPtr(AppMallocDTCM);0 C+ }; G; F* j/ G: {6 v
  6. printf("DTCM总大小 = %d字节,申请大小 = 0280字节,当前共使用大小 = %d字节\r\n", # O9 j4 @& X2 M
  7.                                                              DTCMUsed->size, DTCMUsed->used);
    , I7 Y6 Z1 U6 f4 w1 z, R

  8. 7 y7 p  Z+ h) }1 F
  9. /* 从AXI SRAM 申请160字节空间,使用指针变量AXISRAM_Addres0操作这些空间时不要超过160字节大小 */        
    5 g' A/ `, m. R
  10. AXISRAM_Addres0 = osRtxMemoryAlloc(AppMallocAXISRAM, 160, 0);
    9 y" [6 P: e. @
  11. AXISRAMUsed = MemHeadPtr(AppMallocAXISRAM);
    + z# U( `5 E+ i" w; E* ]
  12. printf("AXI SRAM总大小 = %d字节,申请大小 = 0162字节,当前共使用大小 = %d字节\r\n", 2 G3 {( _- v5 |+ K: y4 g
  13.                                                             AXISRAMUsed->size, AXISRAMUsed->used);
复制代码

; i' C9 k/ O+ a4 i$ v2 @申请了空间后,就可以直接使用了。另外注意红色字体部分,通过DTCMUsed->used和AXISRAMUsed->used可以获取当前使用的空间大小。
" ]# b, c! w8 L
2 ?6 U1 I+ a3 w  c  释放动态内存4 |; l. m0 L% r, ^! i# m
通过函数uint32_t osRtxMemoryFree (void *mem, void *block)做动态内存释放。
$ F, Q) x* h( M$ `& V; k  F- Q- @9 v* W
9 c( e: a7 B# G* i, E第1个参数填写内存区首地址,比如释放的AppMallocDTCM,就填AppMallocDTCM即可。
; a$ w) I! w1 c+ d
4 a/ ]! d  }: W/ \( Q第2个参数填写申请内存时所获取的内存区首地址,这里用于释放。
; ?0 Z- G# {  {( K
- P) u8 z$ b. l3 Y. L! G- ?3 J4 j返回值,返回1表示成功,返回0表示失败。
8 V+ M! m8 t6 v. t/ N
1 N0 `- C' n% m  T举个例子:) N+ f2 m% Z7 X

$ |- ~; Y) i9 M7 l! E9 v
  1. /* 释放从DTCM申请的280字节空间 */
    2 S) G; D& R1 D% @
  2. osRtxMemoryFree(AppMallocDTCM, DTCM_Addres0);
    ' |; d4 R3 c; y" A$ I+ s
  3. DTCMUsed = MemHeadPtr(AppMallocDTCM);
    , h1 l/ Z- i+ A' p! n% i5 J" F) [0 ?
  4. printf("释放DTCM动态内存区申请的0280字节,当前共使用大小 = %d字节\r\n", DTCMUsed->used);5 T4 z$ V6 \. k5 P0 L
  5.   q. d) j, i" t2 g* ^
  6. /* 释放从AXI SRAM申请的160字节空间 */
    " E* l- `2 G- u7 x, A, a
  7. osRtxMemoryFree(AppMallocAXISRAM, AXISRAM_Addres0);
    " X! K+ L# E1 ~0 Y# S5 n
  8. AXISRAMUsed = MemHeadPtr(AppMallocAXISRAM);1 H' W8 F* u" B" `
  9. printf("释放AXI SRAM动态内存区申请的0160字节,当前共使用大小 = %d字节\r\n", AXISRAMUsed->used)
复制代码

5 G% u; w1 r+ O* Z27.4 实验例程说明(MDK)* b4 o% V5 }; J& T* L. D: u
配套例子:' \* O. U; R% U% |
V7-006_TCM,SRAM等五块内存的动态内存分配实现1 D+ h0 ]2 a7 Z# Y
4 `; g3 N% A, K8 q% `
实验目的:; L0 u5 V" C" V
学习TCM,SRAM等五块内存的动态内存分配实现。
% u/ l8 W% s. Z% C2 b2 s4 a% ^$ b
! s2 L/ c. r6 _
实验内容
$ {/ F" C& S% L0 {& c启动自动重装软件定时器0,每100ms翻转一次LED2。7 j0 ~7 Q( B5 Q# P6 ^+ T- K5 q

$ s6 P2 O" y4 B  Q; b1 q. I& L, m; Z
实验操作:
8 l! @- }- G" j  a1 V( n8 F0 }2 HK1键按下,从DTCM依次申请280字节,64字节和6111字节。0 P/ f9 l  h: K( h
K1键松开,释放从DTCM申请的空间。
, L; b" Y- ^0 MK2键按下,从AXI SRAM依次申请160字节,32字节和2333字节。: |! I! v. v! R$ l
K2键松开,释放从AXI SRAM申请的空间。3 S! F. O8 P: a. _- G
K3键按下,从D2域SRAM依次申请200字节,96字节和4111字节。! Z% D* B4 X5 h3 u: p4 D; M" @
K3键松开,释放从D2域SRAM申请的空间。
# J* y- k( f( }; [+ D# ]摇杆OK键按下,从D3域SRAM依次申请300字节,128字节和5111字节。
+ h$ ~+ i/ f" U3 d摇杆OK键松开,释放从D3域SRAM申请的空间。
* i6 Q+ W& Q5 U, F& A# C/ X' [" g% P% |; W8 l# Z0 J

3 ~9 U, x; V' s/ a! \" g5 t' R上电后串口打印的信息:$ b- F5 m- [8 {$ E
3 f2 S. _" r& P* i* u
波特率 115200,数据位 8,奇偶校验位无,停止位 1
: L% C9 e0 k# v. ^! [: }  l1 r. |7 t( T% p5 D4 r# L
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDcvMTM3OTEwNy0yMDE5.png
! a, |) u0 V7 z7 x1 n
+ g+ V  i6 b$ a- {: B
程序设计:/ F& I/ x1 j9 [% H8 O# N
7 B; k' Q9 d- A% o1 n0 ~
  系统栈大小分配:
& ?% x" ?# X& r: Y# X3 W
+ \9 m, g" W' |" v
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDcvMTM3OTEwNy0yMDE5.png

- ]- D2 c3 W# Z% V- u" j+ a" b9 o3 E2 G
RAM空间用的DTCM:7 O8 Z) E& j1 v3 }' g
+ y# `5 q; o6 U: \
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDcvMTM3OTEwNy0yMDE5.png
' E: M/ G7 X& [6 |( e. _: J/ M  j4 V
: o; q/ ]8 Q$ ?1 g7 ^
  硬件外设初始化
) v0 c- T  n) i* p% b7 I! v+ f1 d' l
硬件外设的初始化是在 bsp.c 文件实现:
1 r; q" G/ _% ?  z9 k
# k4 Q& y, q; O- r  [/ c1 ~
  1. /*
    " E' T+ F. @) m6 K; x+ G
  2. *********************************************************************************************************& x3 _% L" d" k# X) h
  3. *        函 数 名: bsp_Init+ B7 V) S' \! \
  4. *        功能说明: 初始化所有的硬件设备。该函数配置CPU寄存器和外设的寄存器并初始化一些全局变量。只需要调用一次
    + n: J% m# u* ^+ ~  Z# x
  5. *        形    参:无% p& Y6 k4 E# L* Y4 A
  6. *        返 回 值: 无
    " q0 h6 Y2 s& m7 D  K# e1 m; C
  7. *********************************************************************************************************. G. ]* |' W/ H# _
  8. */
    # h8 H+ ]; _+ G9 b) E
  9. void bsp_Init(void)# k$ [  i  }: E! N) |1 _
  10. {
    & t4 @, q. K* p( A6 j& K* s/ B' I) e" W3 ]7 s
  11.     /* 配置MPU */
    " h8 o) Z# ~2 z  |' @1 f
  12.         MPU_Config();" }  }, L/ ]' o
  13.         4 g: F- |( o! y/ l  \8 X
  14.         /* 使能L1 Cache */, `- D6 I+ _6 _8 P
  15.         CPU_CACHE_Enable();5 O+ F$ m$ o3 k) m( m& x$ \

  16. + v0 ]' i4 B6 k3 y$ N/ p
  17.         /*
    , f/ u8 r) |+ e9 ?( s2 g9 V
  18.        STM32H7xx HAL 库初始化,此时系统用的还是H7自带的64MHz,HSI时钟:
      ~( b0 m: d2 a- p+ q
  19.            - 调用函数HAL_InitTick,初始化滴答时钟中断1ms。
    4 H4 i! L) G  R% W- s. D: p9 g
  20.            - 设置NVIV优先级分组为4。  r  ]% S- d& Z' y
  21.          */8 H! S& o2 T6 ~, a" X  P& S2 h
  22.         HAL_Init();8 t3 o$ v+ h6 U$ X* A
  23. 3 \/ ^  N3 Y7 M! {. w8 z: ?2 a2 w
  24.         /* 9 Y4 D7 `( j9 ^9 b, t( _0 q
  25.        配置系统时钟到400MHz
    ! B9 l8 V$ @5 U: H8 n( U
  26.        - 切换使用HSE。
    % \" n: R5 [; K$ ~0 C# \* l2 j
  27.        - 此函数会更新全局变量SystemCoreClock,并重新配置HAL_InitTick。
    " O% t7 E/ s; j" }; V1 s# }5 }
  28.     */
    8 |1 B# N2 J0 `
  29.         SystemClock_Config();2 m$ A3 Q" p& }2 c2 ^# ~9 D2 X/ d
  30. . R/ W/ P" r6 {' c
  31.         /*
    ! Y! u; s0 a" D
  32.            Event Recorder:7 m" h, R# V9 q/ H* o
  33.            - 可用于代码执行时间测量,MDK5.25及其以上版本才支持,IAR不支持。9 |4 U) c  |# [' {. P- g
  34.            - 默认不开启,如果要使能此选项,务必看V7开发板用户手册第xx章# k1 O" v% ^/ ]$ p9 N/ n( s
  35.         */        0 @3 h- y1 S% ~0 Y
  36. #if Enable_EventRecorder == 1  8 c5 ]7 Y& Y6 P8 K; B3 R0 k" a
  37.         /* 初始化EventRecorder并开启 */# _# E1 q4 @# G9 M; @# D
  38.         EventRecorderInitialize(EventRecordAll, 1U);
    6 Y% Y; d# Z' `2 @+ H- O- d
  39.         EventRecorderStart();7 Y& U# f( N& l: J* L: L! o% v
  40. #endif
    ' r# j5 j8 ?0 k! n: }
  41.           D5 X5 R) F5 U  E& q% e6 J
  42.         bsp_InitKey();            /* 按键初始化,要放在滴答定时器之前,因为按钮检测是通过滴答定时器扫描 */
    2 l7 ?5 g& v" x) S, l
  43.         bsp_InitTimer();          /* 初始化滴答定时器 */
    " ~. }" L7 L1 c5 B" x" m
  44.         bsp_InitUart();        /* 初始化串口 */
    * K4 ]3 L% n$ d/ D1 i& D8 Z& h, }
  45.         bsp_InitExtIO();        /* 初始化FMC总线74HC574扩展IO. 必须在 bsp_InitLed()前执行 */        / T( {! o: u$ ~2 F0 s( x' y  J
  46.         bsp_InitLed();            /* 初始化LED */        
    - e, v2 G7 G' u8 j/ W; [/ G
  47. }
复制代码

+ i' ~. S  ~  d0 r0 e  MPU配置和Cache配置:
; O- o& I- C) x数据Cache和指令Cache都开启。
# i, J1 v" K2 F1 E: |- {1 D  w
) T& A( X* y' s' }) l6 hAXI SRAM的MPU属性:
4 \( D; T3 m' h5 K* ?" N; x1 z) m1 l0 C$ o2 j! _, _! C; k
Write back, Read allocate,Write allocate。! K' {+ V3 _; X# h6 i2 F4 I

8 p1 ], F, A8 x+ ~$ u4 M6 `0 ^FMC的扩展IO的MPU属性:
" ~, E, u; T  N' n$ n) @( p5 x! H& m! v# _9 r+ K0 F) v
必须Device或者Strongly Ordered。/ d4 F' p( |7 ?$ L( w
7 \, w4 b0 U6 V2 u5 n% R
D2 SRAM1,SRAM2和SRAM3的MPU属性:
! I( z; Y8 G- O
- A* w8 w2 g, d  Q$ M" x+ JWrite through, read allocate,no write allocate。
2 y% F$ y# d6 Y- h" \, ?8 \% e' s
7 o7 x. ]% Z# _1 H1 XD3 SRAM4的MPU属性:0 H' {" Y7 A$ L5 C3 O, v
- ^, M# ~: A/ L  o& J! P$ s8 a
Write through, read allocate,no write allocate。
3 k  ]$ k% x9 m( h1 ~$ ?+ \& Z1 q
  1. /*% M4 d1 J& V5 t, E. f
  2. *********************************************************************************************************
    2 N. u! n6 Y7 E" w) }! p0 _
  3. *        函 数 名: MPU_Config- \5 o7 V9 T$ C  o$ }" o
  4. *        功能说明: 配置MPU
    5 S' E- v$ X* t. w" d
  5. *        形    参: 无+ x& d8 V  E7 [2 q
  6. *        返 回 值: 无
    8 }3 u. a/ {( I; P' \( k
  7. *********************************************************************************************************
    0 o0 [/ U( a7 x8 u* r& G
  8. */
    9 a) E# h- ]( r0 o8 I
  9. static void MPU_Config( void )
    % G- [# M$ f* o( W, a- q/ g6 N
  10. {9 [! f" S; e( U2 F5 v
  11.         MPU_Region_InitTypeDef MPU_InitStruct;3 x$ \1 F! s- h6 f/ `
  12. ) s7 @4 N  P; v1 x& g
  13.         /* 禁止 MPU */
    ( m' F! G, h/ j1 @, y9 l( X
  14.         HAL_MPU_Disable();
    & e8 L$ {& ~. R9 k! ^* R: w2 k
  15. 8 N- U  n5 @+ Y4 E, |" r6 \+ L9 }
  16.         /* 配置AXI SRAM的MPU属性为Write back, Read allocate,Write allocate */3 s' T, [  }4 n$ y2 K+ s2 }$ D
  17.         MPU_InitStruct.Enable           = MPU_REGION_ENABLE;
    4 ~$ E: @8 l) u0 v
  18.         MPU_InitStruct.BaseAddress      = 0x24000000;
    $ e: Z$ f& w4 n" ~
  19.         MPU_InitStruct.Size             = MPU_REGION_SIZE_512KB;
    : ?) K  Z9 L5 ^8 ~  Y! `4 T
  20.         MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
    8 M, g( h1 Y, P
  21.         MPU_InitStruct.IsBufferable     = MPU_ACCESS_BUFFERABLE;
      W8 y5 M# X; T% Y  |; V0 U  r! z
  22.         MPU_InitStruct.IsCacheable      = MPU_ACCESS_CACHEABLE;
    ( z. Y# Y3 I- ^1 ~0 Z2 S% E; L
  23.         MPU_InitStruct.IsShareable      = MPU_ACCESS_NOT_SHAREABLE;
    5 p: G! x2 ]1 e4 f% S$ `
  24.         MPU_InitStruct.Number           = MPU_REGION_NUMBER0;
    5 W, m3 M% S: j  p+ }9 A
  25.         MPU_InitStruct.TypeExtField     = MPU_TEX_LEVEL1;- U) k, e" O  L7 r8 u
  26.         MPU_InitStruct.SubRegionDisable = 0x00;5 N9 p) o, b% G) s5 u! q* ]
  27.         MPU_InitStruct.DisableExec      = MPU_INSTRUCTION_ACCESS_ENABLE;- g. C! c% x2 b( I% ~6 `1 }/ |1 t
  28. 8 H8 N: I! X& s8 N& b4 p- U! V- I8 W
  29.         HAL_MPU_ConfigRegion(&MPU_InitStruct);( ^/ e! h6 b' T
  30.         9 ?1 H8 h: I8 J
  31.         
    1 i. V! \6 `! z) T( ]
  32.         /* 配置FMC扩展IO的MPU属性为Device或者Strongly Ordered */
    9 M8 Y; e: {2 X7 \! A5 x
  33.         MPU_InitStruct.Enable           = MPU_REGION_ENABLE;
    & h0 z+ L; Y, V3 W6 f% ]# e' o
  34.         MPU_InitStruct.BaseAddress      = 0x60000000;# ?+ ~3 @! o% y0 {5 _- b. S
  35.         MPU_InitStruct.Size             = ARM_MPU_REGION_SIZE_64KB;        / T( x9 g: ?% A5 i/ k/ K% q& e/ b  E* ~
  36.         MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
    5 y# G& t3 ^) P$ {/ E
  37.         MPU_InitStruct.IsBufferable     = MPU_ACCESS_BUFFERABLE;
    $ ^; i" n3 _  B; c) x( C1 F
  38.         MPU_InitStruct.IsCacheable      = MPU_ACCESS_NOT_CACHEABLE;
    # K/ X, e: b! |7 Y9 _9 E
  39.         MPU_InitStruct.IsShareable      = MPU_ACCESS_NOT_SHAREABLE;4 m) T" g9 A8 z
  40.         MPU_InitStruct.Number           = MPU_REGION_NUMBER1;/ U) Q0 t( h4 @% _
  41.         MPU_InitStruct.TypeExtField     = MPU_TEX_LEVEL0;, ^/ p2 [# P* ?0 f, B) Q6 D1 f
  42.         MPU_InitStruct.SubRegionDisable = 0x00;
    0 a' d9 D9 P( S  B; K; D. |' e
  43.         MPU_InitStruct.DisableExec      = MPU_INSTRUCTION_ACCESS_ENABLE;
    - h# N( O& d* W1 @9 C7 [8 P
  44.         7 u0 G3 e  n9 U. B
  45.         HAL_MPU_ConfigRegion(&MPU_InitStruct);
    9 x5 {" e- t0 e
  46.         
    6 W! \, G8 K, q- V) h
  47.         /* 配置SRAM1的属性为Write through, read allocate,no write allocate */
    ! S( Q0 V, P! W' N; Q  R0 A
  48.     MPU_InitStruct.Enable           = MPU_REGION_ENABLE;  b3 l3 H9 `% S: _$ ^# P
  49.     MPU_InitStruct.BaseAddress      = 0x30000000;
    , i3 f# N7 T5 n; d
  50.     MPU_InitStruct.Size             = ARM_MPU_REGION_SIZE_128KB;        9 T/ o" j# \, V) m& _( c. A
  51.     MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
    8 r: c) s! @" e
  52.     MPU_InitStruct.IsBufferable     = MPU_ACCESS_NOT_BUFFERABLE;
    3 @, \8 y7 b  T; w
  53.     MPU_InitStruct.IsCacheable      = MPU_ACCESS_CACHEABLE;
    1 I/ i: M  ]1 r: o3 @( ^2 V
  54.     MPU_InitStruct.IsShareable      = MPU_ACCESS_NOT_SHAREABLE;+ c; \6 K+ ?! x( d5 E
  55.     MPU_InitStruct.Number           = MPU_REGION_NUMBER2;
    . J  x6 l1 p% \4 \* r  |
  56.     MPU_InitStruct.TypeExtField     = MPU_TEX_LEVEL0;
    & H+ M+ q+ Y  r' [' e
  57.     MPU_InitStruct.SubRegionDisable = 0x00;
    % K1 i" g) @( }. h
  58.     MPU_InitStruct.DisableExec      = MPU_INSTRUCTION_ACCESS_ENABLE;
    5 ]9 N& l2 G' X1 ^
  59.   _- X' F' c1 B! [( T
  60.     HAL_MPU_ConfigRegion(&MPU_InitStruct);6 e4 M  Z+ j( x- V# q( v
  61.         
    4 x' s) U4 P0 i8 c" n3 }! m
  62.         /* 配置SRAM2的属性为Write through, read allocate,no write allocate */7 S( j) p4 c) z0 B* A8 g
  63.     MPU_InitStruct.Enable           = MPU_REGION_ENABLE;
    % C1 g9 B' `* B1 I: i( E2 @
  64.     MPU_InitStruct.BaseAddress      = 0x30020000;( A$ ]! L& z6 {" E7 p5 K
  65.     MPU_InitStruct.Size             = ARM_MPU_REGION_SIZE_128KB;        ; _6 |- e1 h, p3 n/ v
  66.     MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
    8 a# B+ `3 _3 W4 N2 b5 o
  67.     MPU_InitStruct.IsBufferable     = MPU_ACCESS_NOT_BUFFERABLE;+ t4 d2 j2 ^6 L) W) ?' ~
  68.     MPU_InitStruct.IsCacheable      = MPU_ACCESS_CACHEABLE;/ }9 C# A5 d5 A+ [6 f
  69.     MPU_InitStruct.IsShareable      = MPU_ACCESS_NOT_SHAREABLE;
    - L# b6 U5 y2 H4 @1 {
  70.     MPU_InitStruct.Number           = MPU_REGION_NUMBER3;. [* O( D1 r( {* I- E( q- S
  71.     MPU_InitStruct.TypeExtField     = MPU_TEX_LEVEL0;
    4 o+ ?; D/ T# u1 l" |
  72.     MPU_InitStruct.SubRegionDisable = 0x00;" j3 N! @7 o$ N7 e; B
  73.     MPU_InitStruct.DisableExec      = MPU_INSTRUCTION_ACCESS_ENABLE;
    8 _0 Q+ X& w% s+ t& `% j

  74. 5 r0 C& b! l) m1 K$ _3 b% a
  75.     HAL_MPU_ConfigRegion(&MPU_InitStruct);
      q% Y$ W& h* N$ e
  76. , M; p. J0 f- F9 p- \& Y& O
  77.   p+ ?* `5 L! T! T' m
  78.     /* 配置SRAM3的属性为Write through, read allocate,no write allocate */
    " j( S7 T9 G0 D/ g
  79.     MPU_InitStruct.Enable           = MPU_REGION_ENABLE;2 l) }, o& z0 D
  80.     MPU_InitStruct.BaseAddress      = 0x30040000;
    4 N1 o; u" O! Y
  81.     MPU_InitStruct.Size             = ARM_MPU_REGION_SIZE_32KB;        
    ( H$ ]* m4 b1 w' ~9 T5 m: R
  82.     MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;6 S" P9 l9 y( {6 i
  83.     MPU_InitStruct.IsBufferable     = MPU_ACCESS_NOT_BUFFERABLE;
    * v8 M, O5 b* O8 R1 z& y
  84.     MPU_InitStruct.IsCacheable      = MPU_ACCESS_CACHEABLE;
    7 \% v: o! Y3 w: c: P0 X
  85.     MPU_InitStruct.IsShareable      = MPU_ACCESS_NOT_SHAREABLE;. y7 e2 U1 _: B! e+ H
  86.     MPU_InitStruct.Number           = MPU_REGION_NUMBER4;. o+ N+ p/ x; v. b* l) L
  87.     MPU_InitStruct.TypeExtField     = MPU_TEX_LEVEL0;8 j4 g4 p7 {( j7 n+ ?, x
  88.     MPU_InitStruct.SubRegionDisable = 0x00;/ c/ L0 u) d8 X0 V
  89.     MPU_InitStruct.DisableExec      = MPU_INSTRUCTION_ACCESS_ENABLE;% w6 Q+ r+ S" X* k) v

  90. 4 l& L+ I4 t7 F, N$ |
  91.     HAL_MPU_ConfigRegion(&MPU_InitStruct);
    & p9 S' w9 P/ |/ D1 _
  92.         3 A3 B# o* o: Y1 U
  93.         
    + C& R0 \" ~1 g) {. W3 u2 S6 \6 M1 Q
  94.         /* 配置SRAM4的属性为Write through, read allocate,no write allocate */
    & }/ r) A6 W1 @  y9 g2 C* I. \* v
  95.     MPU_InitStruct.Enable           = MPU_REGION_ENABLE;
    ' c; I1 ^2 d' U9 Z; O
  96.     MPU_InitStruct.BaseAddress      = 0x38000000;
    ) B& D; i) d& U2 u) {" X
  97.     MPU_InitStruct.Size             = ARM_MPU_REGION_SIZE_64KB;        ; G1 z9 A$ z5 M; v
  98.     MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
    * i& v# W2 |1 u, S
  99.     MPU_InitStruct.IsBufferable     = MPU_ACCESS_NOT_BUFFERABLE;
    9 [/ o5 V1 A# m) ~4 i0 h9 B
  100.     MPU_InitStruct.IsCacheable      = MPU_ACCESS_CACHEABLE;0 s) n4 u! A/ X( x4 l; {, u
  101.     MPU_InitStruct.IsShareable      = MPU_ACCESS_NOT_SHAREABLE;
    $ M. u0 }* E; x% \4 Z
  102.     MPU_InitStruct.Number           = MPU_REGION_NUMBER5;+ D. _0 W, S& j# ^7 p
  103.     MPU_InitStruct.TypeExtField     = MPU_TEX_LEVEL0;; {/ N9 R! c4 [
  104.     MPU_InitStruct.SubRegionDisable = 0x00;
    7 c' e: E1 b- _8 o: G! o
  105.     MPU_InitStruct.DisableExec      = MPU_INSTRUCTION_ACCESS_ENABLE;
    % @7 c/ x: B* q9 U
  106. & Y) x3 V/ d9 Y9 n/ b
  107.     HAL_MPU_ConfigRegion(&MPU_InitStruct);2 C4 }( V0 V6 f" c% Q, v& u6 x' A
  108.         
    1 ^& K3 w* X, C# p' ~
  109.         /*使能 MPU */5 q& V0 E' [3 r3 A4 m; \& w8 O# M" _/ V
  110.         HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);& e0 ]6 o0 [: B& q+ _$ q. W
  111. }
    " ?3 s  P% a& o; x" B( U" n6 S

  112. 5 g- Z8 S% I0 T5 @4 E; z9 X
  113. /*
    + ?( n$ m) F# ]" ~" {( B' q
  114. *********************************************************************************************************7 K4 Y4 o3 p$ }
  115. *        函 数 名: CPU_CACHE_Enable! Z2 O1 |! g* d! ]
  116. *        功能说明: 使能L1 Cache
      V2 b* R+ l. k6 d7 M
  117. *        形    参: 无; c; r/ D. ]+ |4 f4 v
  118. *        返 回 值: 无
    + P; T! [, @5 J& v
  119. *********************************************************************************************************
    ( ^  e! {# ^( m8 H, a9 P6 C8 I
  120. */
    # O4 ]. A( R5 k
  121. static void CPU_CACHE_Enable(void)' N" z7 c6 [  ~5 A5 x: Q
  122. {
    ( l2 R$ i& B8 t. _- G9 g9 X
  123.         /* 使能 I-Cache */5 Y0 x; z! C& A$ a
  124.         SCB_EnableICache();
    8 `! u" ]( N7 z. n7 e
  125. & N4 M+ R( W% w
  126.         /* 使能 D-Cache */1 t- v* ]/ }  t( u) l: `
  127.         SCB_EnableDCache();5 Y; t2 f; c6 [; u& h, c
  128. }
复制代码

- s8 H, a, f8 r7 f, b8 C& m6 F  主功能:/ I, A- q( T% M7 }
3 Y" q) F& t/ X; q6 k
主程序实现如下操作:" _9 }2 U4 U/ t- ]2 a# Y, g, I

& M8 B. @! b0 z& n: Z& H* B9 `  启动自动重装软件定时器0,每100ms翻转一次LED2。2 G3 u2 h+ N6 b+ G  H
  K1键按下,从DTCM依次申请280字节,64字节和6111字节。
# R* ~  U2 t" F9 y! M  K1键松开,释放从DTCM申请的空间。
8 ^5 Z1 {' ]/ ~3 A- R2 V" k' Q  C  K2键按下,从AXI SRAM依次申请160字节,32字节和2333字节。
+ E7 b8 n7 j( C$ W. U! F  K2键松开,释放从AXI SRAM申请的空间。
9 U8 N% z1 v2 ^; o9 K+ |  K3键按下,从D2域SRAM依次申请200字节,96字节和4111字节。7 P  M/ l1 |$ d5 n2 q$ M
  K3键松开,释放从D2域SRAM申请的空间。/ q: o  }6 M7 t! ^6 B4 |8 h8 g+ Y, U
  摇杆OK键按下,从D3域SRAM依次申请300字节,128字节和5111字节。5 J: p+ `6 H, X2 N9 w  f
  摇杆OK键松开,释放从D3域SRAM申请的空间。# z/ w) E3 W5 e. `
  1. /*
    ) G; V" ?2 V& s4 x3 f9 U4 j% W' F
  2. *********************************************************************************************************& N/ f3 G+ M+ i$ y- ~
  3. *        函 数 名: main
    . U: d) R! c4 u, d4 \$ p, i) [2 n7 v
  4. *        功能说明: c程序入口3 w9 I5 y8 c% E8 t" l5 p/ e" v
  5. *        形    参: 无# ]. q3 ^! G. b6 T! i7 M2 o
  6. *        返 回 值: 错误代码(无需处理)
    2 s: |9 ]1 \) f6 }# ?
  7. *********************************************************************************************************
    1 l% M  l: k# H, B9 j
  8. */
    , S% Z; b5 A3 X" [
  9. int main(void)2 W# I9 N" y# }8 D/ x. t! W
  10. {2 o! b! M# i/ x) ]% o
  11.         uint8_t ucKeyCode;                /* 按键代码 */
    , \* X% d9 u. K& z/ o
  12.         uint32_t *DTCM_Addres0, *AXISRAM_Addres0, *SRAM1_Addres0, *SRAM4_Addres0;* V4 i+ h5 i/ ?; g. j! g
  13.         uint16_t *DTCM_Addres1, *AXISRAM_Addres1, *SRAM1_Addres1, *SRAM4_Addres1;7 j4 I( S/ \9 m, w
  14.         uint8_t  *DTCM_Addres2, *AXISRAM_Addres2, *SRAM1_Addres2, *SRAM4_Addres2;! _  f9 ?/ w, d* x% L- r
  15. & B' u6 z  n- C) _/ o! G% h
  16. 4 m$ l/ ]/ i7 j) _  B# h
  17.         bsp_Init();                /* 硬件初始化 */# u/ h) d% D% ?% `
  18.         
    / u* L( F" j. ^, o  k' @
  19.         /* 初始化动态内存空间 *// O3 t( R( E9 U/ s
  20.         osRtxMemoryInit(AppMallocDTCM,    sizeof(AppMallocDTCM));5 y  s7 v  y+ j3 w' U7 \* m3 z- R
  21.         osRtxMemoryInit(AppMallocAXISRAM, sizeof(AppMallocAXISRAM));2 d9 [2 c( r/ S  w9 ?$ i0 C! I
  22.         osRtxMemoryInit(AppMallocSRAM1,   sizeof(AppMallocSRAM1));% J; V. M' [# [' U$ _
  23.         osRtxMemoryInit(AppMallocSRAM4,   sizeof(AppMallocSRAM4));
    5 X4 m7 X( i; ]' g" ~
  24.         
    3 o% z, F% I1 V# ]
  25.         PrintfLogo();        /* 打印例程名称和版本等信息 */9 V: f( R- D! E) j
  26.         PrintfHelp();        /* 打印操作提示 */" G1 F4 Y, w( }9 k. U; V

  27. $ h- }- r' |2 p
  28.         bsp_StartAutoTimer(0, 100);        /* 启动1个100ms的自动重装的定时器 */4 W. f  Y. w! Q* J
  29.           f0 v5 I% a, S/ n' i2 f' c# ?) z% w

  30. 1 k6 U7 N& f( i  E6 [0 E8 o0 i/ y. p
  31.         /* 进入主程序循环体 */6 w9 T$ v5 ]( j  c% \
  32.         while (1)
    5 L: i; x! l% E) j; R
  33.         {( {& t" x" P8 [8 m
  34.                 bsp_Idle();                /* 这个函数在bsp.c文件。用户可以修改这个函数实现CPU休眠和喂狗 */
    5 A: ]( A/ U# X$ d7 k
  35. * [% V/ t% v; \, _9 l9 q" f
  36.                 /* 判断定时器超时时间 */
    . Z; S* _" b) L. d7 N* i4 |, u4 Z8 o) K
  37.                 if (bsp_CheckTimer(0))        
    , ]) d# ^" w( R  x
  38.                 {5 A$ ^; [( \$ S) r4 ~" {2 n
  39.                         /* 每隔100ms 进来一次 */  
    / R1 k8 v$ O" N/ x3 R
  40.                         bsp_LedToggle(2);$ r* c5 T1 q( J4 G% R. n
  41.                 }
    8 V; d% B; k  t8 W' \. g) V& h
  42. , m( J( z% [/ Q5 Z
  43.                 /* 按键滤波和检测由后台systick中断服务程序实现,我们只需要调用bsp_GetKey读取键值即可。 */! A7 @/ H, m2 o% ]
  44.                 ucKeyCode = bsp_GetKey();        /* 读取键值, 无键按下时返回 KEY_NONE = 0 */
    ) u# L6 u& L8 B
  45.                 if (ucKeyCode != KEY_NONE)
    , d0 Q  \! O2 p  H1 L
  46.                 {
    & T" H+ z5 h1 x  R  i/ h8 d
  47.                         switch (ucKeyCode)1 W5 e9 b6 m) f2 B6 c0 N
  48.                         {
    0 U6 L/ k4 h/ }
  49.                 /* 从DTCM依次申请280字节,64字节和6111字节 */
    . V+ m6 |! u5 B- L( K
  50.                                 case KEY_DOWN_K1:        + J! `# U. D! E4 X1 p6 d+ F: X( C9 m1 x
  51.                     /* 从DTCM申请280字节空间,使用指针变量DTCM_Addres0操作这些空间时不要超过280字节大小 */, c% M0 X" ^( C
  52.                                         printf("=========================================================\r\n");
    4 ^/ _$ v9 k+ E5 Z' b* ]- G
  53.                                         DTCM_Addres0 = osRtxMemoryAlloc(AppMallocDTCM, 280, 0);
    $ w6 Z3 D# |4 U9 P$ a# x& f; v
  54.                                         DTCMUsed = MemHeadPtr(AppMallocDTCM);
    $ p" m9 d- d$ X& a5 o
  55.                                         printf("DTCM总大小 = %d字节,申请大小 = 0280字节,当前共使用大小 = %d字节\r\n",
    / V/ ^/ |/ F; ?- m6 l% R
  56.                                                                                 DTCMUsed->size, DTCMUsed->used);
    ) ~5 X; n- o8 A, d
  57.                                 
    ; T& M; w! [5 f# t6 T
  58.                         /* 从DTCM申请64字节空间,使用指针变量DTCM_Addres1操作这些空间时不要超过64字节大小 */        5 Z6 W+ s' Q% r% ]) g8 u/ l- p1 P. h
  59.                                         DTCM_Addres1 = osRtxMemoryAlloc(AppMallocDTCM, 64, 0);" g; ~/ t6 l5 N1 @6 d
  60.                                         DTCMUsed = MemHeadPtr(AppMallocDTCM);
    * n9 \2 q# s! a5 v5 ^' A
  61.                                         printf("DTCM总大小 = %d字节,申请大小 = 0064字节,当前共使用大小 = %d字节\r\n",
    - Q* q5 R7 s: C1 K
  62.                                                                                                            DTCMUsed->size, DTCMUsed->used);
    ! S; r8 [) ?7 ^/ E. B1 z9 [$ S
  63.                                 ; {( {" ^( c% w1 x. N
  64.                     /* 从DTCM申请6111字节空间,使用指针变量DTCM_Addres2操作这些空间时不要超过6111字节大小 */* j9 P5 ~2 a7 D9 _* r
  65.                                         DTCM_Addres2 = osRtxMemoryAlloc(AppMallocDTCM, 6111, 0);, C. @% X( P4 ]# s& h- l/ a! p
  66.                                         DTCMUsed = MemHeadPtr(AppMallocDTCM);
    % [, `2 n+ J" |3 H
  67.                                         printf("DTCM总大小 = %d字节,申请大小 = 6111字节,当前共使用大小 = %d字节\r\n",
    8 Z6 C: ~/ j# k4 ?
  68.                                                                                 DTCMUsed->size, DTCMUsed->used);
    2 Q9 Q$ H9 X/ x2 U7 z* ]
  69.                                         break;/ R+ q; i  y7 _( d- v/ a/ n
  70.                                 7 p2 D' S( `0 w5 S( r
  71.                                 /* 释放从DTCM申请的空间 */
    1 U: U4 k) N& f4 d% {$ g( r2 e
  72.                                 case KEY_UP_K1:          Z  M6 s7 L' V+ H; i6 ~
  73.                                         /* 释放从DTCM申请的280字节空间 */
    / p' |, e4 R% x- L# H, ]. ?
  74.                                         osRtxMemoryFree(AppMallocDTCM, DTCM_Addres0);/ P& s6 o# w+ I6 g3 x8 f
  75.                                         DTCMUsed = MemHeadPtr(AppMallocDTCM);9 B) t$ g* K; K6 G
  76.                                         printf("释放DTCM动态内存区申请的0280字节,当前共使用大小 = %d字节\r\n",
    + f6 V9 W5 W5 [+ m
  77. DTCMUsed->used);
    # r  l, @2 \" k8 w. G
  78.                                 - D( E) P: R! i8 N+ u/ y6 R' p; v7 r! _
  79.                                         /* 释放从DTCM申请的64字节空间 */4 F' M( j% D5 @. q  I" x& D2 M
  80.                                         osRtxMemoryFree(AppMallocDTCM, DTCM_Addres1);% ~/ g0 ^9 ]! U  {: r
  81.                                         DTCMUsed = MemHeadPtr(AppMallocDTCM);! v! n5 j) @; J3 d0 V2 l
  82.                                         printf("释放DTCM动态内存区申请的0064字节,当前共使用大小 = %d字节\r\n",3 @9 ~. E$ c4 N8 {8 X
  83. DTCMUsed->used);
    # m7 Y9 B! R- k: h" j) ]* Z$ I
  84.                                 : l3 m! w# G/ \$ k+ z
  85.                                         /* 释放从DTCM申请的6111字节空间 *// N- x! ^" q. W
  86.                                         osRtxMemoryFree(AppMallocDTCM, DTCM_Addres2);
    : ]8 j6 [' y  }. }
  87.                                         DTCMUsed = MemHeadPtr(AppMallocDTCM);. S" {0 x* R6 t. Y7 b
  88.                                         printf("释放DTCM动态内存区申请的6111字节,当前共使用大小 = %d字节\r\n",
    + S" j2 Q5 k; u
  89. DTCMUsed->used);
    - x4 f' |4 O9 {* Z/ M- t) ?7 B
  90.                                         break;
    ; }  e( X$ @' t) e( U6 A
  91.                                 
    " f$ k4 ~' F6 N; e
  92.                                 /* 从AXI SRAM依次申请160字节,32字节和2333字节 */* k1 h; r1 S' x
  93.                                 case KEY_DOWN_K2:        - N: a2 M, _" I
  94.             /* 从AXI SRAM 申请160字节空间,使用指针变量AXISRAM_Addres0操作这些空间时不要超过160字节大小 */
    9 e; \. G+ I1 e6 e
  95.                                         printf("=========================================================\r\n");                $ `5 p( p% M9 ?6 ]
  96.                                         AXISRAM_Addres0 = osRtxMemoryAlloc(AppMallocAXISRAM, 160, 0);
    " X' I+ b: E/ L+ H# D: O7 b
  97.                                         AXISRAMUsed = MemHeadPtr(AppMallocAXISRAM);" f5 I4 Y& k& M8 }; _* y3 u/ d3 O. x
  98.                                         printf("AXI SRAM总大小 = %d字节,申请大小 = 0162字节,当前共使用大小 = %d字节\r\n",
    8 B0 }) A/ y, _1 E
  99.                                                                                 AXISRAMUsed->size, AXISRAMUsed->used);
    ! G6 f" c! x: ^
  100.                                 
    % ~8 @, _( g, z8 C) L9 I7 E
  101.                         /* 从AXI SRAM 申请32字节空间,使用指针变量AXISRAM_Addres1操作这些空间时不要超过32字节大小 */  y9 M7 W* ]8 r" |( {: \
  102.                                         AXISRAM_Addres1 = osRtxMemoryAlloc(AppMallocAXISRAM, 32, 0);
    , {) `& |: c7 e7 w, E. C7 v8 c+ a
  103.                                         AXISRAMUsed = MemHeadPtr(AppMallocAXISRAM);# o4 `# a8 _4 @. }
  104.                                         printf("AXI SRAM总大小 = %d字节,申请大小 = 0032字节,当前共使用大小 = %d字节\r\n", 0 `/ d5 D# M, i1 c: F) Q3 n
  105.                                                                                                       AXISRAMUsed->size, AXISRAMUsed->used);! K# p4 u6 j/ ], e, v
  106.                                 : D* r: U. d, k9 Q/ P, l
  107. /* 从AXI SRAM 申请2333字节空间,使用指针变量AXISRAM_Addres2操作这些空间时不要超过2333字节大小 */        
    ( _/ {" h/ K4 E6 \9 D/ m
  108.                                         AXISRAM_Addres2 = osRtxMemoryAlloc(AppMallocAXISRAM, 2333, 0);
    ; W/ G2 o5 d- L& V* j
  109.                                         AXISRAMUsed = MemHeadPtr(AppMallocAXISRAM);  `/ ~' O  U: I# j
  110.                                         printf("AXI SRAM总大小 = %d字节,申请大小 = 2333字节,当前共使用大小 = %d字节\r\n",
    * F3 n7 ?' C$ k
  111.                                                                                 AXISRAMUsed->size, AXISRAMUsed->used);
      X& c1 P$ q& z( S: s. }
  112.                                         break;. u; i" s" s! F0 B) P! l" p0 |
  113.                                 * n% k' B' h: C9 Y" @! D- {/ d
  114.                                 /* 释放从AXI SRAM申请的空间 */
    : S; _- ]( U+ V; ~% _3 m) C* F
  115.                                 case KEY_UP_K2:        
    ( f4 O: z. ]: ?& o* P* k7 L# p% i8 f) \
  116.                                         /* 释放从AXI SRAM申请的160字节空间 */: C1 t# w' U0 e6 F2 |4 C
  117.                                         osRtxMemoryFree(AppMallocAXISRAM, AXISRAM_Addres0);! W1 z4 U$ P5 C* }
  118.                                         AXISRAMUsed = MemHeadPtr(AppMallocAXISRAM);
    & T# }3 M& z" s
  119.                                         printf("释放AXI SRAM动态内存区申请的0160字节,当前共使用大小 = %d字节\r\n",; Q# G5 a: ~( L
  120. AXISRAMUsed->used);/ |- c1 v7 T. c# n$ X# O+ `6 h
  121.                                 : c6 R! x4 x3 L! b6 F4 ?
  122.                                         /* 释放从AXI SRAM申请的32字节空间 */: N/ {2 H; v# {4 V5 I' A
  123.                                         osRtxMemoryFree(AppMallocAXISRAM, AXISRAM_Addres1);% O' p! e( k- H' o  c$ c
  124.                                         AXISRAMUsed = MemHeadPtr(AppMallocAXISRAM);2 x1 o( W! A& e! ?. Q
  125.                                         printf("释放AXI SRAM动态内存区申请的0032字节,当前共使用大小 = %d字节\r\n",
    # m  c* Q# f* Z' b8 q7 b7 E
  126. AXISRAMUsed->used);
    5 q, r4 k" Z, E- c, ?
  127.                                 
    $ n. p0 x" X  e3 N# j
  128.                                         /* 释放从AXI SRAM申请的2333字节空间 */
    9 B/ w3 k7 d5 d+ e: e) y% ^2 b% j1 O
  129.                                         osRtxMemoryFree(AppMallocAXISRAM, AXISRAM_Addres2);
    * ~5 m/ |3 s. V, m( J9 ^
  130.                                         AXISRAMUsed = MemHeadPtr(AppMallocAXISRAM);! `! |& \3 A7 t) B7 B; I/ s
  131.                                         printf("释放AXI SRAM动态内存区申请的2333字节,当前共使用大小 = %d字节\r\n", ; ?) q2 J) y# ?% U3 E
  132. AXISRAMUsed->used);7 @, {( y* I* S% @$ \
  133.                                         break;" \! p2 ]; Z5 k  V# I7 S. g' V
  134.                                 
    . |( G3 M' h% Z3 Y/ C
  135.                                 /* 从D2域SRAM依次申请200字节,96字节和4111字节 */1 [1 _: N+ l- \4 X
  136.                                 case KEY_DOWN_K3:        
    & N; t7 x9 s$ f# X7 e) m1 ]4 q/ ?+ s
  137.         /* 从D2域的SRAM申请200字节空间,使用指针变量SRAM1_Addres0操作这些空间时不要超过200字节大小 */
    % b) O' j; u! Z4 J6 t$ H
  138.                                         printf("=========================================================\r\n");               
    9 B. j8 N8 v4 N% C
  139.                                         SRAM1_Addres0 = osRtxMemoryAlloc(AppMallocSRAM1, 200, 0);% B+ L$ P6 a* p5 R
  140.                                         SRAM1Used = MemHeadPtr(AppMallocSRAM1);* Y: G1 R: q4 H" ]6 w
  141.                                         printf("D2域SRAM总大小 = %d字节,申请大小 = 0200字节,当前共使用大小 = %d字节\r\n",
    6 d+ F5 U0 v( \! H. [2 I" t/ K
  142.                                                                                 SRAM1Used->size, SRAM1Used->used);; ~- W1 U* k# b9 y; [
  143.                                 
    , O0 M9 J& w1 X) R3 _! h
  144.          /* 从D2域的SRAM申请96字节空间,使用指针变量SRAM1_Addres1操作这些空间时不要超过96字节大小 */        5 z5 L  G; o: D, n' p& f
  145.                                         SRAM1_Addres1 = osRtxMemoryAlloc(AppMallocSRAM1, 96, 0);
    ; u+ X: b! g5 \
  146.                                         SRAM1Used = MemHeadPtr(AppMallocSRAM1);$ H6 H0 b% a! C  k5 Y% M
  147.                                         printf("D2域SRAM总大小 = %d字节,申请大小 = 0096字节,当前共使用大小 = %d字节\r\n", 8 `' q2 t: k* L
  148.                                                                                                            SRAM1Used->size, SRAM1Used->used);- m7 @# t7 V6 _' Y8 z6 [9 ]; U2 g
  149.                                 / e+ a+ Q+ k; Z3 |  a/ H5 s( Q- m) c
  150.          /* 从D2域的SRAM申请4111字节空间,使用指针变量SRAM1_Addres2操作这些空间时不要超过4111字节大小 */
    * |( `. M3 v1 f! h% A
  151.                                         SRAM1_Addres2 = osRtxMemoryAlloc(AppMallocSRAM1, 4111, 0);5 ^1 N8 }1 N: m+ n% U1 z$ x  Y4 f
  152.                                         SRAM1Used = MemHeadPtr(AppMallocSRAM1);$ R' z+ s9 a; }4 e# S8 h9 @& o
  153.                                         printf("D2域SRAM总大小 = %d字节,申请大小 = 4111字节,当前共使用大小 = %d字节\r\n",
    ) E/ r7 s% Q. L8 B1 ?
  154.                                                                                 SRAM1Used->size, SRAM1Used->used);
    + n# e2 p3 O* K4 s; L/ C  r4 v
  155.                                         break;8 w+ W( G5 Z4 _7 K5 w( U" _9 I
  156.                                 
    2 u# ?" E8 d  H7 R
  157.                                 /* 释放从D2域SRAM申请的空间 */
    . y, z' O% A# |6 y: q2 Q; U
  158.                                 case KEY_UP_K3:        : f- Y9 P7 x( p, y$ K' q
  159.                                         /* 释放从D2域的SRAM申请的200字节空间 */9 M0 F) m0 ], E
  160.                                         osRtxMemoryFree(AppMallocSRAM1, SRAM1_Addres0);2 d9 r$ M5 y: e6 ?6 G$ U  e' }" A9 j" X
  161.                                         SRAM1Used = MemHeadPtr(AppMallocSRAM1);
    / w) b: P, L5 ]' ^
  162.                                         printf("释放D2域SRAM动态内存区申请的0200字节,当前共使用大小 = %d字节\r\n",, V* k/ H& I& Z; q
  163. SRAM1Used->used);
    . V2 R: B0 ]/ p! `; t6 ?
  164.                                 
    $ S0 N  I& `8 K
  165.                                         /* 释放从D2域的SRAM申请的96字节空间 */+ `. d0 m1 ?+ Q  d. j5 P* v, r' x
  166.                                         osRtxMemoryFree(AppMallocSRAM1, SRAM1_Addres1);/ ?+ N3 u4 T5 L' J3 L4 E
  167.                                         SRAM1Used = MemHeadPtr(AppMallocSRAM1);+ Z3 U6 {+ {$ C
  168.                                         printf("释放D2域SRAM动态内存区申请的0096字节,当前共使用大小 = %d字节\r\n",) T! K% d# }# M% L' A; ^8 X
  169. SRAM1Used->used);
    4 u- H7 w4 c5 e1 c
  170.                                 
    $ g, w! o% N0 J; l* ?  {) `7 B. W& v
  171.                                         /* 释放从D2域的SRAM申请的4111字节空间 */
    . n" q" `( [" M) P0 X+ S
  172.                                         osRtxMemoryFree(AppMallocSRAM1, SRAM1_Addres2);
    3 T! p$ y& B0 x+ j
  173.                                         SRAM1Used = MemHeadPtr(AppMallocSRAM1);
    8 x% \2 Y1 u. B' s) a
  174.                                         printf("释放D2域SRAM动态内存区申请的4111字节,当前共使用大小 = %d字节\r\n",
    ) I2 ^! c+ L, a  x
  175. SRAM1Used->used);
    . W: ]; S$ }5 G) l  `5 a- {3 y
  176.                                         break;
    # I1 j) i6 M0 g! P+ v
  177.                                 
    0 P' F. D' i. m- D, x( ^
  178.                                 /* 从D3域SRAM依次申请300字节,128字节和5111字节 */
    + v( G+ a0 e" m4 r' I: k
  179.                                 case JOY_DOWN_OK:        ! \) z* Y% L4 u& H+ q2 z
  180.             /* 从D3域的SRAM申请300字节空间,使用指针变量SRAM4_Addres0操作这些空间时不要超过300字节大小 */& Q* w- I. b) R4 N" K
  181.                                         printf("=========================================================\r\n");               
    0 T5 p7 L* [$ k4 H5 f
  182.                                         SRAM4_Addres0 = osRtxMemoryAlloc(AppMallocSRAM4, 300, 0);
    7 k- k8 [3 f( \2 Q( }3 e4 v
  183.                                         SRAM4Used = MemHeadPtr(AppMallocSRAM4);
    - @! W' k  K& P- F: R4 j- k
  184.                                         printf("D3域SRAM总大小 = %d字节,申请大小 = 0300字节,当前共使用大小 = %d字节\r\n",
    ' R  J- C) a% b. \
  185.                                                                                 SRAM4Used->size, SRAM4Used->used);
    . Y. G, L- S$ `( _( O) a2 e
  186.                                   E6 x1 l, f: V8 R+ k8 ]  {3 [
  187.                 /* 从D3域的SRAM申请96字节空间,使用指针变量SRAM4_Addres1操作这些空间时不要超过96字节大小 */) K% [8 E4 R- O
  188.                                         SRAM4_Addres1 = osRtxMemoryAlloc(AppMallocSRAM4, 128, 0);
    . m0 ]( J# \0 R: Y& J. q
  189.                                         SRAM4Used = MemHeadPtr(AppMallocSRAM4);
      G+ k( e3 Z7 @; Z: T7 `$ j( ~
  190.                                         printf("D3域SRAM总大小 = %d字节,申请大小 = 0128字节,当前共使用大小 = %d字节\r\n",
    9 [/ p) C* E& D1 I9 K. ~3 h  a) v6 `
  191.                                                                                                            SRAM4Used->size, SRAM4Used->used);# @  a7 q  y" ?7 T
  192.                                 . o4 `% h" s1 [# ?) B- g( u7 a- n( V
  193.         /* 从D3域的SRAM申请5111字节空间,使用指针变量SRAM4_Addres2操作这些空间时不要超过5111字节大小 */
    5 _: z- U7 C) u3 g
  194.                                         SRAM4_Addres2 = osRtxMemoryAlloc(AppMallocSRAM4, 5111, 0);
    ; w$ }6 y: E" O1 J1 x0 L
  195.                                         SRAM4Used = MemHeadPtr(AppMallocSRAM4);0 K3 a9 I( u- l* ~3 K
  196.                                         printf("D3域SRAM总大小 = %d字节,申请大小 = 5111字节,当前共使用大小 = %d字节\r\n", 7 u* A' C' H3 T: a7 L, ~
  197.                                                                                 SRAM4Used->size, SRAM4Used->used);7 g9 }: q' M4 n2 U5 W
  198.                                         break;
    ! o5 S4 f5 q* W4 C* [- M
  199.                                 
    , `$ {; h9 g8 D  {8 e+ \/ D7 r
  200.                                 /* 释放从D3域SRAM申请的空间 */' y8 z* y, ?3 a% U
  201.                                 case JOY_UP_OK:        
    ' ]" ^" s5 |0 Y
  202.                                         /* 释放从D3域的SRAM申请的300字节空间 */- W( I* o8 u' d- V  M
  203.                                         osRtxMemoryFree(AppMallocSRAM4, SRAM4_Addres0);2 `7 p5 r1 g. V: ~3 u# M
  204.                                         SRAM4Used = MemHeadPtr(AppMallocSRAM4);
    ! C' U+ X/ d' a2 n7 U- N
  205.                                         printf("释放D3域SRAM动态内存区申请的0300字节,当前共使用大小 = %d字节\r\n",
    * T; L0 J2 ^$ R8 d
  206. SRAM4Used->used);2 R* r, J5 G$ H# t! [# I
  207.                                 
    * H. t# S6 q7 u6 l3 F: @
  208.                                         /* 释放从D3域的SRAM申请的128字节空间 */
    6 t$ M8 j$ |6 z4 n' p: ^* @7 |. Y
  209.                                         osRtxMemoryFree(AppMallocSRAM4, SRAM4_Addres1);" a8 u5 s) O) A9 C
  210.                                         SRAM4Used = MemHeadPtr(AppMallocSRAM4);; t' a' ^: h( A' t: Q3 V
  211.                                         printf("释放D3域SRAM动态内存区申请的0128字节,当前共使用大小 = %d字节\r\n",/ L8 C% y! N: O! s8 E# q
  212. SRAM4Used->used);
    . _! Y4 Q) r4 O' o' z& Z6 H' j
  213.                                 
    $ M7 q' M4 W7 W" I/ D; V4 i8 D' U
  214.                                         /* 释放从D3域的SRAM申请的5111字节空间 */
    , i1 ~+ Q& j, E1 D9 y5 S
  215.                                         osRtxMemoryFree(AppMallocSRAM4, SRAM4_Addres2);) u/ z$ _8 r$ i8 ?$ G
  216.                                         SRAM4Used = MemHeadPtr(AppMallocSRAM4);' |7 J3 W7 m' t9 `, e6 {
  217.                                         printf("释放D3域SRAM动态内存区申请的5111字节,当前共使用大小 = %d字节\r\n",1 a# u+ T' x" x; |3 e
  218. SRAM4Used->used);6 R& e2 _6 m# M+ b
  219.                                         break;
    / k: W( D/ T  q4 S
  220.                         6 Q/ v+ L( J3 _: w- Q8 b8 w
  221.                                 default:0 `' W3 e) F' S2 H1 U
  222.                                   /* 其它的键值不处理 */
    5 F$ ~4 I) X) H( k( g# g
  223.                                   break;6 X$ X) S. Y# c% W/ Z. ~
  224.                         }& j9 V% b' t: a8 l/ j* Q4 p3 ^
  225.                 }" n5 O. }% a2 f& c) ^8 \! x; F- q
  226.         }
    ! W: L0 p' P5 C  [  h
  227. }
复制代码
0 b: _" C& N/ Z( v/ t: J7 j
27.5 实验例程说明(IAR)
* a3 K( L! B! F/ x配套例子:
" S% i$ m; b1 |V7-006_TCM,SRAM等五块内存的动态内存分配实现
  r9 o2 `3 }3 x, p/ i& {! j7 q% S9 X7 L. @- H0 j$ U7 l9 p
实验目的:$ L4 z4 g6 N; V) K' L9 S
学习TCM,SRAM等五块内存的动态内存分配实现。
4 z/ ~2 R/ \' Z! O. N. V
* C% R4 o% c7 G" [5 T3 J7 c
+ y: B8 q8 F4 b7 ]# Q& \$ k1 W, M) j实验内容:! g2 R1 w3 u* a8 W0 v1 @
启动自动重装软件定时器0,每100ms翻转一次LED2。2 G7 l$ k3 s: M
/ S. q7 \, R9 h% K* |; c8 W
实验操作:2 L$ l! a' Q! o% \; [- N
K1键按下,从DTCM依次申请280字节,64字节和6111字节。
7 b5 A6 S3 a* G9 w( uK1键松开,释放从DTCM申请的空间。! b( y, Q. P; v" P& v3 \( e5 F
K2键按下,从AXI SRAM依次申请160字节,32字节和2333字节。% ]9 u- I3 H* p& V! n- j1 V6 E: h
K2键松开,释放从AXI SRAM申请的空间。
0 Z- E. ^  n6 L/ XK3键按下,从D2域SRAM依次申请200字节,96字节和4111字节。! x0 y& Q1 y+ n# w! n: B4 n9 X' M
K3键松开,释放从D2域SRAM申请的空间。
6 w$ T4 B1 X3 s! e摇杆OK键按下,从D3域SRAM依次申请300字节,128字节和5111字节。
$ O7 H) H% y" [9 v/ E5 {摇杆OK键松开,释放从D3域SRAM申请的空间。
! Q( ]* R+ O  j2 d/ R! Q; J* E; j& \0 f# n
上电后串口打印的信息:
9 A! |2 `0 }4 Y9 j( D% q; d$ U/ o6 L$ M/ v$ ]  H2 q8 y, a6 N/ j
波特率 115200,数据位 8,奇偶校验位无,停止位 1
- g, q2 |1 M5 a( p7 r, T4 S6 F( e1 c& n3 p
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDcvMTM3OTEwNy0yMDE5.png

% [' v( D  Z$ Q6 d
# K) [! x4 I  W+ o程序设计:+ ?' w" {" a! j3 }) ^+ U$ e* t
& p$ e2 ]7 m# y1 l1 C
  系统栈大小分配:8 k5 Q$ E0 z* {
" P  k$ R; Q# _! l7 B
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDcvMTM3OTEwNy0yMDE5.png
) _6 T8 l8 z3 K6 I

7 w6 l7 D& Z8 E, q1 k5 J( u: P  RAM空间用的DTCM:
, ~: N& c/ I- Q
" U3 f5 p2 w' _; K
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDcvMTM3OTEwNy0yMDE5.png
. |: D: L' Z( w! d; j2 |2 d, u
/ n! N4 q9 t" ~& D% O) M; _
  硬件外设初始化
, y* }# m2 ?0 V% N& N
% p5 C: t6 I, F/ c: O
硬件外设的初始化是在 bsp.c 文件实现:* E0 N% d  T  A. ?* G. [
" Z% @: {+ J. R' ~( U! |) ^$ Q! K. S
  1. /*3 {# ~8 Q4 B/ c7 i, h# ]
  2. *********************************************************************************************************7 t" _7 y) T0 `) p+ W! p
  3. *        函 数 名: bsp_Init( s9 z. X- P& x5 |! \
  4. *        功能说明: 初始化所有的硬件设备。该函数配置CPU寄存器和外设的寄存器并初始化一些全局变量。只需要调用一次. Y7 G: B/ L2 z2 M- k& g1 Q
  5. *        形    参:无: j& ^3 Q8 q* k  k( z2 H
  6. *        返 回 值: 无; _; b1 [/ r" h/ m# r  Y
  7. *********************************************************************************************************
    6 P+ o/ ~1 f5 r/ C4 F1 k
  8. */! f8 Z9 Y% a5 [3 B& S/ _
  9. void bsp_Init(void)
    & A! v( `* U, _1 x5 V' B
  10. {
    4 X$ u3 h, d' q9 N6 g1 f  U
  11.     /* 配置MPU */& A6 X1 U2 P5 R5 I& R9 m* R. Z* D
  12.         MPU_Config();% @$ D! x# z$ X, k( L. J
  13.         8 U4 F( E# S9 _2 D, A- d
  14.         /* 使能L1 Cache */
    % e* a. m! h) f" i7 u& ]4 c, j
  15.         CPU_CACHE_Enable();0 k$ @: n6 ?* p) {) J) `
  16. 9 ~3 n" u7 X: }
  17.         /*
    4 J6 c+ {, S' p! c. w0 y
  18.        STM32H7xx HAL 库初始化,此时系统用的还是H7自带的64MHz,HSI时钟:2 X7 ~0 O  o( I$ y0 _
  19.            - 调用函数HAL_InitTick,初始化滴答时钟中断1ms。
    2 B( A. _6 n/ _
  20.            - 设置NVIV优先级分组为4。  r2 b1 \) p* X1 a
  21.          */
    : J) w$ k! j0 t9 h
  22.         HAL_Init();
    $ \: [/ u. c4 r3 ~
  23. # H" u+ q1 {: L" b/ ~9 F
  24.         /* 8 d' A; M( C2 C+ Z4 I
  25.        配置系统时钟到400MHz$ L, d! x: O7 ^* m
  26.        - 切换使用HSE。
    0 H* Z$ g% u+ A8 g8 Z7 P
  27.        - 此函数会更新全局变量SystemCoreClock,并重新配置HAL_InitTick。$ H9 e% }' C2 Z/ |6 V6 R7 ]" v
  28.     */1 j6 c" b, q$ _+ ]( k
  29.         SystemClock_Config();
    . r6 G; x: `8 _7 {3 |- d
  30. , X$ m* n' h4 s6 X; \
  31.         /*
    0 _2 c% ~) }6 U( i! l2 G
  32.            Event Recorder:
    " v7 w$ d  h& a& F! h: N% J
  33.            - 可用于代码执行时间测量,MDK5.25及其以上版本才支持,IAR不支持。
    + v! X0 D* x- V  f
  34.            - 默认不开启,如果要使能此选项,务必看V7开发板用户手册第xx章& r9 e4 g7 z1 ?2 v- n2 |) }+ H
  35.         */          A0 m, N  ~' B) g% R% B
  36. #if Enable_EventRecorder == 1  - a7 }, V9 o" v8 E" y
  37.         /* 初始化EventRecorder并开启 */
    3 }% S/ C( q6 l5 P! A9 e
  38.         EventRecorderInitialize(EventRecordAll, 1U);& y, U! p5 ~" p9 w' J( ?
  39.         EventRecorderStart();- D* r% E$ h- x& W0 J  R- K
  40. #endif
    : t/ T  Y: o; R' f8 n' U5 e! c" @
  41.         
    5 `7 v+ P: Y; d) v
  42.         bsp_InitKey();            /* 按键初始化,要放在滴答定时器之前,因为按钮检测是通过滴答定时器扫描 */
    " l5 r2 q/ S1 o- @) U2 [* u. d
  43.         bsp_InitTimer();          /* 初始化滴答定时器 */
    + d/ o! z8 R! `- u4 u: K4 Y
  44.         bsp_InitUart();        /* 初始化串口 */+ o( n1 ?  k2 m+ M
  45.         bsp_InitExtIO();        /* 初始化FMC总线74HC574扩展IO. 必须在 bsp_InitLed()前执行 */        
    : p- G: X+ Q* Q" K. U
  46.         bsp_InitLed();            /* 初始化LED */        " ~7 c! l. A! C
  47. }
复制代码

& |- {" c& X2 d+ B) i  MPU配置和Cache配置:

5 i" a2 X, g7 N0 y3 ^
! x# Q  ~5 e0 W7 v- o数据Cache和指令Cache都开启。+ @& }! b' R+ K7 o
1 O( M* [% z( s- O+ W
AXI SRAM的MPU属性:/ w6 x) D1 u$ P) p5 b: x

3 w% @; q" t% IWrite back, Read allocate,Write allocate。
& F  h+ ?9 c; s3 _) I% {9 _' A, E( W. Z/ u  z" U: T. Z
FMC的扩展IO的MPU属性:
) `0 c2 f6 L3 H; T# f- i$ j" Y0 V( P% a
必须Device或者Strongly Ordered。+ \* ~: |0 |$ |- q( l* G
: ~+ J4 Q8 |3 Q: U, g
D2 SRAM1,SRAM2和SRAM3的MPU属性:, m$ `( \& B$ s4 M7 L

6 p' O: H5 M7 v" lWrite through, read allocate,no write allocate。* V1 u, y; M5 L7 Y6 p: M/ G

1 @7 H; @6 `5 E/ `) ZD3 SRAM4的MPU属性:
8 d, c: q# f- a5 K
9 \1 v0 f, C+ M8 ]+ N. @3 U) ZWrite through, read allocate,no write allocate。. T  _9 y/ I5 I$ x) g6 K
% m0 |6 r7 U4 H5 F
  1. /*
    9 f) F# K  l7 G, v( Y4 {
  2. *********************************************************************************************************+ z" ~' B0 J7 |, ~$ {
  3. *        函 数 名: MPU_Config* ^+ d' d, g8 G1 G
  4. *        功能说明: 配置MPU
    2 T) J+ x& J$ ]5 {
  5. *        形    参: 无
    % n% c% U- [' B1 E- R8 t/ y4 E
  6. *        返 回 值: 无  a4 u, f) m9 X" C/ l' J& v
  7. *********************************************************************************************************! b# S0 m1 I8 q
  8. */
    9 r2 b* E5 O( k8 @4 E% Q
  9. static void MPU_Config( void )
    $ O$ b; x  ?+ g: T  f, r, I7 G
  10. {
    - Y0 }' N8 W/ f' J2 O; P
  11.         MPU_Region_InitTypeDef MPU_InitStruct;
    7 K/ `; U! S3 E
  12. % H$ c8 t$ h, n. B( M; }. n
  13.         /* 禁止 MPU */5 O, M8 J' [. a5 }/ H/ O6 \  K
  14.         HAL_MPU_Disable();# b$ W( v: i- M, Q0 ]/ L: W& V* u  H

  15. : X4 B$ n9 u5 [* K5 Z
  16.         /* 配置AXI SRAM的MPU属性为Write back, Read allocate,Write allocate */. f' h& d# R6 F9 V- h
  17.         MPU_InitStruct.Enable           = MPU_REGION_ENABLE;9 w) c0 v2 P3 y
  18.         MPU_InitStruct.BaseAddress      = 0x24000000;
    ! ?1 S( f; Z2 u1 \# G5 G$ p! V: c
  19.         MPU_InitStruct.Size             = MPU_REGION_SIZE_512KB;  x# T" \  Z1 }1 G, Y; K
  20.         MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;8 E7 d9 h9 N6 i) s* l  w% U; [. @
  21.         MPU_InitStruct.IsBufferable     = MPU_ACCESS_BUFFERABLE;3 O' h4 o8 J: C: ^; D" s; V
  22.         MPU_InitStruct.IsCacheable      = MPU_ACCESS_CACHEABLE;
    0 n2 X. T- n5 R! ]  @& T& z9 @
  23.         MPU_InitStruct.IsShareable      = MPU_ACCESS_NOT_SHAREABLE;# U- Y2 A% x* `( o  g5 s
  24.         MPU_InitStruct.Number           = MPU_REGION_NUMBER0;
    9 V2 n0 e) }8 B% R8 L2 q
  25.         MPU_InitStruct.TypeExtField     = MPU_TEX_LEVEL1;3 Q/ p1 ^7 Y0 x5 ^( q
  26.         MPU_InitStruct.SubRegionDisable = 0x00;  S0 S' S7 p/ z  U
  27.         MPU_InitStruct.DisableExec      = MPU_INSTRUCTION_ACCESS_ENABLE;6 H0 J, d# l, ~; f' L% h2 z
  28. - O0 {7 o# t5 V5 G6 x  V5 E
  29.         HAL_MPU_ConfigRegion(&MPU_InitStruct);
    ! Y" F1 ?- Y+ }& U. T) H. {6 m
  30.         
    7 b2 R: Z2 [  Z) B8 v1 b) _8 j$ @6 E, E9 a
  31.         ; W" M; `- D1 E
  32.         /* 配置FMC扩展IO的MPU属性为Device或者Strongly Ordered */
    % ~" f/ ^; m3 d9 a
  33.         MPU_InitStruct.Enable           = MPU_REGION_ENABLE;
    / E8 i+ b. S0 V5 R  {9 p5 s
  34.         MPU_InitStruct.BaseAddress      = 0x60000000;
    $ G6 o# W: K5 T' f- f6 Z
  35.         MPU_InitStruct.Size             = ARM_MPU_REGION_SIZE_64KB;        # G$ u( j& y: [0 T! G4 m8 T
  36.         MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;8 G4 L+ Q% U, P
  37.         MPU_InitStruct.IsBufferable     = MPU_ACCESS_BUFFERABLE;$ S! G% F0 z4 }$ R) p: x  R
  38.         MPU_InitStruct.IsCacheable      = MPU_ACCESS_NOT_CACHEABLE;, G% C+ e6 Z. g9 u' S1 H
  39.         MPU_InitStruct.IsShareable      = MPU_ACCESS_NOT_SHAREABLE;
    . Z! H6 O) [% o2 x  t
  40.         MPU_InitStruct.Number           = MPU_REGION_NUMBER1;" I. g' Z3 ?0 w0 d/ }
  41.         MPU_InitStruct.TypeExtField     = MPU_TEX_LEVEL0;
    4 b* x# Z3 l" h6 t& Q
  42.         MPU_InitStruct.SubRegionDisable = 0x00;
    ! W9 G4 o( A' h) K
  43.         MPU_InitStruct.DisableExec      = MPU_INSTRUCTION_ACCESS_ENABLE;
    . g, G- T( Q' ~/ c3 ~0 o/ |
  44.         
    7 h- m" W! R9 K3 D0 |, I  q' n
  45.         HAL_MPU_ConfigRegion(&MPU_InitStruct);- U* I$ \6 x  v6 A) r2 P4 X, ^% x
  46.         ( D8 \3 U- I- A& f
  47.         /* 配置SRAM1的属性为Write through, read allocate,no write allocate */* @5 ~2 c! `# ?0 ?0 _
  48.     MPU_InitStruct.Enable           = MPU_REGION_ENABLE;
    : D  w5 Q! s- R; c% T+ e
  49.     MPU_InitStruct.BaseAddress      = 0x30000000;
    2 y6 w9 N/ @1 `9 l" C" g% C
  50.     MPU_InitStruct.Size             = ARM_MPU_REGION_SIZE_128KB;        
    " ^: L2 `* T  c) s# n% {) N5 o( @
  51.     MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
    : l) Y  `/ D5 F( d
  52.     MPU_InitStruct.IsBufferable     = MPU_ACCESS_NOT_BUFFERABLE;, w, j5 m  `9 f8 |2 \6 s: O5 t
  53.     MPU_InitStruct.IsCacheable      = MPU_ACCESS_CACHEABLE;
      u8 r7 W# Q4 }: z
  54.     MPU_InitStruct.IsShareable      = MPU_ACCESS_NOT_SHAREABLE;
    . p# x0 p; P3 D$ ~4 ]
  55.     MPU_InitStruct.Number           = MPU_REGION_NUMBER2;0 t3 \5 e8 S' E$ O# T! _% L2 ~
  56.     MPU_InitStruct.TypeExtField     = MPU_TEX_LEVEL0;
    : p' i3 F7 |# S
  57.     MPU_InitStruct.SubRegionDisable = 0x00;
    4 t% d! H) O- \% q- c0 h3 H
  58.     MPU_InitStruct.DisableExec      = MPU_INSTRUCTION_ACCESS_ENABLE;& D1 |7 Q  L7 ~* q: a! A  z

  59. $ I/ [$ c/ {2 i, e
  60.     HAL_MPU_ConfigRegion(&MPU_InitStruct);; N; c" v2 s5 w
  61.         5 f! P5 j2 v0 E/ \. D
  62.         /* 配置SRAM2的属性为Write through, read allocate,no write allocate */
    2 o' `' |" K; s# c9 A
  63.     MPU_InitStruct.Enable           = MPU_REGION_ENABLE;
    # C8 C5 Y6 G- j3 p$ B4 S
  64.     MPU_InitStruct.BaseAddress      = 0x30020000;* [5 g/ Q1 @! P* o% W" {
  65.     MPU_InitStruct.Size             = ARM_MPU_REGION_SIZE_128KB;        ) `$ G5 h& C; w8 j8 S* W0 z* ?- T2 R
  66.     MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;/ {2 D) ]# ]$ A. W& R( j# |+ X6 ^5 j
  67.     MPU_InitStruct.IsBufferable     = MPU_ACCESS_NOT_BUFFERABLE;; }6 X4 p' M$ z% L& }
  68.     MPU_InitStruct.IsCacheable      = MPU_ACCESS_CACHEABLE;2 c' D& |8 v& o" r# X! k; W
  69.     MPU_InitStruct.IsShareable      = MPU_ACCESS_NOT_SHAREABLE;& X9 T. h: J2 ^& c& O, I5 t
  70.     MPU_InitStruct.Number           = MPU_REGION_NUMBER3;
    ; b/ D- g9 C! L
  71.     MPU_InitStruct.TypeExtField     = MPU_TEX_LEVEL0;
    - u2 A0 {% S5 A3 h7 [6 U: P* l
  72.     MPU_InitStruct.SubRegionDisable = 0x00;6 n  T) P1 M* P' O# x# A9 Z8 e
  73.     MPU_InitStruct.DisableExec      = MPU_INSTRUCTION_ACCESS_ENABLE;
    7 G9 e( ]% ?: ?. V$ F) P. V

  74. , l0 Y1 W" d- X- {. I4 u
  75.     HAL_MPU_ConfigRegion(&MPU_InitStruct);
    6 ^; O# K+ q6 T1 l* v6 b' M
  76. / D5 X1 L1 f" @6 N0 l

  77. # r% i( _' N- d7 `) l, D
  78.     /* 配置SRAM3的属性为Write through, read allocate,no write allocate */) z! h% P+ u, h% G) T6 k
  79.     MPU_InitStruct.Enable           = MPU_REGION_ENABLE;
    8 h4 S; I, m2 l9 }; p! K
  80.     MPU_InitStruct.BaseAddress      = 0x30040000;
    $ l  }0 w' @5 \9 l" ^, ~
  81.     MPU_InitStruct.Size             = ARM_MPU_REGION_SIZE_32KB;        ( V# B% j- u) u5 \6 k. w: |
  82.     MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
    1 @+ k7 R. G1 b+ g5 V# ]
  83.     MPU_InitStruct.IsBufferable     = MPU_ACCESS_NOT_BUFFERABLE;+ W( A8 K) w5 i# X. W' v; n9 M# u& y! L
  84.     MPU_InitStruct.IsCacheable      = MPU_ACCESS_CACHEABLE;- C2 E8 n) C5 K/ V5 A5 \. h1 P
  85.     MPU_InitStruct.IsShareable      = MPU_ACCESS_NOT_SHAREABLE;: p* B; X9 B- J7 c, z+ E! C; R
  86.     MPU_InitStruct.Number           = MPU_REGION_NUMBER4;  R7 [2 {* l, G& U
  87.     MPU_InitStruct.TypeExtField     = MPU_TEX_LEVEL0;
    $ S1 Q$ _% Y: G9 I. p9 A* A: D( u
  88.     MPU_InitStruct.SubRegionDisable = 0x00;0 b& M6 A2 _: o  c/ y1 \
  89.     MPU_InitStruct.DisableExec      = MPU_INSTRUCTION_ACCESS_ENABLE;, J8 Q( L! o! @7 ?# }

  90. 3 e+ x& g) B1 b1 G5 Q3 u
  91.     HAL_MPU_ConfigRegion(&MPU_InitStruct);, V) N4 N8 L( z1 H7 ~
  92.         
    ; ]8 O" a/ k. K6 `
  93.         # X" \$ a$ l. p
  94.         /* 配置SRAM4的属性为Write through, read allocate,no write allocate */
    % n1 m- r" B2 j7 R$ b6 i
  95.     MPU_InitStruct.Enable           = MPU_REGION_ENABLE;% Q* o8 H% Y/ m. _+ x; T  _2 B
  96.     MPU_InitStruct.BaseAddress      = 0x38000000;; o+ p4 c/ d* `
  97.     MPU_InitStruct.Size             = ARM_MPU_REGION_SIZE_64KB;        , Y9 O: x" Q3 M1 X: ^8 a
  98.     MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;  K  g. E+ I+ E) Y8 V% f; ]
  99.     MPU_InitStruct.IsBufferable     = MPU_ACCESS_NOT_BUFFERABLE;1 L9 h: p6 V) r8 [( x/ j* P. f
  100.     MPU_InitStruct.IsCacheable      = MPU_ACCESS_CACHEABLE;6 b9 z. _6 @/ P  E/ ]3 A+ t
  101.     MPU_InitStruct.IsShareable      = MPU_ACCESS_NOT_SHAREABLE;( ~: f8 M$ r( `& N) q# @8 E
  102.     MPU_InitStruct.Number           = MPU_REGION_NUMBER5;, }4 Z$ ]( z/ J$ N; {
  103.     MPU_InitStruct.TypeExtField     = MPU_TEX_LEVEL0;
    / ~& l3 ]+ k# F( n* P
  104.     MPU_InitStruct.SubRegionDisable = 0x00;
    & O! n0 L. e6 H
  105.     MPU_InitStruct.DisableExec      = MPU_INSTRUCTION_ACCESS_ENABLE;& w0 k+ v& a' s$ q2 D$ L7 w
  106. % h9 Z$ G" P) D. d; u
  107.     HAL_MPU_ConfigRegion(&MPU_InitStruct);' p3 c  r" ~3 T
  108.         - k" o. ~. l1 h, C( h8 [
  109.         /*使能 MPU */
    6 U  S$ g$ f* k. i) {
  110.         HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);1 C4 c$ g" W) F  D8 j5 R
  111. }
    0 i! I+ g, k3 H5 y; N: @
  112. $ T; N( u* _- u& Z3 K9 L
  113. /*
    , Z2 k1 w9 s  W1 d/ b/ y; `. K
  114. *********************************************************************************************************! {. [7 x3 m& h# Z- g5 Q8 C, s& f
  115. *        函 数 名: CPU_CACHE_Enable
    / N2 L  w! C: z0 d6 B! Q
  116. *        功能说明: 使能L1 Cache
    0 R, b/ j  Y- T* G! g0 s
  117. *        形    参: 无
    ' y* }( ^) g: d) |# E
  118. *        返 回 值: 无
    1 p" ^" z- X* Y7 _5 h
  119. *********************************************************************************************************& ^. ~" K5 ^  Q7 W  v  R
  120. */% o) M3 E0 n) ~: W# l
  121. static void CPU_CACHE_Enable(void)3 O: R7 ?" P/ f  b
  122. {
    0 T+ }: }- W/ ]1 ?2 F- X
  123.         /* 使能 I-Cache */% x) d3 t2 o) i6 @8 |6 X6 x
  124.         SCB_EnableICache();7 C; E: o  y7 N& e- Y

  125. / q; D( j+ o4 C
  126.         /* 使能 D-Cache */3 ^" U) B/ w4 \: @
  127.         SCB_EnableDCache();
    3 c0 ]% p! P+ M9 `; E/ l' y
  128. }
复制代码
/ t" u' H% R4 H% B9 m
  主功能:0 L9 {3 L: O% c, f

8 O& J. R# g! K- l) Q5 I主程序实现如下操作:: B% M* A3 s. k# r
: w6 ]$ b! ?: B4 }
  启动自动重装软件定时器0,每100ms翻转一次LED2。
# Y) q+ g" H+ x1 b2 a, P% l  K1键按下,从DTCM依次申请280字节,64字节和6111字节。- `% g# _2 Q/ |( w
  K1键松开,释放从DTCM申请的空间。& g9 }  B$ \" a. A/ q
  K2键按下,从AXI SRAM依次申请160字节,32字节和2333字节。* H9 f) I9 V* f+ x0 T' h2 B
  K2键松开,释放从AXI SRAM申请的空间。+ b# R6 j$ E- F& z% y* T
  K3键按下,从D2域SRAM依次申请200字节,96字节和4111字节。5 x+ l1 n+ R, _) l/ f5 \6 A
  K3键松开,释放从D2域SRAM申请的空间。
1 R( q" X+ h& X/ w  摇杆OK键按下,从D3域SRAM依次申请300字节,128字节和5111字节。4 B! M( y/ p1 ^0 H# @& k
  摇杆OK键松开,释放从D3域SRAM申请的空间。6 v( s. ]! M) F) W
  1. /*& y  ^) ~* k7 D9 m; O$ L1 y
  2. *********************************************************************************************************9 d! p) }4 Q0 i5 H# h  G7 y
  3. *        函 数 名: main, \1 k- u$ C3 N6 v" J
  4. *        功能说明: c程序入口: s! x) D  p" E7 Q
  5. *        形    参: 无7 G' F/ H6 k) _: q1 ^6 A. Z
  6. *        返 回 值: 错误代码(无需处理)" Z4 P3 S5 f8 J/ ~( B# h; m
  7. *********************************************************************************************************- f% F# @) W: }7 p1 [. u
  8. */
    * I- h$ y+ M) w( F5 z0 i: g3 k
  9. int main(void)
    / K% L) H2 C8 j5 I
  10. {% m( c. O) S4 N& L$ `
  11.         uint8_t ucKeyCode;                /* 按键代码 */' D1 f$ _0 v& |7 R1 I" e. ~
  12.         uint32_t *DTCM_Addres0, *AXISRAM_Addres0, *SRAM1_Addres0, *SRAM4_Addres0;
    4 S  C; B+ ]5 f2 l0 G# _
  13.         uint16_t *DTCM_Addres1, *AXISRAM_Addres1, *SRAM1_Addres1, *SRAM4_Addres1;
    / P: G8 R  o5 X
  14.         uint8_t  *DTCM_Addres2, *AXISRAM_Addres2, *SRAM1_Addres2, *SRAM4_Addres2;1 c) N0 W0 q4 ~% `) ~
  15. 9 H" `8 f3 S" k' X

  16. - B' |2 L: g# |& A
  17.         bsp_Init();                /* 硬件初始化 */
    ( b' c9 |2 E) X% T
  18.         
    0 k5 `( e7 \  J* o" Z
  19.         /* 初始化动态内存空间 */
    - ?: `7 K2 U( r6 ]  i% O* K0 }
  20.         osRtxMemoryInit(AppMallocDTCM,    sizeof(AppMallocDTCM));; t0 {1 `; K: n0 S( W& a* ?# r4 _, _
  21.         osRtxMemoryInit(AppMallocAXISRAM, sizeof(AppMallocAXISRAM));) N5 L: E7 l/ ]
  22.         osRtxMemoryInit(AppMallocSRAM1,   sizeof(AppMallocSRAM1));
    : S0 o6 r: c  z5 t
  23.         osRtxMemoryInit(AppMallocSRAM4,   sizeof(AppMallocSRAM4));# P! n7 g9 Z& r6 o
  24.         
    , g0 S2 v& ]( \/ g$ Q0 t8 O
  25.         PrintfLogo();        /* 打印例程名称和版本等信息 */7 q9 x5 u. l* i$ ]2 _2 K0 l
  26.         PrintfHelp();        /* 打印操作提示 */
    3 n/ c/ F  E1 f6 ]4 u/ f$ z
  27. " \4 O" M- _1 p/ F8 s( V. J
  28.         bsp_StartAutoTimer(0, 100);        /* 启动1个100ms的自动重装的定时器 */
    , f+ |$ d# K5 H4 d& M
  29.         
    3 y/ ^0 W6 ~$ y; [

  30. 3 v1 L) K, z& |4 l/ _) u/ x; G9 k
  31.         /* 进入主程序循环体 */" m" ~; k! {; b, X- A; e# z* H3 A
  32.         while (1)
    0 D  s  G) t/ Y# S9 n& U
  33.         {
    . R$ u# {1 P5 O1 l: ]3 V0 A
  34.                 bsp_Idle();                /* 这个函数在bsp.c文件。用户可以修改这个函数实现CPU休眠和喂狗 */6 W6 A. m$ x+ A# Y% f0 w
  35.   B# H, ^. _5 o3 z, h, i- s* H
  36.                 /* 判断定时器超时时间 */
    % \" f; v" w5 [( A6 L' L, E
  37.                 if (bsp_CheckTimer(0))        1 A$ {& w% M9 T" z: B( u
  38.                 {
    2 i5 Q6 |# `2 }4 Q$ a7 C( n
  39.                         /* 每隔100ms 进来一次 */  0 A3 N2 g& B3 H- i1 ~. p
  40.                         bsp_LedToggle(2);# J2 Z. ?7 A# F# L5 ^& m' T+ P2 T( b
  41.                 }- T5 J; V2 |) T' g* x! p

  42. - r& z+ R; i& l& U1 o" Q5 Y
  43.                 /* 按键滤波和检测由后台systick中断服务程序实现,我们只需要调用bsp_GetKey读取键值即可。 */! O6 `; M: L8 e& G
  44.                 ucKeyCode = bsp_GetKey();        /* 读取键值, 无键按下时返回 KEY_NONE = 0 */
    3 p0 o' [: u4 R& e; L: ]# w
  45.                 if (ucKeyCode != KEY_NONE)# C. H% V1 P* q2 R' b
  46.                 {
    ; C- s9 K+ c! }  C
  47.                         switch (ucKeyCode)' \+ X0 p" A; T) l6 D7 ]
  48.                         {3 I5 r  [) s3 M& g: L& P
  49.                 /* 从DTCM依次申请280字节,64字节和6111字节 */* Y1 Y$ ?0 t4 f6 m5 n- |
  50.                                 case KEY_DOWN_K1:        ! f! J3 D1 w9 H( p- s" }
  51.                     /* 从DTCM申请280字节空间,使用指针变量DTCM_Addres0操作这些空间时不要超过280字节大小 */
    2 W! p" U' j( U8 _+ S
  52.                                         printf("=========================================================\r\n");! f0 M7 I+ f' W; ]+ V$ Q! m
  53.                                         DTCM_Addres0 = osRtxMemoryAlloc(AppMallocDTCM, 280, 0);/ |5 Z& Y+ k* E7 K$ ^2 O, D9 `0 L; M8 u
  54.                                         DTCMUsed = MemHeadPtr(AppMallocDTCM);1 Z$ w6 j# @' Y7 f! q3 Y. d
  55.                                         printf("DTCM总大小 = %d字节,申请大小 = 0280字节,当前共使用大小 = %d字节\r\n",
    9 \! k3 g6 A$ a2 o# I
  56.                                                                                 DTCMUsed->size, DTCMUsed->used);3 a$ J" X  f$ W+ ?
  57.                                 $ a- O# e7 k$ X, a7 t
  58.                         /* 从DTCM申请64字节空间,使用指针变量DTCM_Addres1操作这些空间时不要超过64字节大小 */        % X0 e& L1 A# c; M1 j4 {
  59.                                         DTCM_Addres1 = osRtxMemoryAlloc(AppMallocDTCM, 64, 0);
    . h+ p( {2 z$ @9 ^, U7 ?
  60.                                         DTCMUsed = MemHeadPtr(AppMallocDTCM);7 U- Q" X5 w: n5 q
  61.                                         printf("DTCM总大小 = %d字节,申请大小 = 0064字节,当前共使用大小 = %d字节\r\n", % U9 V* V8 W8 W$ R
  62.                                                                                                            DTCMUsed->size, DTCMUsed->used);
    9 H8 T* q9 z8 U: ]7 ]
  63.                                 ) [! q7 ^1 i6 x! x! y
  64.                     /* 从DTCM申请6111字节空间,使用指针变量DTCM_Addres2操作这些空间时不要超过6111字节大小 */4 y$ K) [0 s( T) B% w. D, t" l
  65.                                         DTCM_Addres2 = osRtxMemoryAlloc(AppMallocDTCM, 6111, 0);
    ; l+ |3 O8 J$ r/ J' b
  66.                                         DTCMUsed = MemHeadPtr(AppMallocDTCM);8 z* v) }9 M' p9 n) ]4 g. Y& y
  67.                                         printf("DTCM总大小 = %d字节,申请大小 = 6111字节,当前共使用大小 = %d字节\r\n", 7 o) V6 q) r, P" S$ M
  68.                                                                                 DTCMUsed->size, DTCMUsed->used);
    6 U0 R) k, z# y/ V
  69.                                         break;/ }, {! g, ^! \4 R8 B
  70.                                 
    & p7 t# Z2 n, M4 N" ^7 @2 |8 m
  71.                                 /* 释放从DTCM申请的空间 */
    . `* M( |/ i4 c
  72.                                 case KEY_UP_K1:        
    1 j3 K# G  H' s
  73.                                         /* 释放从DTCM申请的280字节空间 */0 y( K9 J3 \4 v) W6 O+ l
  74.                                         osRtxMemoryFree(AppMallocDTCM, DTCM_Addres0);1 E/ w# _" r% a7 [, B4 ~4 }6 y
  75.                                         DTCMUsed = MemHeadPtr(AppMallocDTCM);9 V# `% ?# d1 p( N
  76.                                         printf("释放DTCM动态内存区申请的0280字节,当前共使用大小 = %d字节\r\n", + N5 G1 H3 O1 Q2 X/ k+ {
  77. DTCMUsed->used);
    * W" e6 Q7 o# q' |4 R3 `
  78.                                 / B+ l* H4 E& M
  79.                                         /* 释放从DTCM申请的64字节空间 */" F& p& o/ C2 y3 r
  80.                                         osRtxMemoryFree(AppMallocDTCM, DTCM_Addres1);
    ) F7 E/ {3 Y( F* ]! K- A' Z$ _
  81.                                         DTCMUsed = MemHeadPtr(AppMallocDTCM);- U* C; V+ L8 l0 Q5 |
  82.                                         printf("释放DTCM动态内存区申请的0064字节,当前共使用大小 = %d字节\r\n",
    0 {' o: }$ z2 Z$ r/ f1 Z9 U! F
  83. DTCMUsed->used);
    % H( w6 j/ S. O% G" O" q
  84.                                 
    % r2 Z* Z! }% I! K3 L. W
  85.                                         /* 释放从DTCM申请的6111字节空间 */7 ?5 \  }* y0 N" l; _
  86.                                         osRtxMemoryFree(AppMallocDTCM, DTCM_Addres2);
    ( }+ m) F4 p2 V
  87.                                         DTCMUsed = MemHeadPtr(AppMallocDTCM);) s( w" A* \0 X3 z  `1 j
  88.                                         printf("释放DTCM动态内存区申请的6111字节,当前共使用大小 = %d字节\r\n",5 Y+ h7 ?3 r( A( s
  89. DTCMUsed->used);) X- q  ^2 T& H# v. m) k' x/ H
  90.                                         break;* Z  y, F- N" C8 n" ?
  91.                                 0 c& l0 j" o8 W+ G
  92.                                 /* 从AXI SRAM依次申请160字节,32字节和2333字节 */
    $ J( P7 [0 N. j! H+ F. m6 D
  93.                                 case KEY_DOWN_K2:        
    1 U  `+ o$ {& E) e2 C- N' g
  94.             /* 从AXI SRAM 申请160字节空间,使用指针变量AXISRAM_Addres0操作这些空间时不要超过160字节大小 */! r" o* B7 l$ v5 ]
  95.                                         printf("=========================================================\r\n");               
    ! e" U1 [" x9 m$ G4 ]; \
  96.                                         AXISRAM_Addres0 = osRtxMemoryAlloc(AppMallocAXISRAM, 160, 0);- a5 Y( K/ q4 L! c4 a
  97.                                         AXISRAMUsed = MemHeadPtr(AppMallocAXISRAM);; I) t6 w4 e: G2 i* x3 V  V0 C
  98.                                         printf("AXI SRAM总大小 = %d字节,申请大小 = 0162字节,当前共使用大小 = %d字节\r\n",
    / ^- r2 w' B; i. W% _4 D5 s3 C
  99.                                                                                 AXISRAMUsed->size, AXISRAMUsed->used);
    . N% q% B& L" r" r  }: o
  100.                                 
    & _7 j( u( s* w' j
  101.                         /* 从AXI SRAM 申请32字节空间,使用指针变量AXISRAM_Addres1操作这些空间时不要超过32字节大小 */4 o; C( J6 H6 u6 f7 M( p
  102.                                         AXISRAM_Addres1 = osRtxMemoryAlloc(AppMallocAXISRAM, 32, 0);
    $ u& }" e. w- |) r6 ?/ c. J
  103.                                         AXISRAMUsed = MemHeadPtr(AppMallocAXISRAM);
    1 `3 z+ ^3 U$ a- ~" X: W/ K
  104.                                         printf("AXI SRAM总大小 = %d字节,申请大小 = 0032字节,当前共使用大小 = %d字节\r\n",
    , ?+ V2 ?! H; T$ i. f: w
  105.                                                                                                       AXISRAMUsed->size, AXISRAMUsed->used);6 t3 J1 J4 s; i) t2 ?- _* C' l
  106.                                 
    4 m: X! h/ \+ s2 q) M9 ]
  107. /* 从AXI SRAM 申请2333字节空间,使用指针变量AXISRAM_Addres2操作这些空间时不要超过2333字节大小 */        
    / l% S& D4 O& |, T
  108.                                         AXISRAM_Addres2 = osRtxMemoryAlloc(AppMallocAXISRAM, 2333, 0);% B$ J, G% G$ n" S' I: S
  109.                                         AXISRAMUsed = MemHeadPtr(AppMallocAXISRAM);
    % N2 G2 `9 @% f7 Y$ e4 r
  110.                                         printf("AXI SRAM总大小 = %d字节,申请大小 = 2333字节,当前共使用大小 = %d字节\r\n", 1 a% X" d& c# o4 z- w5 F& |( O
  111.                                                                                 AXISRAMUsed->size, AXISRAMUsed->used);3 V6 f2 u9 w( A; Q5 z" L
  112.                                         break;' c( T. ^4 b; T  t
  113.                                 4 R) D' W$ o% p1 h4 b
  114.                                 /* 释放从AXI SRAM申请的空间 */" ^  P  ]: }' H. M; y/ O
  115.                                 case KEY_UP_K2:        0 p2 u$ W, m5 Z4 l( K' f" m
  116.                                         /* 释放从AXI SRAM申请的160字节空间 */
    4 Z& P. v9 v4 I8 F+ o
  117.                                         osRtxMemoryFree(AppMallocAXISRAM, AXISRAM_Addres0);. S6 |2 R) ?6 v' `
  118.                                         AXISRAMUsed = MemHeadPtr(AppMallocAXISRAM);" ^% V: l& u+ |; X0 I7 ]
  119.                                         printf("释放AXI SRAM动态内存区申请的0160字节,当前共使用大小 = %d字节\r\n",/ Q* ~1 r7 u$ \+ l  g  |5 S2 m
  120. AXISRAMUsed->used);
    9 N/ P2 H/ [! u% I( k
  121.                                 9 J7 L% u* Y* L4 R
  122.                                         /* 释放从AXI SRAM申请的32字节空间 */
    # I; F) W3 }, K2 B7 {  Y7 o- U* ~  [% ?
  123.                                         osRtxMemoryFree(AppMallocAXISRAM, AXISRAM_Addres1);
    , w9 \( ]/ {4 ]4 }9 b" W' o
  124.                                         AXISRAMUsed = MemHeadPtr(AppMallocAXISRAM);  E6 _7 X2 I! o6 L- e- @5 a' w
  125.                                         printf("释放AXI SRAM动态内存区申请的0032字节,当前共使用大小 = %d字节\r\n",1 }% G6 W5 R) u+ |
  126. AXISRAMUsed->used);
    + B! j+ H2 }, ~- J- `  T5 x4 i% q
  127.                                 
    1 v* {% ], O- _
  128.                                         /* 释放从AXI SRAM申请的2333字节空间 */' j& p/ a+ F4 Y0 }3 k
  129.                                         osRtxMemoryFree(AppMallocAXISRAM, AXISRAM_Addres2);! Y# R9 G4 N6 h/ n; L" b
  130.                                         AXISRAMUsed = MemHeadPtr(AppMallocAXISRAM);; e8 L, W3 k8 ]! R# P; X
  131.                                         printf("释放AXI SRAM动态内存区申请的2333字节,当前共使用大小 = %d字节\r\n",
    1 M3 J( B/ v' F  s" [9 w
  132. AXISRAMUsed->used);
    - [/ R% w7 j  J1 Q: ?
  133.                                         break;# h& c; _* ~& k' f: g; j/ `! c
  134.                                 
    9 B. g9 X! R# e% t$ R' h
  135.                                 /* 从D2域SRAM依次申请200字节,96字节和4111字节 */
    9 R" c6 p* E* i
  136.                                 case KEY_DOWN_K3:        
    7 ]/ h$ X, s# V. ]2 C9 A5 M' ^; ]
  137.         /* 从D2域的SRAM申请200字节空间,使用指针变量SRAM1_Addres0操作这些空间时不要超过200字节大小 */3 U% I3 J1 ^$ U) Z
  138.                                         printf("=========================================================\r\n");               
    : A6 T# B7 C/ K+ J3 q
  139.                                         SRAM1_Addres0 = osRtxMemoryAlloc(AppMallocSRAM1, 200, 0);
    6 d8 @% o, M9 |% @& }( @
  140.                                         SRAM1Used = MemHeadPtr(AppMallocSRAM1);
    . c& x: x  d5 V0 L& \
  141.                                         printf("D2域SRAM总大小 = %d字节,申请大小 = 0200字节,当前共使用大小 = %d字节\r\n",
    * F( }9 O/ \  ?( K# {
  142.                                                                                 SRAM1Used->size, SRAM1Used->used);* B2 \) o+ e6 `, y2 P& g1 X
  143.                                 
    ( X, t6 _7 T& k/ y) w+ I
  144.          /* 从D2域的SRAM申请96字节空间,使用指针变量SRAM1_Addres1操作这些空间时不要超过96字节大小 */        ) j+ g0 q# g. s, l% m9 R
  145.                                         SRAM1_Addres1 = osRtxMemoryAlloc(AppMallocSRAM1, 96, 0);: W1 T) q; X( m0 o5 F, ~6 n- |
  146.                                         SRAM1Used = MemHeadPtr(AppMallocSRAM1);
    8 G+ k3 i& u# e* K+ L- w
  147.                                         printf("D2域SRAM总大小 = %d字节,申请大小 = 0096字节,当前共使用大小 = %d字节\r\n",
    3 P9 ~* s* O, O/ K, Z' S
  148.                                                                                                            SRAM1Used->size, SRAM1Used->used);
    / y4 k+ o5 c- m* v8 M% y. x
  149.                                 
    7 [* `, N; {# w7 S7 V/ C
  150.          /* 从D2域的SRAM申请4111字节空间,使用指针变量SRAM1_Addres2操作这些空间时不要超过4111字节大小 */
    3 C, J" Y4 Z' z7 ^: l- K" }  G6 ?7 M
  151.                                         SRAM1_Addres2 = osRtxMemoryAlloc(AppMallocSRAM1, 4111, 0);
    ) @3 V# y2 M: D- A# n0 A* T3 d! M$ U
  152.                                         SRAM1Used = MemHeadPtr(AppMallocSRAM1);
    - x6 t- p1 v! `% C  L
  153.                                         printf("D2域SRAM总大小 = %d字节,申请大小 = 4111字节,当前共使用大小 = %d字节\r\n",
    / O0 i2 N6 I, m7 `5 M- k2 w
  154.                                                                                 SRAM1Used->size, SRAM1Used->used);
    : w1 k- \% H* m5 p$ G4 n
  155.                                         break;' u( D% |2 t* Z
  156.                                 
    3 ~, z* ~, x. U, s+ F# S
  157.                                 /* 释放从D2域SRAM申请的空间 */! q+ u; w9 Q, y
  158.                                 case KEY_UP_K3:        4 S1 S- W0 d# h  }" M+ ?6 A
  159.                                         /* 释放从D2域的SRAM申请的200字节空间 */
    0 C) ?1 d( |3 h& F
  160.                                         osRtxMemoryFree(AppMallocSRAM1, SRAM1_Addres0);7 T) f9 [4 k7 i( e$ o
  161.                                         SRAM1Used = MemHeadPtr(AppMallocSRAM1);
    ) T0 c# y& f$ j0 f! B' m
  162.                                         printf("释放D2域SRAM动态内存区申请的0200字节,当前共使用大小 = %d字节\r\n",
    7 h; o' U& `( t6 Q$ O$ J, u- N" P
  163. SRAM1Used->used);+ C, Q2 D0 N. c4 x- n  z
  164.                                 ' k0 H! S' [; P7 _$ p1 ~
  165.                                         /* 释放从D2域的SRAM申请的96字节空间 */1 `1 y* Z' k: g* Q. m
  166.                                         osRtxMemoryFree(AppMallocSRAM1, SRAM1_Addres1);
    * a7 c9 v. ~5 O7 P9 {
  167.                                         SRAM1Used = MemHeadPtr(AppMallocSRAM1);& ~# J3 ^0 h) d& W! X
  168.                                         printf("释放D2域SRAM动态内存区申请的0096字节,当前共使用大小 = %d字节\r\n",/ z; v6 J. y8 E
  169. SRAM1Used->used);, I9 {5 [2 F# x# h$ [$ v
  170.                                 4 O% `2 a0 E( @) E
  171.                                         /* 释放从D2域的SRAM申请的4111字节空间 */
    ; a8 _5 P* n- y5 g" k: @
  172.                                         osRtxMemoryFree(AppMallocSRAM1, SRAM1_Addres2);
    ! T4 m$ U  a. @  x8 Y
  173.                                         SRAM1Used = MemHeadPtr(AppMallocSRAM1);
    2 A) G& P6 Q, V3 W9 w
  174.                                         printf("释放D2域SRAM动态内存区申请的4111字节,当前共使用大小 = %d字节\r\n",9 ?8 V5 E7 T2 C* G# [: f2 m
  175. SRAM1Used->used);
    % `7 Y/ q7 b0 h- f' x( ~
  176.                                         break;" A3 ]1 r7 a% A1 @
  177.                                 
    ' f* m$ ^" t# S- \( r% `
  178.                                 /* 从D3域SRAM依次申请300字节,128字节和5111字节 */
    " d2 c( d# w% V/ f, c6 c( Z: \
  179.                                 case JOY_DOWN_OK:        
    5 c$ Z# z$ V7 _8 J# |/ L
  180.             /* 从D3域的SRAM申请300字节空间,使用指针变量SRAM4_Addres0操作这些空间时不要超过300字节大小 */
    0 E# U6 ~# I: Z, C. Z4 z
  181.                                         printf("=========================================================\r\n");               
    ! e2 Q% D" a3 ^
  182.                                         SRAM4_Addres0 = osRtxMemoryAlloc(AppMallocSRAM4, 300, 0);
    . h0 P% `; ~+ k3 A1 L" l
  183.                                         SRAM4Used = MemHeadPtr(AppMallocSRAM4);- h9 G* z8 M8 c( i
  184.                                         printf("D3域SRAM总大小 = %d字节,申请大小 = 0300字节,当前共使用大小 = %d字节\r\n",
    3 ~4 O- ?% a  V
  185.                                                                                 SRAM4Used->size, SRAM4Used->used);" I; G: f0 {9 t4 C+ v8 |
  186.                                 & ~- I/ l+ @1 S) ]& U1 M6 ]
  187.                 /* 从D3域的SRAM申请96字节空间,使用指针变量SRAM4_Addres1操作这些空间时不要超过96字节大小 */, S! B# ~1 c1 a# x! E9 Y5 Q  {! n  }
  188.                                         SRAM4_Addres1 = osRtxMemoryAlloc(AppMallocSRAM4, 128, 0);
    - O9 }" \- S9 C9 A
  189.                                         SRAM4Used = MemHeadPtr(AppMallocSRAM4);. H, q7 d/ `) I  U: A: e/ |% w
  190.                                         printf("D3域SRAM总大小 = %d字节,申请大小 = 0128字节,当前共使用大小 = %d字节\r\n", 4 {, |* L, D3 j% K1 `0 z1 e" _
  191.                                                                                                            SRAM4Used->size, SRAM4Used->used);
    9 D; b( Z5 a" C8 e
  192.                                 
    # e0 T3 Z" p. S, [' n) @
  193.         /* 从D3域的SRAM申请5111字节空间,使用指针变量SRAM4_Addres2操作这些空间时不要超过5111字节大小 */
    3 L2 H  \% _. |
  194.                                         SRAM4_Addres2 = osRtxMemoryAlloc(AppMallocSRAM4, 5111, 0);
    ( @4 z! y/ e3 `" P
  195.                                         SRAM4Used = MemHeadPtr(AppMallocSRAM4);; C4 O1 @7 K+ K) C
  196.                                         printf("D3域SRAM总大小 = %d字节,申请大小 = 5111字节,当前共使用大小 = %d字节\r\n", 8 S  f3 D  T) n% u9 f
  197.                                                                                 SRAM4Used->size, SRAM4Used->used);5 {, L! n' P) Q
  198.                                         break;
    " o1 e: l+ j5 x  U' [  x: G
  199.                                 * D2 ~; S: O1 J  g. q% D
  200.                                 /* 释放从D3域SRAM申请的空间 */
    & A% M+ U% X2 {3 }
  201.                                 case JOY_UP_OK:        1 y. N2 Y  C+ S$ |( d. l
  202.                                         /* 释放从D3域的SRAM申请的300字节空间 */
    ! N4 C0 m; F: h6 i/ `1 c  x
  203.                                         osRtxMemoryFree(AppMallocSRAM4, SRAM4_Addres0);
    0 L( G( {0 U3 _0 p
  204.                                         SRAM4Used = MemHeadPtr(AppMallocSRAM4);( c7 o7 _1 h# Z9 W
  205.                                         printf("释放D3域SRAM动态内存区申请的0300字节,当前共使用大小 = %d字节\r\n", ! |% M6 H  g8 y$ f: \& j
  206. SRAM4Used->used);# }% ~; u# [9 {! q8 X  Z
  207.                                 6 Y6 R0 l5 t2 [
  208.                                         /* 释放从D3域的SRAM申请的128字节空间 */+ F: }$ n( q. T
  209.                                         osRtxMemoryFree(AppMallocSRAM4, SRAM4_Addres1);
    ! C! B+ N/ C. j- s1 Z" n2 R& i
  210.                                         SRAM4Used = MemHeadPtr(AppMallocSRAM4);9 r9 ^! |' `3 J8 L  W# w; r
  211.                                         printf("释放D3域SRAM动态内存区申请的0128字节,当前共使用大小 = %d字节\r\n",- Q6 T) i% X( S9 w: Y
  212. SRAM4Used->used);. P# Y+ ~5 E6 T) Z
  213.                                 
    " r. v$ V/ L" w5 ?
  214.                                         /* 释放从D3域的SRAM申请的5111字节空间 */6 |% \! k: ]7 l" R$ s
  215.                                         osRtxMemoryFree(AppMallocSRAM4, SRAM4_Addres2);
    ' d5 G0 B' @9 j
  216.                                         SRAM4Used = MemHeadPtr(AppMallocSRAM4);+ c* s  C- q* C
  217.                                         printf("释放D3域SRAM动态内存区申请的5111字节,当前共使用大小 = %d字节\r\n",
    0 T& ]8 N2 Q( o4 {
  218. SRAM4Used->used);; ]1 a% R  F% [8 t+ @5 u& }
  219.                                         break;
    / M5 w9 p( x' F3 x$ w% l
  220.                         * s) J5 n/ D3 y7 I2 _" x$ ~
  221.                                 default:3 c% E( d  ]' W+ v7 h0 Q
  222.                                   /* 其它的键值不处理 */
    % W% W4 g2 K: s6 {7 N' [: F
  223.                                   break;
    8 o9 y2 Z- c% T" U1 ?1 m$ r
  224.                         }
    . N& r1 r$ L6 g  [" H/ l
  225.                 }
    # p" [) \8 Z8 d, X/ H1 C
  226.         }8 P0 w. S2 ^  @0 a& d
  227. }
复制代码
( e7 x2 K) i4 R: z  T5 g
27.6 总结1 F* n" g/ \, L& r* E1 O0 Q) n
本章节就为大家讲解这么多,还是比较有项目实用价值的,特别是MP3编解码,JPEG编解码,视频播放器,矢量字体等需要动态内存的场合。" Z% Q- p) F. [  g( ~

  X" ?5 G% }. \- H! S$ f9 M  `+ u8 ?! R
, N; u3 D. E1 C) Z' l# V
收藏 评论0 发布时间:2021-12-23 15:00

举报

0个回答

所属标签

相似分享

官网相关资源

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