stm32存储资源详解

战舰STM32F103ZET6开发板

ZET6芯片

 

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

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

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

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

64k字节内部SRAM程序相关

my_mem_init(SRAMIN);	//初始化内部内存池
#define SRAMIN	0    //定义内部内存池
//mem1内存参数设定.mem1完全处于内部sram
#define MEM1_BLOCK_SIZE			32  	  						//一个内存块大小为32字节
#define MEM1_MAX_SIZE			40*1024  						//最大管理内存40K字节,可以自己根据需要调整
#define MEM1_ALLOC_TABLE_SIZE	MEM1_MAX_SIZE/MEM1_BLOCK_SIZE 	//内存表的大小
//内存池(32字节对齐)
__align(32) u8 mem1base[MEM1_MAX_SIZE];					//内部sram内存池,数组的起始地址由编译器自动分配
//内存管理表
u16 mem1mapbase[MEM1_ALLOC_TABLE_SIZE];				//内部sram内存池MAP

1M字节外部SRAM程序相关

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

分块式内存管理

   分块式内存管理由内存池内存管理表两部分组成。内存池被等分为 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字节

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

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

相当于stm32外接了一个硬盘,虽调用速度慢,但数据不分丢失,一般用于存放FATFS文件系统,字库,图像,日志

#define FLASH_SECTOR_SIZE 	512			  
//对于W25Q128
//前12M字节给fatfs用,12字节后,用于存放字库,字库占用3.09M,剩余部分,用户自定义使用		    
u16	    FLASH_SECTOR_COUNT=2048*12;	//W25Q1218
#define FLASH_BLOCK_SIZE   	8     	//每个BLOCK分配8个扇区
//字库占用的总扇区数
#define FONTSECSIZE	 	791
//字库存放的起始地址
#define FONTINFOADDR 	1024*1024*12 	

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章