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.

[参考译文] CCS/TMS320F2.8069万:加载cinit失败导致低功耗模式

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/635106/ccs-tms320f28069-failure-to-load-cinit-causing-low-power-mode

部件号:TMS320F2.8069万
主题: controlSUITE中讨论的其他部件

工具/软件:Code Composer Studio

每个人

我最近(实验)发现,如果没有正确加载Cinit,TMS320F2.8069万 将进入低功耗模式。 以下是如何发现这一点:

我目前正在测试我的自定义bootloader,它完全包含在A区中。如果应用程序代码不需要更新,则应用程序代码将被执行(在B区到H区中)。 my c_init00()函数, 它初始化cinit,位于A区。 与 bootloader关联的所有cinit变量都位于A区。但是 ,对于 应用程序代码,我在H区中留出了一个地址范围,可用于应用程序代码所需的cinits。 我使用链接程序命令文件执行此操作。

C2000十六进制实用程序将根据  链接器命令文件的排列顺序排列十六进制文件中的数据。 意思是,如果 我将cinits放在 链接程序命令文件的节部分的开头,那么这就是  将放在十六进制文件中的第一位。

当 在 引导加载过程中强制中断通信时,它将进入低功耗模式,但仅当通信中断在引导加载过程的早期发生时。 如果在任何其他时间发生,则不会进入低功耗模式。

我的问题是,如果cinit初始化失败,是否有设置或命令告诉MCU不要进入低功耗模式? 相反,是否有方法使其进入其他故障模式? 我问,因为如果它进入低功耗模式,它就不会启动到闪存。 相反,我必须强制它进入单独的引导模式 ,然后才能再次使用bootloader (对于字段发行版不可行)。

