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

基于stm32存储资源经验分享

[复制链接]
攻城狮Melo 发布时间:2023-5-11 18:51
ZET6芯片
& q0 l7 G# K% C0 V% A; M
, j  A# t+ H/ U6 [5 q0 s5 t1 D
20190922223659933.png - w$ O* Y- v& P7 y

  ?: [+ c7 E8 C+ ]4 e

5 r' Q$ G3 W& _, R该芯片内部自带了64k字节的SRAM,以及512K的内部FLASH2 D' I2 M% [3 P( B6 }
7 a! |. [9 f4 S1 _/ E* c
20190922223853114.png
# d; E' P1 ?2 G+ m  a( q  i, c* |3 D% ~! I. {6 T
IROM1=0x80000=512K 和IRAM1=0X10000=64k的大小( t4 O  ]7 g$ t+ k, R  M
$ C: q+ g) Y. y
同时开发板外置了1M字节外部SRAM芯片(IS62WV51216)- _, G2 J2 ~) n/ P7 W1 T/ j
4 x& t; e6 G& ?0 Q( I8 @& L
20190922223834727.png 0 S- t" Y" i) T; l: z, z; c
1 i7 H3 m/ e: v& R! ?6 T/ \: B3 s
1M字节(即512K*16位)其中512K是由19根地址线决定,219=512K; 16位是由16根数据线决定的
9 Y$ {8 |/ l% z9 e  w# H
1 E  V' |- D% d# M( V2 Z6 O" ~2 U6 e8 T
64k字节内部SRAM程序相关) @( _" i" F) u
  1. my_mem_init(SRAMIN);        //初始化内部内存池- h+ k+ s6 K/ q( b5 J
  2. #define SRAMIN        0    //定义内部内存池
    . f2 g  u! v; T# V& C7 o9 m6 R
  3. //mem1内存参数设定.mem1完全处于内部sram  a% Q0 _! T6 ~9 \  x, r  U2 k
  4. #define MEM1_BLOCK_SIZE                        32                                                            //一个内存块大小为32字节
    0 m* _1 u( R$ x
  5. #define MEM1_MAX_SIZE                        40*1024                                                  //最大管理内存40K字节,可以自己根据需要调整
    ) H6 d& x3 g, @; N% [
  6. #define MEM1_ALLOC_TABLE_SIZE        MEM1_MAX_SIZE/MEM1_BLOCK_SIZE         //内存表的大小
    , M  a5 R' o$ I- _
  7. //内存池(32字节对齐)
    4 r" F7 E& ^! m9 G7 d
  8. __align(32) u8 mem1base[MEM1_MAX_SIZE];                                        //内部sram内存池,数组的起始地址由编译器自动分配8 L3 M1 |, [2 k7 `
  9. //内存管理表% ?. _/ `( R/ k& L9 T- o5 X/ s
  10. u16 mem1mapbase[MEM1_ALLOC_TABLE_SIZE];                                //内部sram内存池MAP
复制代码

" y$ W9 A1 S- j6 X* v1 e1M字节外部SRAM程序相关
+ [  p, \* I; ]. x7 P0 c( Y
  1. my_mem_init(SRAMEX);        //初始化外部内存池
    2 }0 O1 ?: ]$ Z8 F" L% f" O) u4 v- ]
  2. #define SRAMEX        1    //定义外部内存池# k; P: `# O, g. ?/ l
  3. //mem2内存参数设定.mem2完全处于外部sram
    , o0 W  t& ~8 Z5 o! u) ]1 W
  4. #define MEM2_BLOCK_SIZE                        32                                                            //一个内存块大小为32字节; L& Q$ f7 G0 J/ ~& s8 ]5 z
  5. #define MEM2_MAX_SIZE                        960*1024                                                  //最大管理内存960K字节,可以根据自己需要调整! P5 W' v7 P$ P* |  ^9 w, i
  6. #define MEM2_ALLOC_TABLE_SIZE        MEM2_MAX_SIZE/MEM2_BLOCK_SIZE         //内存表的大小9 K# u( i- Y7 W  [# p( {0 H& [
  7. //内存池(32字节对齐)
    3 ~1 G7 y6 q9 p, J" V7 M& X4 c, C
  8. __align(32) u8 mem2base[MEM2_MAX_SIZE] __attribute__((at(0X68000000)));//外部sram内存池,数组的起始地址为0X68000000
    , k: y* p/ |# w) h
  9. //内存管理表  t4 Z# ~: ?5 L( V  F
  10. u16 mem2mapbase[MEM2_ALLOC_TABLE_SIZE] __attribute__((at(0X68000000+MEM2_MAX_SIZE)));//外部sram内存池MAP
复制代码

5 G& {4 c* f  g+ G分块式内存管理
$ y4 Q: f5 z+ o  V
7 y4 ^7 Z- i) y; }& p8 o
20190922224202325.png 3 b$ H- y; X9 L6 ]
  k# T3 V8 K( F2 G
   分块式内存管理由内存池和内存管理表两部分组成。内存池被等分为 n块,对应的内存管理表,大小也为 n,内存管理表的每一个项对应内存池的一块内存。
