Cortex-M4 学习-存储系统

目录

一、简介

二、存储器映射

三、连接处理器到存储器和外设

四、存储器的端

五、位段操作



一、简介

        Cortex-M处理器可对32位存储器寻址,因此空间能达到4GB。有以下特性:

  • 多个总线接口,指令和数据可同时访问
  • 基于AMBA的总线接口设计(APB、AHB)
  • 同时支持大端和小端
  • 支持非对齐数据传输
  • 支持排他传输(用于嵌入式OS或RTOS的信号量操作)
  • 可位寻址的存储器空间
  • 不同存储器区域的存储器属性和访问权限
  • 可选的MPU(存储器保护单元)

二、存储器映射

        存储器区域定义如下:

存储器区域
区域地址范围备注
代码0x00000000-0x1FFFFFFF512MB的存储器空间,主要用于程序代码(包含默认向量表),该区域允许数据访问。
SRAM0x20000000-0x3FFFFFFF大都为片上SRAM,类型没限制。若支持可选的位段特性,则SRAM区域的第一个1MB可位寻址,还可以执行程序代码。
外设0x40000000-0x5FFFFFFF多数用于片上外设,和SRAM类似,若支持可选的位段特性,则SRAM区域的第一个1MB可位寻址,还可以执行程序代码。
RAM0x60000000-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; 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值