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.

[参考译文] TMS320F280037C:引导加载程序示例

Guru**** 2512055 points
Other Parts Discussed in Thread: UNIFLASH, C2000WARE, SYSCONFIG

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1344815/tms320f280037c-bootloader-examples

器件型号:TMS320F280037C
主题中讨论的其他器件:UNIFLASHC2000WARESysConfig

您好!

我目前正在开发引导加载程序应用。 我仍处于要求偏差阶段、在继续之前、我想提出一些问题。

-我想知道是否有与我们的应用类似的例子。 我们需要将自定义引导加载程序存储在闪存中、而不是使用 ROM 引导加载程序。 通信外设将是 MCAN 或 CAN-FD。  我已经看到、在 driverlib 上的闪存示例中有一个内核、它可以直接在闪存中编程、然后调整以在我们的应用中使用? 此外、我想知道闪存工具中的库是否与示例兼容、如果有的话。

-我想更好地展示项目应该如何分配。 我已经想到的是具有两个单独的 CCS 项目、一个用于引导加载程序、另一个用于应用程序。 引导加载程序代码将包含闪存入口点、因此无论何时重置器件、它都将进入引导加载状态。 应用程序代码将位于将在不同扇区编程的单独项目中。 但是、我不明白如何找到应用程序的入口点、因为如果我没有弄错、它会与常见的入口点0x80000不同。 应用程序的入口点将是该应用程序所在的第一个闪存地址? 例如、如果应用程序从 sector9启动、入口点将是 sector9的第一个加数?

-我应该如何管理不同的.cmd 文件? 它们应该相同并为应用程序和引导加载保留闪存扇区、还是应该有两个单独的.cmd 文件? 此外、如果引导程序和应用程序都需要将代码上传到 RAM、如何在跳转到不同的代码之前擦除 RAM?

-如何重置设备? 如果可能、我希望在进入引导加载程序或应用程序之前重置所有配置。

-我们希望能够更新引导加载程序,是否有将代码放入 RAM、擦除引导加载程序扇区并对新的引导加载程序进行编程的示例?

-是否可以在 Linux 中使用 uniflash 或类似的东西? 我们还希望能够针对新器件从零开始对引导加载程序+应用程序进行编程。

谢谢。

