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.

[参考译文] TMS320F28375D:如何在复位后强制 CPU2进入 main

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1211804/tms320f28375d-how-to-force-cpu2-to-go-into-main-after-reset

器件型号:TMS320F28375D

客户将 CPU2设置为之后转至 main 复位 但它不起作用(对于 CPU1、它可以正常工作)

当他们设置脚本时:scripts->EMU 引导模式 select->EMU_boot_flash 也适用于 CPU2、但在将程序再次重新加载到 CPU 后、它停止工作。

他们如何解决这一问题?

重新启动 选项可以正常工作、但仅在 CCS 级别工作。

通常他们使用 javascript 来运行一些脚本: 复位 工作正常、 重新启动 不起作用、它只是停止了。   

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

    劳伦斯、您好!  

    有关以下答案的更多详细信息、请参阅 F2837xD 技术参考手册的第4.7节。  

    当客户使用 EMU_BOOT_FLASH 脚本时、地址0xD00的值会更改为 BMODE 值、以使器件在仿真引导流程中引导至闪存。 我认为在您重新启动器件时该部分会被复位。 如本 TRM 部分所述、用户可以使用 OTP 中的一个位置来永久设置该器件的引导模式。 如果您在此方面需要帮助、请告诉我。

    此致、

    Ben Collier

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

    您好!

    我们 暂时跳过"Scripts"->EMU Boot mode"这一问题。

    更重要的是、为什么 CPU2不转至 main? 自动运行选项有两个选项:->在程序加载或重新启动以及复位时运行到符号 main ->。

    这两个选项都已设置、但 CPU2仅在重新启动期间转到 main、而不是复位。  

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

    尊敬的 Sebastian:

    好的、我已经复制了您看到的内容。 请允许我与另一位专家讨论此问题、我很快会回来与您联系。

    此致、

    Ben Collier

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

    尊敬的 Ben:

    解决该问题的另一种方法是在 JavaScript 中运行 restart 函数。
    事实是:

    函数 RESTART 会按如下顺序正常运行:
    debugSession_2 = debugServer.openSession ("*"、"C28xx_CPU2");
    debugSession_2.target.connect();
    debugSession_2.memory.loadProgram( programToLoad_2 );
    debugSession_2.target.restart ();-> Restart 已经正确完成。
    debugSession_2.target.runAsynch();

    重新启动功能不能按如下顺序正常工作:
    debugSession_2 = debugServer.openSession ("*"、"C28xx_CPU2");
    debugSession_2.target.connect();
    debugSession_2.target.runAsynch();
    debugSession_2.target.reset ();
    debugSession_2.target.restart ()->程序卡在这里。

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

    尊敬的 Sebastian:

    感谢您提供更多信息。 我要与之讨论的专家今天整天都很忙、所以我希望明天能给您回复。

    此致、

    Ben Collier  

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

    e2e.ti.com/.../ccs_5F00_Flash_5F00_ResetCpu.txt

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

    尊敬的 Sebastian:

    问题是由 CPU2的0xD00寄存器中的值引起的。 电源复位后,该值始终加载为0x**025A。 使用此值、CPU2将始终在等待引导模式下引导、在这种模式下、它将保持空闲状态、等待 CPU1释放它。

    当加载程序或使用"重启"按钮时、JTAG 调试探针只会跳转到 CPU1或 CPU2上 main 的位置、因为它知道程序启动的位置。  

    当您复位器件时、它将返回到引导 ROM。 对于 CPU1、0xD00处的值由引导模式引脚确定、并将在上电时设置。 当您对器件进行软件复位时、它将针对0xD00的最后2个字节中设置的值进行相应引导。 这些选项如下所示。

    如果 CPU1已设置为从闪存(0x**0B5A)引导、那么如果您的程序存储在闪存中、它将引导至闪存并转至 main。 如果 CPU1设置为 获得引导模式(0x**035A),则它将读取 OTP 中的一个位置以确定引导模式。 默认情况下、OTP 中的此位置设置为全部为0xF、并引导至闪存。  

    由于 CPU2在电源复位后将始终在0xD00处编程0x**025A、因此它将始终等待 CPU1释放它、除非您在0xD00处对值进行重新编程、 EMU_BOOT_FLASH 脚本就是这样做的。

    另一种可以使用的权变措施是在 CPU1 c 代码中放入一行、告知 CPU1将 CPU2从复位中拉出、如下所示。

    CPU1将卡在这一行、直到它将 CPU2拉出复位。 因此、 在 CPU1和 CPU2均跳转到 main 后、您需要复位 CPU2 (使其处于等待引导状态)、然后可以运行 CPU1和 CPU2程序。

    如果您需要进一步澄清其中的任何一个问题、敬请告知。

    此致、

    Ben Collier

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

    您好!

    答案足以感谢您的解释。