0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

重新分配FlexRAM的方法

li1756686189 来源:嵌入式 MCU 2022-12-28 13:55 次阅读

应用笔记AN12077 解释了如何通过应用程序启动代码中的软件重新分配FlexRAM。下面将进一步详细说明进行这些修改的方法。

RT Internal SRAM FlexRAM
RT1010 Up to128KB Up to128KB
RT1015 Up to128KB Up to128KB
RT1020 Up to256KB Up to256KB
RT1050 Up to 512 KB Up to 512 KB
RT1060 Up to 1MB Up to 512 KB
RT1064 Up to 1MB Up to 512 KB

对于RT106x系列,1MB的内部SRAM中只有512 KB可以通过FlexRAM重新分配为DTCM、ITCM和OCRAM。剩余的512 KB来自OCRAM,无法重新分配。对于所有其他RT10xx,可以将整个内部SRAM重新分配为DTCM、ITCM和OCRAM。应用笔记AN12077 第3.1.3.1节解释了重新分配FlexRAM时的大小限制。值得一提的是,所有RT10xx部件中的ROM引导加载程序都使用OCRAM,因此在重新分配FlexRAM时,应该保留一些OCRAM,这不适用于RT106x,因为将始终拥有512 KB的OCRAM,无法重新分配。

MCUXpresso IDE中的实现

首先,需要将SDK示例导入MCUXpresso IDE工作区。为RT1050-EVKB导入了igpio_led_output示例。如果编译此项目,将看到RT1050-EVKB上FlexRAM的默认配置如下:

SRAM_DTC:128 KB,SRAM_ITC:128 KB,SRAM_OC:256 KB

现在需要转到文件startup_mimxrt1052.c中的复位处理程序。重新分配FlexRAM必须在配置FlexRAM之前完成,这就是为什么要在复位处理程序中完成的原因。需要修改以重新分配FlexRAM的寄存器是IOMUX _GPR_GPR16和IOMUX _GPR _GPR17。

Register Address
IOMUXC_GPR_GPR16 0x400AC040
IOMUXC_GPR_GPR17 0x400AC044

需要确定如何重新分配FlexRAM,以查看需要加载到寄存器IOMUXC_GPR_GPR17中的值。如果希望具有以下配置:

SRAM_DTC 256 KB
SRAM_ITC 128 KB
SRAM_OC 128KB

以下对IOMUXC_GPR_GPR17寄存器的解释:

01c91946-8674-11ed-bfe3-dac502259ad0.png

需要加载到寄存器的值是0xAAAAFF55。其中,前4个存储块对应于128KB的SRAM_OC,接下来的4个存储块对应于128 KB的SRAM_ITC,最后8个存储块是256KB的SRAM-DTC。现在就可以开始在ResetISR处理程序中编写代码了。首先要做的是将新值加载到寄存器IOMUXC_GPR_GPR17中。之后,需要配置寄存器IOMUXC_GPR_GPR16,以指定FlexRAM存储体配置应取自寄存器IOMUX _GPR_GPR 17,而不是熔丝Fuse。然后,如果在FlexRAM的新配置中,SRAM_DTC或SRAM_ITC的大小为0,则需要禁用寄存器IOMUXC_GPR_GPR16中的这些存储器。代码如下所示:

