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 IDE 从外部时钟生成相位对齐/锁定时钟

Guru**** 2465360 points
Other Parts Discussed in Thread: HALCOGEN

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1165373/tms570lc4357-using-het-ide-to-generate-phase-aligned-locked-clock-from-external-clock

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

我已经学习了 HET IDE 教程、希望实现一个相对简单的时钟发生器。

从外部生成的1 PPS 时钟、我想生成一个5毫秒50%占空比周期时钟、该时钟与1 PPS 时相位对齐(并希望"锁定")。

我之前使用的 LaunchPad HET PWM 项目产生了一个5毫秒的时钟(生成了 CPU 的周期性中断)、但它没有任何方法来与外部1 PPS 时钟对齐。  因此、HET IDE 的使用是合适的。  HET PWM 项目中的 hL_het.c 中的微代码似乎比我需要的"肉"更多、因此我不确定是否存在"反向工程"(是否存在任何 HET 反汇编器?) 提供的注释表明这是适当/有用的。

是否有任何 HET IDE 项目可以帮助我快速完成此操作?  我在算法库中看到了一些内容、包括 PWM 项目、但它们看起来比我需要的任何内容都要花哨。

我将尝试更熟悉 HET 指令和引擎、但如果 我能找到一个足够接近的轮子作为起点、我不是一个重新发明轮子的人。

