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.

[参考译文] TMS320F28069:如果在引导加载程序期间发生问题、则需要引导加载程序重新启动

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

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/609037/tms320f28069-need-bootloader-to-restart-if-issues-occurred-during-bootloader

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

我能够使用引导加载程序将代码成功加载到 闪存中。  但是、 对于我的应用、如果  通信中断或器件断电、我需要引导加载程序自动重启。

为了提供一些背景资料、下面是我拥有的内容:

GPIO37和34都设置为1 (为了进入 Get 模式)。 这些值是固定的、用户不能修改。

2.然后输入我的主函数。 请参见下图。 "enter_bootloader"建立 SCI 并执行自动波特。 如果所有操作都成功,则输入 SciBoot()。 SciBoot 是在汇编文件中定义的函数。 然后分支到 SCI 引导 Rom。



然后、使用 C2000串行固件升级程序。 首先将"f28069_flash_kernel"加载到 RAM 中。 这两个 C2000串行固件升级程序和闪存内核最初都来自 TI controlSUITE。  

成功完成后、闪存内核会将应用程序代码加载到闪存中。

5.完成此操作后,主板将重新启动。 由于不发送自动波特字符,因此电路板超时"enter_Bootloader()函数,并与其余应用程序代码一起继续。 如果在引导加载过程中从未关闭电源或通信从未中断、则到目前为止的所有操作都可以正常工作。

为了使这项工作即使引导加载程序不成功、我决定将与引导加载程序关联的所有函数置于扇区 E 中。闪存内核永远不会擦除该扇区。 所有其他应用程序代码都位于扇区 F、G 和 H 中。为此、我修改了链接器命令文件、以便在扇区 E 中列出 引导加载程序的特定地址。 然后、我在 Main.c 中使用了 CODE_SECTION pragma  请参见下图:







添加后、在器件加载到闪存时将其断电。 当我重新打开它时、似乎它没有尝试进入"enter_bootloader"函数、因为 C2000串行固件升级程序无法开始加载闪存内核。 是否有人知道问题可能是什么? 这是因为 main 引用的是一个函数"DynalinkXLoop ()"、它位于扇区的一部分、该扇区在引导加载程序过程中被擦除并写入到该扇区中吗?

很抱歉这个长帖子。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    需要将包含到_c_int00的长分支的 codestart 段编程到闪存中。 通常会链接它以开始。 但您首先要了解的是 RAM 位置。 这不奏效。 需要分配给闪存。

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

    感谢您的回答。 首先、我想指出、在上图中、注释掉了"BEGIN"。 因此、"codestart"被设定为一个闪存地址。

    在上图中、.text、.cinit、.econst 和.switch 都使用"flash_FGH"。 由于扇区 F、G 和 H 正在闪存内核中被擦除(因为这些扇区正在用于我的应用程序代码)、我想、如果我使用了一些其他未被擦除的扇区、这是可以的。 因此、对于.text、.cinit、.econst 和.switch、我分配了"flash_BCD"。 同样、引导加载程序代码仅位于扇区 E

    我将其下载到 MCU。 然后、我对应用程序代码做了一个小的更改、并尝试加载该代码。 但是、这次应用程序代码不会加载到闪存中。 我想、由于初始化段引用的扇区未被擦除、但应用需要、因此它无法完成、因为它能够对所有扇区进行编程。

    因此、我有以下问题:是否可以有两对单独的初始化段? 这意味着一组初始化段将用于"enter_Bootloader()",另一组将用于"DynalinkXLoop ()? 每个初始化段将由.text、.cinit、.econst 和.switch 组成。 你怎么看? 同样,目标是确保"enter_Bootloader()"将始终启动,但"DynalinkXLoop ()"始终可以自由修改。

    已用 SysTick 处理
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、这是可能的。 您似乎有很好的理解。

    您只需要确保在引导至闪存时、具有到_c_int00的适当长分支、然后该分支会分支到您的代码、该代码决定要运行哪个应用程序。

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

    是的、我已验证我的代码是否分支到_c_int00。 但是、我无法找到如何将_c_int00分支设置到扇区 E (包含引导加载程序代码)。 我该怎么做? 我猜我可以从链接器命令文件中指定它、但我不知道该命令是什么。

    已用 SysTick 处理
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您能否弄清楚它的分支位置? 无论在何处分支(可能是主函数)、我都会插入您的逻辑、以确定分支位置、如引导加载程序。

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

    SAL

    很抱歉不能尽快回复。 是的、我也知道我的代码分支的位置。 现在、我有了主函数和函数、用于确定是否执行存储在扇区 E 中的引导加载程序。现在、无论是初始阶段还是在闪存内核无法将应用程序代码加载到闪存的情况下、都将执行此操作。 这就是引导加载程序的工作方式、因为用户需要能够在引导加载程序失败时重新尝试引导加载程序。

    但是、我现在遇到了引导加载程序经常失败的问题。 具体而言、闪存内核将始终加载、但闪存内核现在无法将应用程序代码加载到闪存。 在查看扇区 E 的反汇编后、我仍然看到一些引用的 ISR 与我的引导加载程序没有任何关系(至少我认为它们与它们没有任何关系)。 我还会看到其他非引导加载程序相关器件中的一些函数。

    我猜链接器命令文件使用.text 命令来确定代码的起始位置。 但是、必须注意确保扇区 E 仅包含引导加载程序代码、而不包含任何其他内容、因为该扇区永远不会被擦除。 它可能会失败、因为闪存内核有时会尝试写入扇区 E。 很难确定、因为无法单步执行闪存内核(因为这需要手动输入十六进制文件-需要很长时间)。 我知道、在我将代码拆分为不同的扇区之前、闪存内核一直在正确加载到闪存中。

    您是否有任何其他想法来说明它为什么经常出现故障? 谢谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    首先、确保您正在将内核的 memcpy 写入 RAM 并从 RAM 运行。 其次、如果您不想擦除闪存中的内核、则需要确保十六进制文件中的任何代码都不会驻留在该扇区中。 您可以通过观察闪存应用程序的十六进制文件的块地址和块大小来手动确认这一点。

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

    SAL

    很抱歉我没有早点回复、我不在办公室了。

    我对闪存内核从 RAM 运行非常有信心。 作为测试、我使用 JTAG 端口将自己的闪存内核下载到电路板上。 我在 code composer 中观察到了反汇编、并验证了这一切都在 RAM 中。

    如果闪存内核被覆盖、这是可以的。 但是、引导加载程序部分(位于其自身扇区的闪存中)永远不会被擦除。

    在做了一些研究之后、我发现将引导加载程序代码放置在扇区 G 和 H 中会更容易。其余代码(可以升级)将驻留在扇区 A 至 F 中

    作为测试、我使用 JTAG 端口将其下载到电路板。 查看 Code Composer 中的反汇编、我可以看到所有引导加载程序代码都驻留在扇区 G 和 H 中。执行此操作后、我使用上述组件重新测试了通过串行通信加载 的过程、这种情况成功发生。

    但是、我现在需要确保起始地址 在扇区 G 或 H 中(而不是在任何其他扇区中)。 这将确保在以串行方式加载代码失败的情况下、不会擦除包含引导加载程序的扇区。 为此、我需要将_c_int00设置为扇区 G 或 H 中的地址。您知道如何执行此操作吗? 我做了一些研究、但在下面的链接中、我不确定哪种选项适用于我的案例。 如果有任何帮助,将不胜感激。

    http://processors.wiki.ti.com/index.php/Accessing_c_int00

    已用 SysTick 处理