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.

[参考译文] CCS/TM4C1294NCPDT:具有外部 RAM 的 TM4C1294 RAM 扩展

Guru**** 2609955 points
Other Parts Discussed in Thread: TM4C1294NCPDT, TIDM-TM4C129XSDRAM

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/764100/ccs-tm4c1294ncpdt-tm4c1294-ram-extension-with-external-ram

主题中讨论的其他器件:TM4C1294NCPDTTIDM-TM4C129XSDRAM

ART 编号:TM4C1294NCPDT

工具/软件:Code Composer Studio

您好!

我将 TM4C1294微控制器用于物联网应用。 我一直面临着 RAM 使用方面的一些问题、并计划使用外部 RAM 来获得更多可用 RAM。

我一直在阅读下面的示例 ti.com/tool/TIDM-TM4C129XSDRAM 、它似乎非常直接地满足了硬件要求、但我仍然对使用外部 RAM 进行固件开发有一些疑问。

我的问题更多地涉及链接器以及如何使用外部和内部 RAM 处理我的代码。 在前面的示例中、作者使用以下行来确保他正在访问外部 RAM:

G_pu16EPISdram =(uint16_t *) 0x60000000; 

他的链接器也是默认值、因此我假设在代码上分配变量时、此类变量永远不会使用外部 RAM、对吧?

#define APP_BASE 0x00000000
#define RAM_BASE 0x20000000

//系统存储器映射*/

存储
器{
/*存储在内部闪存中并从内部闪存执行的应用程序*/
闪存(RX):origin = APP_BASE,length = 0x00100000
/*应用程序使用内部 RAM 进行数据*/
SRAM (rwx):origin = 0x20000000,length = 0x00040000
}//

内存

中的段分配*/ SECTIONS
{
.intvecs:> app_base
.text:> FLASH
.const:> FLASH
.cinit:>闪存
.pinit:> FLASH
init_array:> FLASH

.vtable:> RAM_base
.data :> SRAM
.bss:> SRAM
.sysmem:> SRAM
.stack:> SRAM
}

__stack_top =__stack + 256; 

那么、我的问题是:是否可以将外部和内部 RAM 用作一个线性存储器组? 我能否像使用内部 RAM 一样进行编程? 需要对该示例进行哪些修改才能执行此操作?

我打算将其与 TI-RTOS 结合使用、这会改变答案还是仍然一样?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    如果您希望在一个连续存储器映射中要求内部 RAM 和外部 RAM、则不可能这样做。 根据设计、外部存储器将映射到0x60000000、而内部 RAM 将映射到0x20000000。 从 CPU 存储器映射的角度来看、两者之间存在差距。 正确配置 EPI (外部外设接口)模块后、您可以访问0x6000000处的外部存储器、就像对内部存储器进行读/写操作一样。 下面是一段代码。 有关完整示例、请参阅中的 SDRAM.c 示例 /examples/peripherals/epi/sdram.c.


    //
    //
    //上64MB SDRAM 芯片(32Meg x 16位)的起始地址和结束地址
    // SDRAM 子板。
    //
    //
    #define SDRAM_START_ADDRESS 0x00000000
    #define SDRAM_END_ADDRESS 0x01FFFFFF

    //
    //将 EPI 存储器指针设置为 EPI 存储器空间的底座。 请注意
    // g_pui16EPISdram 被声明为易失性,因此编译器不应
    //优化内存的读出。 使用该指针、即存储器空间
    //像简单数组一样访问。
    //
    G_pu16EPISdram =(uint16_t *) 0x60000000;

    //
    //写入 SDRAM 卡的前2个地址和后2个地址。 自以来
    // SDRAM 卡可以按字寻址,我们将写入字。
    //
    G_pu16EPISdram[SDRAM_START_ADDRESS]= 0xabcd;
    G_pu16EPISdram[SDRAM_START_ADDRESS + 1]= 0x1234;
    G_pu16EPISdram[SDRAM_END_ADDRESS - 1]= 0xdcba;
    G_pu16EPISdram[SDRAM_END_ADDRESS]= 0x4321;
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Charles、

    我知道外部 RAM 将从地址 0x60000000开始、以及如何明确要求微控制器从这些地址进行读取和写入。 我想知道是否可以使我的代码的其余部分保持透明。 由于我已经有几千行代码以及几个.c 和.h 文件、因此我需要做大量工作并考虑哪个变量将进入哪个内存。

    当我将 MSP430与 FRAM 搭配使用时、这将通过在变量声明之前写入一个#pragma 来完成、以便在 FRAM 上分配特定的区域而不是普通 RAM。 我假设 FRAM 存储器区域事先已在链接器上声明。

    同样、您提到的示例显示了如何指向外部 RAM 上的特定地址、这一点我很清楚。 不是如何使用外部 RAM、而是在我将来对已经测试的工作代码进行代码或代码返工时将遇到的麻烦降至最低。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Daniolip、
    您是指#pragma DATA_SECTION (符号、"段名")吗? 您可以在此处的编译器用户指南中找到此 pragma 及其用法的详细信息。 www.ti.com/.../spnu151r.pdf。请注意、在读取/写入外部存储器之前、您仍需要根据要连接的外部器件类型配置 EPI 模块。