Skip to content

STM32存储架构详解

· 5 min · 嵌入式开发 / STM32 / 存储架构 / 学习笔记

一、STM32内核还有MCU#

在一块STM32的芯片中,有内核、存储、总线和各种外设。

STM32芯片本身叫做MCU,也可以是一个SOC,上述所有的硬件都被集成在其中。

其中的存储器有flash和sram两部分,下面会详细解释这些。

作为一个stm32的芯片,其内存布局往往是被cortex-M3内核大致确定的,很多STM32都遵循着类似的内存布局。

二、STM32的虚拟内存#

STM32将整块芯片中所有可用的地址都统一映射为虚拟内存,32位的寄存器和地址总线允许的寻址空间为4G,这4GB的虚拟内存被ARM内核大致划分,对ST公司来说做了一些更具体和符合使用情况的细节划分。

为什么说是虚拟内存呢?因为这些内存将所有的地址空间统一编址,不同硬件的物理地址都被划分到这里的虚拟内存。

此处的虚拟内存只是一种映射,stm32中没有虚拟内存的概念,也没有MMU专门管理内存。stm32的映射由MPU(memory protection unit)实现

对于没有MMU内存管理单元的ARM简单MCU,其内存划分都遵循相同划分。

嵌入式ARM处理器内核都是类哈佛架构,即数据总线和指令总线独立,那么最理想的情况就是程序放在Code区,数据放在SRAM区,以保证良好的性能

位带区和位带别名区#

在SRAM和Peripherals中存在一个位带区和位带别名区。以Peripherals为例,许多常用外设都放在位带区中,如果要操作某一个寄存器的单独一位,位带区中的每一位都会被单独映射到位带别名区,并且每一位映射为32位。

STM32的内存空间是根据ARM内核划分的具体实现。

STM32的4G内存被分为大小相同的8个block,每个大小就是512mb,可以和ARM内核的空间划分相对应。从低地址到高地址分别是:

三、STM32的RAM#

在一个单片机程序中,代码和只读数据被存储在Flash中,全局变量、静态变量被存储在RAM中。

在RAM中还有堆和栈。

在启动文件startupstm32xxxx.s中一开始就是对堆内存和栈内存大小的定义。在整个RAM的空间中,从下往上依次是data、bss、HEAP、STACK。

Heap和Stack的大小和位置在硬件系统上电时被确定。

其中Heap从低地址向高地址扩展,而Stack从高地址向低地址扩展。

在系统上电时,存储在FLASH中的全局变量和静态变量被搬运到RAM中。