非常感谢。

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

    您好、QJ、

    没问题。  只需按照自己的计划进行审核。  我很清楚,我们都有不同的工作要求,我很高兴得到你们的帮助。

    我现在将继续自己挖掘。

    非常感谢。

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

    您好、QJ、

    我后退了一步、完成了一个更简单的 HET 程序、(应该是)简单地设置了引脚6 (无条件)。  仿真器显示正在设置引脚、但实际 Launchpad 未显示其设置(如读取 het2_6_post)。

    我尝试了与引脚8完全相同的实验、但引脚8会按预期进行设置。

    因此、我的 PIN6配置(或引脚6的固有能力)有一些不同之处、我需要对此进行跟踪。

    非常感谢您的任何建议。

    === HET

    l0 sub{src1=zero、src2=zero、dest=R、data=0};
    L0xb ECMP{hr_lr=low、en_pin_action=on、pin=6、action=set、reg=R、IRQ=on、data=0};
    L0xc BR{NEX=L0、COND_ADDR=L0、EVENT=NOCOND};

    == C

    void hetNotification (hetBASE-t * hetREG、UINT32 VEC)

    if (vec < sizeof (numVec)/sizeof (numVec[0]))(如果(vec < sizeof (numVec)/sizeof (numVec[0])))
    numVec[VEC]++;
    #define FASTACK
    #ifdef FASTACK
    if (hetREG = hetREG2){
    het2_6_post = gioGetBit (hetPORT2、6);
    VEC = VEC;

    其他

    (笑声)

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

    我改进了位设置程序以设置所有 HET2位并遇到了一些 odball 行为。  在配置了位0至15且在 Halcogen 中检查了 DIR 的情况下、为了指示端口输出、引脚4、5和6未按预期进行设置。  那么、HET2引脚4、5和6有何特别/不同?

    请注意、HET 仿真器显示了按预期设置的所有引脚。  但模拟器不受实际硬件限制/专业知识的影响。

    感谢你的任何帮助。

    下面 C 程序的引脚值...

    === HET 程序

    l0 sub{src1=zero、src2=zero、dest=R、data=0};

    L0x0 ECMP{hr_lr=low、en_pin_action=on、pin=0、action=set、reg=R、IRQ=off、data=0};
    L0x1 ECMP{hr_lr=low、en_pin_action=on、pin=1、action=set、reg=R、IRQ=off、data=0};
    L0x2 ECMP{hr_lr=low、en_pin_action=on、pin=2、action=set、reg=R、IRQ=off、data=0};
    L0x3 ECMP{hr_lr=low、en_pin_action=on、pin=3、action=set、reg=R、IRQ=off、data=0};

    L0x4 ECMP{hr_lr=low、en_pin_action=on、pin=4、action=set、reg=R、IRQ=off、data=0};
    L0x5 ECMP{hr_lr=low、en_pin_action=on、pin=5、action=set、reg=R、IRQ=off、data=0};
    L0x6 ECMP{hr_lr=low、en_pin_action=on、pin=6、action=set、reg=R、IRQ=off、data=0};
    L0x7 ECMP{hr_lr=low、en_pin_action=on、pin=7、action=set、reg=R、IRQ=off、data=0};

    L0x8 ECMP{hr_lr=low、en_pin_action=on、pin=8、action=set、reg=R、IRQ=off、data=0};
    L0x9 ECMP{hr_lr=low、en_pin_action=on、pin=9、action=set、reg=R、IRQ=off、data=0};
    L0x10 ECMP{hr_lr=low、en_pin_action=on、pin=10、action=set、reg=R、IRQ=off、data=0};
    L0x11 ECMP{hr_lr=low、en_pin_action=on、pin=11、action=set、reg=R、IRQ=off、data=0};

    L0x12 ECMP{hr_lr=low、en_pin_action=on、pin=12、action=set、reg=R、IRQ=off、data=0};
    L0x13 ECMP{hr_lr=low、en_pin_action=on、pin=13、action=set、reg=R、IRQ=off、data=0};
    L0x14 ECMP{hr_lr=low、en_pin_action=on、pin=14、action=set、reg=R、IRQ=off、data=0};
    L0x15 ECMP{hr_lr=low、en_pin_action=on、pin=15、action=set、reg=R、IRQ=off、data=0};

    L0x16 ECMP{hr_lr=low、en_pin_action=on、pin=16、action=set、reg=R、IRQ=off、data=0};
    L0x17 ECMP{hr_lr=low、en_pin_action=on、pin=17、action=set、reg=R、IRQ=off、data=0};
    L0x18 ECMP{hr_lr=low、en_pin_action=on、pin=18、action=set、reg=R、IRQ=off、data=0};
    L0x19 ECMP{hr_lr=low、en_pin_action=on、pin=19、action=set、reg=R、IRQ=off、data=0};

    L0x20 ECMP{hr_lr=low、en_pin_action=on、pin=20、action=set、reg=R、IRQ=off、data=0};
    L0x21 ECMP{hr_lr=low、en_pin_action=on、pin=21、action=set、reg=R、IRQ=off、data=0};
    L0x22 ECMP{hr_lr=low、en_pin_action=on、pin=22、action=set、reg=R、IRQ=off、data=0};
    L0x23 ECMP{hr_lr=low、en_pin_action=on、pin=23、action=set、reg=R、IRQ=off、data=0};

    L0x24 ECMP{hr_lr=low、en_pin_action=on、pin=24、action=set、reg=R、IRQ=off、data=0};
    L0x25 ECMP{hr_lr=low、en_pin_action=on、pin=25、action=set、reg=R、IRQ=off、data=0};
    L0x26 ECMP{hr_lr=low、en_pin_action=on、pin=26、action=set、reg=R、IRQ=off、data=0};
    L0x27 ECMP{hr_lr=low、en_pin_action=on、pin=27、action=set、reg=R、IRQ=off、data=0};

    L0x28 ECMP{hr_lr=low、en_pin_action=on、pin=28、action=set、reg=R、IRQ=off、data=0};
    L0x29 ECMP{hr_lr=low、en_pin_action=on、pin=29、action=set、reg=R、IRQ=off、data=0};
    L0x30 ECMP{hr_lr=low、en_pin_action=on、pin=30、action=set、reg=R、IRQ=off、data=0};

    L0x31 ECMP{hr_lr=low、en_pin_action=on、pin=31、action=set、reg=R、IRQ=on、data=0};

    L0xc BR{NEX=L0、COND_ADDR=L0、EVENT=NOCOND};

    === C 程序

    int main (空)

    /*用户代码开始(3)*/

    timer_init();

    uint32 dir = hetPORT2>DIR;
    dir = 0xffffffU;//输出所有位
    gioSetDirection (hetPORT2、dir);
    uint32 p;
    对于(p = 0;p < 32;p++)
    gioSetBit (hetPORT2、p、0);

    hetInit();
    uint32 het2_intas = hetREG2->INTENAS;
    // HET 程序行 L1、L3和 L7可以使用中断(IRQ=ON)
    // L1 => 2^1 = 0x2 5毫秒时钟
    // L3 => 2^3 = 0x8 1秒时钟输出
    // L7 => 2^7 = 0x80 1秒时钟输入
    // L8 => 2^8 = 0x100 1毫秒脉冲标记 PPS 中的前5毫秒周期
    // hetREG2->INTENAS = het2_intas | 0x18a;
    hetREG2->INTENAS =~0;// hack:立即启用所有中断
    het2_intas = hetREG2->INTENAS;
    _enable_FIQ ();
    _enable_IRQ ();
    Timer_delay (10);
    while (1);
    /*用户代码结束*/

    返回0;


    /*用户代码开始(4)*/

    uint32 numNotifications;
    uint32 numBadNotifications;
    uint32 numVec[16];
    uint32 het2_6_pre =~0;
    uint32 het2_6_post =~0;
    uint32 het2_6_val[32];

    uint64 tmr_c_start;
    uint64 tmr_c_next;
    uint64 tmr_c_current;

    float usec_start;
    float usec_next;
    float usec_current;

    void hetNotification (hetBASE-t * hetREG、UINT32 VEC)

    if (vec < sizeof (numVec)/sizeof (numVec[0]))(如果(vec < sizeof (numVec)/sizeof (numVec[0])))
    numVec[VEC]++;
    #define FASTACK
    #ifdef FASTACK
    if (hetREG = hetREG2){
    // het2_6_post = gioGetBit (hetPORT2,/*6*/ 8);
    uint32 p;
    对于(p = 0;p < 32;p++)
    het2_6_val[p]= gioGetBit (hetPORT2、p);
    VEC = VEC;

    #endif

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

    将所有32个引脚配置为 DIR 输出、我们可以看到引脚4、5、6、22和23与其他引脚"不同"。  HET 和 C 程序与之前一样。

    为什么?

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

    进一步调查显示、HET2引脚2和8无法从 HET2引擎中清除。

    我没有看到任何能够修复这些行为的 Halcogen 配置。

    感谢您的观看。

    引脚2和8不可清除

    不可设置、引脚4、5、6、22、 和23.

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

    我的 C 代码显示了5毫秒的关闭周期时钟。  我有 Halcogen、据说使用采样预分频器设置作为模拟器。

    仿真器使用50MHz 的 VCLK2、环路分辨率预分频器16和高分辨率预分频器5、从而产生1.6 μ s 的高分辨率周期。

    Halcogen 在50MHz 时使用 VLCK2、高分辨率预分频器4 (应与5分频相同)、环路分辨率预分频器4 (应与16分频相同)、从而产生1.6 μ s 的高分辨率周期。

    然而、当我使用 C 代码来计时5毫秒中断时、我看到的是3.333毫秒、而不是5.0毫秒。

    有什么想法、有什么问题吗?

    非常感谢。

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

    Halcogen 中使用的预分频器值与《技术参考手册》中的信息一致。

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

    如果我不得不猜测、我认为这与 VLCK2的设置有关。  VLCK2的默认设置为75MHz、我当前使用的是50MHz。  Halcogen 可能没有考虑到这一点。

    3.33 MHz 与5.0 MHz 相比为66.7%。

    50MHz 与75MHz 相比、是66.7%。

    有什么建议吗?  谢谢。

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

    问题已解决。  我们的硬件人员注意到《技术参考手册》说...

    ===

    27-24 VCLK2R VBUS 时钟2比。


    注意:VCLK2频率必须始终大于或等于 VCLK 频率。
    VCLK2频率必须是 VCLK 频率的整数倍。

    ===

    我看到了这一发言,但这一意义使我逃脱了。  不确定 VCLK 和 VCLK2之间的底层关系是什么。

    无论如何、当 VCLK 为75MHz 时、将 VCLK2设置为50MHz 不起作用(无壁龛警告)。  硬件仍然使用75MHz (因此使用3.333ms 而不是5.000ms 时钟)。  将 VCLK2更改为150MHz (0作为 VCLK2分频器设置)并使用15作为 HR 时钟分频器、可产生相同的所需10MHz HR 时钟。 之前、VCLK2为50MHz、HR 分频器为5。

    有一个 Halcogen 注释:VLCK2最大值为110MHz、但它可能是某些其他电路板的痕迹、因为150MHz 似乎适用于 TMS570-LC43。

    当我将150MHz VCLK2和15 HR 时钟分频器应用到 HET 仿真器时、数据会运行(大约10毫秒)、但 WaveViewer 会显示消息、指示需要 Gigawave 选项。  由于150MHz 创建的数据点多于50MHz、这在某种程度上是意料之中的。  不确定为什么90天 Synoptic 试用许可证不包含_full_ Gigawave 选项(但90天试用确实会将波形查看扩展到超过该范围、根本没有许可证)。

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

    我在32个 HET2引脚、我拥有的3个不同 Launchpad 板上运行了设置和清除测试、结果与我之前的结果大致相同、所有3个板上的行为都是相同的:

     无法设置: 4、6、22、33

    无法清除:2.

     

    之前我看到过(在一个板上):

    无法设置:4、5、6、22、23

    无法清除:2、8

     

    不知道为什么引脚5和8现在“运行”,但这可能是由于 VCLK2 (现在以某种方式同步到 VCLK?)。

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

    您好!

    我对 HET 程序结构有一个简单的问题。  我看到'''#'字符可用于在带有 HET 指令的行上为注释添加前缀、但'#'(主题标签/#_SIGN)字符不能在空白行上使用、以执行相同的操作。

    是否有方法将非指令(空)行标记为注释行?

    感谢你的帮助。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="521569" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1165373/tms570lc4357-using-het-ide-to-generate-phase-aligned-locked-clock-from-external-clock/4421185 #4421185"]如果有方法可以将非指令(空)行标记为注释行?

    我没有尝试过、但从 HET IDE 教程用户指南 中、它看起来像一个";"(分号)字符、用于注释:

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

    您好、Chester、

    感谢您提供信息。  我在讲解本教程时错过了它。

    事实上、我的指令行具有终止指令部分的";"、可能是由 IDE 输入、因为我没有意识地将它们放在那里。  是分号、而不是井号、用于描述指令中的注释。  但是、"#"(如 Bash 中使用的那样)更容易看到、所以我可能会将它们保留在那里。