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.

[参考译文] MSP432E401Y:如何从外部 SDRAM 执行代码。

Guru**** 2529560 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1268911/msp432e401y-how-to-execute-code-from-external-sdram

器件型号:MSP432E401Y

亲爱的蔡杏娟:

我希望这条消息能让您满意。 我在此报告一个 MSP432微控制器单元的问题、该问题与从外部 SDRAM 启动地址0x60000000特别相关。

根据您的建议、我已下载 www.ti.com/.../TIDM-TM4C129SDRAMNVM 软件配套资料、并通过 ektm4c129_qssi_bootloader 代码和 ektm4c129_qssi_boot_deme1应用代码下载 gone. 因此、我创建了简单的 hello world (UART Print)应用程序、并根据 ektm4c129_qssi_boot_deme1应用程序代码修改了链接器脚本。


在引导加载程序中、代码初始化 SDRAM、通过 Xmodem 接收应用程序.bin 文件、然后将其写入 SDRAM 中。 暂时我不使用 Qssi 闪存、我将通过 SDRAM 接收应用程序、并将数据直接写入 SDRAM。 我在从 SDRAM 中读取数据后验证了应用程序 bin 文件数据。因此、我确认是否将数据正确写入 SDRAM、但无法在 SDRAM 上运行。下面我附加了应用程序链接器脚本和入口点代码供您参考。

应用程序链接器脚本

SDRAM 起始地址= 0x60000000

下面我将分享链接器脚本文件和图像供您参考。

hello world 项目的链接器脚本文件

CRC table 运算符无法与空输出段关联*/
--diag_suppress=10199

--retain=interruptVectors
#define APP_BASE 0x60000000
#define RAM_BASE 0x60100000

/*系统内存映射*/

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

/*内存中的段分配*/

