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.

[参考译文] TMS570LC4357:这是一个合法的 HET 程序、HET 启动问题

Guru**** 2457950 points
Other Parts Discussed in Thread: HALCOGEN, TMS570LS1224

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1183156/tms570lc4357-is-this-a-legitimate-het-program-het-start-up-issues

器件型号:TMS570LC4357
主题中讨论的其他器件:HALCOGENTMS570LS1224

多篇文章提到、以下 HET 指令将在 HET1_4和 HET1_23上生成两个1 PPS 信号、LR 为1.6微秒...

l0 CNT{reg=a、max=624999、data=0};
L1 ECMP{hr_lr=low、en_pin_action=on、pin=4、action=PULSEHI、reg=a、irq=on、data=312500、hr_data=0};
L2 CNT{reg=B、max=624999、data=0};
L3 ECMP{hr_lr=low、en_pin_action=on、pin=23、action=PULSEHI、reg=B、IRQ=on、data=312500、hr_data=0};

但是、我无法可靠地看到这种情况、因为有时我会看到50%占空比为1秒的时钟、而其他时候我会看到没有时钟或"随机"(占空比或周期)时钟。 这是在我刚刚使用 CCS 下载映像之后。  实际上、我必须对 Launchpad 电路板进行下电上电、以便完全启动 HET1时钟。

我怀疑 Rega 和 regB 需要显式初始化、或者没有进行某些此类初始化。  hetInit()始终以相同的方式调用。  HET IDE 在启动时显示所有设置为0的寄存器、但我猜这只能在仿真器中触发、或者某些(实际)"硬件"信号触发它(加电时?) 而不是通过 hetInit()完成的操作。

