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.

[参考译文] TMS320F28P650DK:刷写可通过自定义 CAN 引导加载程序 (F28P65x) 实现、但不会跳转到 BANK1 中的应用程序

Guru**** 2689745 points

Other Parts Discussed in Thread: C2000WARE, UNIFLASH

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1594702/tms320f28p650dk-flashing-works-via-custom-can-bootloader-f28p65x-but-does-not-jump-to-application-in-bank1

器件型号: TMS320F28P650DK
Thread 中讨论的其他器件: C2000WAREUNIFLASH

您好、

目前我正在使用自定义 CAN 引导加载程序通过 CAN 使用闪存 API 的库 ( FAPI_F28P65x_EABI_v3.00.02.lib )、刷写完成、但应用程序未运行(不会跳转到仍在引导加载程序代码中的应用程序)、

引导加载程序将存储到闪存组 0 中 (FLASH_BANK0 :origin = 0x080002、length = 0x01FFFE)

应用程序代码将存储到闪存组–1 中

FLASH_APP_HDR :origin = 0x00A0000、length = 0x000002 // codestart
Flash_app   :origin = 0x00A0200、length = 0x01FE00 )
闪存成功完成但未跳转到应用程序中、我可以清除所有中断、但仍然无法正常工作。
4.刷写 bin 文件不是.TXT 文件。对于.bin 生成“${CG_TOOL_ROOT}/bin/hex2000 --binary --memwidth=8 --romwidth=8 -o “${BuildArtifactFileBaseName}.bin““${BuildArtifactFileName}“",“,生成、生成了.bin 文件  
5.我已验证引导加载程序和应用程序文件代码 satrt 均为正确的.map 文件“
注意:
当使用类似这样的自定义引导加载程序时、是否可以.bin从 0x00A0000 开始刷写 RAW?是否首选 TI-TXT?.binhex2000上述配置的 RAW 是否仅包含 BANK1 数据、或者是否可以包含其他区域(例如 RAM、CINIT 等)?
2.我的 jump_to_application()方法对于 F28P65x/C28x 是正确的吗?  
3.这个跳转代码是否支持 TI 板?? 、复位后、仍在引导程序代码和中  
在 Main() 中调用 bootloader_entry() 函数。
#pragma CODE_SECTION(jump_to_application, ".TI.ramfunc")
void jump_to_application(void)
{
    typedef void (*entry_t)(void);
    entry_t app_start = (entry_t)0x000A0000;

    DINT;
    IER = 0;
    IFR = 0;

    EALLOW;
    Interrupt_disable(INT_CANA0);
    CAN_disableGlobalInterrupt(CANA_BASE, CAN_GLOBAL_INT_CANINT0);
    DINT;
    DRTM;
    EDIS;

    app_start();

    for(;;) { }
}


static bool app_image_valid(void)
{
    volatile uint16_t *codestart = (volatile uint16_t*)0x00A0000;

    if ((*codestart == 0xFFFFu) || (*codestart == 0x0000u)) {
        return false;
    }
    return true;
}

void bootloader_entry(void)
{
    if (g_boot_next_is_app == BOOT_MAGIC_APP && app_image_valid())
    {
        g_boot_next_is_app = BOOT_MAGIC_NONE;
        jump_to_application();
        for(;;) { }
    }
}
引导加载程序代码闪存组 1
FLASH_BANK0      : origin = 0x080002, length = 0x01FFFE  // 0x80002–0x9FFFF 

   RESET            : origin = 0x3FFFC0, length = 0x000002
}

SECTIONS
{
   codestart        : > BEGIN
   .text            : >> FLASH_BANK0, ALIGN(8)
   .cinit           : > FLASH_BANK0, ALIGN(8)
   .switch          : > FLASH_BANK0, ALIGN(8)
   .reset           : > RESET, TYPE = DSECT

   .stack           : > RAMM1

   .boot_noinit : > RAMGS1, type=NOINIT
5.应用程序.cmd 是“
 
FLASH_APP_HDR   : origin = 0x00A0000, length = 0x000002  // codestart
   FLASH_APP       : origin = 0x00A0200, length = 0x01FE00  // 0xA0200–0xBFFFF
   RESET           : origin = 0x3FFFC0, length = 0x000002
}

