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

基于stm32存储资源经验分享

[复制链接]
攻城狮Melo 发布时间:2023-5-11 18:51
ZET6芯片
! F3 z) F) O& N' p1 v, z: I7 o. d9 g  r
20190922223659933.png
7 Z: p$ \( m7 G2 I5 n6 q* B0 F, V6 K" X0 e& L: N+ B8 m/ @
* N6 ], V# F' J0 y9 R: p  q
该芯片内部自带了64k字节的SRAM,以及512K的内部FLASH/ j5 r0 v7 g( W( m2 u- o3 b

6 ~: ]" ^  f* U7 h: e! @
20190922223853114.png
1 b+ z( [. }; D8 V0 s0 p
# x+ U: ?% f  E2 _* x1 s; x; `, m
IROM1=0x80000=512K 和IRAM1=0X10000=64k的大小6 T7 K9 N6 B' q# Y/ r- k; }

) O# S% r/ v! A- ~4 v: Y同时开发板外置了1M字节外部SRAM芯片(IS62WV51216)% d1 C% j9 S) T3 x

5 P1 r) |, G# g+ k# _* D5 |
20190922223834727.png
1 ^/ w) X+ e( s( b) H; N. k& o$ ?, x8 e$ K
1M字节(即512K*16位)其中512K是由19根地址线决定,219=512K; 16位是由16根数据线决定的
- Y1 l( s- S. ^* Q2 X2 j8 y! h
4 l' Z6 {& {2 z% M8 K  r: @5 B* A
64k字节内部SRAM程序相关
2 _; Q; j( T: v
  1. my_mem_init(SRAMIN);        //初始化内部内存池
    6 w5 M- F9 s2 j, M% v( _
  2. #define SRAMIN        0    //定义内部内存池4 {/ {: `) X! P! m* o
  3. //mem1内存参数设定.mem1完全处于内部sram2 L' Z  N9 n6 v( |
  4. #define MEM1_BLOCK_SIZE                        32                                                            //一个内存块大小为32字节% J, z+ e3 g1 B- o# N( e" p- C$ ]
  5. #define MEM1_MAX_SIZE                        40*1024                                                  //最大管理内存40K字节,可以自己根据需要调整) z% ?$ U/ K% P! Q+ p2 j- H2 z
  6. #define MEM1_ALLOC_TABLE_SIZE        MEM1_MAX_SIZE/MEM1_BLOCK_SIZE         //内存表的大小
    & B" D9 I, D  A$ \7 U$ X- s% g5 H) K
  7. //内存池(32字节对齐)$ T# D9 I  _7 w( u" G
  8. __align(32) u8 mem1base[MEM1_MAX_SIZE];                                        //内部sram内存池,数组的起始地址由编译器自动分配/ d) u8 y( x9 C( q/ d# q
  9. //内存管理表9 \4 N) f! c$ w/ C. L% Y- Y
  10. u16 mem1mapbase[MEM1_ALLOC_TABLE_SIZE];                                //内部sram内存池MAP
复制代码

8 U  P# D! \0 ]1M字节外部SRAM程序相关& c) m4 C" M. z2 {8 `" g
  1. my_mem_init(SRAMEX);        //初始化外部内存池. g; Q- {* N1 e# I/ ~2 K7 B
  2. #define SRAMEX        1    //定义外部内存池
    ' y+ }. G0 ~  Q$ z: j8 U; z( c
  3. //mem2内存参数设定.mem2完全处于外部sram
    1 m+ l  U% C/ `9 U% t6 y
  4. #define MEM2_BLOCK_SIZE                        32                                                            //一个内存块大小为32字节7 {+ M! ]; V" O4 v
  5. #define MEM2_MAX_SIZE                        960*1024                                                  //最大管理内存960K字节,可以根据自己需要调整
    - h- ~- j' a$ w, v, M6 T
  6. #define MEM2_ALLOC_TABLE_SIZE        MEM2_MAX_SIZE/MEM2_BLOCK_SIZE         //内存表的大小
      T1 Z/ B" R9 ]) [0 @7 u3 M# s- s
  7. //内存池(32字节对齐)+ D- R( m" p7 V
  8. __align(32) u8 mem2base[MEM2_MAX_SIZE] __attribute__((at(0X68000000)));//外部sram内存池,数组的起始地址为0X68000000
    7 K5 Q( ?& G$ X/ i. s8 _
  9. //内存管理表
    7 g+ ]5 q9 n) t$ m/ w5 b& {
  10. u16 mem2mapbase[MEM2_ALLOC_TABLE_SIZE] __attribute__((at(0X68000000+MEM2_MAX_SIZE)));//外部sram内存池MAP
复制代码

6 g( H" p) l" X. N% N  p& |' D分块式内存管理
" J' O; N/ J0 r( Z$ M4 d8 i. s* g7 @# o/ v
20190922224202325.png   Q, i6 ]" L4 C

8 ~4 y8 @% w7 ~% J( A   分块式内存管理由内存池和内存管理表两部分组成。内存池被等分为 n块,对应的内存管理表,大小也为 n,内存管理表的每一个项对应内存池的一块内存。
: M& Y$ [; e6 X  d/ u+ j
  N. q* E# t( j; `
   内存管理表的项值代表的意义为:当该项值为 0 的时候,代表对应的内存块未被占用,当该项值非零的时候,代表该项对应的内存块已经被占用,其数值则代表被连续占用的内存块数。比如某项值为 10,那么说明包括本项对应的内存块在内,总共分配了 10 个内存块给外部的某个指针。0 R. M" q5 |( x7 d

% E2 R6 G5 y6 j/ r8 W9 U   内存分配方向是从顶->底的分配方向。即首先从最末端开始找空内存。当内存管理刚初始化的时候,内存表全部清零,表示没有任何内存块被占用' D& b3 `8 G9 g8 V4 S, x: c3 g

% Q( Y* [4 _  o  ?注:
: L1 y0 N' c; X3 r* f' k
9 \; m% w# E% J  R+ w当涉及到跑算法,GUI应用等内置的内存不够用时,就用外部的SRAM来扩充内存8 O' U4 J' ]% I2 M4 p

' `8 U1 J. b1 w" F2 M
- g  A6 Z+ }$ G- V5 F8 H
程序数据的存储区域
" B% @8 b6 I$ D$ Q下载到flash的有:Code: 代码
& N3 S6 D0 i- ^1 E4 G) A0 V( K" R9 V9 o                             RO-data:程序定义的常量6 \2 m& e1 D2 z, r
                            RW-data:已初始化的非0全局变量,当程序初始化时会拷贝到RAM中去
1 }/ i  H4 i; z! [- ^; r# @2 q% ?7 \1 O+ u# i
下载到RAM的有:RW-data:已初始化的全局变量
9 S; }1 R0 c7 n2 I* p: T. Z- W                              ZI-data:未初始化的全局变量,以及初始化为0 的变量  W0 Q) `7 }$ g
, v7 b( C. U9 c1 |
STM32F103ZET6的flash资源详解
7 S7 V; N4 |, a9 _
  ZET6芯片内部内置了512K字节的flash,用于存放代码和数据常量,是主存储块,起始地址为0x08000000,这是程序执行的起始地址,此时的BOOT0和BOOT1都接GND.被划分为256页,每页2K字节: o: \$ O, m1 Y4 J% l: @5 P
+ X* }) t; [7 C8 x
20190922224451603.png
8 l, Q5 }6 g& E. y* X: G7 O% ?5 h6 [) l+ w0 X4 O
同时开发板外置了16M字节的外部flash芯片,即为W25Q128' Z, c: p  s  e, r6 o5 P

+ S7 [: Y7 O7 T; a2 s, c' l) V6 |( o
20190922224518447.png
+ S" q0 D: y% G6 P9 b$ n+ y3 ~/ q+ s: m, G6 _, K. c- Q
采用spi通信传输,分成256个块(BLOCK),每块64k字节,每块又分成16个扇区(sector),每扇区4K字节) F% p. X- _& }9 [  {9 t

3 D  n$ z$ d; W, G相当于stm32外接了一个硬盘,虽调用速度慢,但数据不分丢失,一般用于存放FATFS文件系统,字库,图像,日志等
  1. #define FLASH_SECTOR_SIZE         512                          
    ! f; o% [/ l' C3 s0 G3 P
  2. //对于W25Q128
      q- `  [9 L# l% a7 E2 d3 M
  3. //前12M字节给fatfs用,12字节后,用于存放字库,字库占用3.09M,剩余部分,用户自定义使用                    
    ( {2 V, h* T; _+ \  w4 j9 i
  4. u16            FLASH_SECTOR_COUNT=2048*12;        //W25Q1218, I4 k/ {1 [8 M
  5. #define FLASH_BLOCK_SIZE           8             //每个BLOCK分配8个扇区
    ' i0 Q9 P0 D* G. m# y7 ?& ?: |
  6. //字库占用的总扇区数
      E3 e2 A* e5 Q) {0 v
  7. #define FONTSECSIZE                 791! f6 {: m- F2 j! X1 N1 F, R- a
  8. //字库存放的起始地址
    6 f- [3 v$ s& o  X  ^9 x5 O
  9. #define FONTINFOADDR         1024*1024*12        
复制代码

. M% V  K' f  {
! m+ R) L1 a: @- i
) j: K6 J' ?) k+ X  ~- s4 L
————————————————
3 _2 F8 Q( d2 W版权声明:Psyduck_ing# ^0 q1 w) {; r/ Y) v& g3 P
如有侵权请联系删除
% Y8 ?) X: [5 Z6 e3 K+ ^. W" r3 G
0 p1 h& S, X$ `% K* T4 s6 b

7 a: T7 P' h$ p" Z0 d& V% H3 R
收藏 评论0 发布时间:2023-5-11 18:51

举报

0个回答

所属标签

相似技术帖

官网相关资源

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