小猫爪:i.MX RT1050学习笔记11-FlexRAM的使用

1 前言

对于RT1050的内部SRAM则是有着非常灵活的功能。接下来让我们一起来学习一下吧。

2 FlexRAM介绍

RT1050总共有512KB大小的内部RAM,然后将其按照32KB大小分成了16个bank,每一个bank都可以分成ITCM, DTCM, OCRAM,三者的描述如下:

名称 描述
I-TCM (Instruction-Tightly Coupled Memory) 指令高速缓存,可以通过一个64位 I-TCM接口访问,只能供内核访问,速度贼快,通常存一些需要高速访问的代码指令
D-TCM (Data- Tightly Coupled Memory) 数据高速缓存,可以通过两个 I-TCM接口访问,只能供内核访问,速度一般快,通常存一些需要高速访问的数据
OCRAM(On-Chip RAM) 普通RAM,可以通过AXI接口访问,内核外设均可访问,速度较之有点慢

16个bank都可以无序打乱,但是有一个限制条件就是ITCM和DTCM的大小必须是2的多少次方,比如:0K,16K,32K,64K,128K,256K;OCRAM可以为0 ~ 512K。

(说到这里或许有的小伙伴就有人来问了,为什么512KB不能完全是TCM,因为BootROM在启动时会使用掉最少32K+4(1)K的OCRAM,所以我们最少要给OCRAM预留出64KB的空间来保证其正常启动)

默认配置如下:

ITCM DTCM OCRAM
128KB 128KB 256KB

3 FlexRAM配置方法

配置FlexRAM也是非常简单,有两种渠道可以实现:
①通过配置FUSE的0x6D0处的[19:16]。
②通过配置寄存器IOMUXC_GPR_GPR17。

可以通过配置寄存器IOMUXC_GPR_PGR16的FLEXRAM_BANK_CFG_SEL位来选择上面两种方式之一,默认是通过FUSE来配置。

下表显示了RT1050的可能配置:
在这里插入图片描述
注意:如果通过寄存器对32个Bank的分配配置完成后,还需要进行配置寄存器IOMUXC_GPR_GPR14来告诉内核ITCM和DTCM的大小,另外如果我们在配置ITCM和DTCM的大小为0之前,我们还需要配置寄存器IOMUXC_GPR_GPR16的DTCM和ITCM的使能位INIT_DTCM_EN和INIT_ITCM_EN)

总结通过配置寄存器来初始化FlexRAM流程如下:
①配置寄存器IOMUXC_GPR_GPR17对16个bank进行分配。
②配置寄存器IOMUXC_GPR_PGR16的FLEXRAM_BANK_CFG_SEL来选择配置源寄存器。
③如果配置ITCM或者DTCM大小为0,则应配置IOMUXC_GPR_GPR16中对应的TCM使能位。
④配置寄存器IOMUXC_GPR_GPR14,修改DTCM和ITCM的大小。

4 FlexRAM使用

RT提供了配置寄存器的方法来配置FlexRAM,所以我们是可以在程序运行的时候来改变FlexRAM的配置的,不过这需要注意很多方面的影响,比如中断,比如数据存储等,不当的操作非常容易造成难以想象的结果,所以还是不建议这样做。最好在程序运行前完成FlexRAM的配置。下面介绍几种不同的使用场景:

4.1 修改FSUE

这种方法就是一次性的,一般只有在产品发布的情况下才会这样做,所以我们就直接PASS掉。

4.2 通过IDE脚本

我们在程序调试阶段,则可以通过IDE的脚本文件改变相关寄存器的值,IDE脚本的方式我已经在我的前一篇文章《小猫爪:i.MX RT1050学习笔记10-SDRAM的提前初始化》具体介绍过了,大家可以参考。

4.3 在BootLoader中

如果在有BootLoader的应用开发中,我们可以在BootLoader中通过在跳转到APP之前,添加对相关寄存器的配置来实现。

4.4 修改startup.s文件

我们可以在入口函数Reset_Handler中添加配置相关寄存器的汇编代码,保证在启动后RAM中无任何数据前完成对FlexRAM的配置。参考代码如下:

在这里插入图片描述

4.5 通过DCD

通过DCD也可以配置FlexRAM,列出DCD中可以操作的寄存器表如下:
在这里插入图片描述

可以看到FlexRAM相关的寄存器也在其中,所以我们可以将FlexRAM相关的寄存器信息写入至DCD中,BootROM读取DCD数据后,也是可以完成对FlexRAM的初始化配置。DCD数据的生成在前一章也详细说过了,在这里就不举例了。

END

おすすめ

転載: blog.csdn.net/Oushuwen/article/details/109336329