谢谢你。

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

    我已将我们的引导程序专家添加到此线程中,希望他能提供一些帮助。

    如何判断设备是否在低功耗模式下运行? 是否尝试连接到设备,调试器是否报告此错误?:"C28xx: Error connecting to the target:(error -1155 @ 0x0) Device may be operating in low power mode.(C28xx:连接到目标时出错:(错误-1155 0x0)设备可能正在低功耗模式下运行。) 重置设备,然后重试此操作。 如果错误仍然存在,请确认配置,关闭电路板电源后重启,和/或尝试更可靠的JTAG设置(例如,Lower TCLK)。 "

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

    标记

    感谢您的回复。 为了回答您的问题,我可以通过将设备连接 到 调试器来确定它处于低功耗模式。 它产生的错误与您在上面描述的错误完全相同。

    退出低功耗模式的唯一方法是拔下用于 确定开机启动模式的GPIO引脚之一。 之后,我可以使用JTAG端口加载。

    Syed

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

    Syed,

    您收到此错误是因为CCS无法连接到设备。 低功耗模式只是一种可能的情况。 当设备访问安全内存时,当ECSL跳闸JTAG连接时,您也会收到此错误。 您的ECSL密码(8字节CSM密码的一部分)是否已编程?

    此致,

    Manoj

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

    感谢您的回复。 我会试着找出这一点。 不过,我想我应该多说几个细节:

    我的项目的目标是能够在没有JTAG端口的情况下将新的应用程序代码加载到设备。 相反,用户应该能够使用串行连接加载。

    在我的CCS项目中,当主板启动到闪存时,主板会等待查看它是否接收到一组特定的字符(通过SCI)。 如果是,它将进入ROM中的SciBoot。 从该处,将controlSUITE中的修改版本"f2.8069万_flash_kernel"加载到RAM中。 controlSUITE和MY版本中的唯一主要区别是不擦除扇区A (因为这是确定是否启动bootloading的代码所在的位置)。

    然后,"f2.8069万_flash_kernel"将应用程序代码加载到flash。 为了澄清我前面提到的内容,如果我在flash_kernel尝试加载十六进制文件的cinit部分时切断了计算机和TMS320F2.8069万之间的通信,那么我将无法重新启动启动加载过程或使用CCS进行连接。 但是,如果我在加载cinit后中断通信,我仍然可以重新尝试启动加载程序,并且可以使用JTAG端口连接到CCS。

    由于我能够使用JTAG端口正常连接至CCS,因此我假定ECSL密码通常正在编程。 但是,在这种边缘情况下,我想知道ECSL密码是否无法编程,因为它需要cinit中的一些全局变量。 这就是为什么通常不会发生这种情况的原因。 我会尝试进行一些挖掘,看看ECSL编程的位置(如果有的话)。

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

    Manoj

    首先,我无法确定在 发生此错误时,ECSL是否正在进行电源循环编程。 问题是,当出现该错误时,我无法使用调试器来确定它是否已成功解锁。

    其次,我要强调,即使我不使用JTAG,也会发生此问题。 也就是说, 当与计算机的唯一连接是串行连接(SCI)时,就会发生这种情况。 如果我在闪存内核加载cinits时中断此通信,然后重启主板,我无法使用串行连接重新连接到主板。 但是,如果我在任何其他时间中断通信,例如当闪存内核加载十六进制文件的.text部分时,我仍然可以在关闭电源后使用串行连接连接到设备。 此外,使用bootloader完全加载程序后,无论我重启设备多少次,它都不会进入低功耗模式。

    因此,我认为闪光灯不会被锁定。 毕竟,它实际上是锁定了设备, 它每次都应该这样做,即使bootloader成功地将代码加载到闪存中也是如此。  此外,我检查了我的代码,并且没有使用密码来锁定闪存(密码仍设置为defaut FFFF)。

    基本上,在我看来,芯片中有一个错误,如果没有填充cinits,设备将进入低功耗模式。 当它执行此操作时,我无法重新尝试引导加载程序。 尽管我知道如何使其脱离低功耗模式(拔下 用于确定启动模式的GPIO引脚之一),但我的大多数设备用户都不知道如何执行此操作。  此外,此设备的用户将无法访问JTAG端口。

    我的问题是:如何确保 F2.8069万 不会进入低功耗模式,即使 没有完全填充cinits?

    Syed  

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

    Syed,

    设备不应仅因为在.cinit十六进制代码过程中通信中断而进入低功耗模式。 我的理解是,您声称设备处于低功耗模式,因为CCS在连接时报告为低功耗模式。 您是否检查了VDDIO/VDD上的电源电流以确认您是否处于低功率模式? 如果电源电流没有下降,则确认设备处于低功耗模式还为时过早。

    另外,ECSL密码是CSM密码的一部分,我们需要知道在Sector-A的最后八个位置(0x3F7FF8 - 0x3F7FFF)中编程了什么。 连接到锁定设备上的CCS的一种方法是使设备处于等待引导模式。 您可以通过将GPIO37设置为高,GPIO34设置为低,使设备处于等待引导模式。 连接到设备后,请提供0x3F7FF8 - 0x3F7FFF的内容。

    此致,

    Manoj

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

    Manoj

    很抱歉未能尽快回复您。 当我中断启动加载程序时,它正在将煤渣加载到闪存中,然后再重新启动,主板总共消耗了48mA的电流。 明确地说,这是我无法使用引导加载程序或JTAG端口将代码重新加载到闪存的情况(启动时操作GPIO34和37除外)。

    关于 第二点, 在将主板置于等待启动后,我发现所有八 个位置都有FFFF。 这与 错误不 存在且引导加载程序成功时的正常情况匹配。

    这两种结果似乎相互矛盾。  由于电流消耗较高,它似乎不太可能处于低功率模式。 但是,我 怀疑闪存是否已锁定,因为密码与通常的密码没有什么不同。

    除了低功耗模式或 锁定的设备之外,是否还有其他任何可能生成该错误代码的设备?

    谢谢。

    Syed  

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

    我认为这是您的应用程序代码问题,而不是设备问题。

    您是否有任何代码部分会擦除扇区A? 我想知道sectora的擦除操作是否被中断。 这也可能会锁定您的设备并给出以下错误:

    "C28xx:连接到目标时出错:(错误-1155 @ 0x0)设备可能在低功耗模式下运行。 重置设备,然后重试此操作。 如果错误仍然存在,请确认配置,关闭电路板电源后重启,和/或尝试更可靠的JTAG设置(例如,Lower TCLK)。 "

    收到此错误时,您是否检查了闪存是否损坏? 此外,您是否对十六进制文件中的cinit变量位置进行了重新排序?

    此外,开机时会发生什么情况? 您是否尝试过单步执行代码以了解发生的情况?

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

    Manoj

    1.代码的任何部分都不会擦除闪存扇区A。闪存内核擦除除扇区A以外的所有扇区。在任何情况下,都不应擦除扇区A。 由于它包含启动引导加载过程的代码,因此永远不应将其擦除。 另外,十六进制文件在扇区A内不包含地址。我是通过进入C2000十六进制实用程序的属性并 在链接器命令文件中列出与 扇区A地址对应的部分来实现这一目的的。   然后,当CCS生成十六进制文件时,此功能将从十六进制文件中排除这些部分。  因此,假设某种东西正在擦除闪存扇区A,即使引导加载程序成功,它也永远不会启动。 这种情况没有发生。 当引导加载程序成功时,应用程序代码和电路板的运行正常,就像使用JTAG和CCS下载一样。

    我还应该注意,当闪存内核擦除完毕后,它会向主机发送一个特殊字符,表示已擦除闪存。 只有这样,主机计算机才会尝试发送需要在闪存中编程的数据。

    2.我已经检查了引导加载程序成功时和出现错误时的两种情况的闪存。 引导加载程序成功时,闪存将与项目中指定的内容匹配。 当发生错误时,它会显示不一致发生在电影的地址范围内。 闪存扇区A仍匹配。

    3.电影始终位于十六进制文件的开头。 cinits的起始地址和范围在链接程序命令文件中指定。 我还对链接程序命令文件进行了排列,以便生成十六进制文件时,电影始终排在第一位。 每当我重建项目时,我还会手动打开十六进制以检查并确保情况确实如此。

    4.正常开机时,它应等待检测来自主机的串行数据。 如果没有任何反应,则应转到应用程序代码。 但是,当错误发生时,开机时,它甚至不会尝试查找串行数据。 我知道这是因为我激活了主板上的一个LED,它在引导加载程序等待期间保持亮起。 该代码等待7秒钟,然后转至应用程序代码。 但是,在开机时,LED甚至不会亮起。  在_c_init00中发生了一个事情,当cinit表不完整时,它将进入这种状态。 我的猜测是,当端点零未编程到中时,它可能会将0xFFFFFFFF解释为内存位置。 当它尝试转到此位置时,会发生错误,因为它显然不是内存映射的一部分。 我没有rts2800_fpu32的源代码,因此我无法确定。 但是,我确实可以访问rts2800_BL (从controlSUITE),它看起来像是基于boot28.asm的汇编代码。这可能是可能的。

    5.发生错误时,无法单步完成此操作。 我尝试过很多次,但似乎不可能。 即使我将其置于等待启动状态,CCS允许我做的只是检查闪存。 我无法逐步执行代码。

    基于所有这些,我认为可能有两个变通办法:

    选项1:在闪存内核中,擦除扇区B-H后,但在开始加载cinits之前,在紧位于cinits内存范围之后的内存范围中添加零。 这样,即使cinits没有完成加载,引导例程仍将看到它认为是端接零的内容。  我可以修改链接程序命令文件,以确保零所在的位置没有cinits (即不要尝试写入未擦除的地址)。  这在理论上应允许行李箱完成,并将手控板置于闪存代码的开始部分。 这将允许用户在启动时重试引导加载程序。

    选项2:如果我可以保留rts2800_fpu32,我可以修改汇编代码的cinit部分,使其在闪存范围之外时不使用地址(例如不存在的地址 0xFFFFFFFF)。  然后我可以使用此库代替正常的rts2800库。

    Syed  

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

    我忘了提到我正在测试选项1。 如果您有任何其他基于我在这里提到的内容的建议,请告诉我。

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

    如果您能够连接到设备,您应该能够单步完成代码。 您看到的是什么问题?

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

    我唯一可以连接到设备的方法是将其置于等待模式。 执行此操作后,我可以看到闪存的内容,但CCS不允许我逐步完成项目(这些按钮将灰显并禁用)。 我会再试一次以确定,但这至少发生在我身上五次。

    我看到的问题是我上面描述的:如果下载在加载电影过程中中断,那么当我关闭并重新打开设备时,它将不允许我重新尝试我的引导加载程序。 它也不允许我使用JTAG和CCS连接到它,而不操作GPIO引脚将其置于GetMode之外的其他状态。 但是,如果我在任何其他点中断闪存下载,我仍然可以在关闭电源后重新尝试启动加载程序。

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

    如果您不对任何CSM密码进行编程(例如,当闪存0x3F7FF8 - 0x3F7FFF的最后八个位置都是0xFFFFs时),则连接设备不会有任何问题。 此外,在以前的消息中,您确认了扇区A从未被擦除,也从未被破坏,无论您是否看到cinit错误。 因此,如果使用SCI查找特定字符的应用程序代码是在sectora中编程的,则应该能够重新引导/重新编程,而不会出现任何问题。 因此,我们显然在这里缺少一些关键信息。

    您是否绝对确定设备已正确通电? 另外,您使用的是哪个版本的CCS? 因为在CCS7上,当设备安全时,我的调试器按钮不会呈灰色显示。

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

    Manoj

    正确,查找特殊字符的代码仅在扇区A中。但是,在该扇区之前,会运行boot28.asm。 从controlSUITE查看rts2800_BL中的代码,如果没有端接零,则boot将继续尝试将变量加载到RAM中。

    由于 电影是从位于外部的扇区加载的,因此所有地址中可能都有FFFF,而不是实际地址(FFFF位于内容已被擦除的地址位置)。 此外,可能不存在端接零,因为擦除和端接零编程之间发生通信丢失。 因此,如果扇区B-H的擦除功能成功,但未加载cinits (重要的是没有端接零),则可能会出现严重问题。

    为了检验这一理论,我尝试了我先前评论中的备选案文1。 在这里,我在链接程序命令文件中指定的内存范围的底部0x200地址中置零。 更具体地说,我的cinits的起始值为0x3D8500,范围指定为0xA00。 在闪存内核中,擦除功能成功后,我以0编程,从地址0x3D8D00开始,到0x3D8F00结束。 只有在完成此操作后,固件才会向PC发送一个字符,表示它已准备好接收数据。 然后,PC应用程序开始发送数据(先采集)。 此时我中断了通信。

    现在,当我重启时,我可以重新启动我的引导加载程序。 此外,我还可以使用JTAG端口和CCS连接到主板(如果我选择这样做)。

    我认为这非常明确地证明,如果没有cinit表的端点零(如果在正确的时间中断编程,则可能会发生这种情况),那么当TMS320F2.8069万重新启动时,就会出现错误。 同样,这可能是因为 rts2800将0xFFFFFFFF解释为导致错误的实际地址。

    因此,A区和查找字符的初始代码基本上是可以的。 但是,在此之前运行的rts2800对cinit表的一致性很敏感(不在扇区A中)。 这可能会导致故障。

    基于此,我似乎可以进入boot28.asm并添加几行来检查地址0xFFFFFFF (如果找到它,则忽略它),如果它到达闪存的末尾(如果没有找到终端零),则停止。 这样可以解决我的问题。

    是否有用于rts2800_fpu32的源代码? 我只能找到rts2800_bl.

    最后,我使用6.2。

    Syed

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

    Syed,

    rts2800_fpu32的源文件可在以下路径中找到:-

    <ccsv6>\tools\compiler\latest-compiler-version\lib

    此致,

    Manoj

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

    Syed,

    我从软件团队那里得到了确认,您可以修改boot28.asm。 请遵循以下链接中提到的步骤。

    此致,

    Manoj

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

    我可以关闭此线程吗? 我相信你能够解决电影问题。

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

    是的,请继续并关闭此线程。 我将修改rts2800库的说明标记为解决方案,以防将来任何其他人遇到相同的问题。

    我实施了这一变革,并使其发挥作用。 我唯一要添加的是rts2800库需要写入一个特殊值到辅助寄存器,该寄存器指示cinit在移至main之前是否正确初始化。 Main随后将检查此寄存器,并确定是留在bootloader中还是转到应用程序代码。

    Syed