ARM Cortex-M 存储器映射

ARM Cortex-M 存储器映射

本文来自于我关于ARM Cortex-M 的存储器系统的系列文章。欢迎阅读、点评与交流~
1、ARM Cortex-M 的存储器系统特性
2、ARM Cortex-M 存储器映射

文章目录

  • [ARM Cortex-M 存储器映射](#ARM Cortex-M 存储器映射)

一、概述

ARM Cortex-M处理器的存储器映射是一个统一编址的32位地址空间(4GB),这个空间被预定义为不同的功能区域,每个区域有特定的用途和访问特性。

二、存储器映射整体布局

复制代码
0xFFFFFFFF ┌──────────────────────┐
            │  私有外设总线(PPB)   │
0xE0100000 └──────────────────────┘
            │      保留区域        │
0xE0000000 └──────────────────────┘
            │   外部设备区域      │
0xA0000000 └──────────────────────┘
            │   外部RAM区域       │
0x60000000 └──────────────────────┘
            │  外部ROM/Flash区域  │
0x40000000 └──────────────────────┘
            │   片上外设区域      │
0x20000000 └──────────────────────┘
            │    片上SRAM区域     │
0x00000000 └──────────────────────┘

三、主要存储器区域详解

1. 代码区域 (0x0000 0000 - 0x1FFF FFFF) - 512MB

  • 用途:存储程序代码、常量数据和中断向量表
  • 访问:通过ICode和DCode总线访问,支持字节、半字、字访问
  • 典型包含
    • Flash存储器
    • ROM
    • 部分片上RAM(用于代码执行)

2. 片上SRAM区域 (0x2000 0000 - 0x3FFF FFFF) - 512MB

  • 用途:数据存储(变量、堆栈、堆)
  • 访问:通过系统总线访问
  • 特点
    • 支持位带操作(Bit-band)
    • 通常分为多个SRAM块

3. 片上外设区域 (0x4000 0000 - 0x5FFF FFFF) - 512MB

  • 用途:连接芯片上的所有外设
  • 包含
    • GPIO端口
    • 定时器、串口、SPI、I2C等外设寄存器
    • 也支持位带操作

4. 外部RAM区域 (0x6000 0000 - 0x9FFF FFFF) - 1GB

  • 用途:连接片外SRAM、DRAM等
  • 访问:通过FSMC(Flexible Static Memory Controller,灵活静态存储器控制器)或外部总线接口

5. 外部设备区域 (0xA000 0000 - 0xDFFF FFFF) - 1GB

  • 用途:连接片外设备
  • 特点:通常用于外部FPGA、CPLD或特殊外设

6. 私有外设总线 (0xE000 0000 - 0xE00F FFFF) - 1MB

  • 核心重要性:包含Cortex-M内核的系统控制功能

    PPB详细布局:
    0xE00F FFFF ┌──────────────────────┐
    │ ROM表 │
    0xE00F F000 └──────────────────────┘
    │ 保留 │
    0xE004 2000 └──────────────────────┘
    │ TPIU (跟踪单元) │
    0xE004 0000 └──────────────────────┘
    │ ETM (嵌入式跟踪) │
    0xE004 1000 └──────────────────────┘
    │ DWT (数据观察点) │
    0xE000 1000 └──────────────────────┘
    │ FPB (Flash补丁) │
    0xE000 2000 └──────────────────────┘
    │ NVIC (中断控制器) │
    0xE000 E000 └──────────────────────┘
    │ SCB (系统控制块) │
    0xE000 E000 └──────────────────────┘
    │ SysTick定时器 │
    0xE000 E010 └──────────────────────┘
    │ MPU (内存保护单元) │
    0xE000 ED90 └──────────────────────┘

四、关键技术特性

1. 位带操作

  • 目的:实现单个位的原子操作

  • 地址映射

    • SRAM位带别名区:0x2200 0000 - 0x23FF FFFF
    • 外设位带别名区:0x4200 0000 - 0x43FF FFFF
  • 计算公式

    复制代码
    别名区地址 = 位带基址 + (字节偏移×32) + (位号×4)

2. 向量表重定位

  • 初始位置:0x0000 0000(从Flash启动)
  • 可重定位到
    • 0x0000 0000(Flash)
    • 0x2000 0000(RAM)
    • 0x8000 0000(外部Flash)
  • 通过VTOR寄存器(Vector Table Offset Register)设置

3. 内存属性与访问权限

  • 不同区域有不同的访问属性:
    • 可执行(X)、可读®、可写(W)
    • 缓存(Cache)和缓冲(Buffer)属性
    • 特权/非特权访问控制

五、Cortex-M系列差异

特性 Cortex-M0/M0+ Cortex-M3 Cortex-M4/M7
位带操作 可选 支持 支持
MPU 可选 可选 标准(M7)或可选
地址空间 4GB 4GB 4GB(+可选40位)
向量表重定位 支持 支持 支持

六、实际芯片实现示例(以STM32F4为例)

复制代码
STM32F407 (Cortex-M4) 存储器映射:

0xFFFFFFFF ┌───────────────┐
            │      PPB      │
0xE0000000 └───────────────┘
            │    保留       │
0x50000000 └───────────────┘
            │   FMC/FSMC    │
0xA0000000 └───────────────┘
            │  AHB1/2/3总线 │
0x40000000 └───────────────┘
            │   CCM RAM     │
0x10000000 └───────────────┘
            │    SRAM2      │
0x2001C000 └───────────────┘
            │    SRAM1      │
0x20000000 └───────────────┘
            │     Flash     │
0x08000000 └───────────────┘
            │  系统存储器   │
0x1FFF0000 └───────────────┘
            │  引导程序区   │
0x00000000 └───────────────┘

七、开发中的注意事项

  1. 启动配置:通过BOOT引脚或选项字节选择启动区域
  2. 链接脚本:正确配置代码、数据、堆栈的内存区域
  3. 外设访问:使用CMSIS定义的外设寄存器结构体
  4. 对齐访问:确保数据按正确对齐方式访问
  5. 内存保护:合理配置MPU保护关键区域

八、总结

Cortex-M的存储器映射设计提供了:

  • 统一的地址空间,简化编程模型
  • 固定的区域划分,确保代码可移植性
  • 灵活的重定位能力,适应不同应用需求
  • 硬件加速特性(如位带),提高实时性

理解存储器映射对于:

  • 优化内存使用
  • 调试内存相关问题
  • 设计高效的嵌入式系统
  • 实现可靠的安全机制

都具有重要意义。在实际开发中,建议结合具体芯片的参考手册和CMSIS库来准确理解和使用存储器映射。

相关推荐
AndyHeee13 天前
【SVC、PendSV(系统异常) 与 外设 IRQ 、NVIC笔记】
arm开发
暮云星影13 天前
瑞芯微rk3588利用Rockchip NPU运行大语言模型(LLM)
arm开发·人工智能·语言模型·自然语言处理
techdashen13 天前
绕过系统 ICMP:用 rawsock、Npcap 和 WMI 找到默认网卡
开发语言·arm开发·rust
振南的单片机世界13 天前
ARM中断比51快在哪?硬件压栈+NVIC集中管理
arm开发·stm32·单片机·嵌入式硬件
墨绿色的摆渡人13 天前
论文笔记(一百三十七)Learning Dual-Arm Push and Grasp Synergy in Dense Clutter
arm开发·论文阅读
暮云星影14 天前
全志linux开发屏幕适配(一)屏幕参数设置说明
linux·arm开发
m0_5474866614 天前
《ARM Cortex-M4嵌入式应用技术——基于STM32F407、STM32CubeMX与Proteus》全套PPT课件
arm开发·stm32·proteus
Lanceli_van14 天前
SQLite 3.45.2(sqlite-autoconf-3450200)ARM 交叉编译完整步骤
arm开发·sqlite
暮云星影14 天前
全志linux开发屏幕适配(二)`HDMI`驱动适配说明
linux·arm开发·驱动开发
暮云星影14 天前
瑞芯微rk3566开发FIT Secure Boot
linux·arm开发·驱动开发·安全