查看: 4907|回复: 8

[原创] 【经验分享】基于MCUXpresso RT1050 FlexRAM重新配置

[复制链接]

该用户从未签到

656

主题

6312

帖子

0

超级版主

Rank: 8Rank: 8

积分
19947
最后登录
2024-4-19
发表于 2020-3-4 15:56:05 | 显示全部楼层 |阅读模式
本帖最后由 小恩GG 于 2020-3-4 15:59 编辑

【经验分享】基于MCUXpresso RT1050 FlexRAM重新配置

一,文档说明
    RT1050一共有512KB内部FlexRAM,默认的情况是128KB ITCM, 128KBDTCM,256KBOCRAM。在实际的使用中,有些客户需要重新分配这个FlexRAM,来均衡自己应用所需要ITCM, DTCM以及OCRAM。通过官方应用笔记Using the i.MX RT FlexRAM:http://www.nxp.com/docs/en/application-note/AN12077.pdf
我们可以知道一些关于FlexRAM的知识以及配置的限制等。重新配置FlexRAM的分区情况,主要可以通过FUSE或者IOMUXC_GPR_GPR17寄存器情况去配置,具体关系如下:

1.jpg

如果修改fuse,那么以后就难以重新修改,因为fusebit只能从01,不能从10,所以,在实际的调试过程中,客户可以通过修改内部寄存器方式临时修改FlexRAM的分区情况。最近发现有部分网友在使用寄存器重新分区FlexRAM的过程中,出现了各种各样的问题,比如不能debugdebug问题解决之后,又出现debug可以运行,但是下载进去,重新复位代码不能起来的问题。所以本篇文章为了需要使用这个功能的网友使用,总结了在MCUXPressoIDE下具体的重新配置RT1050 FlexRAM ITCM, DTCM以及OCRAM大小的步骤, 其他RT芯片系列方法也是类似,只是具体的寄存器分区大小按照实际的芯片寄存器去配置。

二,FlexRAM配置分析

     RT1050 默认的FlexRAM为:128KB ITCM, 128KB DTCM, 256KBOCRAM。那么如果需要配置FlexRAM为:128KB ITCM, 256KBDTCM, 128KBOCRAM,应该怎么做呢?
从上面的表格,我们可以看出,可以将IOMUXC_GPR_GPR17配置为下表的黄色行数据:

2.jpg

IOMUXC_GPR_GPR17寄存器中:
   • 00b—bankis not used.
    • 01b—bank is configured forOCRAM.
    • 10b—bankis configured for DTCM.
    • 11b—bankis configured for ITCM.
RT1050一共512KB FlexRAM, 做16等分,一个bank 为512KB/16=32KB。

所以需要128KBITCM, 256KB DTCM, 128KB的OCRAM, 则:

ITCM: 4bank,共411b

DTCM:  8bank, 810b

OCRAM: 4个bank,401b

FlexRAM分区地址关系如下:

2-1.jpg

相关的寄存器有:
    IOMUXC_GPR->GPR17 =0x5AAFFAA5;
   IOMUXC_GPR->GPR16 |= 0x7;
IOMUXC_GPR->GPR14 = (9<<20) |(8<<16);
三,MCUXPressoIDE配置步骤

  下面在MIMXRT1050-EVKB开发板上以SDK led_blinky MCUXpresso工程为例,给出具体操作步骤。下载最新的SDK并且在MCUXpresso IDE中导入led_blinky工程。
3.1 修改MCU Settingsmemory

3.jpg
DTCM,ITCM, OCRAM改为实际需要的大小,点击apply


3.2 Reset代码里面添加FlexRAM的代码

   FLEXRAM->TCM_CTRL = 4;
   IOMUXC_GPR->GPR17 = 0x5AAFFAA5;
   IOMUXC_GPR->GPR16 |= 0x7;
    IOMUXC_GPR->GPR14=  (9<<20) | (8<<16) ;
4.jpg