如果能有任何见解,将不胜感激。  谢谢。

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

    这与我之前多次看到的旧 HET 引擎问题相同、但行为略有不同。  基本上、HET 的 Halcogen 配置被混乱。  我能够摆脱这种情况(仅限)、方法是启用 PWM 执行更多或更少的相同操作、然后禁用 PWM。  显然、PWM 机制在 Halcogen 中接线一些东西、使 HET 时钟在启动时正常运行。  当我禁用 PWM 并返回 HET 本身时、该接线保持在位并且 HET 引擎按预期启动。

    在执行一些构建/运行后、此行为消失、情况再次发生。  可能会在硬件中连接某些设备、并一直保留到加载了一些新映像或一些代码擦除该布线为止。

    当然、我很想知道发生了什么、因为当这种行为不被充分理解时、这种行为非常可怕。

    如果能在这方面提供任何帮助,将不胜感激。

    谢谢。

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

    对于 HET 引擎、似乎存在不良的错误/限制。  按照以下说明、可以预期 L0+L1在引脚4上生成1 PPS 时钟、而 L2+L3在引脚23上生成另一个1 PPS 时钟。  这两个时钟确实会生成、但引脚23的时钟将在几秒钟到几分钟后消失。  我已经尝试用 reg=T 替代 reg=B、它似乎进一步扩展了故障点、但第二个时钟最终将失败。

    l0 CNT{reg=a、max=624999、data=0};
    L1 ECMP{NEX=L2、hr_LR=LOW、en_PIN_ACTION = ON、PIN=4、ACTION = PULSEHI、reg = A、IRQ=ON、DATA=312500、hr_DATA=0};
    L2 CNT{reg=B、max=624999、data=0};
    L3 ECMP{NEX=L0、hr_LR=LOW、en_PIN_ACTION = ON、PIN=23、ACTION = PULSEHI、reg =B、IRQ=ON、DATA=312500、hr_DATA=0};

    我认为这方面没有任何解决办法、但请告诉我其他想法/可能性。

    谢谢。

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

    当 PWM 正在使用时(而不是 HET)、看起来没有启动的 HET 引擎与对 pwmStart()的调用相关。  不知怎么说,pwmStart()会留下一些“静态”的东西,以便 HET 引擎可以将其用作(不可靠)的副作用。

    一个简单的修复方法是编写一个 hetStart()函数,因此...

    //与 pwmStart()相同
    void hetStart (hetRAMBASE_t * hetRAM、uint32 PWM)

    hetRAM->指令[(PWM << 1U)+ 41U].Control |= 0x00400000U;

    然后在 hetInit()之后立即调用它...

    hetInit();
    hetStart (hetRAM1,0 /*pwm0*/);

    这可确保 HET (HET1)引擎启动。

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

    您是否将代码复制到 HET RAM?

    缺省情况下,HALCOGen 生成的 hetInit()将 HALCOGen HET 代码复制到 HET RAM 中。

    (void) memcpy ((void *) hetRAM1、(const void *) het1PROGRAM、sizeof (het1PROGRAM));

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

    您好!

    我想 hetInit()实现了 memcpy()。  正如我提到过的、这是"不稳定的"、因为在我使用的 PWM 之后的几个 HET (-only)构建可以正常工作、但在某些情况下、较新的 HET 构建无法正确启动。

    如果我明确添加了 hetStart()函数(它只是 pwmInit()),那么 HET (HET1)启动工作正常(始终如一)。  HET2程序似乎一直正常启动。

    不知道为什么需要 hetStart(),但它一直对我来说运行良好。

    谢谢。

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

    哦、我知道 HET (-only)在我使用的 PWM 工作之后构建、因为 HET 生成的时钟"准确"、而 PWM 生成的时钟"近似"。  我知道 HET 程序取代了 PWM 程序。

    谢谢。

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

    我"想"我知道我为什么会经历这样的怪球行为。  我注意到、由于我经常执行闪存擦除(Properties->Debug->Flash_Settings)来只擦除"只需要扇区(用于程序加载)"、因此 HET 程序有时(一段时间后)不能正确加载/启动。  如果我擦除"整个闪存"、至少在引入"新"(而不是"递增修订")项目时、HET 程序才会正确启动。  我现在不能肯定地说这一点,因为这只是对几次闪烁的观察。  即使 HET 一开始就失败了、使用"只需要必要的扇区"、它只是偶尔/不可预测的。

    正如我之前提到的,我能够通过切换到使用 PWM/pwmInit()然后返回 HET 来“修复”我的故障/卡住的情况。  PWM 不执行 HET 操作、但完全闪存擦除可能会弥补这一点。

    如果有人对有关 HET 程序加载和启动的闪存布局和执行序列有更深入的了解、请告诉我我我的观察结果是否有价值。

    非常感谢。

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

    当"只需要扇区"被选中时、程序所需的闪存扇区(在映射文件中)是否被擦除? 并加载了新程序?

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

    是否在 CCS 工程属性中选择了正确的器件名称?

    如果使用了 LC43x 板、但在 CCS 中选择了 LS31x 器 件、则选择"仅必要扇区"选项可能不会擦除程序所需的所有扇区。

    LS3137上闪存的前四个扇区的大小为32KB

    LC43x 上前四个闪存扇区的大小为16KB。

    如果代码大小为120KB、则仅擦除4个小于映像大小的扇区(64KB 与120KB)。  

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

    "Variant and core"设置为"TMS570LC43xx"。

    遗憾的是、完全擦除闪存没有任何影响。  昨天我切换到了总是擦除"整个闪存"、并且在经过很多构建/加载周期后昨天没有看到任何问题。  但是、我今天再次看到问题(HET1未运行)。

    我必须返回运行我的独立项目一次,并使用它在相关的 Halcogen PWM 设置下运行 pwmStart(),然后返回到使用 HET。

    就好像 PWM 在电路板上执行一些非易失性硬件更改、HET 设施随后会利用这些更改。

    我真的需要弄清楚如何可靠地加载和运行 HET、因为这个 PWM 黑客攻击是站不住脚的。

    我不知道擦除"仅必要扇区"是否会擦除每个程序扇区、但后续运行使用的是新编译的代码。

    非常感谢。

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

    尊敬的 Peter:

    pwmStart()是 为了启用 HALCOGen 生成的 N2HET 代码的引脚操作。 如果您使用自己的 N2HET 代码(来自 HET IDE),pwmStart()将不起作用。

    选择"只需必要扇区" 或 "整个闪存" 不会影响 NHET RAM 中的 NHET 代码。 NHET 代码被从闪存复制到 hetInit()中的 NHET RAM:

      (void) memcpy ((void*) hetRAM1、(void*) HET_INIT0_PST、sizeof (HET_INIT0_PST);

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

    您好、QJ、

    是的,我知道 pwmStart()和 hetInit()的工作方式,已经走过了很多次。

    由于 PWM 设置(执行 hetInit()和 pwmStart())能够执行一些操作来清除纯 HET 设置遇到的"挂起"、 我想这个问题的快速解决方法就是从 PWM 设置中获取代码、并在初始化操作之前将其作为初始化前的预启动操作执行。

    因此,我创建了 hetPreInitHET1()函数(来自 PWM 设置的 hetInit()),并在 hetInit()函数(来自 P纯 HET 设置)之前运行它。  只用于 HET 的设置运行正常、我希望预初始化代码能够确保导致任何挂起的一切都将消失。  当然、如果我以正确的方式执行操作、我将精确地缩小初始化代码中执行解除挂起的内容。  但是、这需要时间。

     到目前为止、我还没有看到任何挂起、希望初始化前的代码修复程序能够正常工作。

    非常感谢。

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

    老实说,我对 NHET RAM、 hetPreInitHET1()和修改 后的 hetInit()中的 NHET 代码不是很清楚。 修改的 hetInit()意味着新的 hetInit()可能不包含 memcpy()、预调用方配置等

    希望您 的 hetPreInitHET1()能够按预期工作。  

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

    您好、QJ、

    我只想澄清我的原始问题是什么、以及我当前的快速修复是什么(这似乎有效)。

    在我最初的 HET 设置中、HET1使用一个简单的2线程序来生成一个1PPS 时钟(用于测试的穷人的信号发生器)、在大多数情况下、将图像写入 TMS570芯片并运行正常。 生成了1PPS 时钟。  但是、有时、1PPS 时钟无法生成、尽管图像多次刷写、但我无法确定原因。  因为我最初使用 PWM 来尝试生成1 PPS 时钟(由于 PWM 参数限制无法精确地生成)、所以我回到使用 PWM、并且能够再次生成(或多或少) 1 PPS 时钟。  我发现 PWM 时钟生成会"清除" HET1不再生成的问题(在后续的纯 HET 图像中)。

    所以、观察/假设是 PWM Halcogen 生成的代码执行 HET PWM Halcogen 生成的代码_not _执行的操作。

    然后我猜可能是完全闪存擦除(对于纯 HET 图像)的一部分问题、但这条线上的实验显示了闪存方法没有什么区别。

    因此,我尝试了一个“快速修复”,其中包括使用 PWM 项目的 hetInit()中的 HET1代码块对硬件进行预编程,在从 pure-HET 项目运行 hetInitHET1()之前,我放置了一个 hetPreInitHET1()函数。  hetPreinitHET1()中的代码写入一整组寄存器并将 PWM 程序写入 HET RAM。  hetInit()中的代码然后将预先插入的寄存器和 HET HET1程序的部分内容过度写入(HET RAM 中)。

    到目前为止、快速修复似乎已经奏效、我还没有看到任何新的图像在运行、而 HET1停止生成。

    很可能上面的观察/假设是正确的,hetPreInintHET1()函数中的某些内容涉及由 Halcogen 生成的(Pure-HET) hetInit()应该执行的某些硬件。

    如果我有时间、我应该精确地缩小 hetPreInitHET1()中的代码(一个或多个寄存器写入、或者复制到 HET RAM 的 PWM 程序)、以准备随后的 P纯 HET hetInit()以_always_work (生成1 PPS 时钟)。  此搜索过程非常繁琐和耗时、因为最初的问题不会经常发生(但令人难以置信的烦人、而且当它出现时、它会成为一个障碍)。

    非常感谢。

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

    hetPreinitHET1() 将 HAL 生成的代码(PWM 代码)写入 NHET RAM,而 hetInit()将您自己的代码(PPS 代码)写入 NHET RAM,后者会覆盖 PWM 代码的前4条指令。

    您的 PPS 代码:

    l0 CNT{reg=a、max=624999、data=0};
    L1 ECMP{NEX=L2、hr_LR=LOW、en_PIN_ACTION = ON、PIN=4、ACTION = PULSEHI、reg = A、IRQ=ON、DATA=312500、hr_DATA=0};
    L2 CNT{reg=B、max=624999、data=0};
    L3 ECMP{NEX=L0、hr_LR=LOW、en_PIN_ACTION = ON、PIN=23、ACTION = PULSEHI、reg =B、IRQ=ON、DATA=312500、hr_DATA=0};

    PWM 代码的前4条指令为:

    L0 CNT

    L1 PWNT:PWM 0 ->占空比

    L2 DJZ:PWM 0 ->周期

    L3 PWNT:PWM 1 ->占空比  

    由于 PPS 代码的 L3指令的下一条指令是 L0、NHET 微机器只执行您的 PPS 代码。 NHET RAM 中剩余的 PWM 代码不影响 PPS 执行。

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

    您好、QJ、

    是的、我意识到 HET1"覆盖"_应该_对所有 PWM hetInit()代码求反。  我没有将问题缩小到 HET1 RAM 内容或预初始化的 HET1寄存器。  我甚至不能绝对肯定地说我的问题已经完全消失了,尽管我在添加快速修复之后没有看到它再次发生。

    我当前的 HET1程序变得更小、仅在 HET1引脚23上生成1 PPS。

    l0 CNT{reg=a、max=624999、data=0};
    L1 ECMP{NEX=L0、hr_lr=low、en_pin_action=on、pin=23、action=PULSEHI、reg=a、IRQ=off、data=312500、hr_data=0};

    在引脚4和引脚23上生成1 PPS 的旧 HET1程序有一些奇怪的行为、即引脚23 PPS 时钟(第二项)在运行几秒至几分钟后将消失。  由于我实际上不必让两个引脚都运行、因此我删除了第二个时钟的代码、并且不再追问这个问题。

    我将向您介绍进一步的调查结果、尤其是当问题再次发生时。  如果/有时间、我将尝试隔离修复。

    非常感谢。

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

    尊敬的 Peter:

    CPU 是否正在尝试动态更改 L1指令(ECMP)的数据字段和控制字段? 如果 CPU 直接更改 ECMP 指令的数据字段、则可能会错过一个或多个脉冲。

    建议使用 MOV32或 MOV64指令来改变其它指令的字段。

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

    您好、QJ、

    不可以、HET1程序正在引脚23上生成一个固定的1PPS 时钟、如上面的2行代码所示。

    出于好奇、我回到了在引脚4和23上生成1 PPS 的4线程序、实际上它仍然无法生成第二个时钟(L3和 L4)。  这是一个不相关的"错误"。  当我回到2行程序时、引脚23上的1 PPS 再次出现。

    请注意、有问题的行为(由快速修复缓解)不是跳过一个或两个拍频的输出时钟、而是根本不会生成(可能是因为 HET1程序根本不运行)。

    我有一个 HET2程序、它生成一个5 MEC 时钟、该时钟"自动对齐"至输入1 PPS 时钟、但该程序始终正确运行。  该程序确实会更改 ECMP 中的数据。

    非常感谢。

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

    我无法生成在 HET IDE 上运行的4行 PPS 代码的问题。我的 waveviewer 是免费的评估版本、因此我无法长时间模拟您的代码。

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

    您好、QJ、

    非常感谢您在仿真器中运行该程序。  我还在使用免费的波形查看器、因此只能看到大约10毫秒以上的数据。

    在任何情况下、仿真都不会(很可能)出现问题、而是在实际硬件中运行程序。  如果我可以找到一段时间、我将只在某些独立项目中放置4行 HET 代码、看看是否会中断。  一件简单的事情就是只需在 L2和 L4上设置 IRQ=on 并在 CPU 上拾取中断

    顺便说一下、我还看到 HET1 (引脚23)变"坚果"、当 IRQ=ON 时不会产生1 PPS、而是会产生某种更高频率的噪声、这会导致 CPU 中断具有破坏性(以至于项目无法执行任何操作)。  因此、我必须将 HET1中断屏蔽为关闭状态。

    我必须回到这个问题、因为我的快速修复程序目前似乎运行良好。

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

    我在 launchpad 上运行 PPS 代码(80秒)、但未发现问题:

    PPS 代码:

    l0 CNT{reg=a、max=624999、data=0};
    L1 ECMP{NEX=L2、hr_LR=LOW、en_PIN_ACTION = ON、PIN=6、ACTION = PULSEHI、reg = A、IRQ=ON、DATA=312500、hr_DATA=0};
    L2 CNT{reg=B、max=624999、data=0};
    L3 ECMP{NEX=L0、hr_LR=LOW、en_PIN_ACTION = ON、PIN=9、ACTION = PULSEHI、reg =B、IRQ=ON、DATA=312500、hr_DATA=0};

    BTW、我在 TMS570LS1224 Launchpad 上测试代码:

    e2e.ti.com/.../7331.het.c

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

    在 L1和 L3中启用 IRQ (ECMP 指令)。

    使用引脚6和引脚9是因为这两个信号会路由到 LP 板上的接头。

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

    您好、QJ、

    我已将两个项目上传到 Protonmail。  一个在 HET1_23上生成单个1PPS 时钟、另一个在 HET1_4和 HET1_23上生成两个1PPS 时钟。  第一个功能正常、打印到 sciREG1 (115200 2N1)、 第二个功能不起作用、可能是由于 HET1中断不断、并且没有开始打印。

    网址: www.protonmail.com

    用户: shareuser1000@proton.me

    密码:密码

    SUBJ:HET1 1PPS 项目、单一和双

    谢谢。

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

    我上传了包含双时钟的另一个项目,但在 hetInit()之前调用 hetPreInitHET1()。  此项目工作正常、到 sciREG1的输出指示两个时钟都在运行。

    SUBJ:HET1 1PPS 项目、双通道、带 preInitFix

    谢谢。