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.

[参考译文] 编译器/F28M35H52C:F28M35H52C:如何使用.cmd 文件分配外部 SDRAM 空间?

Guru**** 2538930 points
Other Parts Discussed in Thread: CONTROLSUITE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/833032/compiler-f28m35h52c-f28m35h52c-how-to-allocate-external-sdram-space-using-cmd-file

器件型号:F28M35H52C
Thread 中讨论的其他器件:controlSUITE

工具/软件:TI C/C++编译器

您好!

我已经制作了一个定制 PCB 板、其中包含 F28M35。 我需要更多的 RAM、因此我在设计中添加了一个64 MB 的外部 RAM。

我一直在使用这个外部 RAM、通过将数组的起始位置指向 EP_BASE_ADDRESS (0x6000 0000)来存储一些大数组、在 主函数中、我正在为 SD RAM 初始化 EPI 模块、这一切正常。

现在、我还想为一些全局和局部静态变量在外部 RAM 上分配空间、为此、我尝试将外部 RAM 添加到.cmd 文件中、并在 RAM 中分配不同的变量

===========================================================================================================================================

存储器

/*闪存中的起始地址(引导地址)*/
FLASH_boot (rwx):origin = 0x00200030、length = 0x0004

闪存(rwx):origin = 0x00200034,length = 0x0007FF9C

/*包括 C0-C1-C2-C3 SRAM */
C03SRAM (rwx):origin = 0x20000000,length = 0x8000

/*包括 S0-S1-S2 SRAM */
S02SHRAM (rwx):origin = 0x20008000,length = 0x6000

/*包括 S5-S6-S7 SRAM */
S57SHRAM (rwx):origin = 0x20012000,length = 0x6000

/*包括 C28至 M3 MSG SRAM
Shoudld 可用于将消息从 C28发送到 M3 */
CTOMMSGRAM (R):origin = 0x2007F000,length = 0x0800

/*包括 M3到 C28 MSG SRAM
应用于将消息从 M3发送到 C28 */
MTOCMSGRAM (RW):origin = 0x2007F800,length = 0x0800

/*外部 RAM 组*/
EXT_RAM_Bank_1:origin = 0x60000000、length = 0x00F42400
EXT_RAM_Bank_2:origin = 0x60F42400,length = 0x00F42400
EXT_RAM_Bank_3:origin = 0x61E84800,length = 0x00F42400
EXT_RAM_Bank_4:origin = 0x62DC6C00,length = 0x00F42400

部分

/*分配计划领域:*/
.text:> FLASH //代码
.cinit:>闪存
.pinit:> FLASH
binit:> FLASH
init_array:> FLASH

/*初始化段进入闪存*/
.const:> FLASH

/*分配未初始化的数据段:*/
.data :> S02SHRAM
.bss:> C03SRAM /*静态分配的变量。 全局变量是其中的一部分。 *
.sysmem:> C03SRAM
.stack:> S02SHRAM /*用于局部变量、函数参数和返回地址的空间*/
.cio:> C03SRAM
.neeardata :> C03SRAM
.rodata:> C03SRAM
.args:> C03SRAM

SDCardIO_mod:> EXT_RAM_Bank_1
GlobalVars_mod:> S57SHRAM

__STACK_TOP =__STACK + 256;

===========================================================================================================================================

一旦我这么做、我的代码就停止工作。

在读取某个位后、我必须知道我还必须在.gel 文件中定义外部 RAM 并在那里进行初始化、因为要在.cmd 文件中使用该 RAM、应该在执行 main 函数之前对其进行读取和初始化。

因此、我在.gel 文件中添加了地址:

===========================================================================================================================================

GEL_MapAddStr (0x60000000、0、0x04000000、"R|W|EX"、0);

===========================================================================================================================================

但是、我没有获得任何仅将其初始化为.gel 文件的参考。

请向我推荐一些参考文档、或者如何修改.gel 文件以初始化外部 RAM (EPI 模块)。?

谢谢

