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

基于stm32存储资源经验分享

[复制链接]
攻城狮Melo 发布时间:2023-5-11 18:51
ZET6芯片# m* s( z! \" W) E* I7 \  }- k

4 z( c; y  Y& [. n
20190922223659933.png 0 Z+ R5 P  d- F: e2 I/ e

3 @$ g- L: j5 J- ^$ F: A

( w9 q; ?9 k5 ]9 ^0 k, F该芯片内部自带了64k字节的SRAM,以及512K的内部FLASH/ M# q; s0 Y1 A% Z" P) Q" Y' _5 E3 m% u

  U* P. b  C" o1 B4 g# |# I5 r
20190922223853114.png
1 \" s7 T( g- V9 e1 [" L
! g5 K1 Z6 s* e# ]
IROM1=0x80000=512K 和IRAM1=0X10000=64k的大小6 D# r, _* o8 I- z( `

: c- x6 \4 g% `7 T: J6 F0 G* J+ u同时开发板外置了1M字节外部SRAM芯片(IS62WV51216): R/ Z7 o1 C: I9 n

1 M" [- b  d3 d
20190922223834727.png
0 y9 ?3 h) H; L6 ?& ]& j  A0 b
* i- C( C/ h( N# ^9 e1M字节(即512K*16位)其中512K是由19根地址线决定,219=512K; 16位是由16根数据线决定的
0 N& o7 r. C8 i  @5 L( i# c

) c  _( Z% H8 V  v! J  t64k字节内部SRAM程序相关
6 m+ J9 Z* E- N! U
  1. my_mem_init(SRAMIN);        //初始化内部内存池' [; d; u3 s' ^4 ]1 B
  2. #define SRAMIN        0    //定义内部内存池2 r; E4 J) ~% P6 M% F* N
  3. //mem1内存参数设定.mem1完全处于内部sram& t# _7 k- D' ]
  4. #define MEM1_BLOCK_SIZE                        32                                                            //一个内存块大小为32字节) U- P% ?' M/ l( S! m- I
  5. #define MEM1_MAX_SIZE                        40*1024                                                  //最大管理内存40K字节,可以自己根据需要调整2 j, f) b9 H/ K
  6. #define MEM1_ALLOC_TABLE_SIZE        MEM1_MAX_SIZE/MEM1_BLOCK_SIZE         //内存表的大小( H3 k. h# p( e0 S4 x  k4 L
  7. //内存池(32字节对齐)
    " r9 f$ ?# a! k+ M% n2 x6 Y6 b
  8. __align(32) u8 mem1base[MEM1_MAX_SIZE];                                        //内部sram内存池,数组的起始地址由编译器自动分配
    8 K0 u, }8 ]: z( u
  9. //内存管理表
    * T* ?2 A* j7 z0 b9 I
  10. u16 mem1mapbase[MEM1_ALLOC_TABLE_SIZE];                                //内部sram内存池MAP
复制代码

4 u, ^3 p1 F% U: F- q1M字节外部SRAM程序相关- }/ S8 [2 N0 p5 S+ m
  1. my_mem_init(SRAMEX);        //初始化外部内存池6 Q5 y# @! @. z! e) M# a- m
  2. #define SRAMEX        1    //定义外部内存池
    + d( N1 l/ t4 A, T" S1 Y; _( h% d
  3. //mem2内存参数设定.mem2完全处于外部sram
    8 L4 T- w7 H4 c% m! W, c9 C
  4. #define MEM2_BLOCK_SIZE                        32                                                            //一个内存块大小为32字节
    % _! E0 @, d) M6 T/ R' \6 ^
  5. #define MEM2_MAX_SIZE                        960*1024                                                  //最大管理内存960K字节,可以根据自己需要调整
    + D3 `2 N( ?8 Y0 a. v
  6. #define MEM2_ALLOC_TABLE_SIZE        MEM2_MAX_SIZE/MEM2_BLOCK_SIZE         //内存表的大小
    $ U' R/ o- A3 H/ y
  7. //内存池(32字节对齐)" z) p- Z! t8 M( ]* T) ~4 c
  8. __align(32) u8 mem2base[MEM2_MAX_SIZE] __attribute__((at(0X68000000)));//外部sram内存池,数组的起始地址为0X68000000
    5 f3 c& L, b: I# r* z
  9. //内存管理表$ N& q" n9 w. f$ m
  10. u16 mem2mapbase[MEM2_ALLOC_TABLE_SIZE] __attribute__((at(0X68000000+MEM2_MAX_SIZE)));//外部sram内存池MAP
复制代码

% B( w; C  g% C1 Y$ u& X9 p8 o分块式内存管理* _! L6 n. \% A
2 v5 Q7 N4 ^/ r/ z3 ~
20190922224202325.png + w" K" ^8 F. G3 I, G% G! Z0 z

! M, p5 a6 s' K7 P   分块式内存管理由内存池和内存管理表两部分组成。内存池被等分为 n块,对应的内存管理表,大小也为 n,内存管理表的每一个项对应内存池的一块内存。- c: O7 Q6 [& d! w3 p

: M& w# H0 q% y* V+ K   内存管理表的项值代表的意义为:当该项值为 0 的时候,代表对应的内存块未被占用,当该项值非零的时候,代表该项对应的内存块已经被占用,其数值则代表被连续占用的内存块数。比如某项值为 10,那么说明包括本项对应的内存块在内,总共分配了 10 个内存块给外部的某个指针。6 _" c$ e: a' K$ T

# T2 ]) j' l! s2 N7 w3 v  h   内存分配方向是从顶->底的分配方向。即首先从最末端开始找空内存。当内存管理刚初始化的时候,内存表全部清零,表示没有任何内存块被占用0 Q  @4 m- B( U5 a, S  O  ]. T- y# X# t5 o& s

8 t3 @/ C* W5 y, J& x' F注:
! `. u: X- G% W% ]* B, ]5 H- ^& y
当涉及到跑算法,GUI应用等内置的内存不够用时,就用外部的SRAM来扩充内存
, m- `: W/ B5 D) R" W: G7 C& E& }; V4 ^( l6 |

0 E! x+ K" P9 Y# L/ B9 a2 C% x程序数据的存储区域- y; ^- G$ r5 T4 R7 G# j
下载到flash的有:Code: 代码* ]" X* E8 I& b2 }/ E0 R8 h
                             RO-data:程序定义的常量
- ~: X: p. B7 y; s- j                            RW-data:已初始化的非0全局变量,当程序初始化时会拷贝到RAM中去% B4 c: y- ?1 ~/ ~0 U
0 Z3 a7 I( G7 J1 _7 d9 p0 ]
下载到RAM的有:RW-data:已初始化的全局变量. Z2 L% J# s; I; G6 a2 {. Z
                              ZI-data:未初始化的全局变量,以及初始化为0 的变量
6 B9 j& E/ S: n

7 {" j2 a6 t3 B8 YSTM32F103ZET6的flash资源详解

1 f1 T' j# s" J* D4 ?  ZET6芯片内部内置了512K字节的flash,用于存放代码和数据常量,是主存储块,起始地址为0x08000000,这是程序执行的起始地址,此时的BOOT0和BOOT1都接GND.被划分为256页,每页2K字节; ?8 h  g: c; i! D8 i
' P! R6 l! S' h) f5 t
20190922224451603.png ; F' X- N" i( O% }
2 A- m+ @8 n- o
同时开发板外置了16M字节的外部flash芯片,即为W25Q1282 `- c; U6 F* ^6 {4 [$ g0 D
+ P) @# L1 [+ d; O$ u# N
20190922224518447.png
7 U$ \) x" e. h1 ^3 q8 m3 x% H- X5 W. r" d  N
采用spi通信传输,分成256个块(BLOCK),每块64k字节,每块又分成16个扇区(sector),每扇区4K字节
9 W. |/ q# w7 b- N8 l5 V& A# W

, O- o  f6 E6 \6 j2 L: e) N4 d' o相当于stm32外接了一个硬盘,虽调用速度慢,但数据不分丢失,一般用于存放FATFS文件系统,字库,图像,日志等
  1. #define FLASH_SECTOR_SIZE         512                          
    . G. }7 H: e2 N: V4 _/ J' w) y
  2. //对于W25Q128  F2 G: ^. s# m2 W$ U4 ^& C# v$ P
  3. //前12M字节给fatfs用,12字节后,用于存放字库,字库占用3.09M,剩余部分,用户自定义使用                    4 [1 e6 ?; q# I# \
  4. u16            FLASH_SECTOR_COUNT=2048*12;        //W25Q1218
    - ^5 _3 S- S; Z4 H8 u* L
  5. #define FLASH_BLOCK_SIZE           8             //每个BLOCK分配8个扇区: E6 f5 l2 x) `  Q" y" K* w+ l
  6. //字库占用的总扇区数$ D+ F/ D% C; n' e  b
  7. #define FONTSECSIZE                 791
    5 W4 l. d8 ^, n4 p
  8. //字库存放的起始地址7 w5 A! Z2 R: B- c7 J* M! m
  9. #define FONTINFOADDR         1024*1024*12        
复制代码
3 z) z6 Z. o4 x0 l5 G

$ p; ^7 S& }9 V4 ?2 {; L3 }' r% W8 t" ^! N) `, k
————————————————4 t' k( B# c; R! S, x; _+ [" m
版权声明:Psyduck_ing! s) S9 R* L) n# A# [
如有侵权请联系删除- [+ I- G+ R; L; c3 m: U/ y* h
' s  ?: X) w+ u+ Q3 {
1 `  O7 \' E4 }5 H, b5 n; |; _

! \: k8 q2 W2 M2 t- y  S; @
收藏 评论0 发布时间:2023-5-11 18:51

举报

0个回答

所属标签

相似技术帖

官网相关资源

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