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

基于stm32存储资源经验分享

[复制链接]
攻城狮Melo 发布时间:2023-5-11 18:51
ZET6芯片
. O6 X, ~6 n$ }& Z, B$ P& t
* F4 q0 Y+ v4 b' f! p- Q
20190922223659933.png
; \9 a# ]% L# l
9 h& g$ w) @+ m, M) H
3 q; C/ }9 y* K; I5 o0 O' r* P
该芯片内部自带了64k字节的SRAM,以及512K的内部FLASH
' {+ w: h# r. B4 d" r+ i2 ?
, Z( \' X3 i9 }" s! g5 b" p
20190922223853114.png
6 x* ?) T0 l5 }7 F4 ~* q
  G, F( [% p4 \. @' Q- z
IROM1=0x80000=512K 和IRAM1=0X10000=64k的大小
6 T1 w+ r$ w$ c, C4 S) q
0 |3 P- [  p: C% W6 k, y' r
同时开发板外置了1M字节外部SRAM芯片(IS62WV51216)$ V6 M! _1 [; Y5 A' d& _
- }( k7 I" P" S3 v0 z6 [0 e
20190922223834727.png
$ r+ @1 o6 T4 o+ F! v" o: q9 k
0 f% {/ T' x9 r# F1M字节(即512K*16位)其中512K是由19根地址线决定,219=512K; 16位是由16根数据线决定的' m7 K# D: p1 M; X! n

* \/ P8 E* o# W( [64k字节内部SRAM程序相关
6 M- r; a0 t- F1 R/ h+ u3 E
  1. my_mem_init(SRAMIN);        //初始化内部内存池
    7 z5 v4 J% `7 |6 r; {0 l0 H
  2. #define SRAMIN        0    //定义内部内存池- N3 X5 O: D( _( k* N5 s
  3. //mem1内存参数设定.mem1完全处于内部sram
    ) ?# w2 u: N1 q" D/ W" D: q
  4. #define MEM1_BLOCK_SIZE                        32                                                            //一个内存块大小为32字节
    6 H) C' ?/ M8 w" V$ `$ K, }. r( f
  5. #define MEM1_MAX_SIZE                        40*1024                                                  //最大管理内存40K字节,可以自己根据需要调整
      I' v7 X1 W$ I" v
  6. #define MEM1_ALLOC_TABLE_SIZE        MEM1_MAX_SIZE/MEM1_BLOCK_SIZE         //内存表的大小
    ' @( T4 r5 r; q+ }3 d8 W
  7. //内存池(32字节对齐)
    ) D* R) ]. j5 W! n6 \3 Z
  8. __align(32) u8 mem1base[MEM1_MAX_SIZE];                                        //内部sram内存池,数组的起始地址由编译器自动分配
    : e* ~# H3 S. k1 u8 b
  9. //内存管理表: U: _3 Q; I# B3 O$ G0 K
  10. u16 mem1mapbase[MEM1_ALLOC_TABLE_SIZE];                                //内部sram内存池MAP
复制代码

- ]% M2 r! h+ N6 [1M字节外部SRAM程序相关
! d. n: I. L  i9 G# n: E- Q$ U
  1. my_mem_init(SRAMEX);        //初始化外部内存池1 Y9 D- y3 W% E  W
  2. #define SRAMEX        1    //定义外部内存池
    9 `  A; h- i8 c, x! T
  3. //mem2内存参数设定.mem2完全处于外部sram! U, Z& a1 m3 {
  4. #define MEM2_BLOCK_SIZE                        32                                                            //一个内存块大小为32字节6 \! r$ q) M$ C3 {2 m6 d0 w
  5. #define MEM2_MAX_SIZE                        960*1024                                                  //最大管理内存960K字节,可以根据自己需要调整* M1 Y6 K! \# B2 F
  6. #define MEM2_ALLOC_TABLE_SIZE        MEM2_MAX_SIZE/MEM2_BLOCK_SIZE         //内存表的大小
    + v5 _0 h0 t9 O$ p1 y
  7. //内存池(32字节对齐)
    4 O% W! ?2 j2 @
  8. __align(32) u8 mem2base[MEM2_MAX_SIZE] __attribute__((at(0X68000000)));//外部sram内存池,数组的起始地址为0X68000000
    ) L# |8 Z* s5 L, L
  9. //内存管理表
    * E2 |$ i& u0 v% F
  10. u16 mem2mapbase[MEM2_ALLOC_TABLE_SIZE] __attribute__((at(0X68000000+MEM2_MAX_SIZE)));//外部sram内存池MAP
复制代码
" c+ [( d5 k3 @: l3 }
分块式内存管理- h& T; t& W- E+ @  V+ ]
9 ^8 M8 A4 r, M
20190922224202325.png % z# P, K0 x! {7 L7 W: \2 m  a1 h
0 ?$ F# A4 r4 H% C5 q
   分块式内存管理由内存池和内存管理表两部分组成。内存池被等分为 n块,对应的内存管理表,大小也为 n,内存管理表的每一个项对应内存池的一块内存。
1 x" h# ~9 _. [* r9 A, h2 l
7 S0 c! m2 K; `' W
   内存管理表的项值代表的意义为:当该项值为 0 的时候,代表对应的内存块未被占用,当该项值非零的时候,代表该项对应的内存块已经被占用,其数值则代表被连续占用的内存块数。比如某项值为 10,那么说明包括本项对应的内存块在内,总共分配了 10 个内存块给外部的某个指针。
5 h0 Q6 C7 v* p  d
8 D4 b$ w" Y8 O, W   内存分配方向是从顶->底的分配方向。即首先从最末端开始找空内存。当内存管理刚初始化的时候,内存表全部清零,表示没有任何内存块被占用
0 V6 u) V, g9 H5 ?7 D
: B  ?( m  u1 |. ?  h3 Y
注:* Q2 s% {; T; J# U- _* z# i/ k4 K' L0 |

4 ^3 c, A8 i/ r3 ^5 y6 s+ _1 s- a当涉及到跑算法,GUI应用等内置的内存不够用时,就用外部的SRAM来扩充内存; H, N2 S4 j/ J/ i  }

, U% ~9 V1 w& \7 n
& K( @' m. \5 F7 ~* g
程序数据的存储区域( j9 k/ Y6 A1 H/ O9 @
下载到flash的有:Code: 代码0 Q$ K& R- B: \$ j) l3 b
                             RO-data:程序定义的常量
. N. v+ m  Z: j                            RW-data:已初始化的非0全局变量,当程序初始化时会拷贝到RAM中去- Q& w' \4 P6 s: g  h

% A: p1 H+ @! o2 @9 i% g下载到RAM的有:RW-data:已初始化的全局变量
! W! `* v. K% I7 k4 v8 q0 |                              ZI-data:未初始化的全局变量,以及初始化为0 的变量
) [9 o6 H! i; T
+ o$ B/ q' b7 s/ o
STM32F103ZET6的flash资源详解
! u/ z6 T# H. C. N
  ZET6芯片内部内置了512K字节的flash,用于存放代码和数据常量,是主存储块,起始地址为0x08000000,这是程序执行的起始地址,此时的BOOT0和BOOT1都接GND.被划分为256页,每页2K字节2 u% I' t3 |5 }* A2 b1 M2 M

4 {& z* P8 g' h; T" P; {
20190922224451603.png ; l! g7 [, j# Y6 s/ K% P9 G2 {+ p
6 R% z" Q: v: n: Z2 H+ i4 @# Z/ j
同时开发板外置了16M字节的外部flash芯片,即为W25Q128
7 _% a" A; y7 F& n& t) F: S) P% V$ @8 u  `
20190922224518447.png " y, b# K# q. i; x0 c, ?: A8 H

* D( T- W9 e# H采用spi通信传输,分成256个块(BLOCK),每块64k字节,每块又分成16个扇区(sector),每扇区4K字节
8 X  u/ C# T5 |& ]$ y* R: `% b
: ^5 e+ y0 }# w$ _
相当于stm32外接了一个硬盘,虽调用速度慢,但数据不分丢失,一般用于存放FATFS文件系统,字库,图像,日志等
  1. #define FLASH_SECTOR_SIZE         512                          
    & d& h) C: W: I' e) R; T$ F
  2. //对于W25Q128$ `6 s: ?+ \$ S( V* C) F
  3. //前12M字节给fatfs用,12字节后,用于存放字库,字库占用3.09M,剩余部分,用户自定义使用                    
    ; N7 L* K7 a4 B( F
  4. u16            FLASH_SECTOR_COUNT=2048*12;        //W25Q1218% b* ]5 W% W/ P5 W6 U. i  a
  5. #define FLASH_BLOCK_SIZE           8             //每个BLOCK分配8个扇区/ C5 g& d6 a- S* c5 ]
  6. //字库占用的总扇区数1 ]6 q) l; U9 L& [/ |5 W- q: M
  7. #define FONTSECSIZE                 791  w. l1 s; k$ l8 m% O3 v. T; n
  8. //字库存放的起始地址
    1 E" R: D6 b5 E/ O' ^. n
  9. #define FONTINFOADDR         1024*1024*12        
复制代码
* y5 V+ C: ]1 ^' o5 \& v8 ~, J, L* q
5 Z/ h2 M% Y6 M" M
! \* N5 ^) Z/ m# U- C2 |) `3 f/ J, l
————————————————: K* F- x5 h. _! h
版权声明:Psyduck_ing
" R1 _4 e# y+ [如有侵权请联系删除
0 X! k$ a1 K% w( p
: D, c, X! \4 S3 y+ M7 c* g$ S* a2 t6 h! R) e: _
  C% }/ u0 g/ a4 b
赞 收藏 评论0 发布时间:2023-5-11 18:51

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版