Shubham

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

    Shubham、

    请注意、默认情况下不启用 EPI 、 默认情况下不启用 EPI 的 GPIO 多路复用器。 您需要在加载代码之前初始化 EPI。 您可以在 GEL 文件中定义 EPI 使能函数、并调用该函数、然后加载代码并运行。 您可以参考 EPI 示例、了解如何初始化 EPI。

    此致、

    Vivek Singh

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

    您好、Vivek、

    感谢您的回答。

    这就是我到目前为止在主函数中用来在 main()中初始化 EPI 的内容。

    ------------------------------------------------------

    HWREG (SYSCTL_MWRALLOW)= 0xA5A5A5;
    /*启用 EPI 接口*/
    SysCtlPeripheralEnable (SYSCTL_Periph_EPI0);

    /* EPI 接口所需的使能引脚*/
    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOC);
    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOE);
    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOF);
    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOG);
    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOH);
    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOJ);

    /*初始化 GPIO 端口 C 引脚*/
    HWREG (GPIO_PORTC_BASE + GPIO_O_PCTL)= GPIO_PCTL_PC4_EPI0S2 |
    GPIO_PCTL_PC5_EPI0S3 |
    GPIO_PCTL_PC6_EPI0S4 |
    GPIO_PCTL_PC7_EPI0S5;
    GPIODirModeSet (GPIO_PORTC_BASE、
    (GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7)、
    GPIO_DIR_MODE_HW);
    GPIOPadConfigSet (GPIO_PORTC_BASE、
    (GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7)、
    GPIO_PIN_TYPE_STD_WPU);


    /*初始化 GPIO 端口 E 引脚*/
    HWREG (GPIO_Porte _BASE + GPIO_PCTL)= GPIO_PCTL_PE0_EPI0S8 |
    GPIO_PCTL_PE1_EPI0S9;
    GPIODirModeSet (GPIO_Porte _BASE、
    (GPIO_PIN_0 | GPIO_PIN_1)、
    GPIO_DIR_MODE_HW);
    GPIOPadConfigSet (GPIO_Porte _BASE、
    (GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3)、
    GPIO_PIN_TYPE_STD_WPU);

    /*初始化 GPIO 端口 F 引脚*/
    HWREG (GPIO_PORTF_BASE + GPIO_O_PCTL)= GPIO_PCTL_PF4_EPI0S12 |
    GPIO_PCTL_PF5_EPI0S15;
    GPIODirModeSet (GPIO_PORTF_BASE、
    (GPIO_PIN_4 | GPIO_PIN_5)、
    GPIO_DIR_MODE_HW);
    GPIOPadConfigSet (GPIO_PORTF_BASE、
    (GPIO_PIN_4 | GPIO_PIN_5)、
    GPIO_PIN_TYPE_STD_WPU);

    /*初始化 GPIO 端口 G 引脚*/
    HWREG (GPIO_PORTG_base + GPIO_PCTL)= GPIO_PCTL_PG0_EPI0S13 |
    GPIO_PCTL_PG1_EPI0S14 |
    GPIO_PCTL_PG7_EPI0S31;
    GPIODirModeSet (GPIO_PORTG_base、
    (GPIO_PIN_0 | GPIO_PIN_1)、
    GPIO_DIR_MODE_HW);
    GPIOPadConfigSet (GPIO_PORTG_base、
    (GPIO_PIN_0 | GPIO_PIN_1)、
    GPIO_PIN_TYPE_STD_WPU);
    GPIODirModeSet (GPIO_PORTG_base、
    GPIO_PIN_7、
    GPIO_DIR_MODE_HW);
    GPIOPadConfigSet (GPIO_PORTG_base、
    GPIO_PIN_7、
    GPIO_PIN_TYPE_STD_WPU);

    /*初始化 GPIO 端口 H 引脚*/
    HWREG (GPIO_Porth_BASE + GPIO_O_PCTL)= GPIO_PCTL_PH0_EPI0S6 |
    GPIO_PCTL_PH1_EPI0S7 |
    GPIO_PCTL_PH2_EPI0S1 |
    GPIO_PCTL_PH3_EPI0S0 |
    GPIO_PCTL_PH4_EPI0S10 |
    GPIO_PCTL_PH5_EPI0S11;
    GPIODirModeSet (GPIO_Porth_BASE、
    (GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 |
    GPIO_PIN_4 | GPIO_PIN_5)、
    GPIO_DIR_MODE_HW);
    GPIOPadConfigSet (GPIO_Porth_BASE、
    (GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 |
    GPIO_PIN_4 | GPIO_PIN_5)、
    GPIO_PIN_TYPE_STD_WPU);

    /*初始化 GPIO 端口 J 引脚*/
    HWREG (GPIO_PORTJ_BASE + GPIO_O_PCTL)= GPIO_PCTL_PJ0_EPI0S16 |
    GPIO_PCTL_PJ1_EPI0S17 |
    GPIO_PCTL_PJ2_EPI0S18 |
    GPIO_PCTL_PJ3_EPI0S19 |
    GPIO_PCTL_PJ4_EPI0S28 |
    GPIO_PCTL_PJ5_EPI0S29 |
    GPIO_PCTL_PJ6_EPI0S30;
    GPIODirModeSet (GPIO_PORTJ_BASE、
    (GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 |
    GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6)、
    GPIO_DIR_MODE_HW);
    GPIOPadConfigSet (GPIO_PORTJ_BASE、
    (GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 |
    GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6)、
    GPIO_PIN_TYPE_STD_WPU);

    /*将时钟分频器设置为1 (2分频)*/
    EPIDividerSet (EPI0_BASE、1);

    /*启用 SDRAM 模式*/
    EPIModeSet (EPI0_BASE、EPI_MODE_SDRAM);

    /*系统时钟频率介于50-100MHz 之间
    睡眠模式被禁用。
    刷新计数= 0x2EE (默认值)*/
    EPIConfigSDRAMSet (EPI0_BASE、(EPI_SDRAM_CORE_FREQ_50_100 |
    EP_SDRAM_FULL_POWER | EPI_SDRAM_SIZE _512Mbit)、750);

    /*外部 RAM 大小(设置正确的地址范围)为512 MB
    *宏显示256MB、但这是 TI 库的错误
    *外部 RAM 地址= 0x60000000 */
    EPIAddressMapSet (EPI0_BASE、(EPI_ADDR_RAM_SIZE = 256MB | EPI_ADDR_RAM_BASE_6));

    /*等待 EPI RAM 初始化序列*/
    while (HWREG (EPI0_BASE + EPI_O_STAT)& EPI_STAT_INITSEQ);

    ------------------------------------------------------

    但是、我认为我不能在.gel 文件中使用相同的函数、因为我正在使用一些函数、例如"EPIDividerSet"、"SysCtlPeripheralEnable"等。 而无法在.gel 文件中使用它们。

    是否有方法将头文件和源文件用于.gel 文件中??

    我使用的初始化代码来自以下示例:

    C:\ti\controlSUITE\device_support\f28m35x\v220\F28M35x_Examples_Master\EPI_SDRAM3\EPI_SDRAM.c

    我想你也是指同一个、或者告诉我是否有其他东西。

    谢谢

    Shubham

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

    Shubham、

    您可能无法在 GEL 文件中使用 TI 库中的函数。 您必须直接写入寄存器(如 pinmux 和 EMIF 配置)。

    此致、

    Vivek Singh