3.3  IDE debug脚本.scp文件准备
RT1050_connect_128Kocram_128Kitcm_256Kdtcm.scp内容为:
  1. 100 REM===============================
  2. 110 REM RT1050_connect.scp
  3. 120 REM
  4. 130 REM Copyright 2019 NXP
  5. 140 REM All rights reserved.
  6. 150 REM===============================
  7. 160 print "RT1050 ConnectScript"
  8. 170 REM probelist
  9. 180 p% = probefirstfound
  10. 190 rem probeopenbyindex p%
  11. 200 wireswdconnect p%
  12. 210 selectprobecore p% 0
  13. 220 cminitapdp this
  14. 230 cmhalt this
  15. 235 goto 320
  16. 240 rem trap in bootrom
  17. 250 cmwatchset this 0 0x400F8004 RW
  18. 260 cmresetvectorcatchclear this
  19. 270 print "Resetting andtrapping"
  20. 280 cmsysresetreq this
  21. 290 print "Back from reset"
  22. 300 cmresetvectorcatchset this
  23. 310 cmwatchclear this 0
  24. 320 print "Disabling MPU"
  25. 330 s% = Peek32 this 0xE000ED94
  26. 340 s% = s% & 0xFFFFFFFE
  27. 350 Poke32 this 0xE000ED94 s%
  28. 360 REM ====== Configure FlexRAM======
  29. 370 print "Configure FlexRAM for128KB OC RAM, 128KB I-TCM, 256KB D-TCM"
  30. 380 REM TCM CTRL Poke 0x400B0000 - toforce RAM clocking and set wait states = b100
  31. 390 Poke32 this 0x400B0000 0x4
  32. 400 REM IOMUXC_GPR17 0x400AC044 - thissets bitfield allocation of FlexRAM 32KB banks to OC 256KB b01, I 128KB b11, D128KB b10
  33. 410 Poke32 this 0x400AC044 0x5AAFFAA5
  34. 420 REM IOMUXC_GPR16 0x400AC040 - thissets enables for I and DTCM and the source of the TCM config = 0x200007
  35. 430 Poke32 this 0x400AC040 0x200007
  36. 440 print "Finished"
  37. 450 REM===============================
  38. 460 end
复制代码

   RT1050_connect_128Kocram_128Kitcm_256Kdtcm.scp拷贝到IDE安装目录下:
C:\nxp\MCUXpressoIDE_11.1.0_3209\ide\binaries\Scripts
拷贝完之后,在debug configuration界面的script connect 中添加刚刚的脚本:

5.jpg

3.4  修改stack的起始位置

   STACK的位置由end改为start,这样可以解决烧录之后,重新上电不运行的问题。
6.jpg

下面就可以编译代码,并且运行,测试结果如下:
7.jpg

可以发现,寄存器的FlexRAM情况确实是需要的配置情况,烧录之后,退出debug重新上电,可以发现led还是可以闪烁,说明功能已经正常工作。

【经验分享】基于MCUXpresso RT1050 FlexRAM重新配置.pdf (637.3 KB, 下载次数: 77)
回复

使用道具 举报

该用户从未签到

10

主题

40

帖子

0

注册会员

Rank: 2

积分
147
最后登录
2023-7-27
发表于 2020-3-26 09:26:59 | 显示全部楼层
MPU也要同步修改
回复 支持 反对

使用道具 举报

该用户从未签到

656

主题

6312

帖子

0

超级版主

Rank: 8Rank: 8

积分
19947
最后登录
2024-4-19
 楼主| 发表于 2020-4-1 13:39:39 | 显示全部楼层
本帖最后由 小恩GG 于 2020-4-1 13:47 编辑

非常正确,如果使能了MPU,BOARD_ConfigMPU对应的RAM memory size也是要修改的。
感谢你的提醒,例程中是关掉了MPU,所以没有提到这点。
这里如果使能MPU的网友,务必注意修改如下对应代码的对应memory大小:
void BOARD_ConfigMPU(void)
    /* Region 4 setting: Memory with Normal type, not shareable, outer/inner write back */
    MPU->RBAR = ARM_MPU_RBAR(4, 0x00000000U);
    MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 0, 1, 1, 0, ARM_MPU_REGION_SIZE_128KB);
    /* Region 5 setting: Memory with Normal type, not shareable, outer/inner write back */
    MPU->RBAR = ARM_MPU_RBAR(5, 0x20000000U);
    MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 0, 1, 1, 0, ARM_MPU_REGION_SIZE_256KB);
    /* Region 6 setting: Memory with Normal type, not shareable, outer/inner write back */
    MPU->RBAR = ARM_MPU_RBAR(6, 0x20200000U);
    MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 0, 1, 1, 0, ARM_MPU_REGION_SIZE_128KB);


回复 支持 反对