SECTIONS
{
   codestart       : > FLASH_APP_HDR, ALIGN(2)
   .text           : >> FLASH_APP, ALIGN(8)
   .cinit          : > FLASH_APP, ALIGN(8)
   .const          : > FLASH_APP, ALIGN(8)
   .switch         : > FLASH_APP, ALIGN(8)
   .reset          : > RESET, TYPE = DSECT
   .stack          : > RAMM1
#if defined(__TI_EABI__)
   .bss            : > RAMLS5
   .data           : > RAMLS5
   .sysmem         : > RAMGS1
   .init_array     : > FLASH_APP, ALIGN(8)
#else
   ...
#endif
   GROUP
   {
       .TI.ramfunc :
       {
           *(.TI.ramfunc*)
       }
   } LOAD = FLASH_APP,
     RUN  = RAMLS0,
     LOAD_START(RamfuncsLoadStart),
     LOAD_SIZE(RamfuncsLoadSize),
     LOAD_END(RamfuncsLoadEnd),
     RUN_START(RamfuncsRunStart),
     RUN_SIZE(RamfuncsRunSize),
     RUN_END(RamfuncsRunEnd),
     ALIGN(8)
}"
 
对于 F28P65x 上的组 0 引导加载程序+组 1 应用、这种存储器拆分和跳转方法是否符合 TI 建议、或者我是否应该遵循不同的模式。
 
非常感谢有关此设置的正确跳转过程和图像格式的任何指导或示例。  
 
