戰艦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