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.

[参考译文] TMS320F28377S:通过串行接口(SCI)上传 RAM 应用

Guru**** 2595160 points
Other Parts Discussed in Thread: TMS320F28377S, TMS320F28335, C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/708620/tms320f28377s-ram-application-uploaded-via-serial-interface-sci

器件型号:TMS320F28377S
主题中讨论的其他器件: TMS320F28335C2000WARE

我们有一个已构建为在 TMS320F28377S 的 RAM 中执行的应用。 正确设置引导模式 GPIO、我们希望通过串行接口上载应用、然后立即执行、例如使用运行在 Windows 7上的德州仪器 C2000串行闪存编程器应用。

 

我们遇到了以下问题:

  • ‘过程非常慢:我们尝试更改‘-b’选项,但应用程序无法启动
  • 应用程序始终返回错误的最后一个发送的字符(例如、00=0F)

 

我有以下问题:

  • 为了解决上述问题、应该重新编译德州仪器 C2000串行闪存编程器应用程序?
  • 是否存在其他编程费用?
  • 对于 TMS320F28335、我们已经体验了使用终端应用直接上传发送固件文件的体验:使用 TMS320F28377S 可以实现同样的功能?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    >>>更新

    将 TMS320F28377S 设置为 SCI 引导模式、我们能够使用终端应用上传 Blinky 应用(构建为在 RAM 中执行):我们看到了所有已发送字符的回显、在传输结束时、应用程序已正确启动。

    但是、当我们切换到标称应用程序(在 RAM 中运行且占用几乎所有可用 RAM)时、SCI 引导模式失败。 在这种情况下、上载以相同的方式开始、但在其传输的大约70%处、字符回波丢失、在上载结束时、应用程序不会启动。
    •在可使用 SCI 引导模式下载和执行的 RAM 中运行的内置应用程序的大小是否有任何限制?
    •对应用程序的存储器区域的组织方式是否有任何限制?
    •如果通过 JTAG 下载应用程序时工作正常、那么它始终可以使用 SCI 引导模式下载和执行吗?

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

    从 ROM 运行的 SCI 引导加载程序回显每个字符。 这与 Windows 操作系统相结合是传输速度缓慢的原因。

    我不确定您遇到错误的最后一个字节的原因。

    如果您能够在运行 SCI 引导加载程序的 F2833x 器件上将代码加载到 RAM 中、则相同的过程应该适用于 F2837x。 SCI 引导加载程序和协议未更改。

    希望这对您有所帮助。
    SAL
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Nicola、

    唯一的限制应该是不将代码加载到驻留在 RAMM0存储器块中的堆栈。 我不能想到任何其他限制。

    使您不会将代码加载到为引导 ROM 保留的 RAMM0的保留部分。

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

    您好 Sal、

    正如您所建议的那样、我们为引导 ROM 保留了 RAMM0、但我们也有同样的问题:在大约70%的固件传输中、字符回显丢失、并且在上传结束时、应用程序不会启动。

    是否存在其他禁忌?

    此处是我们的链接器文件内容:

    MEMORY
    {
    PAGE 0:
    /* BEGIN 用于“引导至 SARAM"引导加载程序模式*/
    
    BEGIN :origin = 0x000000,length = 0x000002
    FPUTABLES :origin = 0x3FEBDC,length = 0x0006A0
    复位 :origin = 0x3FFFC0,length = 0x000002/*
    
    RAMGS0 :origin = 0x00C000、length = 0x001000
    RAMGS1 :origin = 0x00D000、length = 0x001000
    RAMGS2 :origin = 0x00E000、length = 0x001000
    RAMGS3 :origin = 0x00F000、length = 0x001000
    RAMGS4 :origin = 0x010000,length = 0x001000
    RAMGS5 :origin = 0x011000,length = 0x001000
    RAMGS6 :origin = 0x012000,length = 0x001000
    RAMGS7 :origin = 0x013000、length = 0x001000
    RAMGS8 :origin = 0x014000、length = 0x001000
    RAMGS9 :origin = 0x015000,length = 0x001000
    RAMGS10 :origin = 0x016000,length = 0x001000
    RAMGS11 :origin = 0x017000、length = 0x001000
    RAMGS12 :origin = 0x018000、length = 0x001000
    RAMGS13 :origin = 0x019000、length = 0x001000
    RAMGS14 :origin = 0x01A000、length = 0x001000
    RAMGS15 :origin = 0x01B000、length = 0x001000
    */
    RAMGS :origin = 0x00C000、length = 0x010000
    
    page 1:
    
    boot_RSVD :origin = 0x000002、length = 0x000120 // M0的部分,引导 ROM 将此用于堆栈*//
    
    *
    RAMM0 :origin = 0x000122、length = 0x0002DE
    RAMM1 :origin = 0x000400、length = 0x000400
    RAMD0 :origin = 0x00B000、length = 0x000800
    RAMD1 :origin = 0x00B800,length = 0x000800
    *//RAMECCM
    :origin = 0x000400、length = 0x000400
    RAMECCD :origin = 0x00B000、length = 0x001000
    
    // RAMLS0
    :origin = 0x008000、length = 0x000800
    RAMLS1 :origin = 0x008800,length = 0x000800
    RAMLS2 :origin = 0x009000、length = 0x000800
    RAMLS3 :origin = 0x009800,length = 0x000800
    RAMLS4 :origin = 0x00A000、length = 0x000800
    RAMLS5 :origin = 0x00A800、length = 0x000800
    */
    RAMLS :origin = 0x008000、length = 0x003000
    
    CANA_MSG_RAM :origin = 0x049000、length = 0x000800
    CANB_MSG_RAM :origin = 0x04B000、length = 0x000800
    }
    
    
    SECTIONS
    {
    codestart :>开始, PAGE = 0
    ramfuncs :> RAMLS, PAGE = 1.text
    :> RAMGS, PAGE = 0
    .cinit :crc_table (_link_gen_crc_table)> RAMGS, PAGE = 0.Pinit
    :> RAMGS, PAGE = 0.switch
    :> RAMGS, PAGE = 0.reset
    :>重置, PAGE = 0、TYPE = DSECT /*未使用、*/
    
    .stack :> RAMECCD,PAGE = 1.ebss
    :> RAMLS, PAGE = 1.econst
    :crc_table (_link_gen_crc_table)> RAMGS, page = 0
    
    FPUmathTables:> FPUTABLES,page = 0,type = NoLoad
    
    //段链接器放置自动计算的 CRC 表*/
    .TI.crctab 所需的段 :> RAMLS,page = 1/*
    
    部分,重定向受 ECC 保护的 RAM 中的安全变量*/
    eccSection :> RAMECCD,PAGE = 1
    }
    
    /*
    /========================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
    //文件结束。
    //============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
    *
    

    此致、

    Nicola

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

    您使用的波特率是多少? 如果它太高、则器件可能会丢失字符、因为 POR 之后、它仅以10MHz 运行。

    您能否确定发生故障时正在传输哪个内存块? 您可以加载引导 ROM 的符号并以这种方式对其进行调试。

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

    -我们已将终端应用程序的传输速率设置为9600,但同样的问题是:在大约70%的固件传输中,字符回显丢失,并且在上载结束时,应用程序不会启动
    -在哪里可以找到引导 ROM 的符号?

    顺便说一下、通过使用标称 TI 闪存编程器、我们能够成功上传整个固件、但应用程序不会启动(启动时、串行消息会定期通过用于固件上传的同一串行线路传输)。
    我们已经尝试将目标连接到 CCS 6.1.0.00104、但是这个操作似乎会重置 RAM (我们看到所有的存储器0000)。 我们如何在不复位 RAM 和调试正在运行的 RAM 应用的情况下连接目标?

    此致、
    Nicola
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    1) 1)要在不重置的情况下进行连接、您需要修改所使用目标配置文件的 GEL 文件。

    2) 2)您可以在下面的路径中找到引导 ROM 符号。

    C:\ti\c2000Ware_1_00_05_00\libraries\boot_rom\f2837xd\revB\rom_sources\CCS_files\cpu01\Release

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

    您好 Sal、

    正如您所建议的、我们已经按照报告的那样修改了 GEL 文件 F28377D_CPU1.GEL、但效果是一样的:连接时、所有 RAM 都是0000。

    OnTargetConnect()
    {
    
    *(int *) 0x5F412 = 0x000F; 针对 M0/M1/D0/D1内存的/* RAM 初始化*
    *(int *) 0x5F432 =0x003F; 针对 LS0..LS5存储器的/* RAM 初始化*/
    *(int *) 0x5F452 =0xFFFF; 针对 GS0..GS15存储器的/* RAM 初始化*/
    
    if (GEL_IsInRealtimeMode()) /*如果处于实时模式*/
    {
    }
    其他 /*将器件置于 C28x 模式*/
    {
    C28x_Mode();
    }
    
    F2837x_Memory_Map(); /*初始化 CCS 存储器映射*/*
    
    查看 CCS 是否已在 DSP 上启动*/*
    以实时模式运行。 用户可以添加任何内容 //
    ////*他们希望针对每种情况进行的自定义初始化内容。 *
    
    if (GEL_IsInRealtimeMode()) /*执行实时模式目标初始化*/
    {
    
    }
    其他 /*执行停止模式目标初始化*/
    {
    /* GEL_Reset ();*/ /*重置 DSP */
    }
    } 

    我们还禁用了目标配置属性面板中的所有复位选项、如图所示。

     

    我们如何实现我们的目标?

     

    谢谢、

    Nicola

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    请查看您发布的前3行代码。 OnTargetConnect()。 前3行代码执行 RAM 初始化。 如果您不希望这样做、您可以将其注释掉或删除。

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

    我们已经能够按照您的建议读取内存并修改 GEL 文件。
    我们发现:
    •通过终端应用程序发送闪烁固件时、存储器映像与我们通过 JTAG 编程获得的映像相同、应用程序工作正常
    •向我们的标称固件发送终端应用程序时、应用程序不会启动。 连接到目标(并使用相同的 GEL 文件…)时、内存映像与我们使用 JTAG 编程时的映像相同、仅在前70%时(注意:回波中断的百分比相同)。
    •使用德州仪器 C2000串行闪存编程器应用发送我们的标称固件后、上传成功完成、但应用不会启动。 连接到目标(并使用相同的 GEL 文件…)、存储器完全填充0000:似乎 DSP 已复位:在任何情况下、引导 ROM 是否可以执行此复位?

    我们已尝试使用您建议的路径使用符号调试引导 ROM,但加载失败,并显示消息“Can't find a source file at "C:/work/grepos/bootrom/Boot_ROM/F2837x_bootROM-REVB/F2837x_bootROM_dev/F2837x_bootROM/cpu01-bootROM/source/c1brom_Init_Boot.asm”locate the file or edit the source lookup path to include its location"

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

    加载符号后、单击 Locate File 并将其指向/source 目录。 这将帮助您进行调试。

    C:\ti\c2000Ware_1_00_05_00\libraries\boot_rom\f2837xd\revB\rom_sources\F2837x_bootrom\cpu01-bootrom\source

    器件在启动 SCI 引导加载程序后复位的唯一方法是:1)获取错误的标头信息(0x08AA)、这会导致它分支到闪存入口点、 如果在没有编程的情况下分支到那里、则器件将获得非法指令 ISR 并复位、或者2)可能会获得一些错误的块信息并过早完成传输。

    我以前没有看到过这种情况,所以很难说出到底是什么原因造成这种情况。 但是、您应该能够使用引导 ROM 符号对其进行调试并快速找到问题、并将 CCS 指向源目录以调试和设置断点和单步执行等

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

    我们已经取得了进展。

    现在、我们可以验证我们的所有标称固件是否已在 RAM 中正确下载(我们已经验证了将其与通过 JTAG 下载的同一应用程序的映像进行比较)、并且在主代码中放置一个断点、我们可以逐步执行它。

    但是、当我们播放时、似乎 DSP 实际上已复位(这就是我们看到0000存储器的原因)、并且执行返回到引导 ROM 中、但仍在 c1brom_boot.c 文件的 WaitBoot()过程的无限循环中。

    由于应用程序(如果通过 JTAG 加载)始终正常工作、有什么可能会使 DSP 复位?

    谢谢、
    Nicola
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    很难知道是什么导致了复位。 您应该能够在加载后单步执行应用程序以查看。 您可以在条目地址设置断点、以便在成功加载后开始对其进行调试。

    是否确定您的整个应用程序已链接到 RAM? 没有任何东西会发生闪存?

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

    您好 Sal、

     

    从链接器文件中可以看到、闪存中没有任何内容。

    我们可能已经确定了问题。 为了实现这一点、我们已经消除了对更改应用的任何疑问:在通过代码禁用看门狗之后、一旦应用程序进入主代码、我们就会执行无限循环。 这样、我们的应用程序不会执行任何其他代码、但结果是相同的:应用程序启动、执行多次迭代(千次)、但最终我们在引导 ROM 中跳转。

    然后、我们发现、当应用程序通过引导 ROM 的串行方式上载时、实际上会禁用看门狗、因为我们的应用程序的十六进制文件不是从地址00000000开始、而是从地址00016837开始。 这里是我们的十六进制文件的开头。

    [1]
    AA 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 37 68 02 00
    00 00 00 00 00 41 00 EF 6C
    04 00 00 E0 9C 01 19 C3 56 FF 06 00
    

    在我们的映射文件中、我们可以找到链接到此地址的对象、即链接的 rts2800_fpu32.lib

    00016837  00000046    rts2800_fpu32.lib:boot.obj (.text)

     

    证明问题是这样的、如果我们在程序上载到 RAM 后使用调试修改跳转地址(例如、通过将返回的变量 EntryAddr = GetLongData ()输入00000000)、我们的应用程序将正确启动。

     

    现在:

    • 我们的构建过程中有什么问题? 我们如何才能在00000000启动我们的应用程序?
    • 为什么通过代码禁用看门狗似乎没有效果? 实际上、在 BOOR ROM 代码中执行此操作是通过专用的汇编器函数 wd_disableTM
    WD_DISABLE:
    SETC OBJMODE ;为28x 目标代码设置 OBJMODE
    EALLOW ;启用 EALLOW 受保护寄存器访问
    MOVZ DP,#7029h>>>6;设置 WDCR 寄存器的数据页
    MOV @7029h、#0068h;将 WDCR 中的 WDDIS 位置位以禁用 WD
    EDIS ;禁用 EALLOW 受保护的寄存器访问
    LB _c_int00 ;分支到 RTS 库中启动。_asm
    
    .endif
    

    此致、

    Nicola

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

    应确保在应用程序中包含 codestBranch.asm 文件、并将 codestart MEMORY 部分放置在0x00000或 BEGIN MEMORY 区域。

    这应将十六进制文件的入口点更改为0x00000。 否则、您可以在 CCS 工程属性中更改它。

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

    您好 Sal、

    我们已经解决了这个问题。
    我们发现、用于新项目的 CCS 未在 Build->C2000 Linker->Advanced Options -> Symbol Management 中设置--entry_point、-e 至'code_start'的规范、即使符号已在链接器文件中声明且所有代码均可用。

    我认为这有点误导,因为这种行为并不明显或直观(您的代码中有一个称为 code_start 的传统过程,但由于 IDE 选项,这实际上不是应用程序的入口点...)

    顺便说一下、我们如何能够避免这种错误? 应该阅读什么内容以及在哪里?

    此致、
    Nicola

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

    很高兴您能正常工作。 命令行选项/标志应该起作用。 它应该将该选项传递给代码生成工具。

    如果存在问题、您可以在代码生成工具论坛中找到原因。

    谢谢、
    SAL