ARM 存储器映射表图

一、简介
在 ARM 架构中,存储器映射(Memory Map)定义了不同外设、内存区域在地址空间中的分布情况,通过存储器映射表,可以清晰地了解各个组件所占据的地址范围,有助于进行系统配置、编程以及故障排查等工作,以下将以常见的 ARM Cortex M 系列微控制器为例,展示其典型的存储器映射情况。
二、典型 ARM Cortex M 存储器映射表
| 区域名称 | 起始地址 | 结束地址 | 大小 | 描述 |
| 代码区(Flash) | 0x08000000 | 0x080FFFFF | 1 MB | 用于存储程序代码,可多次擦写,断电后数据不丢失,程序复位后通常从这里开始执行指令。 |
| SRAM 区 | 0x20000000 | 0x200FFFFF | 256 KB | 作为通用的读写内存,用于存储运行时的变量、堆栈等数据,读写速度较快,但断电后数据丢失。 |
| 系统控制区(SCB、MPU、NVIC 等) | 0xE000E000 0xE000EFFF | 约 4 KB | 包含系统控制块(SCB)、内存保护单元(MPU)、嵌套向量中断控制器(NVIC)等关键系统外设的寄存器映射,用于系统配置和中断管理等功能。 | |
| 外设寄存器区(以 USART、GPIO 等为例) | 0x40000000 0x400FFFFF | 约 1 MB | 各个外设(如通用同步异步收发器 USART、通用输入输出 GPIO 等)的寄存器映射到该区域,通过访问这些寄存器可以配置外设的工作模式、读取外设状态等,USART1 的寄存器可能从 0x40011000 开始,GPIOA 的寄存器从 0x40010800 开始等,具体每个外设的地址范围根据芯片型号和厂商定义有所不同。 | |
| 片内ROM(如果有,如启动代码存储区) | 0x00000000 0x000FFFFF | 1 MB | 通常包含一些启动代码或只读的固件,在系统复位时可能会首先从这里执行一些初始化操作,然后跳转到 Flash 中的用户程序代码区执行。 |
三、相关问题与解答

问题 1:为什么需要不同的存储器区域(如代码区、SRAM 区、外设寄存器区等)?
解答:不同的存储器区域有其特定的用途和特性,代码区(Flash)用于存储程序代码,因为程序代码在正常运行时不需要频繁修改,且需要断电保存,Flash 的非易失性正好满足这一要求,SRAM 区作为运行时的内存,用于存储变量、堆栈等数据,它的读写速度较快,能满足程序运行时快速读写数据的需求,但由于其易失性,适合临时存储数据,外设寄存器区则是专门为各种外设(如 USART、GPIO 等)提供配置和控制的接口,通过访问这些寄存器可以设置外设的工作模式、读取外设的状态等信息,使得微控制器能够与外部设备进行正确的交互。
问题 2:如何访问外设寄存器区中的特定外设寄存器?
解答:在 ARM Cortex M 微控制器中,访问外设寄存器通常是通过指针操作来实现的,首先需要知道特定外设寄存器的基地址,这个地址可以在芯片的数据手册或参考手册中找到,要访问 GPIOA 的某个寄存器,假设 GPIOA 的基地址是 0x40010800,而我们要访问的是其配置寄存器(假设偏移量为 0x00),那么可以通过定义一个指向该地址的指针,然后通过指针来读写寄存器的值,以下是一个简单的示例代码(以 C 语言为例):

#define GPIOA_BASE 0x40010800 #define GPIOA_CRL *(volatile uint32_t *)(GPIOA_BASE + 0x00) // 假设配置寄存器低 32 位在基地址偏移 0x00 处 // 写入数据到 GPIOA 配置寄存器 GPIOA_CRL = 0x01; // 读取 GPIOA 配置寄存器的值 uint32_t value = GPIOA_CRL;
在上述代码中,GPIOA_BASE 定义了 GPIOA 的基地址,GPIOA_CRL 通过基地址加上偏移量的方式定义了指向配置寄存器的指针,然后就可以像访问普通变量一样对寄存器进行读写操作了,需要注意的是,由于外设寄存器通常涉及到硬件的控制,在进行读写操作时要确保操作的正确性和安全性,避免对硬件造成损坏。
以上就是关于“arm 存储器映射表图”的问题,朋友们可以点击主页了解更多内容,希望可以够帮助大家!
【版权声明】:本站所有内容均来自网络,若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!
发表回复