NXP RT1052--储器映射和寄存器

参考:IMX+RT开发实战指南

RT1052 采用的是 Cortex-M7 内核,内核即 CPU,由 ARM 公司设计。

                                           i.MX RT 系列芯片架构简图
芯片内核和外设之间通过各种总线连接,内核通过 TCM 总线访问芯片内部的 SRAM存储器,从中加载代码指令执行。内核通过 AHBP 总线跟芯片上的 GPIO、 UART 等外设进行交互,达到控制目的 。另外内核还可以通过 AXIM 总线接口连接芯片外部的存储器,扩展存储空间。
没有像传统的 MCU 一样集成内部 FLASH 存储器(此处通指非易失性存储器)。

因此该芯片必须依靠一个外部 FLASH 长期保存程序代码,在芯片上电后,它可以直接执行在外部 FLASH 中的代码,即在外部 FLASH 上XIP,它还可以从外部的 FALSH 加载程序到内部的 SRAM 缓存,然后内核再从内部 SRAM 读取代码来运行,加载代码的方式多种多样。

                                                 RT1052 芯片详细说明图
 

ICache:

ICache,即指令缓存(Instruction Cache),即图中“I$”,
在 i.MX RT 系列芯片中其大小为 32KB,内核访问该存储器有着极高的速度。它的作用是缓存要执行的指令,即内核根据代码的运行情况,预先从其它存储器(如外部 Flash,外部 SDRAM 等)加载可能会被执行的代码存储至 ICache.由于ICache 的存在,程序存储在 SD 卡、 NAND FLASH 等不支持 XIP 的存储器也成为了可能。
 

DCache:
DCache,即数据缓存(Data Cache),即图 中“D$”,在 i.MX RT 系列芯片中其大小为 32KB,它与 ICache 的功能类似,起到缓存的作用,区别只是 ICache 专用于存储指令,DCache 专用于存储数据
 

FlexRAM:
在 i.MX RT 系列芯片中其大小为 512KB,可以把它理解成传统 MCU 的内部 SRAM 存储器,只是它附加了可划分功能区域的配置,分别可以把这内部 SRAM 分为专用于存储指令的 ITCM,专用于存储数据的 DTCM 以及通用功能的OCRAM
 

存储器映射
连接被控总线的是 SRAM、片上外设及外部存储器,这些功能部件共同排列在一个 4GB 的地址空间内。
存储器本身不具有地址信息,它的地址是由芯片厂商或用户分配,给存储器分配地址的过程就称为存储器映射.

cortex-m7存储器映射

大部分块的大小都有 512MB 以上,显然这是非常大的,芯片厂商在每个块的范围内设计各具特色的外设时并不一定都用得完,都是只用了其中的一部分而已。
Block0 主要用于存储程序代码,一般采用 FLASH 存储器, Block1 主要用于运行时的内存,一般采用SRAM 存储器, Block2 用来设计成片上的外设,内核通过相应的地址访问片上外设。
 

存储器 Block0 内部区域功能划分
Block0 主要用于存储程序代码,

ITCM, ITCM 是 Instruction Tightly-Coupled Memory 的缩写,译为指令紧耦合内存。所谓紧耦合是指该内存与内核连接紧密,有非常高的访问速度,而“指令”则表示该内存专用于缓存指令。
我们可以要求内核上电后把相应的代码从外部 FLASH 加载至 ITCM,那么在运行时,代码的执行速度就不会因外部 FLASH 的访问速度而存在瓶颈。
 

ROMCP,这是一小段 ROM 空间,用于存储芯片启动时的加载代码,即bootloader, bootloader 负责把指令从外部存储器加载至 ITCM。
 

SEMC 及 FlexSPI 是 RT1052 可用于控制外部并行及串行 NorFlash 的两个外设,此处把它们映射到此代码空间,是为了支持 XIP 功能(即指令直接在 NorFlash 上运行,不需要加载到内部的 ITCM)
 

储存器 Block1 内部区域功能划分
Block1 用于设计片内的 SRAM,也就是芯片运行时的内存。

DTCM,是 Data Tightly-Coupled Memory 的缩写,译为数据紧耦合内存,它跟 ITCM 类似,有着极高的访问速度,不过它是专门用来存储程序数据的,即代码中变量的存储位置。
 

OCRAM,它是 On-chip RAM 的缩写,即片上内存,可以完全把它理解为传统 MCU 的内部 SRAM,它没有像 ITCM 和 DTCM 的专用限制,可用于存储指令和数据(通用目的)
 

ITCM、 DTCM 及 OCRAM 地址范围均分配了512KB,但这并不是说这三种存储器都有 512KB 大小。实际上这三种存储器共享内部FlexRAM 的空间,而这个内部 FlexRAM 空间在 RT1052 芯片中为 512KB。这三种存储器的空间是可以动态调整的。

