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

基于stm32存储资源经验分享

[复制链接]
攻城狮Melo 发布时间:2023-5-11 18:51
ZET6芯片

20190922223659933.png


该芯片内部自带了64k字节的SRAM,以及512K的内部FLASH

20190922223853114.png

IROM1=0x80000=512K 和IRAM1=0X10000=64k的大小

同时开发板外置了1M字节外部SRAM芯片(IS62WV51216)

20190922223834727.png

1M字节(即512K*16位)其中512K是由19根地址线决定,219=512K; 16位是由16根数据线决定的

64k字节内部SRAM程序相关
  1. my_mem_init(SRAMIN);        //初始化内部内存池
  2. #define SRAMIN        0    //定义内部内存池
  3. //mem1内存参数设定.mem1完全处于内部sram
  4. #define MEM1_BLOCK_SIZE                        32                                                            //一个内存块大小为32字节
  5. #define MEM1_MAX_SIZE                        40*1024                                                  //最大管理内存40K字节,可以自己根据需要调整
  6. #define MEM1_ALLOC_TABLE_SIZE        MEM1_MAX_SIZE/MEM1_BLOCK_SIZE         //内存表的大小
  7. //内存池(32字节对齐)
  8. __align(32) u8 mem1base[MEM1_MAX_SIZE];                                        //内部sram内存池,数组的起始地址由编译器自动分配
  9. //内存管理表
  10. u16 mem1mapbase[MEM1_ALLOC_TABLE_SIZE];                                //内部sram内存池MAP
复制代码

1M字节外部SRAM程序相关
  1. my_mem_init(SRAMEX);        //初始化外部内存池
  2. #define SRAMEX        1    //定义外部内存池
  3. //mem2内存参数设定.mem2完全处于外部sram
  4. #define MEM2_BLOCK_SIZE                        32                                                            //一个内存块大小为32字节
  5. #define MEM2_MAX_SIZE                        960*1024                                                  //最大管理内存960K字节,可以根据自己需要调整
  6. #define MEM2_ALLOC_TABLE_SIZE        MEM2_MAX_SIZE/MEM2_BLOCK_SIZE         //内存表的大小
  7. //内存池(32字节对齐)
  8. __align(32) u8 mem2base[MEM2_MAX_SIZE] __attribute__((at(0X68000000)));//外部sram内存池,数组的起始地址为0X68000000
  9. //内存管理表
  10. u16 mem2mapbase[MEM2_ALLOC_TABLE_SIZE] __attribute__((at(0X68000000+MEM2_MAX_SIZE)));//外部sram内存池MAP
复制代码

分块式内存管理

20190922224202325.png

   分块式内存管理由内存池和内存管理表两部分组成。内存池被等分为 n块,对应的内存管理表,大小也为 n,内存管理表的每一个项对应内存池的一块内存。

   内存管理表的项值代表的意义为:当该项值为 0 的时候,代表对应的内存块未被占用,当该项值非零的时候,代表该项对应的内存块已经被占用,其数值则代表被连续占用的内存块数。比如某项值为 10,那么说明包括本项对应的内存块在内,总共分配了 10 个内存块给外部的某个指针。

   内存分配方向是从顶->底的分配方向。即首先从最末端开始找空内存。当内存管理刚初始化的时候,内存表全部清零,表示没有任何内存块被占用

注:

当涉及到跑算法,GUI应用等内置的内存不够用时,就用外部的SRAM来扩充内存


程序数据的存储区域
下载到flash的有:Code: 代码
                             RO-data:程序定义的常量
                            RW-data:已初始化的非0全局变量,当程序初始化时会拷贝到RAM中去

下载到RAM的有:RW-data:已初始化的全局变量
                              ZI-data:未初始化的全局变量,以及初始化为0 的变量

STM32F103ZET6的flash资源详解

  ZET6芯片内部内置了512K字节的flash,用于存放代码和数据常量,是主存储块,起始地址为0x08000000,这是程序执行的起始地址,此时的BOOT0和BOOT1都接GND.被划分为256页,每页2K字节

20190922224451603.png

同时开发板外置了16M字节的外部flash芯片,即为W25Q128

20190922224518447.png

采用spi通信传输,分成256个块(BLOCK),每块64k字节,每块又分成16个扇区(sector),每扇区4K字节

相当于stm32外接了一个硬盘,虽调用速度慢,但数据不分丢失,一般用于存放FATFS文件系统,字库,图像,日志等
  1. #define FLASH_SECTOR_SIZE         512                          
  2. //对于W25Q128
  3. //前12M字节给fatfs用,12字节后,用于存放字库,字库占用3.09M,剩余部分,用户自定义使用                    
  4. u16            FLASH_SECTOR_COUNT=2048*12;        //W25Q1218
  5. #define FLASH_BLOCK_SIZE           8             //每个BLOCK分配8个扇区
  6. //字库占用的总扇区数
  7. #define FONTSECSIZE                 791
  8. //字库存放的起始地址
  9. #define FONTINFOADDR         1024*1024*12        
复制代码



————————————————
版权声明:Psyduck_ing
如有侵权请联系删除



收藏 评论0 发布时间:2023-5-11 18:51

举报

0个回答

所属标签

相似分享

官网相关资源

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