This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] RM48L930:Hercules SDK SDRAM 不工作

Guru**** 2482225 points
Other Parts Discussed in Thread: HALCOGEN, RM48L952

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/722705/rm48l930-hercules-sdk-sdram-not-working

器件型号:RM48L930

支持路径:/Product/Help、带器件选择/

您好!

我正在尝试在 Hercules HDK 板上启用8MB 的 SDRAM。  HDK 电路板包含一个 ISSI IS42S16400 SDRAM (1 MBit x 16 x 4组)。  我已经阅读过几篇类似的旧文章、并尝试了以下仍然无法正常工作的设置:

在 Halcogen 的 PINMUX 选项卡中、我检查了 ENABLE_EMIF_CLK 输出

2.在 Halcogen EMIF 选项卡中、启用 EMIF_SDRAM。  我还取消选中了 EMIF 的"Apponi选1-3 "框。

3.在 Halcogen EMIF SDRAM 选项卡中,我设置以下内容:

            t (RC)= 64;  t (rp)= 21;  t (RCD)= 21; t (wr)= 11;  t (RAS)= 43;   t (RC)= 64; t (RRD)= 15; t (xsr)= 71;  刷新周期= 60; 刷新周期= 4096; CAS 延迟= 3;  组= 4;  

           pagesize = 256;  SDRAM 初始化时间= 200

我 的 CPU 运行速度慢、为40 MHz。  (HCLK = GCLK = VCLK1 = VCLK2 = VCLK3 = 40MHz)

5.我在运行 GPREG1时验证了位31 = 1

6. 在 Halcogen R4-MPU-PMU 选项卡中、区域6在 SDRAM 基地址0x8000000处启用、大小= 8 MB。  type = far_order_sharable、Permission = PRIV_RW_USER_RW_EXEC

我的代码正在闪存中运行、并使用0x0800_0000处的片上 RAM。  作为测试,在调试器中,我停止执行并打开一个内存窗口,地址为0x80000000,但看到所有的???????????????? 。  我无法在 SDRAM 地址处设置或修改存储器。  

