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.

[参考译文] TMS320F280045:在调试未激活的情况下、代码不会启动

Guru**** 2393325 points
Other Parts Discussed in Thread: TMS320F280049C, TM4C1292NCPDT, TMS320F280045

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1164086/tms320f280045-code-does-not-start-without-debug-active

器件型号:TMS320F280045
主题中讨论的其他器件:TMS320F280049CTM4C1292NCPDT

尊敬的 Sirs

与相关帖子"调试器未激活时应用程序无法启动"一样、我的代码在电源复位时不会运行。  请参阅下面的配置。   

                  

MEMORY
{
PAGE 0 :
   /* BEGIN is used for the "boot to Flash" bootloader mode   */

   BEGIN           	: origin = 0x080000, length = 0x000002
   RAMM0           	: origin = 0x0000F6, length = 0x00030A

   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
   RESET           	: origin = 0x3FFFC0, length = 0x000002

   /* Flash sectors */
   /* BANK 0 */
   FLASH_BANK0_SEC0  : origin = 0x080002, length = 0x000FFE	/* on-chip Flash */
   FLASH_BANK0_SEC1  : origin = 0x081000, length = 0x001000	/* on-chip Flash */
   FLASH_BANK0_SEC2  : origin = 0x082000, length = 0x001000	/* on-chip Flash */
   FLASH_BANK0_SEC3  : origin = 0x083000, length = 0x001000	/* on-chip Flash */
   FLASH_BANK0_SEC4  : origin = 0x084000, length = 0x001000	/* on-chip Flash */
   FLASH_BANK0_SEC5  : origin = 0x085000, length = 0x001000	/* on-chip Flash */
   FLASH_BANK0_SEC6  : origin = 0x086000, length = 0x001000	/* on-chip Flash */
   FLASH_BANK0_SEC7  : origin = 0x087000, length = 0x001000	/* on-chip Flash */
   FLASH_BANK0_SEC8  : origin = 0x088000, length = 0x001000	/* on-chip Flash */
   FLASH_BANK0_SEC9  : origin = 0x089000, length = 0x001000	/* on-chip Flash */
   FLASH_BANK0_SEC10 : origin = 0x08A000, length = 0x001000	/* on-chip Flash */
   FLASH_BANK0_SEC11 : origin = 0x08B000, length = 0x001000	/* on-chip Flash */
   FLASH_BANK0_SEC12 : origin = 0x08C000, length = 0x001000	/* on-chip Flash */
   FLASH_BANK0_SEC13 : origin = 0x08D000, length = 0x001000	/* on-chip Flash */
   FLASH_BANK0_SEC14 : origin = 0x08E000, length = 0x001000	/* on-chip Flash */
   FLASH_BANK0_SEC15 : origin = 0x08F000, length = 0x001000	/* on-chip Flash */

   /* BANK 1 */
   FLASH_BANK1_SEC0  : origin = 0x090000, length = 0x001000	/* on-chip Flash */
   FLASH_BANK1_SEC1  : origin = 0x091000, length = 0x001000	/* on-chip Flash */
   FLASH_BANK1_SEC2  : origin = 0x092000, length = 0x001000	/* on-chip Flash */
   FLASH_BANK1_SEC3  : origin = 0x093000, length = 0x001000	/* on-chip Flash */
   FLASH_BANK1_SEC4  : origin = 0x094000, length = 0x001000	/* on-chip Flash */
   FLASH_BANK1_SEC5  : origin = 0x095000, length = 0x001000	/* on-chip Flash */
   FLASH_BANK1_SEC6  : origin = 0x096000, length = 0x001000	/* on-chip Flash */
   FLASH_BANK1_SEC7  : origin = 0x097000, length = 0x001000	/* on-chip Flash */
   FLASH_BANK1_SEC8  : origin = 0x098000, length = 0x001000	/* on-chip Flash */
   FLASH_BANK1_SEC9  : origin = 0x099000, length = 0x001000	/* on-chip Flash */
   FLASH_BANK1_SEC10 : origin = 0x09A000, length = 0x001000	/* on-chip Flash */
   FLASH_BANK1_SEC11 : origin = 0x09B000, length = 0x001000	/* on-chip Flash */
   FLASH_BANK1_SEC12 : origin = 0x09C000, length = 0x001000	/* on-chip Flash */
   FLASH_BANK1_SEC13 : origin = 0x09D000, length = 0x001000	/* on-chip Flash */
   FLASH_BANK1_SEC14 : origin = 0x09E000, length = 0x001000	/* on-chip Flash */
   FLASH_BANK1_SEC15 : origin = 0x09F000, length = 0x000FF0	/* on-chip Flash */

//   FLASH_BANK1_SEC15_RSVD : origin = 0x09FFF0, length = 0x000010  /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */

PAGE 1 :

   BOOT_RSVD       : origin = 0x000002, length = 0x0000F1     /* Part of M0, BOOT rom will use this for stack */
   RAMM1           : origin = 0x000400, length = 0x0003F8     /* on-chip RAM block M1 */
//   RAMM1_RSVD      : origin = 0x0007F8, length = 0x000008     /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */

   RAMLS5      : origin = 0x00A800, length = 0x000800
   RAMLS6      : origin = 0x00B000, length = 0x000800
   RAMLS7      : origin = 0x00B800, length = 0x000800

   RAMGS0      : origin = 0x00C000, length = 0x002000
   RAMGS1      : origin = 0x00E000, length = 0x002000
   RAMGS2      : origin = 0x010000, length = 0x002000
   RAMGS3      : origin = 0x012000, length = 0x001FF8
//   RAMGS3_RSVD : origin = 0x013FF8, length = 0x000008     /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */
}


