查看: 772|回复: 2

[分享] i.MX RT的FlexRAM配置问题

[复制链接]
  • TA的每日心情
    开心
    2024-3-26 15:16
  • 签到天数: 266 天

    [LV.8]以坛为家I

    3298

    主题

    6545

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    32004
    最后登录
    2024-4-9
    发表于 2023-3-14 09:22:32 | 显示全部楼层 |阅读模式
    i.MX RT的FlexRAM配置问题


    本文以i.MX RT1050为例来做说明,其它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寄存器去配置,具体关系如下:
    11.png
    如果修改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.MX RT1050 默认的FlexRAM配置为:128KB ITCM、128KB DTCM和256KB的OCRAM。那么如果需要配置FlexRAM为:128KB ITCM、256KB DTCM和128KB的OCRAM,应该怎么做呢?

    从上面的表格,我们可以看出,可以将IOMUXC_GPR_GPR17配置为下表的黄色行数据:
    12.png
    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分区地址关系如下:
    13.png
    相关的寄存器配置如下:
    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配置
    14.png
    将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 内容为:
    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 Connect Script"
    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 and trapping"
    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 for 128KB OC RAM, 128KB I-TCM, 256KB D-TCM"
    30. 380 REM TCM CTRL Poke 0x400B0000 - to force RAM clocking and set wait states = b100
    31. 390 Poke32 this 0x400B0000 0x4
    32. 400 REM IOMUXC_GPR17 0x400AC044 - this sets bitfield allocation of FlexRAM 32KB banks to OC 256KB b01, I 128KB b11, D 128KB b10
    33. 410 Poke32 this 0x400AC044 0x5AAFFAA5
    34. 420 REM IOMUXC_GPR16 0x400AC040 - this sets 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 中添加这个脚本文件:
    15.png
    修改stack的起始位置
    将STACK的位置由end改为start,这样可以解决烧录之后,重新上电不运行的问题。
    16.png
    下面就可以编译代码,并且运行,测试结果如下:
    17.png
    可以发现,寄存器的FlexRAM情况确实是需要的配置情况,烧录之后,退出debug重新上电,可以发现led还是可以闪烁,说明功能已经正常工作。
    -----------------------------------------
    代码下载地址:点击下载





    签到签到
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2024-3-15 14:42
  • 签到天数: 87 天

    [LV.6]常住居民II

    2

    主题

    130

    帖子

    0

    高级会员

    Rank: 4

    积分
    608
    最后登录
    2024-4-18
    发表于 2023-3-14 13:47:34 | 显示全部楼层
    学习学习
    光而不耀,静水长流
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2024-3-27 10:12
  • 签到天数: 100 天

    [LV.6]常住居民II

    3

    主题

    1031

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1320
    最后登录
    2024-3-27
    发表于 2023-3-15 09:10:03 | 显示全部楼层

    学习学习
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2024-4-20 20:31 , Processed in 0.124450 second(s), 23 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

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