Cortex-M3 采用了预定义的内存映射方式。Cortex-M3 的中断控制器及调试组件可通过简单的内存存储指令进行访问,从而使得软件设计适合用C语言编程实现。预定义的内存方式使得Cortex-M3 更优化与高度集成。
如图 1-3 所示是Cortex-M3 预定义的存储器映射,其空间是 4G(0x00000000~0xFFFFFFFF)。
图 1-3 Cortex-M3 预定义的存储器映射
程序可以在代码区(0x00000000~0x1FFFFFFF)、内部SRAM 区及外部RAM 区中执行。由于指令总线与数据总线是分开的,所以最理想的是把程序放到代码区,从而使取指和数据访问各自使用自己的总线。
片上SRAM区的大小是 512MB,用于让芯片制造商连接片上的 SRAM,这个区通过系统总线来访问。有一个 1MB 的区间被称为“位带区”。该位带区还有一个对应的 32MB的“位带别名(alias)区”。位带区对应的是最低的 1MB地址范围,而位带别名区里的每个字对应的是位带区的一个比特。位带操作只适用于数据访问,不适用于取指。通过位带的功能,可以把多个布尔型数据打包在单一的字中,但是依然可以从位带别名区中像访问普通内存一样地使用它们。
片上外设区(0x40000000~0x5FFFFFFF)供片上寄存器使用。这个区中也有一个32MB 的位带别名区,以便于快捷地访问外设寄存器,其用法与内部SRAM区中的位带相同。例如,可以方便地访问各种控制位和状态位。要注意的是,外设区内不允许执行指令。
0x60000000~0x9FFFFFFF区域与 0xA0000000~0xDFFFFFFF区域分别用于连接外部RAM和外部设备,它们之中没有位带。两者的区别在于外部 RAM 区允许执行指令,而外部设备区则不允许执行指令。
0xE0000000~0xE00FFFFF是Cortex-M3 独立拥有的区域,该区域不提供给芯片制造厂家使用。如图 1-4 所示是Cortex-M3 的私有外设总线的内存映射图。私有外设总线有以下两条。
(1)AHB私有外设总线:只用于CM3 内部的AHB外设,它们是NVIC,FPB,DWT和ITM。
(2)APB私有外设总线:既用于CM3 内部的APB设备,也用于外部设备(指的是芯片生产厂家的APB外设)。CM3 允许芯片生产厂家增添一些片上APB外设到APB私有总线上,它们通过APB接口来访问。
图 1-4 Cortex-M3 的私有外设总线的内存映射图
下面来看一下LPC17XX是如何使用Cortex-M3 规定的内存映射的。如表 1-7 所示是LPC17XX的内存映射。LPC17XX在Cortex-M3 的预定义的代码区中有 64KB的SRAM,该部分用于执行代码与保存数据。
表 1-7 LPC17XX的内存映射
如图 1-5 所示是LPC1768 的存储器映射情况。LPC177X/LPC178X与LPC1768 除了AHB外设(即DMA、USB、以太网及新增加的LCD)的存储空间不一样外,其余的APB占用空间几乎一样。Cortex-M3 的内核空间均符合Cortex-M3 的存储空间分配要求。
图 1-5 LPC176X的存储器映射情况
技巧: 编译程序时,输出map文件可以查看内存分配情况,以及程序代码、数据占用空间情况。