SECTIONS
{
   codestart        : > BEGIN,     PAGE = 0, ALIGN(4)
   .text            : >> FLASH_BANK0_SEC2 | FLASH_BANK0_SEC3 | FLASH_BANK0_SEC5,   PAGE = 0, ALIGN(4)
   .cinit           : > FLASH_BANK0_SEC1,     PAGE = 0, ALIGN(4)
   .switch          : > FLASH_BANK0_SEC1,     PAGE = 0, ALIGN(4)
   .reset           : > RESET,     PAGE = 0, TYPE = DSECT /* not used, */

   .stack           : > RAMM1,     PAGE = 1

#if defined(__TI_EABI__)
   .init_array      : > FLASH_BANK0_SEC1,       PAGE = 0,       ALIGN(4)
   .bss             : > RAMLS5,       PAGE = 1
   .bss:output      : > RAMLS3,       PAGE = 0
   .bss:cio         : > RAMLS0,       PAGE = 0
   .data            : > RAMLS5,       PAGE = 1
   .sysmem          : > RAMLS5,       PAGE = 1
   /* Initalized sections go in Flash */
   .const           : > FLASH_BANK0_SEC4,       PAGE = 0,       ALIGN(4)
#else
   .pinit           : > FLASH_BANK0_SEC1,       PAGE = 0,       ALIGN(4)
   .ebss            : > RAMLS5,       PAGE = 1
   .esysmem         : > RAMLS5,       PAGE = 1
   .cio             : > RAMLS0,       PAGE = 0
   .econst          : > FLASH_BANK0_SEC4,    PAGE = 0, ALIGN(4)
#endif

   ramgs0           : > RAMGS0,    PAGE = 1
   ramgs1           : > RAMGS1,    PAGE = 1

 
#if defined(__TI_EABI__) 
   .TI.ramfunc      : LOAD = FLASH_BANK0_SEC1,
                      RUN = RAMLS0,
                      LOAD_START(RamfuncsLoadStart),
                      LOAD_SIZE(RamfuncsLoadSize),
                      LOAD_END(RamfuncsLoadEnd),
                      RUN_START(RamfuncsRunStart),
                      RUN_SIZE(RamfuncsRunSize),
                      RUN_END(RamfuncsRunEnd),
                      PAGE = 0, ALIGN(4)
#else					  
   .TI.ramfunc      : LOAD = FLASH_BANK0_SEC1,
                      RUN = RAMLS0,
                      LOAD_START(_RamfuncsLoadStart),
                      LOAD_SIZE(_RamfuncsLoadSize),
                      LOAD_END(_RamfuncsLoadEnd),
                      RUN_START(_RamfuncsRunStart),
                      RUN_SIZE(_RamfuncsRunSize),
                      RUN_END(_RamfuncsRunEnd),
                      PAGE = 0, ALIGN(4)
#endif

}

/*
//===========================================================================
// End of file.
//===========================================================================
*/
        

