目录
一、简介
Cortex-M处理器可对32位存储器寻址,因此空间能达到4GB。有以下特性:
- 多个总线接口,指令和数据可同时访问
- 基于AMBA的总线接口设计(APB、AHB)
- 同时支持大端和小端
- 支持非对齐数据传输
- 支持排他传输(用于嵌入式OS或RTOS的信号量操作)
- 可位寻址的存储器空间
- 不同存储器区域的存储器属性和访问权限
- 可选的MPU(存储器保护单元)
二、存储器映射
区域 | 地址范围 | 备注 |
代码 | 0x00000000-0x1FFFFFFF | 512MB的存储器空间,主要用于程序代码(包含默认向量表),该区域允许数据访问。 |
SRAM | 0x20000000-0x3FFFFFFF | 大都为片上SRAM,类型没限制。若支持可选的位段特性,则SRAM区域的第一个1MB可位寻址,还可以执行程序代码。 |
外设 | 0x40000000-0x5FFFFFFF | 多数用于片上外设,和SRAM类似,若支持可选的位段特性,则SRAM区域的第一个1MB可位寻址,还可以执行程序代码。 |
RAM | 0x60000000-0x9FFFFFFF | 包含两个512MB存储器空间,用于片外存储器灯其他RAM,可存放程序代码和数据。 |
设备 | 0xA0000000-0xDFFFFFFF | 用于片外外设等其他存储器。 |
系统 | 0xE0000000-0xFFFFFFFF | 内部私有外设总线(PPB):0xE0040000-0xE00FFFFF 访问NVIC、Systick、MCU等系统部件 外部私有外设总线(PPB):0xE0040000-0xE00FFFFF 供应商自定义: 0xE0100000-0xFFFFFFFF |
三、连接处理器到存储器和外设
Cortex-M4处理器,主要的总线接口使用AHB(AMBA高性能总线)Lite协议,而APB协议则用作私有外设总线(PPB),主要用于调试部件。
为提高性能,CODE存储区区域已经将总线接口从系统总线中独立出来,如下所示:
在简单的微处理器设计中,程序存储器一般会被连接到I-CODE和D-CODE总线,而SRAM和外设则会被连接到系统总线。
外设协议一般基于APB协议,不过可以使用AHB Lite以提高带宽和运行速度。
注:私有外设总线(PPB)不会用于普通外设,因为PPB有以下特性:
- PPB只支持私有访问。
- 只允许32位访问。
- 写缓存不存在,PPB写传输需要更多的时钟周期。
- PPB中的外设无法使用位段特性。
- 只支持小端。
- 可被处理器或调试器访问,其他主线总设备不行(多处理器环境)。
若内部总线系统中发现多个总线主控设备,DMA、以太网等,一般会存在“总线矩阵”,如下所示:
四、存储器的端
小端存储器系统:字大小数据的第一字节位于32位存储器位置的最低字节处。
大端存储器系统:字大小数据的第一字节位于32位存储器位置的最高字节处。
在Cortex-M处理器中:
- 取值总是处于小端模式
- 对包括系统控制空间(SCS)、调试部件和私有外设总线(PPB) 区域访问总是小端。
五、位段操作
利用位段操作,一次加载/存储操作可以访问(读/写)一个位。位于SRAM区域的第一个1MB(0x20000000 - 0x200FFFFF)和外设区域的第一个1MB(0x40000000 - 0x400FFFFF),支持位段操作。如需要设置地址0x20000000的第二位,位段操作见下图:
使用位段操作需注意以下:
- 位段区域:支持位段操作的存储器地址区域。
- 位段别名:访问位段别名(位段操作)会引起对位段区域的访问(执行了重映射)。
地址映射如下所示:
以下C语言代码完成位段操作:
//将位段地址和位编号转换位位段别名地址
#define BIT_BAND(addr, bitnum) ((addr&0xF0000000) + 0x02000000 + ((addr&0xFFFF)<<5) + (bitnum<<2))
//将地址转换为指针
#define MEM_ADDR(addr) *((volatile unsigned int *)(addr))
#define TEST_ADDR 0X20000000
//不使用位段
MEM_ADDR(TEST_ADDR) != 0x4;
//使用位段
MEM_ADDR(BIT_BAND(TEST_ADDR, 2)) = 1;