请注意、之前我尝试编辑 sys_link.cmd 文件并在地址0x8000000000处添加了 SDRAM (RW)内存定义、长度为0x800000、然后指向.sysmem 段以使用 SDRAM。  但是、当我的代码尝试对内存进行 malloc 时、我得到了数据中止。  因此、我恢复了该更改、并尝试在0x8000000位置的调试器中进行透视和插入存储器。  (哪个显示为"问号"指示的不存在内存(?????????????)

您能不能建议在 Hercules RM48 HDK 电路板上使用 SDRAM 需要什么?

谢谢、

Keith

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    我的 Hercules HDK 板 SDRAM 仍然无法正常工作。  我使用示波器来验证 SDRAM 时钟信号是否存在、其频率为预期的40MHz。  

    TI 是否有人可以帮助我解决这个问题?

    谢谢、

    Keith

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Keith、

    您使用的是哪个 CCS 版本? 为调试器定义的存储器配置似乎存在问题。 您能否检查为(RM48L930)定义代码项目的器件默认加载的.gel 文件?

    至于配置 SDRAM 时的中止、您能否在 CPU 的 MPU 设置中检查该 SDRAM 区域是否配置为可读/可写?

    此致、
    Sunil
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Sunil、

    我使用的是 CCS v7.4。   在 HalcogGen 中、区域6被启用、如下所示。  我不熟悉.gel 文件、它的用途是什么、我在哪里查找它?

    谢谢、

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Keith、

    C:\ti\ccsv8\ccs_base\emulation\gel 文件夹下有一个名为 rm48l930.gel 的文件。 这具有调试器在为 RM48L930器件定义 CCS 工程时使用的内存映射。

    它如下所示:
    GEL_MapAdd (0x60000000、0、0x10000000、1、1); /*外部异步存储器 *
    GEL_MapAdd (0x80000000、0、0x08000000、1、1); /*外部同步 SDRAM 内存 *

    您能否确认在与 CCS v7.4一同使用的.gel 文件中是否有这些行?

    此致、
    Sunil
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    是的,这些行出现在 rm48l952.gel 文件的 memmap()函数中,如下所示。  我还附加了 targetConfig 设置的屏幕截图。

    /*------------------ *

    /*函数- memmap (memSel、extMem)                      *

    /*                                       *

    memmap (memSel、extMem){

      GEL_MapOff ();

      GEL_MapReset();

      /*闪存/RAM 定义*/

      if (memSel ==闪存){

        /*闪存定义*/

        GEL_MapAdd (0x00000000、0、0x00300000、1、0); /*内部闪存()  */

        GEL_MapAddStr (0xF0400000、0、0x00060000、"R|AS2"、0); /*内部闪存 ECC  */     

        GEL_MapAdd (0x08000000、0、0x00040000、1、1); /*内部 RAM      *

        GEL_MapAdd (0x08400000、0、0x00040000、1、1); /*内部 RAM ECC   */

        GEL_MapAdd (0x20000000、0、0x00300000、1、0); /*镜像闪存    */     

        GEL_MapAdd (0xFE000000、0、0x01000000、1、1); /* CRC/PSA        *

      }

      if (memSel == RAM){

        /* RAM 定义*/

        GEL_MapAdd (0x00000000、0、0x00040000、1、1); /*内部 RAM      *

        GEL_MapAdd (0x00400000、0、0x00040000、1、1); /*内部 RAM ECC   */

        GEL_MapAdd (0x08000000、0、0x00300000、1、0); /*内部闪存()  */

        GEL_MapAddStr (0xF0400000、0、0x00060000、"R|AS2"、0); /*内部闪存 ECC  */     

        GEL_MapAdd (0x20000000、0、0x00300000、1、0); /*镜像闪存    */     

        GEL_MapAdd (0xFE000000、0、0x01000000、1、1); /* CRC/PSA        *

      }

      if (extMem =EMIF){

        GEL_MapAdd (0x60000000、0、0x10000000、1、1); /*外部异步存储器   */

        GEL_MapAdd (0x80000000、0、0x08000000、1、1); /*外部同步 SDRAM 内存   */

      }

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Sunil、

    您能否为 Hercules RM48 HDK 电路板向我发送一个启用了 SDRAM 并能正常工作的工作项目?  (包括 Halcogen 配置?)  我以40MHz 的频率运行所有时钟以节省功耗、因此 VCLK3 (=SDRAM 时钟)= 40MHz。

    在 Halcogen 中、您能否检查我的 EMIF SDRAM 设置的40MHz SDRAM 时钟?   它们是:

        TRC = 63

        TRP = 20

        tRCD = 20

        TWR = 50nS (= 2个时钟周期)

        TRAAS = 42

        TRC = 63

        TRrd = 14

        Txsr = 70

        刷新周期= 64ms

        刷新周期= 4096

        CAS 延迟= 3

        组= 4

        pagesize = 256

        SDRAM 初始化时间= 200us

     

    谢谢、

    Keith

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    TI 是否有更多帮助帮助帮助让 SDRAM 在 Hercules HDK 电路板上工作?    我的项目在 SDRAM 工作前一直处于保持状态。

    谢谢、

    Keith

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    e2e.ti.com/.../7824.RM48-HDK-SDRAM-Test.zip

    Keith、

    我要附加一个压缩文件、其中包含一个在 HDK 上测试 SDRAM 的 CCS 工程。 您可以将其用作代码的参考。

    此致、

    Sunil

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢 Sunil。 我构建了您的项目、SDRAM 在电路板上工作。  但您的项目包含 HalCoGen 未生成的文件。  例如,它包含 EMIF.h、EMIF_config.c 和 EMIF_config.h,并且 main()调用 EMIF_init()。   

    我将合并这些文件并测试结果。  但是、您能否提供一个启用了 SDRAM 的项目、其中 BSP (和 EMIF 代码)是由 HalCoGen 创建的?

    谢谢、

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Keith、

    emif.h 只包含 EMIF 的控制和状态寄存器。 这由 HALCoGen 生成。

    EMIF_config.c 和 emif_config.h 是包含测试程序中使用的 C 函数定义和声明的附加文件。 这些文件可以由应用程序替换、甚至可以作为 sys_main.c 文件的一部分包含。 您可以看到 main()例程除了调用 EMIF 测试例程之外什么也不做。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Sunil、
    我将裸机项目中的 EMIF_config.c 和.h 文件合并到基于 FreeRTOS 的应用程序中,并将 system.c 中对 EMIF_SDRAM_StartupInit()的调用替换为对 emifInit()的调用。 在 FreeRTOS 调用 vTaskStartScheduler()之前,SDRAM 现在正在主程序内工作。 在 xPortStartScheduler()中,FreeRTOS 使能 MPU,当发生这种情况时,映射到位置0x8000000的 SDRAM 将失效,对该区域的进一步访问将导致数据中止。

    根据此链接:
    e2e.ti.com/.../660420

    我在 prvSetupDefaultMPU()中添加了此调用:
    prvMpuSetRegion (portFIRST_configurable_region、0x8000000、portMPU_size_8MB | portMPU_region_enable、portMPU_PRIV_RW_USER_RO_EXEC | portMPU_STRONGLYORDERED_sharedable);

    但在 xPortStartScheduler()结束时,代码调用 vPortStartFirstTask(),MPU 设置丢失,进一步的 SDRAM 访问将导致数据中止。 下面是 vPortStartFirstTask 的 asm 代码、您能告诉我需要什么、以便 portRESTORE_CONTEXT 不会丢失 MPU SDRAM 区域设置吗?

    ;恢复第一个任务的上下文。
    .def vPortStartFirstTask
    .asmfunc vPortStartFirstTask
    CPS #0x13
    portRESTORE_CONTEXT
    endasmfunc


    谢谢、
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Keith、

    定义为 portFIRST_configurable_region 的区编号最初可能被 HALCoGen 映射到其他存储器区。 最好按照您引用的示例中的操作为 SDRAM 明确定义一个区域(将该区域编号与 HALCoGen 代码生成的编号相匹配):

    prvMpuSetRegion (portPRIVILEGED_SDRAM_REGION、0x8000000、portMPU_SIZE _32MB | portMPU_REGION_ENABLE、portMPU_PRIV_RW_USER_RO_EXEC | portMPU_STRONGORDERLYED_sharedable);

    请查看此应用手册以了解更多详细信息:
    www.ti.com/.../spna177.pdf

    pdf 文档甚至包含一个用于下载演示 CCS 项目的链接、该链接解释了详细信息。

    此致、
    Sunil

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Sunil、
    在我的 HalCoGen 设置中、第6个 MPU 区(区6)是 SDRAM、其位置为0x80000000、大小= 8 MB。 对应于 portFIRST_configurable_region = 5。 因此我的设置应该是可以的。 还有其他想法吗? HalCoGen 有一个让我禁用 MPU 的开关、但是我想如果我禁用它的话、我必须修改 portasm.asm 和 port.c 中的很多代码。 有什么想法?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Keith、

    有关使用 FreeRTOS 进行外部存储器访问的信息、请参阅此帖子。 这篇文章还提供了指向 FreeRTOS 中说明 MPU 用法的注释的链接。

    e2e.ti.com/.../323853

    此致、
    Sunil
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢 Sunil、他非常乐于助人!

    此致、

    Keith