STM32学习-- 存储器组织

  今天学习一下STM32F1的存储器组织,也看了一下F4的,有些地方有改进,但大体未变。

1. 存储单元

  F1主要有四个存储单元,分别中内部SRAM、内部FLAH、FSMC、AHB到APB桥(连接各种外设)。

STM32学习-- 存储器组织_第1张图片

2.存储空间

  由于其地址总线32位,所以将程序存储器、数据存储器、寄存器、IO端口都组织于4Gb的线性空间内,数据字节以小端格式存放在存储器中。

STM32学习-- 存储器组织_第2张图片
   这个地址是由厂家规定好的,用户只能用而不能改。用户只能在挂外部RAM或FLASH。我们主要了解CODE区(FLASH)和内部SRAM区。

3.片内FLASH

STM32学习-- 存储器组织_第3张图片
         以小容量器件为例
  地址0x0000 0000根据BOOT0、1选择不同的地址空间。在用户闪存模式时,映射地址为0x0800 0000,在从SRAM启动时,映射地址为0x2000 0000,在从系统存储器启动时,映射地址为0x1FFF F000。
  STM32的Flash包括:Flash主存储区(Main memory)、系统存储器(System memory),以及操作字节(Opetio Bytes)。如图所示:
  Flash主存储区从0x0800 0000f 地址开始,不同系列器件有不同大小,这里存放为用户烧入的代码(CODE)、常量(RO)和已经初始化的全局变量的值(RW)。
  系统存储器地址0x1FFF F000 – 0x1FFF F71F,这是厂商出厂之前烧入的一段程序,用来使用串口下载程序,实现IAP。该处你只能使用,不能写或擦除。
操作字节:可以按照用户的需要进行配置(如配置看门狗为硬件实现还是软件实现)。

4.片内SRAM

  SRAM就是单片机的内存空间,内部非堆即栈,堆由低地址向上增长地址从0x2000 0000开始,栈由高地址向下增长。堆中包括静态区和用户分配空间(malloc分配的空间),静态区包括全局变量(ZI、RW) 包括静态变量。栈中存储局部变量。
启动文件startup_stm32f10x_md.s的定义:

; Amount of memory (in bytes) allocated for Stack
; Tailor this value to your application needs
; <h> Stack Configuration
; <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>
Stack_Size EQU 0x00000400
AREA STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem SPACE Stack_Size
__initial_sp

; <h> Heap Configuration
; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>
Heap_Size EQU 0x00000200
AREA HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base
Heap_Mem SPACE Heap_Size
__heap_limit
PRESERVE8
THUMB

  这里定义了堆栈各自大小,堆:512bytes 栈1k;
  所以栈区大小有限制,我们在局部变量中不要定义大数组否则容易溢出

  附

最后附上关于RO,RW, ZI Total ROM Size等的详细说明的摘抄:
  

Code指存储到flash【Rom】中的程序代码。
  ZI英语是zero initial,就是程序中用到的变量并且被系统初始化为0的变量的字节数,keil编译器默认是把你没有初始化的变量都赋值一个0,这些变量在程序运行时是保存在RAM中的。
   RW是可读可写变量,就是初始化时候就已经赋值了的,RW + ZI就是你的程序总共使用的RAM字节数。
   RO是程序中的指令和常量,这些值是被保存到Rom中的。
Total ROM Size (Code + RO Data + RW Data)这样所写的程序占用的ROM的字节总数,也就是说程序所下载到ROM flash
中的大小。为什么Rom中还要存RW,因为掉电后RAM中所有数据都丢失了,每次上电RAM中的数据是被重新赋值的,每次这些固定的值就是存储在Rom中的,为什么不包含ZI段呢,是因为ZI数据都是0,没必要包含,只要程序运行之前将ZI数据所在的区域一律清零即可。包含进去反而浪费存储空间。
  实际上,ROM中的指令至少应该有这样的功能:
   1. 将RW从ROM中搬到RAM中,因为RW是变量,变量不能存在ROM中。
   2. 将ZI所在的RAM区域全部清零,因为ZI区域并不在Image中,所以需要程序根据编译器给出的ZI地址及大小来将相应得RAM区域清零。ZI中也是变量,同理:变量不能存在ROM中。

你可能感兴趣的:(STM32,学习)