使用道具 举报

  • TA的每日心情
    擦汗
    2020-1-10 11:05
  • 签到天数: 13 天

    [LV.3]偶尔看看II

    13

    主题

    49

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    382
    最后登录
    2020-11-12
    发表于 2020-4-2 11:41:54 | 显示全部楼层
    小恩GG 发表于 2020-4-1 13:39
    非常正确,如果使能了MPU,BOARD_ConfigMPU对应的RAM memory size也是要修改的。
    感谢你的提醒,例程中是 ...

    您好这边有个疑问:
    如果这边配置成OCRAM/DTCM/ITCM  = 64/448/0
    GPR14中 DTCM大小应该怎么设置?   相应的如下该怎么设置?
    MPU->RBAR = ARM_MPU_RBAR(5, 0x20000000U);
        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, 0x20200000U);
        MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 0, 1, 1, 0, ARM_MPU_REGION_SIZE_512KB);

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





    哈哈哈哈哈哈哈啊哈哈哈
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    656

    主题

    6312

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    19947
    最后登录
    2024-4-19
     楼主| 发表于 2020-4-2 15:37:57 | 显示全部楼层
    meteorego 发表于 2020-4-2 11:41
    您好这边有个疑问:
    如果这边配置成OCRAM/DTCM/ITCM  = 64/448/0
    GPR14中 DTCM大小应该怎么设置?   相应 ...

    你好,有看到代码最右边ARM_MPU_REGION_SIZE_128KB,这些吗?这些就是你对应的RAM的空间大小。
    那么如果你改变之后,对应的就改成你的大小好了。
    注意 0x20000000U开始是DTCM, 0X00000000开始是ITCM, 0X20002000开始是DTCM。
    当然,我建议你看下我们的应用笔记,不是所有的表格里的分区都能支持哦,要是2的幂数倍。
    AN12077
    http://www.nxp.com/docs/en/application-note/AN12077.pdf
    The Arm Cortex-M7 specifications require the size of ITCM/DTCM to be a power-of-two number, which can conflict with the FlexRAM configuration capability (see configurations 7, 10, 11 in Table 1). Avoid access to the empty RAM space configured by the corresponding FlexRAM configuration or use the recommended way, which defines the size of the TCM as a power-of-two number and reflect that by writing into the appropriate field in IOMUXC_GPR_GPR14->CM7_CFGxTCMSZ (it will update the CM7_xTCMCR accordingly).

    If the requested ITCM/DTCM size is 0 Bytes, disable the corresponding TCM in IOMUXC_GPR_GPR16->INIT_xTCM_EN before configuring the size to 0 Bytes in IOMUXC_GPR_GPR14->CM7_CFGxTCMSZ.
    所以说,你这个448不是2的指数,是不能这么配置的。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    0

    主题

    2

    帖子

    0

    新手上路

    Rank: 1

    积分
    19
    最后登录
    2020-6-30
    发表于 2020-5-22 13:06:42 | 显示全部楼层
    本帖最后由 honami520 于 2020-5-22 15:56 编辑

    楼主不用MDK吗?用的话,方不方便出个MDK的教程。
    后记:
    我自己已经搞定了,就是参考了楼主的方法。我的代码超过了128KB,无法在ITCM里面debug,所以我的目的是把ITCM修改为256KB。
    1、MPU初始化的地方需要修改大小
    2、分散加载文件里面的大小需要修改
    3、我直接在system_init的最开始的地方,加入了楼主的那4段代码,GPR17 16 14。
    4、在mdk debug initialization file里面,在LOAD %L INCREMENTAL这句执行的前面,增加了一个函数,这个函数的意义就是步骤3的内容。

    如果不做步骤4,程序在DEBUG下无法调试,但是竟然可以运行,就是什么都看不到。做了步骤4后目前DEBUG一切正常。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    656

    主题

    6312

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    19947
    最后登录
    2024-4-19
     楼主| 发表于 2020-6-30 19:23:52 | 显示全部楼层
    honami520 发表于 2020-5-22 13:06
    楼主不用MDK吗?用的话,方不方便出个MDK的教程。
    后记:
    我自己已经搞定了,就是参考了楼主的方法。我的代 ...

    感谢你的经验分享!如果可以,建议你把修改的MDK工程也放出来,便于后续有需要的网友。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2019-11-19 11:08
  • 签到天数: 1 天

    [LV.1]初来乍到

    0

    主题

    16

    帖子

    0

    注册会员

    Rank: 2

    积分
    96
    最后登录
    2022-1-10
    发表于 2020-11-6 11:02:28 | 显示全部楼层
    感谢分享,学习
    good good study,day day up
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    3

    主题

    8

    帖子

    0

    注册会员

    Rank: 2

    积分
    60
    最后登录
    2023-8-10
    发表于 2023-8-8 11:04:16 | 显示全部楼层
    RT1050 RM 手册里根本找不到找 INT_xTCM_EN,CM7_CFGxTCMSZ 的定义
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-4-20 19:06 , Processed in 0.166105 second(s), 36 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表