储存器 Block2 内部区域功能划分

AIPS 是 ARM IP Bus 的缩写,它一边与内核 AHB 总线连接,另一边与片上的各种外设连接, AIPS1~4 即连接了各种各样的外设,此处每条总线划分的地址范围各为 1MB,内核根据地址可以访问相应总线下的外设,达到控制目的,
 

 

寄存器映射
在上述存储器 Block2 这块区域,设计的是片上外设,在相应的地址空间内它们以四个字节为一个单元,共 32bit,每一个单元对应不同的功能,当我们控制这些单元时就可以驱动外设工作。
我们可以找到每个单元的起始地址,然后通过 C 语言指针的操作方式来访问这些单元,如果每次都是通过这种地址的方式来访问,不仅不好记忆还容易出错,这时我们可以根据每个单元功能的不同,以功能为名给这个内存单元取一个别名,这个别名对应
的内存区就是我们经常说的寄存器,这个给已经分配好地址的有特定功能的内存单元取别名的过程就叫寄存器映射

 

比如,我们找到 GPIO1 端口的输出数据寄存器 DR 的地址是 0x401B 8000(至于这个地址如何找到可以先跳过,后面我们会有详细的讲解), DR 寄存器是 32bit,对应着 32 个外部 IO,写 0/1 对应的的 IO 则输出低/高电平。现在我们通过 C 语言指针的操作方式,让GPIO1 的 32 个 IO 都输出高电平,
通过绝对地址访问内存单元
 // GPIO1 端口全部输出 高电平
 *(unsigned int*)(0x401B8000) = 0xFFFFFFFF;
0x401B 8000 在我们看来是 GPIO1 端口数据输出寄存器 DR 的地址,但是在编译器看来,这只是一个普通的变量,是一个立即数,要想让编译器也认为是指针,我们得进行强制类型转换,把它转换成指针,即(unsigned int *)0x401B 8000,然后再对这个指针进行 *操作。


通过绝对地址访问内存单元不好记忆且容易出错,我们可以通过寄存器的方式来操作,
通过寄存器别名方式访问内存单元
// GPIO1 端口全部输出 高电平
#define GPIO1_DR (unsigned int*)(0x401B8000)
 *GPIOF_DR = 0xFFFFFFFF;
为了方便操作,我们干脆把指针操作“*”也定义到寄存器别名里面
// GPIO1 端口全部输出 高电平
 #define GPIO1_DR *(unsigned int*)(0x401B8000)
GPIOF_DR = 0xFFFFFFFF;
 

 

代码存储的位置与执行的位置
1. 代码存储在 FLASH 中并执行
在这种方式下代码保存在 SPINorFlash 中, 内核通过 FlexSPI 外设从 SPI-NorFlash 中加载代码并执行,而 DTCM、OCRAM、 SDRAM 存储器则用于存储 C 语言的堆栈、以及显存等内容,即内核从这些位置加载运行的数据。

由于 SPI-NorFlash 掉电后能正常保存内容,所以在下一次上电后,系统仍然能正常执行 NorFlash 中保存的程序,所以在发布应用的时候通常采用把代码保存到 NorFlash 的这种方式。
 

2. 代码存储在 RAM 中并执行
由于 NorFlash 的擦写速度非常慢,对于经常需要更新代码调试的开发阶段我们通常把代码保存到 RAM 类型的存储器中,即系统内的 ITCM、 OCRAM 或 SDRAM。

从 RAM 中加载代码并执行

根据不同的需求,我们可能会把代码放在 ITCM 中以获得极高的运行速度,放在SDRAM 中以存储更大容量的代码,而 OCRAM 优缺点并不明显,在实际应用中我们通常只用它缓存数据,上图用它存储并执行代码只是描述了一种可能性。对于 OCRAM 和
SDRAM 存储器,它们既支持存储代码也支持存储数据,而 ITCM 只支持存储代码,DTCM 只支持存储数据。

无论代码是存储在 ITCM、 OCRAM 或 SDRAM,它们相对于 NorFlash 的写入速度都快得多,但由于掉电后代码会丢失,所以这种运行方式通常只用于开发阶段进行调试。
 

3. 代码存储在 FLASH,在 RAM 中执行

为了综合 FLASH 和 RAM 存储器的优点,该系统对代码的存储和执行还有更复杂的处理方式。

使用这种方式时,系统平时把代码存储在 NorFlash,这能保证掉电后也能正常存储,在上电后把代码从 NorFlash 复制到 ITCM、 OCRAM 或 SDRAM 中,在正式运行时,内核直接从这些 RAM 内加载代码并执行,由于内核对 RAM 的访问速度更快,所以这能提高代码的执行速度,尤其是与内核联系紧密、使用 64 位线宽的 ITCM,它是专门设计需要高速执行代码的。
 

 

 

  • 5
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值