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.

[参考译文] TMS570LS0714:无法获取闪存与放大器;通过总线矩阵进行 RAM MEM 交换工作。

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1021474/tms570ls0714-cannot-get-flash-ram-mem-swap-through-bus-matrix-working

器件型号:TMS570LS0714

我基本上按每个线程执行以下操作:

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/880641/tms570lc4357-flash-ram-swap

除了我的控制器注释0714

我的代码  

        if ( 0x5 !=  systemREG1->BMMCR1) {
            // extern tgt size, addr
            memcpy( (void*)addr, APP_START_ADDRESS,  size);
            systemREG1->BMMCR1 = 0x5;
            systemREG1->CPURSTCR = ~(systemREG1->CPURSTCR); //bye bye
            while(1);
           }
           
           //resets & shouldnt be here

通过调试器、我验证我的应用_di_是否已复制到我需要的位置(我在 RAM 中看到了所有汇编语句、从0x08000000开始)、 BMMCR1从0xA 交换到0x5。

然而、一旦 CPU 复位、它就会返回到我看到的启动位置-来自闪存的同一中断矢量、而不是 RAM。   BMMCR1值是正确的-交换/0x5 -复位后,查看 这两个值的起始值- 0x00000000 (现在假设为 RAM)或0x08000000 (现在假设为闪存 )-我只看到旧代码/旧复位矢量。  就好像我的复制从未发生过一样。  

此代码根本没有启用 RAM 上的 MPU 或 ECC。  

有什么想法吗?  (帮助!)

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

    您好!

    交换 SRAM 和闪存的主要目的是为了加快调试速度。

    请在 CCS 中尝试脚本选项

    存储器开关:RAM 存储器0x00

    2.存储器映射设置:RAM 0x00

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

    我已经看到过它、实际上它也是这样做的。

    不起作用、因为问题相同-我看到没有换用。 还有事要尝试吗?

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

    用户指南并未说明调试器连接的时间。 那么,它是否不能更改这些运行时?

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

    不应在大规模生产中使用交换功能。 开发此功能的目的是通过从 SRAM 运行代码(换用闪存)来简化代码调试。

    内存可在运行时交换。

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

    为了让我了解该功能、我能要求您澄清一下。

    触发交换并在执行 CPU 看到内存时交换内存后、这是否意味着所有代码和变量也必须位于不同的位置-例如、   这是否需要像闪存来自0x08000000和 RAM 来自0一样汇编和链接代码?
    或者、硬件发生了其他一些转换、使您能够保持代码不变?   RAM 范围的 ECC 也必须更改  

    如果代码链接正常、我不了解调试器/仿真器如何使用它

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

    我将开发一个示例项目来交换存储器并从 SRAM 运行代码。  

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

    附件是我使用内存交换从 RAM 执行代码的示例:

    e2e.ti.com/.../TMS570LS12x_5F00_GIOB1_5F00_run_5F00_from_5F00_RAM.zip

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

    在 TMS570中、默认情况下闪存映射到0x00、RAM 映射到0x0800 0000。 我们可以在 CCS10中轻松交换闪存和 SRAM。 在 RAM 而不是闪存中加载和执行代码的两个步骤:

    1.将您的目标连接到 CCS10。 "Scripts"菜单变为活动状态。 选择"Scripts"下的"Target_RAM_TO_0x0"和"RAM @ Address 0x0"的存储器映射设置。

     打开"内存映射"(在"目标"下)以确保 RAM 被映射到0x00

    您可能需要运行该脚本几次。

     2.在 CCS10中打开"sys_core.asm"、在 stackpointer 定义(在链接器 cmd 文件中定义的堆栈)中将"0080000"更改为"0x00010000"

    3.更改链接器 cmd 文件中的存储器映射:


    存储器

    /*用户代码开始(2)*/
      引导程序(RW):origin=0x00000000 length=0x00000020
      RAM (RW):origin=0x00000020 length=0x0000FFE0
      堆栈(RW):origin=0x00010000 length=0x00001500
    /*用户代码结束*/

    /*用户代码开始(3)*/
    /*用户代码结束*/

    /*------------------ *
    /*段配置*/

    部分

    /*用户代码开始(4)*/
      .intvecs:{}>向量
      .text:align (8){}> RAM
      .const:align (8){}> RAM
      .cinit:align (8){}> RAM
      .pinit:align (8){}> RAM
      .bss:{}palign = 8 > RAM
      .data:{} palign =8>RAM
      .sysmem:{} palign =8>RAM
    /*用户代码结束*/

    示例项目是打开/关闭 LS1224 Launchpad 上的单个用户 LED

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

    该项目已在我的 LaunchPad 上进行测试、并按预期工作。

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

    好的、您已经在链接器中更改了 RAM 的启动位置、现在交换了 RAM、以使用该功能- i.e、_have _来更改此设置并构建特殊的可执行文件。

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

    是的、应对链接器 cmd 文件和 sys_core.asm (栈初始化)进行一些更改。