此致、
Suresh K.
 
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Suresh、

    对于此器件、您是否可以参考 C2000ware 示例中的 SCI 闪存内核跳转?

    谢谢。此致、

    Charles

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

    尊敬的 Charles:

    是的、我已经查看了 C2000Ware 中的 SCI 闪存内核示例。
    我了解到 SCI 引导加载程序依赖于main() ROM 引导流程、其中返回一个入口地址、引导 ROM 使用该地址跳转到应用程序。

    在我的案例中、我正在实施 基于 CAN 的定制引导加载程序 所以跳转机制是不同的。 ROM 不会为我处理跳转、因此引导加载程序必须在闪存中显式调用应用程序入口点。

    我的问题主要是关于我的 链接器命令文件 和应用程序的调用函数、并跳转应用程序。 请确认:

    1. 我的引导加载程序.cmd是否将代码正确放入 Bank0 中?

    2. 我的应用程序.cmd正确地将代码放在 BANK1 中(从 0x0A0000 codestart 开始)

    3. CAN 引导加载程序需要任何特殊的段放置或存储器处理

    4. 原始.bin文件对于 F28P65x 闪存是否安全?
    5. 对于自定义引导加载程序(不是 ROM)、以下跳转方法是否有效?
    6. void jump_to_application (void)
        typedef void (* entry_t)(void)
        entry_t APP_START =(entry_t) 0x000A0000

        DINT;
        IER = 0
        IFR = 0

        EALLOW;
        INTERRUPT_DISABLE (INT_CANA0);
        can_disableGlobalInterrupt (cana_base、can_global_INT_CANINT0);
        DINT;
        DRTM;
        EDIS;

        应用程序启动 ();

        for(;;){}
      }

    我想确保 TI 推荐对定制 CAN 引导加载程序流程进行的任何更改都不会遗漏、尤其是关于 codestart 放置、ramfuncs 或闪存 API 使用方面的更改。

    此致、
    Suresh

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

    您好 Suresh、

    ]我的引导加载程序.cmd正确地将代码放置在 Bank0 中?

    是的、这看起来很好。 codestart 位于 0x80000、这是闪存引导入口点。

    ]我的应用程序.cmd正确地将代码放在 BANK1 中(从 0x0A0000 codestart 开始)

    这看起来也不错。

    CAN 引导加载程序需要任何特殊的段放置或内存处理

    您可能需要定义 CANA_MSG_RAM 和 CANB_MSG_RAM 段、请参阅默认链接器文件的示例。

    是一个.bin可安全用于 F28P65x 闪存的原始文件吗?

    是的。 可能需要通过 Uniflash 加载.bin 引导加载程序、因为 CCS 不支持直接加载.bin。 如果将应用加载为.bin 文件、则需要在主机编程器上实现逻辑、以便通过 CAN 读取和发送该文件。 您还需要知道开始编程所需的起始地址。 在本例中、它似乎是 0xA0000。

    对于自定义引导加载程序(不是 ROM)、以下跳转方法是否有效?

    这看起来没问题。 进行此跳转后执行将在哪里? 当您说器件滞留在引导加载程序代码中时、它是进入 for(;){}循环、还是器件正在复位?

    通过引导加载程序进行编程后、您是否可以连接到器件并通过 CCS 闪存插件对程序进行“仅验证“加载? 这将验证您的应用程序映像是否已正确编程。

    此致、

    Alex

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

    您好 Alex、

    感谢您的答复、

    我需要说明 CCS 生成的正确输出文件格式、以便通过 CAN 刷写固件。

    自定义 CAN 引导加载程序建议使用哪种输出文件格式?  .out(elf)。 bin.hex.txt (TI-TXT 格式)

    2.这些格式是什么 官方支持或推荐 可通过 A 对 F28P65x 进行编程 定制 CAN 引导加载程序(不是 ROM 引导加载程序)?

    3.当前我.bin使用以下命令生成文件: “${CG_TOOL_ROOT}/bin/hex2000 “${BuildArtifactFileName}“--binary --memwidth=8 --romwidth=8 -o “${BuildArtifactFileBaseName}.bin“ 刷写此字段时.bin、闪存中的数据不匹配(损坏的字节)。
    我附加了图像和生成的 BIN 文件以供参考。

    4.使用 C2000 Hex Utility(.txt /.hex /.dat 格式): 我可以使用生成固件吗 “${CG_TOOL_HEX}““${BuildArtifactFileName}“-boot -sci8 -a -o “${BuildArtifactFileBaseName}.txt“

    这些格式是否仅适用于 TI ROM 引导加载程序、或者也可用于自定义引导加载程序??

    5.我的自定义 CAN Bootloader 能否刷写 TI-TXT、INTEL-HEX 或 Boot-Table 格式文件?  

    TI 文档提到 ROM 加载程序需要特定的内容 引导表 详细信息。

    自定义引导加载程序是否还需要解析此类引导表格式的文件?
    或者是 A 线性二进制 (.bin) 自定义闪存编程的正确/简单格式?

    请查看引导加载程序和 Applicatione2e.ti.com/.../2818.CMD.zip 随附的.CMD 文件

    此致、

    Suresh K

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

    您好 Suresh

    1.建议将哪种输出文件格式用于自定义 CAN 引导加载程序?  .out(elf)。 bin.hex.txt (TI-TXT 格式)

    这由你决定。 您将编写逻辑来处理文件读取、并可以选择最适合您的格式。 通常、.bin 和 TI-TXT .hex 文件都易于使用。

    这些格式是什么 官方支持或推荐 可通过 A 对 F28P65x 进行编程 定制 CAN 引导加载程序(不是 ROM 引导加载程序)?

    没有官方支持的格式。 TI 的示例实现是使用 TI-TXT 文件格式完成的。

    3.当前我正在.bin使用以下命令生成文件: “${CG_TOOL_ROOT}/bin/hex2000 “${BuildArtifactFileName}“--binary --memwidth=8 --romwidth=8 -o “${BuildArtifactFileBaseName}.bin“ 刷新时.bin、闪存中的数据[/报价]

    请参阅该主题: TMS320F280039C:bin 文件创建问题 — C2000 微控制器论坛 — C2000︎ 微控制器 — TI E2E 支持论坛

    使用 C2000 Hex Utility(.txt /.hex /.dat 格式): 我可以使用生成固件吗 “${CG_TOOL_HEX}““${BuildArtifactFileName}“-boot -sci8 -a -o “${BuildArtifactFileBaseName}.txt“ [/报价]

    是的、这将为您的应用生成 TI-TXT 格式的版本。 ROM 引导加载程序期望以小端字节序格式的序列接收应用程序数据。 他们不关心文件的格式。

    您的引导加载程序将支持您要为其添加支持的任何文件。 对于引导加载程序、主机编程器(在您的笔记本电脑上)通常读取.bin/.hex/等 然后 将数据发送到器件。 因此、主机编程器可支持读取各种类型的文件、但与器件只有一种通信协议。

    此致、

    Alex