void ResetISR(void) {

 // Disable interrupts
 __asm volatile ("cpsid i");

 /* Reallocating the FlexRAM */
 __asm (".syntax unified
"

 "LDR R0, =0x400ac044
"//Address of register IOMUXC_GPR_GPR17
 "LDR R1, =0xaaaaff55
"//FlexRAM configuration DTC = 265KB, ITC = 128KB, OC = 128KB
 "STR R1,[R0]
"

 "LDR R0,=0x400ac040
"//Address of register IOMUXC_GPR_GPR16
 "LDR R1,[R0]
"
 "ORR R1,R1,#4
"//The 4 corresponds to setting the FLEXRAM_BANK_CFG_SEL bit in register IOMUXC_GPR_GPR16
 "STR R1,[R0]
"

#ifdef FLEXRAM_ITCM_ZERO_SIZE
 "LDR R0,=0x400ac040
"//Address of register IOMUXC_GPR_GPR16
 "LDR R1,[R0]
"
 "AND R1,R1,#0xfffffffe
"//Disabling SRAM_ITC in register IOMUXC_GPR_GPR16
 "STR R1,[R0]
"
#endif

#ifdef FLEXRAM_DTCM_ZERO_SIZE
 "LDR R0,=0x400ac040
"//Address of register IOMUXC_GPR_GPR16
 "LDR R1,[R0]
"
 "AND R1,R1,#0xfffffffd
"//Disabling SRAM_DTC in register IOMUXC_GPR_GPR16
 "STR R1,[R0]
"
#endif

 ".syntax divided
");

#if defined (__USE_CMSIS)
// If __USE_CMSIS defined, then call CMSIS SystemInit code
 SystemInit();

01e240ba-8674-11ed-bfe3-dac502259ad0.png

如果编译项目,将看到控制台上显示的内存分布仍然是默认配置。这是因为修改了Reset处理程序以重新分配FlexRAM,但没有修改链接器文件以匹配这些新大小。为此,需要转到项目的属性。进入属性后,需要转到C/C++构建->MCU设置。一旦进入MCU设置,需要修改SRAM内存的大小以匹配新配置。

02039fbc-8674-11ed-bfe3-dac502259ad0.png

在进行这些更改后,如果编译项目,将看到控制台中显示的内存分布与现在新大小相匹配。

022491ea-8674-11ed-bfe3-dac502259ad0.png

需要修改内存保护单元(MPU)以匹配这些新的内存大小。为此,需要转到文件板中的函数BOARD_ConfigMPU.c。在该函数中,需要找到分别对应于SRAM_ITC、SRAM_DTC和SRAM_OC的区域5、6和7。与寄存器IOMUXC_GPR_GPR14相同,如果内存的新大小不是32、64、128、256或512,则需要选择下一个更大的数字。配置应如下所示:

/* Region 5 setting: Memory with Normal type, not shareable, outer/inner write back */
 MPU->RBAR = ARM_MPU_RBAR(5, 0x00000000U);
 MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 0, 1, 1, 0, ARM_MPU_REGION_SIZE_128KB);

 /* Region 6 setting: Memory with Normal type, not shareable, outer/inner write back */
 MPU->RBAR = ARM_MPU_RBAR(6, 0x20000000U);
 MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 0, 1, 1, 0, ARM_MPU_REGION_SIZE_256KB);

 /* Region 7 setting: Memory with Normal type, not shareable, outer/inner write back */
 MPU->RBAR = ARM_MPU_RBAR(7, 0x20200000U);
 MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 0, 1, 1, 0, ARM_MPU_REGION_SIZE_128KB);

02484bb2-8674-11ed-bfe3-dac502259ad0.png

最后,需要将堆栈放在DTCM内存的开头。为此,需要转到项目的属性。从那里,必须用C/C++构建和管理Linker脚本。

02720830-8674-11ed-bfe3-dac502259ad0.png

然后,需要在ResetISR函数中再添加两条汇编指令。我们必须在汇编代码的开头添加以下两条指令:

02c1f408-8674-11ed-bfe3-dac502259ad0.png

这些就是在启动期间重新分配FlexRAM所需的所有更改。

调试会话: 为了验证刚才所做的所有修改是否正确,将启动调试会话。一旦到达main,在运行应用程序之前,将转到外设视图查看寄存器IOMUX _GPR_GPR16和IOMUX _GPR _GPR17,并验证值是否正确。如下图所示,在寄存器IOMUXC_GPR_GPR16中,将FLEXRAM_BANK_CFG_SEL配置为1,以使用寄存器IOMUX _GPR_GPRS17配置FLEXRAM。

02dd2142-8674-11ed-bfe3-dac502259ad0.png

最后,在寄存器IOMUXC_GPR_GPR17中,我们可以看到对应于新配置的值0xAAAAFF55。

02fe3d8c-8674-11ed-bfe3-dac502259ad0.png

通过熔丝重新分配FlexRAM

上述操作是如何通过在复位处理程序中编写一些代码来通过软件重新分配FlexRAM。此过程工作正常,使用此方法测试可以配置不同大小RAM,但一旦找到应用程序的正确配置,建议通过熔丝配置这些新大小,而不是使用寄存器IOMUX _GPR_GPR17。在代码中重新配置FlexRAM有很多危险区域。这几乎都归结为这样一个事实:写入RAM的任何代码/数据/堆栈信息都可能在重新分配期间改变位置。这就是为什么一旦找到正确的配置,就应该通过熔丝进行应用。如果使用Fuse来配置FlexRAM,那么就不必担心代码和数据的移动,因为Fuse 设置被应用为硬件默认设置。记住,一旦烧了熔丝,就没有退路了!这就是为什么首先通过软件方法尝试配置很重要。烧完熔丝后,无需修改复位处理程序,只需修改MPU以更改我们之前看到的区域大小和项目的MCU设置,以匹配通过熔丝配置的新内存大小。

负责FlexRAM配置的熔丝为Default_FlexRAM_Part,此熔丝的地址为0x6D0[15:13]。可以在参考手册的Fusemap一章中找到有关此保险丝和不同配置的更多信息。要烧熔丝,建议使用blhost或MCUBootUtility。两个工具的下载链接如下:

https://www.nxp.com/webapp/sps/download/license.jsp?colCode=blhost_2.6.2&appType=file1&location=null&DOWNLOAD_ID=null

https://github.com/JayHeng/NXP-MCUBootUtility

ResetISR.c参考代码:

0315dfaa-8674-11ed-bfe3-dac502259ad0.png

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 寄存器
    +关注

    关注

    31

    文章

    5308

    浏览量

    119981
  • sram
    +关注

    关注

    6

    文章

    763

    浏览量

    114629
  • mcuxpresso
    +关注

    关注

    1

    文章

    38

    浏览量

    4153