我没有运行引导加载程序。  我注意到 begin:origin 从0x080000开始。  我本以为它应该从0x000000开始。  我已经尝试过280045_flash_lnk.cmd 文件、但出现链接器错误、表示代码不适合存储器。  我注意到"Variant and core:Setting (变量和内核:设置)"是 TMS320F280049C。  下拉列表显示为灰色、因此我无法更改它。  如您所见、UC 已切换到 TMC320F280045_56RSH。  这会对存储器映射产生什么影响吗?  请帮助。  谢谢你。

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

    您好!

    如何验证您的代码未运行?

    您是否曾尝试将调试器连接到正在运行的器件(即、没有对闪存进行编程、没有复位但仅停止)、并看到什么奇怪?

    如果代码处理器已输入并保留启动初始化代码、您可以查看代码处理器中的停止位置(PC 寄存器、分解图)。  

    此致、
    Piotr Romaniuk

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

    感谢 Piotr 的回应。

    Dennis:让我们知道您是谁在检查该功能。

    谢谢、此致、

    桑托什

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

    尊敬的 Romanluk 先生

    [引用 userid="64714" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1164086/tms320f280045-code-does-not-start-without-debug-active/4378641 #4378641"]如何验证代码是否未运行?[/quot]

    很抱歉我迟到了。  我已经离开办公室三天了。  让我来运行我的设置。  我有两个板彼此通信。  一个是 SPI 从器件、另一个是主器件。  从设备是数据采集板、主板收集数据并通过 RS485通信线路将其发送到笔记本电脑。  步骤如下。  从器件向主器件发送数据就绪脉冲、这将触发主器件中的中断。  然后主器件开始 SPI 数据传输。  数据传输完成后、主器件会将数据发送到笔记本电脑、并将其存储在文件中。  从板使用 TMS320F280045 uC、主板使用 TM4C1292NCPDT uC。  我知道主板正在启动并在加电时运行、因为它会在加电时向笔记本电脑发送前导码。  我在终端应用中观察到这一点。  我正在将 Spectrum Digital XDS200 JTAG 仿真器用于这两个板。  我不会同时连接两个仿真器。  将仿真器连接到从器件后、我将代码下载到并启动调试会话。  从设备启动数据采集、从设备和主设备按应有的方式进行通信 、主设备将数据发送到笔记本电脑。  当我返回到代码编辑器模式时、这两个板将继续正常运行。  在两个板运行时、我已从从器件上断开仿真器、它们继续运行。  但是、如果我现在循环通电、则从板不会引导。  我看到了主前导码、但没有数据。  保持仿真器连接无效。   

    [引用 userid="64714" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1164086/tms320f280045-code-does-not-start-without-debug-active/4378641 #4378641"]

    您是否曾尝试将调试器连接到正在运行的器件(即、没有对闪存进行编程、没有复位但仅停止)、并看到什么奇怪?

    如果代码处理器已输入并保留启动初始化代码、您可以查看代码处理器中的停止位置(PC 寄存器、分解图)。  

    [/报价]

    我不确定您希望我在这里做什么。  在我可以查看停止点和寄存器的状态下、有什么过程?  您说我下载 代码、启动调试会话、然后在调试会话期间对电路板进行下电上电吗?   

    在链接器命令文件中看到0x00800000处的起始地址会导致我认为这是问题所在。  我应该再次认为它应该从0x00000000开始。   我已经尝试过280045_flash_lnk.cmd 文件、该文件的起始地址为0x00000000、但链接器错误提示代码不适合存储器。  您对此有何看法。  谢谢你。

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

    尊敬的 McGlumphy 先生:

    让我从您的回答的最后部分开始:

    [引用 userid="347627" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1164086/tms320f280045-code-does-not-start-without-debug-active/4384522 #4384522">在链接器命令文件中看到0x00800000处的起始地址会让我相信这就是问题所在。  我应该再次认为它应该从0x00000000开始。   我已经尝试过280045_flash_lnk.cmd 文件、该文件的起始地址为0x00000000、但链接器错误提示代码不适合存储器。

    正如您看到的、闪存从0x80000开始、因此在链接器文件中这是正确的。

    请验证您是否已在硬件中选择闪存引导-您需要在上电时具有:GPIO24=1、GPIO32=1 (请参阅表8-13 p.198 https://www.ti.com/lit/gpn/tms320f280045)。  

    当我的起始地址与闪存的起始地址不同时、我遇到了类似的问题-如果你真的为0x80000构建程序、请检查它。  它可以与仿真器配合使用、但在独立运行时无法启动。

    您还可以通过仿真器验证0x80000处的内容。 您的启动代码应该有分支指令。

    此致、

    Piotr Romaniuk

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="347627" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1164086/tms320f280045-code-does-not-start-without-debug-active/4384522 #4384522">我不确定您希望我在这里做什么。  在我可以查看停止点和寄存器的状态下、有什么过程?  您说我下载 代码、启动调试会话、然后在调试会话期间对电路板进行下电上电吗?   [/报价]

    如果您有一些与仿真器相关的异常行为(此处:如果已连接并启动程序)、则不需要干扰处理器的状态。 我想您可以尝试如下所示:

    1. 将您的软件编程到闪存中、
    2. 断开仿真器(硬件连接)、
    3. 循环通电
    4. 您可以在此处观察问题的系统
    5. 将仿真器连接到电路板、
    6. 现在、您需要连接调试器(软件)、但不要重置 CPU、也不要对其进行编程。 它应该暂停 CPU  
    7. 您将能够观察执行停滞的位置(存储器类型、地址)、其他寄存器的状态

    首先,我建议您在软件运行正常并再次连接时断开调试器(CCS 的调试视图,图标“连接目标”)(但不关闭它),检查设置是否正确。 您将能够验证是否具有[7]。 不应进行复位或重新启动。  

    现在、让我为您介绍如何在连接模式下连接调试器:

    方法1. -使用自定义调试配置设置、只加载符号而不是编程。
    应在 CCS 的 GUI 中提供手动方法2中的所有步骤。 不幸的是 、我遇到了问题。

    方法2. -逐步配置:

    1. 打开调试器视图(尚未启动调试器)、
    2. 打开视图|目标配置  
    3. 查找您的当前配置、并在鼠标右键按钮菜单中选择"启动所选配置"、
      1. 如果成功、您将在"Debug"视图中看到 CPU 的内核/内核
    4. 在"Debug"视图中选择您的 CPU
    5. 单击 Connect Target 图标  

    如果您的 CPU 将复位、您可能需要修改目标配置中的 GEL 文件。 我刚刚删除了复位、启动时清理内存等

    此致、

    Piotr Romaniuk

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

    尊敬的 Romanluk 先生

    我的设计未连接 GPIO24和 GPIO32。  我认为这是问题所在。  我是否可以通过弱上拉电阻器来初始化这些 GPIO、从而获得闪存引导模式配置?  我不在该板上使用这些 GPIO。  但是、如果我需要这些 GPIO、我将如何在应用程序中将它们用于闪存引导模式和 GPIO?   

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

    尊敬的 McGlumphy 先生:

    [引用 userid="347627" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1164086/tms320f280045-code-does-not-start-without-debug-active/4385055 #4385055"]我是否可以通过弱上拉电阻器初始化这些 GPIO 以获取闪存引导模式配置?  [/报价]

    我不喜欢。 这是引导顺序的早期阶段(如果您漂移、请参阅技术参考中的引导顺序说明)。

    您需要通过电气连接将其上拉至电源、例如通过两个10k 电阻器。  请记住、只有在启用电源时(仅此时)才需要提供这些上拉电阻。 您无需焊接任何东西。  请尝试验证原因是否正确。  

    [引用 userid="347627" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1164086/tms320f280045-code-does-not-start-without-debug-active/4385055 #4385055">但如果我需要这些 GPIO、我如何在应用程序中将它们用于闪存引导模式和 GPIO?   [/报价]

    我不确定您是否可以在 GPIO 上删除此引导选择函数。 有很多 GPIO 引脚。
    可以(我知道它来自类似的 C2000芯片;您需要在芯片的文档中确认)将它们移动到另一个 GPIO。 它涉及 OTP 编程(一个! 时间编程)存储器- Z1_BOOTCTRL。 它是不可撤销的、所以不要这样做、除非你真的需要这个并且你知道你在做什么。  

    此致、

    Piotr Romaniuk

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

    我在 GPIO 引脚24和32上施加了10K 上拉电阻器。  这是一个真正的痛苦,但现在 UC 从闪存启动。  感谢你的帮助。

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

    尊敬的 McGlumphy 先生:

    我很高兴问题得到解决。

    您能否将我的消息标记为我建议将引导输入上拉为解决方案?
    我希望我能为此赢得一些积分。

    此致、

    Piotr Romaniuk

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

    尊敬的 Romanluk 先生

    [引用 userid="64714" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1164086/tms320f280045-code-does-not-start-without-debug-active/4384717 #4384717">请验证您在硬件中选择了闪存启动-您需要在上电时具有:GPIO24=1、GPIO32=1 (请参阅表8-13 p.198 https://www.ti.com/lit/gpn/tms320f280045).
    yan li10 说:
    我没有这样的配置。 这是引导顺序的早期阶段(如果您漂移、请参阅技术参考中的引导顺序说明)。

    感谢您指出这一点。  该文本并未说明这些 GPIO 引脚对于引导配置绝对是必需的。  我认为可能还有另一种方法。