本文以i.MXRT1050为例来做说明,其它i.MX RT10xx系列在FlexRAM的使用上是一样的,只是容量大小有差别。
一、文档说明
i.MX RT1050一共有512KB内部FlexRAM,默认的情况是128KB ITCM,128KB DTCM,256KB的OCRAM。在实际的使用中,有些客户需要重新分配各个存储区的大小,来均衡自己应用所需要的ITCM, DTCM以及OCRAM容量。
通过官方应用笔记Using the i.MX RT FlexRAM,我们可以知道一些关于FlexRAM的知识以及配置的限制等。
重新配置FlexRAM的分区情况,主要可以通过FUSE或者IOMUXC_GPR_GPR17寄存器去配置,具体关系如下:
如果修改fuse,那么以后就难以重新修改,因为fuse的位只能从0到1,不能从1到0,所以,在实际的调试过程中,可以通过修改内部寄存器方式临时修改FlexRAM的分区配置。
最近发现有部分网友在使用寄存器重新分区FlexRAM的过程中,出现了各种各样的问题,比如不能debug,debug问题解决之后,又出现debug可以运行,但是下载进去,重新复位代码不能起来的问题。
本篇文章针对需要配置FlexRAM功能的网友,总结了在MCUXPresso IDE下具体的重新配置i.MX RT1050 FlexRAM ITCM、DTCM以及OCRAM大小的步骤, 其他i.MX RT芯片系列方法也是类似,只是具体的寄存器分区大小,按照实际的芯片寄存器去配置。
二、FlexRAM配置分析
i.MXRT1050 默认的FlexRAM配置为:128KB ITCM、128KB DTCM和256KB的OCRAM。那么如果需要配置FlexRAM为:128KB ITCM、256KB DTCM和128KB的OCRAM,应该怎么做呢?
从上面的表格,我们可以看出,可以将IOMUXC_GPR_GPR17配置为下表的黄色行数据:
IOMUXC_GPR_GPR17寄存器中每2位表示一个Bank,定义如下:
00b—bank is not used.
01b—bank is configured for OCRAM.
10b—bank is configured for DTCM.
11b—bank is configured for ITCM.
i.MX RT1050共有512KB FlexRAM, 做16等分,则每个bank 为512KB/16=32KB。
所以需要128KB ITCM, 256KB DTCM, 128KB的OCRAM时,分配如下:
ITCM:4个bank,共4个11b
DTCM: 8个bank, 共8个10b
OCRAM: 4个bank, 共4个01b
FlexRAM分区地址关系如下:
相关的寄存器配置如下: IOMUXC_GPR->GPR17 = 0x5AAFFAA5; IOMUXC_GPR->GPR16 |= 0x7; IOMUXC_GPR->GPR14 = (9<<20) | (8<<16);
三、MCUXPresso IDE的配置步骤
下面在MIMXRT1050-EVKB开发板上以SDK 的led_blinky MCUXpresso工程为例,给出具体操作步骤。
首先下载最新的SDK并且在MCUXpresso IDE中导入led_blinky工程。
修改MCU Settings的memory配置
将DTCM, ITCM, OCRAM改为实际需要的大小后,点击apply。
在startup文件里的Reset代码部分添加FlexRAM的代码:
FLEXRAM->TCM_CTRL = 4;
IOMUXC_GPR->GPR17 = 0x5AAFFAA5;
IOMUXC_GPR->GPR16 |= 0x7;
IOMUXC_GPR->GPR14 = (9<<20) | (8<<16) ;
准备IDE的调试脚本.scp文件
RT1050_connect_128Kocram_128Kitcm_256Kdtcm.scp 内容为:
100REM=============================== 110REMRT1050_connect.scp 120REM 130REMCopyright2019NXP 140REMAllrightsreserved. 150REM=============================== 160print"RT1050ConnectScript" 170REMprobelist 180p%=probefirstfound 190remprobeopenbyindexp% 200wireswdconnectp% 210selectprobecorep%0 220cminitapdpthis 230cmhaltthis 235goto320 240remtrapinbootrom 250cmwatchsetthis00x400F8004RW 260cmresetvectorcatchclearthis 270print"Resettingandtrapping" 280cmsysresetreqthis 290print"Backfromreset" 300cmresetvectorcatchsetthis 310cmwatchclearthis0 320print"DisablingMPU" 330s%=Peek32this0xE000ED94 340s%=s% 0xFFFFFFFE 350Poke32this0xE000ED94s% 360REM======ConfigureFlexRAM====== 370print"ConfigureFlexRAMfor128KBOCRAM,128KBI-TCM,256KBD-TCM" 380REMTCMCTRLPoke0x400B0000-toforceRAMclockingandsetwaitstates=b100 390Poke32this0x400B00000x4 400REMIOMUXC_GPR170x400AC044-thissetsbitfieldallocationofFlexRAM32KBbankstoOC256KBb01,I128KBb11,D128KBb10 410Poke32this0x400AC0440x5AAFFAA5 420REMIOMUXC_GPR160x400AC040-thissetsenablesforIandDTCMandthesourceoftheTCMconfig=0x200007 430Poke32this0x400AC0400x200007 440print"Finished" 450REM=============================== 460end
将这个超长文件名的文件,RT1050_connect_128Kocram_128Kitcm_256Kdtcm.scp拷贝到IDE安装目录下:
C:nxpMCUXpressoIDE_11.1.0_3209idebinariesScripts
拷贝完之后,在debug configuration界面的script connect 中添加这个脚本文件:
修改stack的起始位置
将STACK的位置由end改为start,这样可以解决烧录之后,重新上电不运行的问题。
下面就可以编译代码,并且运行,测试结果如下:
可以发现,寄存器的FlexRAM情况确实是需要的配置情况,烧录之后,退出debug重新上电,可以发现led还是可以闪烁,说明功能已经正常工作。
本文最初发表在“恩智浦中文社区”,可以在原帖那里下载到代码。
来源:恩智浦MCU加油站
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理
审核编辑 黄宇
-
寄存器
+关注
关注
31文章
5334浏览量
120217 -
i.MX
+关注
关注
1文章
47浏览量
35602
发布评论请先 登录
相关推荐
评论