原文标题:重新分配 FlexRAM

文章出处:【微信号:嵌入式 MCU,微信公众号:嵌入式 MCU】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    xilinx,ddrmig文件中管脚分配

    使用xilinx spartan6,在工程中使用原语生成DDR控制器mig文件,DDR数据管脚定义发生改变,需要重新分配管脚,求告知,这个管脚分配要怎么弄
    发表于 07-19 09:54

    6678工程如何分配存储器地址范围

    各位好!         之前使用ccs3.3创建2812的工程时,一般直接在TCF文件中手动的去重新分配存储器的地址范围,然后生成的cmd文件中也可以看到具体分配的结果。         目前
    发表于 06-25 06:54

    无法修改许可证以允许重新分配产品

    嗨,我正在尝试为独立计算机重新分配vivado许可证文件。当我进入许可网站时,修改按钮显示为灰色。我已经使用激活后来的html链接导航到网站,并通过标准的Web访问进入。请告诉我如何从旧的独立机器
    发表于 12-13 10:49

    Linux的磁盘空间重新分配方法

    在使用CentOS6.3版本linux系统的时候,发现根目录(/)的空间不是很充足,而其他目录空间有很大的空闲,所以本文主要是针对现在已有的空间进行调整。首先,先来查看一下系统的空间分配情况:
    发表于 07-22 08:44

    使用i.MX RT的FlexRAM的教程

    使用i.MX RT的FlexRAM
    发表于 12-12 07:36

    请问STM32MP1开机后可以分配外设吗?

    大家好,例如,我可以将 UART 分配给 Cortex M4 运行时上下文,并为 STM32MP1 生成适当的设备树文件,然后在启动后,以某种方式将 UART 重新分配给 Cortex A7 运行时上下文吗?
    发表于 02-07 09:08

    如何在实时边缘yocto项目中为监狱牢房重新分配资源?

    我想在实时边缘 yocto 项目中为监狱牢房重新分配资源(can1)。我使用修改后的文件 fsl-ok1028a-rdb-jailhouse.dtb、inmate-ls1028a-rdb.dtb
    发表于 03-28 08:26

    S32K314在CS自动控制的情况下,可以在运行程序时重新分配CS引脚吗?

    我正在使用 S32K314,在我的项目中我正在使用 QuadSPI。在我的 spi 闪存中,有两个芯片选择用于两个不同的内存组。我猜在示例项目中,CS 引脚由驱动程序代码控制。但我想将两个引脚分配为 CS 并手动控制。我该怎么做? 在 CS 自动控制的情况下,我可以在运行程序时
    发表于 04-26 07:36

    如何为MIMXRT1062重新分配FlexRAM

    我正在研究 MIMXRT1062。 SRAM_DTC 溢出“SRAM_DTC”。我尝试将 SRAM_DTC 加倍到 256KB 并相应地减少 SRAM_OC(如下)。之后,调试器停止工作。 我已经尝试过这种方式 - 链接 1. 如何为 MIMXRT1062 重新分配 Flex
    发表于 05-29 06:17

    stm32f4的堆栈怎么分配

    使用一些大型的库文件,要重新分配堆或者栈,那要怎么分配大小,总不可能一点点改变吧
    发表于 09-21 06:39

    电荷重新分配DAC,电荷重新分配DAC原理是什么?

    电荷重新分配DAC,电荷重新分配DAC原理是什么? DAC的发展经历了从电子管、晶体管到集成电路的发展过程,早期的DAC采用电子管组装而成。进入五
    发表于 03-24 13:38 1.1w次阅读

    沃达丰及其竞争对手正在向政府施压要求重新分配无线频谱

    WISPA NZ主席迈克·史密斯(Mike Smith)在一份声明中表示,“沃达丰及其竞争对手正在向政府施加巨大压力,要求他们重新分配无线频谱,以便他们能够更经济地运营5G”,但指出一些频谱已经被大约30家地区性无线互联网服务提供商使用,他们共同为数以万计的农村客户提供服务。
    发表于 08-06 10:55 772次阅读

    澳大利亚政府计划在2021年初对26GHz频段的频谱进行重新分配

    在澳大利亚通信和媒体管理局(ACMA)根据行业反馈制定了频谱计划后,通信、网络安全和艺术部长保罗·弗莱彻(Paul Fletcher)发布了一份针对26GHz频段频谱的重新分配声明。
    发表于 10-27 09:29 737次阅读

    FCC将重新分配大部分5.9GHz频段,为了非授权频谱技术和C-V2X

    据外媒报道,当地时间12月12日,美国联邦通信委员会(FCC)一致投票通过了一项提案,该提案将重新分配5.9GHz频段的大部分频谱,并将这些频谱专用于非授权频谱技术和C-V2X技术。
    的头像 发表于 12-13 15:48 3494次阅读

    i.MX RT的FlexRAM配置问题

    i.MX RT的FlexRAM配置问题
    的头像 发表于 10-24 15:46 777次阅读
    i.MX RT的<b class='flag-5'>FlexRAM</b>配置问题