大卫·卡普德维拉

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

    PD:请为我提供更多信息以展示.asm 文件、以及我如何使用.asm 文件实现跳转到 X 位置? 引导加载程序应具有足够的智能、来决定是否已刷写代码、是否必须更新应用程序或者闪存是否未安装应用程序。 因此、我想自由使用跳转至 x 位置指令。

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

    尊敬的 David:

    >我已经看到,在 driverlib 的 flash 示例中,有一个内核,可以直接在 flash 中编程,然后调整它以用于我们的应用程序吗?

    有一个示例表明、对于使用实时固件更新的 F28003x 器件、将内核放置在闪存中、用于 SCI 闪存内核。 此示例的位置是 SCI 闪存内核的 LDFU 构建配置(C2000Ware_x_xx_xx_xx > driverlib > f28003x > examples > flash、选择 flash_kernel_ex3_sci_flash_kernel)。 您应从此示例中获取、并将其与 CAN 闪存编程的当前实施进行比较。  

    >此外,我想知道在闪存工具中找到的库是否与示例兼容,如果有的话。

    示例中提供了最新的闪存 API 库。 有关闪存 API 库的更多信息、您可以查看此器件的闪存 API 指南(C:\ti\cc2000\C2000Ware_5_01_00_00\libraries\flash_api\f28003x)。

    >我应该如何管理不同的.cmd 文件?

    如果可能、让两个链接器 cmd 文件包含相同的信息(存储器命名、映射的段)将有助于理解这两个 应用程序的加载地址和运行地址。  

    >此外,如果引导程序和应用程序都需要上载代码到 RAM,我如何可以擦除 RAM 前跳到另一个网络代码?

    对于引导加载程序和应用程序、您都可以使用 RAM 的不同部分。 您需要使用多少 RAM?

    >如何重置设备?

    您可以执行软件设备重置。 SCI 闪存内核的 LDFU 构建配置显示了这一点。

    >我们希望能够更新引导加载程序,是否有将代码放入 RAM、擦除引导加载程序扇区和编程新引导加载程序的示例?

    要更新次级引导加载程序本身、您可能必须使用主机编程器或 CCS。  

    >是否可以在 Linux 中使用 uniflash 或类似的产品?

    Uniflash 有一个 Linux 安装程序、所以是的。  

    谢谢。此致、

    查尔斯

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

    您好 Charles、

    感谢您的答复。 我也做了一些研究、研究了 LDFU 和 RAM 引导加载程序示例。 首先让我多问一些关于你的答复的问题。

    如果可能,两个链接器 cmd 文件应包含相同的信息(内存命名,映射的部分)将有助于解决这两个 应用程序的加载地址和运行地址。  [/报价]

    我该怎么做? 您能举个例子吗?

    您需要使用多少 RAM?

    我想擦除 RAM、因为该项目仍在开发中、而且我们肯定会需要该 RAM 空间。

    在实时固件更新 uniflash 中、它应该只正确上传应用代码? 它不应上传任何内核,因为已经在闪存中。

    现在、在看了示例后、我还有一些深入的问题。

    -引导加载程序为什么不需要 c_init 符号? 如果我没有弄错、c_init 符号不会在引导加载程序的 codestart 上运行、而是在将应用程序输入为入口点时运行、这也是应用程序的 codeStart 段。

    - LRETR 指令将 PC 置于 codestart 上,开始新闪存应用程序的地址正确吗?

    -是否需要引导加载程序和应用程序的编译类型相同? 都在 COFF 或 EABI 上?

    -如果应用程序和引导加载程序不同,编译器或项目选项会产生影响吗?

    谢谢。此致、

    大卫

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

    David:

    >我该怎么做? 您能举个例子吗?

    回顾您原来的问题、我不清楚您希望这些项目分开、这样可以更好地流程。 为了使引导加载程序能够了解应用程序入口点地址、它需要具有 应用程序启动的起始值。 最好比较28003x_flash_bank0_ldfu_lnk.cmd 文件和28003x_generic_flash_lnk.cmd 文件的起始地址、从而调整可用闪存部分、以使其内核和应用程序不存在重叠。  

    内核(次级引导加载程序)项目下载应用程序项目后、 内核的 LRETR 值将控制新下载的应用程序项目、因此您不必再擦除 RAM。

    >为什么 bootloader 不需要 c_init 符号? 如果我没有弄错、c_init 符号不会在引导加载程序的 codestart 上运行、而是在将应用程序输入为入口点时运行、这也是应用程序的 codeStart 段。

    不需要 c_init 符号、因为该项目由 C++代码组成。

    > LRETR 指令将 PC 置于 codestart 中,开始新闪存应用程序的附加位置正确吗?

    可以。

    >是否需要引导加载程序和应用程序的编译类型相同? 都在 COFF EABI 上

    是的、它们应该是相同的格式。

    >如果应用程序和引导加载程序不同,编译器或项目选项是否会影响?

    是的、就使用的引导模式、memwidth size 和输出格式而言、工程选项确实会产生影响。  

    谢谢。

    查尔斯

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

    非常感谢 Charles、

    可以肯定的是、在引导加载程序和应用程序中使用相同的 RAM 扇区应该没有问题、因为其中一个应覆盖另一个、前提是始终存在 CPU 的复位。

    大卫

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

    您好 Charles、

    如何确保.asm 文件检测到符号 main? 它在编译中不断出现错误、表明链接器无法找到首先在.asm 文件中声明的 main simbol。 对此有什么建议吗?

    大卫

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

    尊敬的 David:

    如果您的设计基于 SCI 闪存内核的 LFU 配置、请注意、"main"不是示例遇到/运行的第一个函数。 它首先进入  void liveDFU (void)函数以启动程序。

    谢谢。

    查尔斯

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

    您好 Charles。

    我想我发现了这个问题。 我认为它是编译格式。 如果我在 COFF 中编译它、则会找不到主函数、但如果在 EABI 中编译、则会编译。 为什么会发生这种情况? 如何更改代码以便能够在 COFF 中进行编译?

    顺便说一下、我将 CAN 引导加载程序与 LDFU 混合使用、但我是从包含.asm 文件的 CAN 引导加载程序示例开始的。

    此致、

    大卫

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

    尊敬的 David:

    根据 C28x 编译器指南(https://www.ti.com/lit/spru514)的第2.13节和2.15节、LFU 功能似乎仅支持 EABI。

    此致、

    斯凯勒

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

    您好,Skyler:

    尽管我要在闪存中实施次级引导加载程序、但我遇到问题的.asm 文件来自不包含 LDFU 特性的 CAN 闪存项目。

    此致、

    大卫

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

    尊敬的 David:

    很抱歉耽误你的时间。  您能否发送错误消息的屏幕截图? 此外、您能否使用 EABI 附加正在使用的链接器文件和通过成功编译生成的.map 文件?  

    此致、

    斯凯勒

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

    您好,Skyler:

    当然、这是我看到的错误:

    .cmd 文件和.map 生成结果为:

    e2e.ti.com/.../5125.cmd_5F00_map.rar

    此外、请注意、我有由 SysConfig 生成的以下.asm 和.cmd 文件、这些文件将在启动时执行、因为我想将预定义的引导 ROM 模式更改为闪存条目、以便始终进入放置在0x008000处的引导加载程序的入口点。 不过、我在调试时可以看到的是、main 是通过 c_init 符号与我自己的.asm 合并进入的。 因此、当它退出程序时、程序计数器会返回 c_init 的退出函数、而不是自定义的 ExitBoot 自定义函数。 你知道为什么会这样吗?

    测试完成具有以下文件:

    uint32_t main (void)
    {

       //
       //初始化设备时钟和外设
       //
       device_init();

       //
       //初始化 GPIO
       //
       device_initGPIO();

       //
       //初始化 MCAN 并等待接收消息
       //
       //新应用程序的实际入口闪点
       返回0x00085000;
    //   返回 MCAN_Boot (0、0120、0、1);

    e2e.ti.com/.../dcsm_5F00_codestart.rar

    e2e.ti.com/.../5125.dcsm_5F00_codestart.rar

    此致、

    大卫