目录
前言
一、基本概念
二、内存映射的组成
三、典型布局
四、常用映射
前言
刚开始学习STM32的同学可能只知道按案例配置RAM、Flash的起始地址和容量,但是这个地址是怎么来的,可能并不清楚,接下来让我来给大家介绍一下STM32的内存映射机制。
STM32的内存映射机制是一种将不同的内存区域(包括Flash、SRAM、外设寄存器等)按逻辑功能映射到单片机的线性地址空间中的方法。这种机制使得用户可以通过访问特定的地址来操作存储单元或外设寄存器,从而实现对STM32单片机内部资源的直接控制。
一、基本概念
- 内存映射:将芯片理论上的地址空间分配给存储器或外设寄存器,使它们具有唯一的地址标识。这一过程类似于给每个房间分配一个门牌号,以便能够准确地找到并访问它们。
- 线性地址空间:STM32单片机的地址空间是线性的,即地址是连续编号的,从0x00000000开始,一直到某个最大值(取决于单片机的具体型号和配置,最大可达4GB)。
二、内存映射的组成
STM32单片机的内存映射可以分为两大部分:系统存储器映射区域和外设寄存器映射区域。
- 系统存储器映射区域:主要包括SRAM(用于存放数据,如全局变量、堆栈等)和Flash(用于存储程序代码)。这些区域在单片机的地址空间中占据固定的位置,用户可以通过访问这些地址来读写数据或执行代码。
- 外设寄存器映射区域:映射了各外设控制需要的寄存器。这些寄存器是外设与单片机之间通信的桥梁,通过访问这些寄存器可以配置外设的工作模式或获取其工作状态。STM32将外设寄存器按照所在的总线(如APB1、APB2、AHB等)进行分组,每个组内的寄存器地址是连续的。
三、典型布局
以STM32F429系列为例,其典型的存储器映射布局如下:
- Flash memory:0x08000000 ~ 0x080FFFFF(1MB),存储程序代码。
- SRAM:0x20000000 ~ 0x2003FFFF(256KB),用于存储运行时的数据。
- APB1外设:0x40000000 ~ 0x4000FFFF,包含连接在APB1总线上的外设,如TIMER2、UART2等。
- APB2外设:0x40010000 ~ 0x400FFFFF,包含连接在APB2总线上的外设,如TIMER1、SPI1等。
四、常用映射
FMC 总共管理 1.5GB 空间,拥有 6 个存储块(Bank)
从FMC的角度,外部器件比划分为固定大小的存储区域,每个存储取得大小为256MB
- 区域1可连接多达4个NOR Flash或PSRAM器件,此区域被划分为NOR/PSRAM1~4共4个子区域,带4个专用片选信号
- 区域2和3用于连接NAND Flash器件,此空间的MU存储器特性必须通过软件重新配置到寄存器中
- 区域5和6用于连接SDRAM器件(每个存储区域一个器件)
我们给板子加了SDRAM或者NANDFLASH这种FMC接口扩展的芯片,怎么知道它们的映射的起始地址呢。下图是STM32F429的FMC映射图,可以看到sdram的存储块属于BANK5和BANK6,起始地址分别为0XC0000000和0XD0000000,而nandfalsh的存储块属于bank2和bank3,起始地址分别为0X70000000和0X80000000。
注意,有的同学好奇为什么0X80000000作为存储代码的起始地址,又作为nandflash的起始地址,又作为nandflash的起始地址,这不冲突吗?起始并不是,仔细看的话,芯片内部flash起始地址是0X08000000,而nandflash起始地址是0X80000000,后面的0不一样多的。