5 Z: Z& ^& m8 T. j
1 }6 k9 z1 {( {# B% n
   内存管理表的项值代表的意义为:当该项值为 0 的时候,代表对应的内存块未被占用,当该项值非零的时候,代表该项对应的内存块已经被占用,其数值则代表被连续占用的内存块数。比如某项值为 10,那么说明包括本项对应的内存块在内,总共分配了 10 个内存块给外部的某个指针。3 X4 H4 {2 G3 ~# I3 X

9 q3 d& F: Q/ Q6 R* `  h# H5 k   内存分配方向是从顶->底的分配方向。即首先从最末端开始找空内存。当内存管理刚初始化的时候,内存表全部清零,表示没有任何内存块被占用
5 J2 `  d4 J+ U  H$ J
/ \4 u* c7 `6 H+ d/ @
注:
& d# K5 H8 k" l# c% [* j# u
( L' k8 ^: X8 P- g' [/ W当涉及到跑算法,GUI应用等内置的内存不够用时,就用外部的SRAM来扩充内存; h! \1 B/ Z! N, v3 J: M
8 t& f2 h- T& k, b; a$ I) }: k
' m& o+ [0 p# H* q9 `
程序数据的存储区域
* X: l6 t3 B4 t" @* A3 K" ]9 C下载到flash的有:Code: 代码8 {3 o* x. `, T- w5 ?5 Z# X
                             RO-data:程序定义的常量# f3 U+ W. ~8 x* {7 \  K8 q2 S
                            RW-data:已初始化的非0全局变量,当程序初始化时会拷贝到RAM中去
4 g, e7 s; z( r! G! o$ `* B8 @
0 P. Z! z) w1 d/ J下载到RAM的有:RW-data:已初始化的全局变量/ d6 |0 h# X3 L8 K
                              ZI-data:未初始化的全局变量,以及初始化为0 的变量7 g& k3 V; U! T- A
4 X( a: @; |+ L
STM32F103ZET6的flash资源详解
! P! `! B) Q# d3 L
  ZET6芯片内部内置了512K字节的flash,用于存放代码和数据常量,是主存储块,起始地址为0x08000000,这是程序执行的起始地址,此时的BOOT0和BOOT1都接GND.被划分为256页,每页2K字节: E# {! e1 |" f$ `9 h& F
  z" i. C& g! Y* R% J
20190922224451603.png
, d& k0 z" P) j- \- I6 q. m+ w6 P4 X1 i7 U$ Q' T
同时开发板外置了16M字节的外部flash芯片,即为W25Q1287 d% u' B5 m& s5 G5 Z
+ ?5 Z# v3 C% L& D( l# ?7 ~
20190922224518447.png 5 G2 Z5 ?( t/ |; d" q( U
( \  [- E- y: b7 w- G8 X3 g7 G
采用spi通信传输,分成256个块(BLOCK),每块64k字节,每块又分成16个扇区(sector),每扇区4K字节+ G, w7 b6 J2 R" K

$ \" I: u. l2 u9 v) V; j3 t1 k相当于stm32外接了一个硬盘,虽调用速度慢,但数据不分丢失,一般用于存放FATFS文件系统,字库,图像,日志等
  1. #define FLASH_SECTOR_SIZE         512                          
    7 z. h: }: X0 p- j1 a3 a2 \
  2. //对于W25Q128$ @* H" w9 r- r* f! M, v% B( d
  3. //前12M字节给fatfs用,12字节后,用于存放字库,字库占用3.09M,剩余部分,用户自定义使用                    . l- ]& f' S' f0 h% Z& M2 S8 x
  4. u16            FLASH_SECTOR_COUNT=2048*12;        //W25Q1218
    3 M2 t! b3 k9 g, q
  5. #define FLASH_BLOCK_SIZE           8             //每个BLOCK分配8个扇区
    " k# \% S+ h! E
  6. //字库占用的总扇区数
    * m  y# K1 G1 f; i, b' E; ?
  7. #define FONTSECSIZE                 791
    ' V5 M7 w% U, |3 Q% l/ O; W. z
  8. //字库存放的起始地址, x& Y# y, N; W0 C& t2 W
  9. #define FONTINFOADDR         1024*1024*12        
复制代码
  B6 ~6 J5 l$ f+ y
4 P, L2 ^6 [4 {7 I& E  u

7 i& I) z9 a; D, a' S
————————————————
- y) v* i3 V+ ~/ L, s版权声明:Psyduck_ing, t. ]5 Y% A( o
如有侵权请联系删除
/ D- B8 z4 X3 p+ `5 _) z$ b$ o- J7 W' J8 i5 {7 c
# e+ t' s: B; p
0 `7 u' }& l7 ^: f$ ?4 s9 W
赞 收藏 评论0 发布时间:2023-5-11 18:51

举报

0个回答

所属标签

相似技术帖

官网相关资源

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