部分
{
.intvecs:> app_base
.text :>闪存
.const :>闪存
cinit :>闪存
请输入您的密码:> FLASH
init_array:> FLASH

.vtable:> RAM_BASE
.data :> SRAM
bss :> SRAM
.sysmem:> SRAM
.stack:> SRAM

__STACK_TOP =_STACK + 256;


在 main.c 中、我将调用应用起点

静态空(*appEntry)();

uint32 entryPiont;

entryPiont = 0x60000000;


appEntry =(void (*)(void)) entryPiont;

(* appEntry)();

期望的解决方案:

               写入 SDRAM 之后、必须从 SDRAM 进行引导、我必须修改这些内容。 最初我不使用 QSSI 闪存、我通过 Xmodem 接收 bin 文件后、现在尝试将其写入 SDRAM、然后在上面运行。

请求帮助:我们正在寻求您的专业知识和支持、以确定该引导问题的原因并寻找合适的解决方案、从而确保 MSP432 MCU 根据预期从正确的 SDRAM 地址(0x60000000)引导。

感谢您花时间关注此事。 我们期待您的及时响应。

注:很抱歉响应出现延迟、因为我集中在其他待处理任务上。 请告知我们应采取的任何具体步骤来诊断和纠正问题。 非常感谢您为解决此问题提供指导。

如果您可以安排通话、这将非常有助于解决问题、我们可以继续前进。

此致、

j. 马尼坎达萨米

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

    您好、TI 团队、

    正在等待答复。

    此致、

    摩尼

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

    尊敬的  Mani:

    Unknown 说:
    我从 SDRAM.A 读取数据后验证了应用程序 bin 文件数据。因此我确认将数据正确写入 SDRAM

    好的。 假设您以某种方式成功地将应用程序固件写入 SDRAM 中、并且可以读回写入的内容、那么就像 EPI 引脚多路复用和 SDRAM 时序初始化一样、证明初始化已正确完成。 这是正确的理解吗? 基本而言、您可以对 SDRAM 进行读取和写入。 是您不能在 SDRAM 之外运行代码。  

    下面我将附加应用链接器脚本和入口点代码供您参考。

    应用程序链接器脚本

    SDRAM 起始地址= 0x60000000

    下面我将分享链接器脚本文件和图像供您参考。

    hello world 项目的链接器脚本文件

    CRC table 运算符无法与空输出段关联*/
    --diag_suppress=10199

    --retain=interruptVectors
    #define APP_BASE 0x60000000
    #define RAM_BASE 0x60100000

    /*系统内存映射*/

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

    /*内存中的段分配*/

    部分
    {
    .intvecs:> app_base
    .text :>闪存
    .const :>闪存
    cinit :>闪存
    请输入您的密码:> FLASH
    init_array:> FLASH

    .vtable:> RAM_BASE
    .data :> SRAM
    bss :> SRAM
    .sysmem:> SRAM
    .stack:> SRAM

    __STACK_TOP =_STACK + 256;

    [/报价]

    与 ektm4c129_qssi_boot_demo1.cmd 相比、该链接器文件似乎与 ektm4c129_qssi_boot_demo1.cmd 相同。 我觉得唯一不同的是你添加了 --diag_suppress=10199。 您是否修改了任何其他内容?

    在 main.c 中、我将调用应用起点

    静态空(*appEntry)();

    uint32 entryPiont;

    entryPiont = 0x60000000;


    appEntry =(void (*)(void)) entryPiont;

    (* appEntry)();

    [/报价]

    这是应用程序固件还是引导加载程序的 main.c?  

     对于应用程序、您为什么不 按原样尝试 ektm4c129_qssi_boot_deme1示例。 您能否将 ektm4c129_qssi_boot_demo1.bin 文件写入 SDRAM 中并直接从 SDRAM 运行这个简单的示例、即使 LED 闪烁。 您有什么看法?

    期望的解决方案:

                   写入 SDRAM 之后、必须从 SDRAM 进行引导、我必须修改这些内容。 最初我不使用 QSSI 闪存、我通过 Xmodem 接收 bin 文件后、现在尝试将其写入 SDRAM、然后在上面运行。

    [/报价]

    我不知道您为引导加载程序修改了什么。 修改后的引导加载程序(最初设计为从 QSSI 闪存下载程序映像)是否仍处于下载模式? 您能否看一下引导加载程序 在执行阶段将应用程序复制到 SDRAM 时所处的范围捕获情况。 请注意、示例引导加载程序本身将依赖于 QSSI 闪存的扇区0中存储的信息。 SeCOR-0包含 SDRAM 起始地址和要复制映像大小的相关信息。 除非您已将引导加载程序修改为不依赖于扇区0信息、否则我不确定您修改后的引导加载程序是否能够将应用程序映像复制到 SDRAM 并跳转到外部 SDRAM 地址。  

    您可以将映像下载到 QSSI 闪存中、该映像已在编译时配置为
    从 EPI 地址空间0x6000 0000执行。 该映像从 PC 或其他
    讨论。 要将新映像加载到 QSSI 闪存、请在加电或复位
    LaunchPad 套件。 这会使引导加载程序进入下载模式。 如果未按下 USER_SW1、
    引导加载程序为有效映像指针读取扇区0、并执行 QSSI 闪存上可用的最后一个映像。 If
    未找到有效映像指针、引导加载程序将进入下载模式、并等待新映像。 期间

    在执行阶段、引导加载程序将映像复制到连接到 EPI 的 SDRAM 存储器中
    外设。 当映像完成复制后、Cortex-M4将禁用中断、并更新
    NVIC_VTABLE 寄存器中映射到外部地址映射、并跳转到外部地址空间
    0x6000 0000。 所有后续代码执行都发生在外部地址空间中、直到下一个板
    复位。 图4显示了代码工作原理的流程图。

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

    尊敬的 Charles Tsai:

                在配置正确的 NVIC_VTABLE 寄存器偏移(0xE000E100)后、该问题已得到解决。请找到我用于从 SDRAM 进行引导的入口点函数。


    void JumpToEntryPoint (uint_fast32_t ui32StartAddr)
    {
    //
    //在 SDRAM 中将向量表设置为应用程序的开头。
    //
    HWREG (NVIC_VTABLE)= ui32StartAddr;

    #if 0
    _asm (" movw r0、#0x0000\n"
    " movt r0、#0x6000\n"
    " LDR sp,[r0]\n"
    " LDR r0、[r0、#4]\n"
    " bx r0");
    #endif
    //
    //从应用程序的矢量表加载堆栈指针。
    //从应用程序的矢量表加载初始 PC 并分支到
    //应用程序的入口点。
    //
    _asm (" LDR sp、[r0]\n"
    " LDR r0、[r0、#4]\n"
    " bx r0\n");

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

    非常感谢您的支持

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

    尊敬的 Mani:

     很高兴您的问题得到解决。