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.

[参考译文] TMS570LS1227:HET 程序

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/567368/tms570ls1227-het-program

器件型号:TMS570LS1227
主题中讨论的其他器件:TMS570LC4357HALCOGEN

您好!  

我正在使用 TMS 570 LS1227、并希望以 交替方式生成2个占空比、但它不起作用  

我已经 针对 基本 HET 程序通过"C"代码更新了新占空比。

;在比较匹配事件
L00 CNT 时具有同步占空比更新的 PWM {REG=A、IRQ=OFF、max= 100}
L01 ECMP{NEX=L02、en_pin_action=on、PIN=2、action=PULSELO、REG=A、data=10、hr_data=0};
L02 BR{NEX=L00、COND_addr=L03、EVENT_ZERO};在完成1后、REG=32、
远程数据=0、L0=0、L0、L0=0、L0=0、L0=0、L0=0、L0=0、L0=NOW= 1、NOW= 1、NOW= 1、L0=NOW= 1、NOW= 1、NOW= 1 
-------------------------------------------------------------------- 
int main (void) { /*用户代码 begin (3)*/ int i、j; hetInit(); while (1) { i=20; hetRAM1->Instruction [L03].Data = i << 7;//将占空比更改为20% (j=0;j<10000;j++);//RAM1<i 循环< I 03+7;直到写入新 指令为止<hetr\n 数据<i 循环<i+40%;/i 循环<hetrechnle<<i = 1;I 循环< I 写入1 < I +。 //将占空比更改为60% }// 用户代码结束*/ 返回0; }

--------------------------------------------------------------------

 示波器上的 O/P -  

是否是导致错误的延迟?  

此致、

Suyog

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、延迟是更新占空比的简单但粗略的方法。

    您需要有两个延迟、每次更新后一个延迟。

    第15行执行和第11行再次执行之间的时间非常短。 可能小于1 HET 环路、并且很有可能很容易错过第15行上的占空比更新(大部分时间)。 有时您可能会很幸运、但这种情况不常见。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    我尝试了相同的方法、但它没有使用-

    int main (void)
    {
    /*用户代码 begin (3)*/
    
    
    int i、j;
    
    hetInit();
    while (1)
    {
    i=20;
    hetRAM1->Instruction [L03].Data = i << 7;//将占空比更改为20%
    (j=0;j<10000;j++);//RAM1<i 循环<
    I 03+7;直到写入新
    指令为止<hetr\n 数据<i 循环<i+40%;/i 循环<hetrechnle<<i = 1;I 循环< I 写入1 < I +。 //将占空比更改为60%
    (j=0;j<10000;j++);
    }//
    
    用户代码结束*/
    
    返回0;
    }
    

     您是否有用于重写和更新操作的示例程序?

    您能告诉我如何处理延迟问题吗?

    是否有任何方法读取当前 HET 寄存器值?

    我们是否可以为 HET 寄存器添加观察/断点?

    此致、

    Suyog

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您可能需要更长的延迟才能实现更长的占空比。

    这里的问题是您异步写入 hetRAM1->Instruction [L03].Data 的比较'缓冲器'寄存器。
    如果您在 ECMP 发生之前过度写入此值、以将"缓冲区"复制到操作比较寄存器中、则在过渡期间的值
    永远不会导致您在引脚上看到任何内容。

    HET 具有中断功能、因此您可以在 ISR 内进行更新。 您始终可以"轮询"中断状态、而不是
    如果只需要延迟循环代码等简单代码、则获取实际中断。
    我建议尝试(启用 ECMP 指令上的中断并在写入 hetRAM1->Instruction [L03].Data 地址之前轮询中断的状态。 然后、还要确保清除中断标志、以便您可以重复该过程。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我对 MC 编程不是很新鲜。 我会在清楚之后再返回给您。  直到我理解...

    while (1)

      if (Interrupt_flag = set)  // set = 0x2?

         {

            向数据字段写入新的占空比  

            INTERRUPT_FLAG =复位     

         }

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

    不过、请务必阅读 TRM 章节以了解任何硬件寄存器、尤其是当您了解硬件时。

    硬件寄存器和"普通存储器"之间的区别在于、硬件寄存器可以在后台由 CPU 以外的其他内容更改、有时硬件的设计与存储器不同。

    例如,您可能会找到一个寄存器说明,显示“要清除一个位,请将'1'写入该位”... 听起来与您的期望相反、但这有很好的理由。 您可能还会找到寄存器、在这里读取寄存器会将置位的任何位清零。

    现在、对于 HETFLG 寄存器、如果您查看寄存器说明、您将看到:

    0读取:标志被清除后、没有到达带有中断的 N2HET 指令。
    写入:无效。

    1读取:标志被清除后、一个带有中断的 N2HET 指令已经到达。
    写入:清除该位。

    这是一个写入1来清除类型寄存器。

    现在、如果有任何中断标志被置位、读取另一种方法是读取 HETOFF1等偏移寄存器中的一个。
    但请注意此处的精细打印:
    注意:在任何读取操作模式下、相应的标志(在 HETFLG 模式下)也会被清除。 仿真中
    模式相应的标志不会被清除。

    因此、如果您从 HETOFF1读取"等效"信息、则需要注意读取-清除副作用。

    只是尝试给出一些示例、说明您在 MCU 新手上说了什么... 但您走的是正确的道路。

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

    您好、Anthony、

    我在 TMS570LC4357中的 HETFLG 感到非常艰难。

    它始终置位或从不置位。

    我假设在读取 hetREG1->OFF1时它会在 void het1HighLevelInterrupt (void)中自动复位。

    我认为在使用 XDS100v2时、该线程在读取时不会复位?

    如果我断开评估板的 USB 电缆、读取时也不会重置。

    如果我在 ISR 中复位它(如上所述写入1) 、我在设置 hetREG1->GCR 的 LSB 时获得第一个中断、但再也不会。

    如果我没有在 ISR 中复位、它永远不会复位、并且每~300ns 进入一次 ISR。

    如何检测 HETram 中的代码是否有效? 在 HET IDE 中、它看起来工作正常。

    提前感谢您的任何建议

    BR Olaf

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

    您应该首先意识到、可以配置器件、以便 HET 在 CPU 暂停时继续运行(在暂停时继续)。

    在这种情况下、您将继续具有 HET 请求中断、您可能看起来永远不能清除中断标志;因为在 CCS 读取存储器并再次更新显示所需的时间内、您的 HET 程序可能已经请求了另一个中断。

    读取 hetREG1->OFF1只清除1中断标志。 最高优先级。 因此、如果有多个 HET 指令正在中断、则需要多次读取 hetREG1->OFF1、直到它返回0、才能实际清除 CPU 的中断请求。

    您可以观看 HETADDR 寄存器并将 CCS 设置为自动更新它的值... 如果您看到它发生了变化、那么您知道 HET 正在运行。 或者、您可以检查 HETGCR;如果位0被置位、那么 HET 正在运行某些东西。 它可能不是你认为它应该是... 但是、只要到位被置位、它就会执行 HET RAM 中的任何内容。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢 Anthony、
    在 Halcogen 中禁用"忽略挂起"。  
    Nhet1_GlbCtrl 将读取
    0x00010001   未置位、主器件置位 、至置位。

    但 Nhet1_Addr 始终为00000005

    在 HET IDE 中删除断点后、地址始终为

    地址   指针   0x000000D7   0xFFF7B808    
    但是 HET 程序只有6个步长(0..5)

    Nhet1_IntEnaSet
    00000018
    Nhet1_IntEnaClr
    00000018

    只有一个中断正暂挂:

    偏移1   指针   0x00000005   0xFFF7B80C    
    IntFlg   指针   0x00000010   0xFFF7B828    

    HET 代码似乎被停止、但是到仍然被设定?
    此致
    OLAF

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

    已解决!

    我在调试 HET 代码的奇怪和意外行为时浪费了很多时间。  
    为了绝望、我决定在剩余的 HET RAM 中填充第一条指令的"保护性"分支指令:

    PROTECT1  BR{NEX=STARTEN、COND_addr=STARTEN、EVENT=NOCOND};
    PROTECT2  BR{NEX=STARTEN、COND_addr=STARTEN、EVENT=NOCOND};
    PROTECT3  BR{NEX=STARTEN、COND_addr=STARTEN、EVENT=NOCOND};
    PROTECT4  BR{NEX=STARTEN、COND_addr=STARTEN、EVENT=NOCOND};
    PROTECT5  BR{NEX=STARTEN、COND_addr=STARTEN、EVENT=NOCOND};
    PROTECT6  BR{NEX=STARTEN、COND_addr=STARTEN、EVENT=NOCOND};
    PROTECT7  BR{NEX=STARTEN、COND_addr=STARTEN、EVENT=NOCOND};


    现在工作了、我获得 HET 中断、IntFlgs 按预期清零、示波器中测量的时序按预期。

    问题:
    为了避免 HET RAM 中的奇怪行为和奇偶校验错误、针对未使用的 HET RAM 建议的初始化值是多少?

    建议:
    在自动生成的代码中插入一个初始化以用中的"安全"初始化值填充 HET RAM 的未使用部分
       void hetInit (void)。
    当前初始化
       (void) memcpy ((void*) hetRAM1、(void*) HET_INIT0_PST、sizeof (HET_INIT0_PST);
    限制为 sizeof (use-HETRAM)。 我在执行自己的初始化之前在未使用的区域中找到了随机数。 。

    此致

    OLAF