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**** 2463330 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 指令和引擎、但如果 我能找到一个足够接近的轮子作为起点、我不是一个重新发明轮子的人。

非常感谢。

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

    尊敬的 Peter:

    您可以切换一个 N2HET 引脚来启用/禁用外部时钟。

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

    您好、QJ、

    我不理解您提到的启用/禁用外部时钟的内容。

    我可能不清楚我需要做什么。  下面的时序图可能会说明问题。  我希望让 HET 生成一个5毫秒的时钟、该时钟将保持与来自外部源的(精确且准确) 1 PPS 时钟保持一致。

    这个5毫秒周期时钟可以永久运行、尽管最好具有启用/禁用功能。  我们可以(希望)使用常用的 edgeEnableNotification()来管理 CPU 中断。

    非常感谢。

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

    尊敬的 Peter:

    我认为1pps 由一个外部器件生成、此器件可由 N2HET 代码控制的 N2HET 引脚的上升沿或下降沿触发。

    是的、您使用输入信号的边沿开始5ms 时钟生成和1pps 生成。

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

    您好、QJ、

    现在、外部1 PPS 不受来自 Launchpad 的任何输出信号的门控。  它要么是精确的1 PPS 信号(来自信号发生器)、要么是平坦的、但绝不是噪声线(可能造成严重破坏)。  1 PPS 分布到多个 Launchpad。

    Launchpad 只需生成5毫秒(200Hz)时钟、但5毫秒相位必须与传入的1 PPS 对齐(每200个周期进行一次自调整)。

    我想 HET 程序将持续寻找传入的1 PPS 的有效边沿(转换)、并在5毫秒的有效边沿重新开始生成5毫秒的时钟。

    现在、如果只有我可以对代码进行正确操作、那么...

    谢谢。

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

    您可以使用 BR 指令来监视输入信号。 当检测到引脚1的上升沿时、代码将跳转至地址 Ly 以启动计数器到 PWM 信号:

    br { NEX= Lx,COND_addr=Ly,EVENT=RISE,PIN=#1 };

    请参阅器件数据表中 N2HET 指令的说明。

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

    您好、QJ、

    我花了很多时间阅读《技术参考手册》第23.6节、它相当完整、但它解释这些内容的方式并不直观(对我来说)。  因此、我重新访问了 HET 教程、并仅使用 IDE 来制作我想要的5ms (200Hz)时钟。

    我相信 IDE 中的以下设置将生成精度为100nsec 的5ms 时钟:

    100.000000 MHz、HR = 10、LR = 16
    l0 CNT{reg=a、max=3124、data=0};
    L1 ECMP{NEX=L0、hr_lr=low、en_pin_action=on、pin=0、action=PULSEHI、reg=a、data=1563、hr_data=0};

    我正在等待 SynaptiCAD 的 Waveviewer Pro 的(免费)许可证、以便能够查看生成的整个波形、因为 Waveviewer free 没有必要的 GIgaviewer。

    问题:

    当我使用 Halcogen 作为 HET2时、我看到我可以将 HR_Clock 设置为各种值。  但我似乎无法更改 VCLK2、它固定为75.000MHz。  我从 IDE 中计算出的值具有 VLCK2=100.000MHz、HR_Clock=10MHz (HR=10)和 Loop _Clock=625KHz (LR=16)。 这使得数字进行了很好的舍入。  是否有方法将 VCLK2更改为100.000MHz?  如果我将 HR_Clock 设置为10MHz 并将 VCLK2设置为75MHz、则 Halcogen 选择 HR_Prescale=7 (HR=8)、这将获得实际的 HR_Clock=9.375MHz、这与所需的10.000MHz 太远。  由于我希望循环时间为1600nsec (IDE 中的 LR=16)、如果我将 Halcogen 循环时间设置为1600.000ns、则 Halcogen 选择 LR_Prescale=4 (HR=16)、从而得到实际的 LR_TIME=1706.667。 与所需的1600 nsec 相差太远。

    VCLK2可配置吗?  如果是、HET1和 HET2是否可以具有不同的 VLCK2值(即使我目前没有使用 HET1进行时序)?

    感谢你的帮助。

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

    我猜 VCLK2硬配置为75MHz、是 TMS570-LC43 CPU 系统时钟的1/4 300MHz。  因此、我可能一直处于 HR_Clock=9.375MHz 的状态、这比我真正想要的10.000MHz 要好6%以上。  可能我需要调整 CNT max=xxx 和 ECMP data=yyy 值、以补偿6%以上的偏差。  Waveform Pro 许可证可能会帮助我"查看"需要的修复程序。

    我很好奇、为什么在 TMS570-LC43模式下、HET IDE 允许用户将主时钟设置/更改为75MHz 以外的值。

    谢谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 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/4387479 #4387479"]我猜 VCLK2硬配置为75MHz、为300MHz 的1/4

    VCK2可配置:VCLK2 = HCLK/(1、2、3...)

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

    N2HET HR 时钟为:VCL2/(1、2、3...64)

    LR 时钟为:HR 时钟/(2^0、2^1、.. 2^7)

    要获得 VCLK2=100MHz、  

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

    非常感谢您提供此信息。  让我的生活变得轻松。

    我不认为我们使用的是 VCLK1和 VCLK3、但您知道它们驱动的主要组件是什么(这可能要求它们处于75MHz 而不是100MHz)吗?

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

    我获得了 SynaptiCAD 90天评估许可证、并将 syncd.lic 文件放在 C:\SynaptiCAD 中。  波形查看器通过帮助->ViewLicenseDetails->ViewFiles 显示现有的许可证文件。  但是、当我运行仿真器时、WaveViewer 会显示一个弹出窗口、显示"Diagram too large。  要读取此文件、您需要使用 GigaWave Option。"  与 WaveViewer Free 的行为相同。

    有什么解决方法的想法吗?

    非常感谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 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/4387576 #4387576"]您是否知道它们驱动的主要组件(可能要求它们的频率为75MHz 而不是100MHz)?

    否 但是、要使 VCLK2=100MHz、HCLK 必须=100MHz。 SRAM 和闪存由 HCLK 驱动、因此代码执行的性能会下降。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 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/4387744 #4387744"]如何解决此问题的任何想法?[/quot]

    许可证允许您试用高级功能、但我不确定是否包含"GigaWave Option"。 请与  SynaptiCAD 核对。

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

    哎呀。  最好不要触摸 SRAM 和闪存速度并保持 HCLK_Divider = 1。  我想我可以只运行 VCLK2=50MHz (VCLK2_Divider=2)、并使用 HR=5 (而不是10)来获得 HR_Clock=10MHz。

    非常感谢您指出这一点。

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

    我已经向 SynaptiCAD 发送了许可证的人员发送了电子邮件、明天应该会收到回复。  我只是认为这是一个常见的问题、HET 开发人员都知道答案。

    谢谢。

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

    许可证问题已解决。  事实证明,必须执行“帮助”->“设置新许可证”并按名称/路径指定许可证文件。  Help->ViewLicenseDetails->ViewFiles 未设置许可证。

    谢谢。

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

    因此、以下代码(如前所述)确实会生成5MHz (200Hz)时钟。  但是、我不清楚这些指令的含义。  在 ECMP 指令中、action=PULSEHI 和 hr_data=0有什么作用?  我可以看到、PULSEHI 在 Rega=1563时将引脚0设置为高电平、但什么将引脚设置为低电平?  当 Rega 从0变为1时,引脚(引脚0)变为低电平(我在波形中看到的是什么),这是否意味着隐式的?  该 ECMP 指令在周期的后半部分创建高脉冲(占空比)、但如果我使用 ACTION=PULSELO、我会在周期的前半部分看到高脉冲、但周期从低电平开始的第一个周期除外。  如果只是为了使第一个周期"相当"(我知道它在功能上没有任何不同)、是否有任何方法可以将引脚0启动为高电平?  hr_data=0有什么作用?  我更改了 hr_data 的各种值、例如 hr_data=15、并且没有看到任何明显的波形差异(在引脚0上)。

    50.000000 MHz、HR = 5、LR = 16
    l0 CNT{reg=a、max=3124、data=0};
    L1 ECMP{NEX=L0、hr_lr=low、en_pin_action=on、pin=0、action=PULSEHI、reg=a、data=1563、hr_data=0};

    为了尝试"重新对齐" L0上的计数器、我尝试将 Rega 修改为0、以便计数器"重新启动"计数器、但这不起作用、因为计数器在计数时重新写入 Rega。  我尝试了以下操作:

    l0 CNT{reg=a、max=3124、data=0};
    L1 ECMP{hr_lr=low、en_pin_action=on、pin=0、action=PULSEHI、reg=a、data=1563、hr_data=0};
    L2 BR{NEX=L0、COND_ADDR=L3、EVENT=RISE、PIN=3};
    L3 MOV32{NEX=L0、REMOVE=0、TYPE=IMTOREG、REG=A、DATA=0};

    并让激励源创建者在引脚3上以1500微秒的频率生成10微秒的脉冲。  我看到 L3被执行、从0x3aa 将 Rega 设置为0。  但是当我单步执行并转到 L0时、计数器会转到0x3ab (被 CNT 计数器覆盖)。

    L0上的计数器"重新对齐"的正确方式是什么?  我看不到任何控制计数器已经在运行的方法。  我看不到《技术参考手册》中的指令中的许多字段、例如 CNT 中的 control={on|off}(可能在某个位置、但在 CNT 指令中不是)、甚至不知道这些字段是否相关。

    感谢你的帮助。

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

    如果我愿意牺牲5ms 时钟的占空比、那么以下代码将起作用:

    l0 CNT{reg=a、max=3124、data=0};
    L1 ECMP{hr_lr=low、en_pin_action=on、pin=0、action=PULSEHI、reg=a、data=1563、hr_data=0};
    L2 BR{NEX=L0、COND_ADDR=L3、EVENT=RISE、PIN=3};
    L3 ADM32{NEX=L0、REMOTE=L1、TYPE=IM&REGTOREM、REG=A、DATA=2};

    当引脚3上升时、ECMP 数据更新为当前环路计数+ 2、因此 PULSEHI 将在引脚3上升2次后发生、并在 CNT 固定5ms 周期结束时变为低电平。

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

    代码需要在计数器翻转时处理边界条件、因此 L3和 L5 "推动"引脚3输入1循环计数...

    l0 CNT{reg=a、max=3124、data=0};
    L1 ECMP{hr_lr=low、en_pin_action=on、pin=0、action=PULSEHI、reg=a、irq=on、data=1563、hr_data=0};
    L2 BR{NEX=L0、COND_ADDR=L3、EVENT=RISE、PIN=3};
    L3 ECMP{hr_lr=low、en_pin_action=off、con_addr=L5、pin=0、reg=a、data=3124、hr_data=0};
    L4 ADM32{NEX=L0、REMOTE=L1、TYPE=IM&REGTOREM、REG=A、DATA=1};
    L5 MOV32{NEXT = L0、REMOTE = L1、TYPE = IMTOREG&REM、reg =无、DATA = 1};

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

    您好、QJ、

    因此、我需要添加一个根据条件置为有效的信号、并在稍后自行取消一些循环计数(例如1 msec)。  在下面的代码中、L3设置引脚1 (基于 L2的条件、看到引脚3上升)。  我需要在一段时间后清除引脚1。  我无法(轻松)将 PULSEHI 用于 L3的 ECMP、因为隐式清零将根据 L0的 CNT 环路(reg A 值)发生、而这一点与引脚3上升不容易相关。  根据 L3指令执行时间、是否有一些(简单)方法来清除引脚1、也许使用一个计数器(在寄存器 B 中??) 它会向下计数到0?  HET 引擎+指令相当强大、但很模糊、我怀疑已经有很多已建立的代码段来执行这种操作。

    l0 CNT{reg=a、max=3124、data=0};
    L1 ECMP{hr_lr=low、en_pin_action=on、pin=0、action=PULSEHI、reg=a、irq=on、data=1563、hr_data=0};
    L2 BR{NEX=L0、COND_ADDR=L3、EVENT=RISE、PIN=3};
    L3 ECMP{hr_lr=low、en_pin_action=on、pin=1、action=set、reg=none、data=0};
    L4 ECMP{hr_lr=low、en_pin_action=off、cond_addr=l6、pin=0、reg=a、data=3124、hr_data=0};
    L5 ADM32{NEX=L0、REMOTE=L1、TYPE=IM&REGTOREM、REG=A、DATA=1};
    L6 MOV32{NEXT = L0、REMOTE = L1、TYPE = IMTOREG&REM、reg =无、DATA = 1};

    非常感谢您的想法。

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

    看起来就像这样。  L7将 regB 设置为625 (625 * 1.6 usec = 1 msec)。  L2递减 regB、L3允许 L4仅在 regB 超过0的交叉上运行、以清除引脚1。

    l0 CNT{reg=a、max=3124、data=0};
    L1 ECMP{hr_lr=low、en_pin_action=on、pin=0、action=PULSEHI、reg=a、irq=on、data=1563、hr_data=0};
    L2 SUB{src1=B、src2=IMM、dest=B、data=1};
    L3 BR{COND_ADDR=L5、EVENT_NZ};
    L4 ECMP{hr_lr=low、en_pin_action=on、pin=1、action=clear、reg=none、data=0};
    L5 BR{NEX=L0、COND_ADDR=L6、EVENT=RISE、PIN=3};
    L6 ECMP{hr_lr=low、en_pin_action=on、pin=1、action=set、reg=none、data=0};
    L7 MOV32{type=IMTOREG、reg=B、data=625};
    L8 ECMP{hr_lr=low、en_pin_action=off、cond_addr=L10、pin=0、reg=a、data=3124、hr_data=0};
    L9 ADM32{NEX=L0、REMOTE=L1、TYPE=IM&REGTOREM、REG=A、DATA=1};
    L10 MOV32{NEXT = L0、REMOTE = L1、TYPE = IMTOREG&REM、reg =无、DATA = 1};

    谢谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 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/4388801 #4388801"]在 ECMP 指令中,action=PULSEHI 和 hr_data=0有什么作用?[/quot]

    将所选引脚设置为高电平。 HR_DATA 是 HR 延迟的值。 如果 hr_data=0或 hr_lr=1、则所选引脚将在下一个 LRP 上被拉高。 如果 hr_data 不等于零且 hr_LR=0、则所选引脚在下一个 LRP 加 HR 延迟时被拉高。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 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/4388801 #4388801"]但什么会将引脚设置为低电平?  当 Rega 从0变为1时,引脚(引脚0)变为低电平(我在波形中看到的是什么)是否隐含的?

    当零标志被置位时、所选引脚被拉至低电平。 当数据等于 CNT 指令中的最大计数时、CNT 指令将设置零标志。 ECMP 不影响零标志。

    [引用 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/4388801 #4388801"]如果仅使第一个周期"相当"(我知道它在功能上没有任何区别)、是否有任何方法可以将引脚0启动为高电平?

    N2HET 汇编指令不具有初始化 N2HET 引脚状态的功能。 但您可以在 hetInit() C/C++函数中将引脚设置为已知状态。

    [引用 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/4388801 #4388801"]hr_data=0有什么作用?  我更改了 hr_data 的各种值、例如使用 hr_data=15、并且在波形中看不到任何明显的差异(在引脚0上)。

    有5个 HR 指令:ECMP、MCMP、WCAP、PCNT 和 PWCNT。 所有 这5条指令都有一个专用的 hr_lr 位。 当 hr_LR=0 (电平)时、指令处于高分辨率(HR)运行模式、并使用 hr_data。 当 hr_lr=1 (电平)时、该指令处于标准模式并且未使用 hr_data。 默认情况下、hr_lr=0 (HR 模式)。  

    HR_LR =高 电平--> hr_LR = 0 --> HR 运行模式

    HR_LR =低 电平--> hr_LR = 1 -->标准运行模式

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 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/4388801 #4388801"]、并让激励源创建者在引脚3上以1500 μ s 的频率生成10 μ s 的脉冲。  我看到 L3被执行、从0x3aa 将 Rega 设置为0。  但当我单步执行并转到 L0时、计数器会转到0x3ab (被 CNT 计数器覆盖)。[/QUERP]

    这是预期的。 MOV32可以更改远程地址(代码中的 CNT)的寄存器和/或数据字段值。 它不会更改计数器值、CNT 会将寄存器值更新为数据字段加1:Rega=data+1

    计数器只有在计数值达到最大值时才被清零。

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

    感谢您的澄清。  此信息可能被埋在《技术参考手册》的某些模糊部分中。

    IDE 使用低和高助记符而不是1和0、因为这是"反向的"。  通常、我们假设 LOW = 0、HIGH = 1、Yes_NO=1选择 Yes 而不是 NO (因此 hr_lr=1 _应该_意味着 hr 而不是 lr)。  文档和编码/解释的有趣部分。

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

    感谢您的说明。  使用 IDE/仿真器可以明显看出其中的一些/许多、但您的确认有助于我对猜测(或猜测)充满信心。

    这个 HET IDE 非常小。  我不知道没有 HET 编码的任何人都可以做什么。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 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/4389470 #4389470"]L2 sub{src1=B、src2=IMM、dest=B、data=1};
    L3 BR{COND_ADDR=L5、EVENT_NZ};[/QUERP]

    很好。 这比使用外部引脚的上升沿作为 BR 事件更好。  

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

    您好、QJ、

    我尝试在 HET IDE 中使用 tools->Send_to_Halcogen,并得到在我指定的 hL_het.c 中不存在 hetPROGRAM[]的错误。  这是因为 hL_het.c 具有 het2PROGRAM[]而不是 hetPROGRAM[]。  是否有任何已确定的解决方法、或者我是否必须"解决"此问题(手动或通过某些脚本)。  很明显、IDE 只能与一个 HET 器件配合使用、而 TMS570-LC43有两个 HET 1和 HET2。

    此外,是否有一些已建立的过程将 IDE 输出合并到 Halcogen 代码生成中,或者每个用户是否都必须手动执行此操作,运行 Halcogen File->Generate_Code,然后手动运行 IDE Send_to_Halcogen?  如果 Halcogen 能够查找 IDE 的输出结果并自动将其合并、那将会很好。

    非常感谢。

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

    尊敬的 Peter:

    HET IDE 可以生成 c 文件和 h 文件

    2.在 HALCoGen HET GUI 中、您可以将 IDE 生成的*。c 和*。h 文件导入到 HAL 项目中。

    3. hetInit()被更新以将您的新代码复制到 HET RAM:

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

    您好、QJ、

    您必须 运行比我新的 HET IDE。  我使用的是03.05.01。

    我用(Cygwin) Bash 脚本破解了构建过程、这不是很巧妙、但工作正常。  将使用更新的 IDE (或当前 IDE、如果我可以了解如何操作)更改过程。

    编号
    相应目录中的#:
    编号
    #运行 Halcogen,File->Generate_Code
    #运行 fix_het
    #运行 HET IDE,Tools->Send_to_HalCoGen,浏览至 hL_het.c,确定,X
    #运行 fix_het -f
    #运行 CCS、Project->Build_Project
    编号

    编号
    # fix_het
    编号

    f=hL_het.c

    如果[["$1"!=-f ]]
    然后 sed -i -e '/het2PROGRAM/{s//hetPROGRAM/g
    S/\[.*\]/\[\]/
    S/static //}'$F"
    FI

    unix2dos“$F”

    ===

    在任何情况下,当安装 HET 程序时,我当前的问题都将发生 edgeNotitimation()。  我在为 Halcogen 的引脚8配置中断时做了所有明显的事情,希望发生 edgeNotification()。  我在 het2HighLevelInterrupt()中放置了一个断点,但它根本不会触发。  为了进行比较,当我使用 pwmNotification()机制时,中断按预期发生。

    int main (空)

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

    timer_init();

    uint32 dir = hetPORT2>DIR;
    DIR |= 0x00000940U;//输出位6、8、11
    gioSetDirection (hetPORT2、dir);
    gioSetBit (hetPORT2、8、1);
    gioSetBit (hetPORT2、6、0);
    gioSetBit (hetPORT2、11、1);

    hetInit();
    edgeEnableNotification (hetREG2、edge0);//上升输出引脚8 (5 msec 脉冲)
    _enable_FIQ ();
    _enable_IRQ ();
    Timer_delay (10);
    while (1);
    /*用户代码结束*/

    返回0;

    void edgeNotification (hetbase_t * hetREG、uint32边缘)

    if (hetREG =hetREG2 && EDGE =edge0){//生成了5msec 时钟

    (笑声)

    非常感谢您的帮助。

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

    我使用您提供的说明(首先需要汇编和加载)插入了.c 和.h 文件。  但是,het2HighLevelInterrupt()仍是_NOT_触发。  看不到我需要调用的任何"启动"函数。   het2HighLevelInterrupt()将发送到 hetNotification()而不是 edgeNotification(),我对此并不清楚。

    对于 HET2、我将.c 和.h 从 HET_INIT0_PST 编辑为 HET_init1_PST。  我确实看到发生了 memcpy()。

    ===在 hL_het.c...

    空 het2HighLevelInterrupt (空)

    uint32 vec = hetREG2->OFF1;

    hetNotification (hetREG2、VEC);

    谢谢。

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

    您好、QJ、

    因此,我注意到 INTENAS 为0 (如果没有调用 edgeEnableNotification(),因为生成的代码使用 hetNotification()),所以我只盲目地启用了所有 hetREG2中断。  仍然调用_no_ het2HighLevelInterrupt()。

    《技术参考手册》中的表23-22提到了 INTENAS 位,但并不清楚启用 hetNotification()时哪些位是要关注的位。

    感谢您的帮助。

    ===要与 INTENAS 一起使用的代码

    hetInit();
    // edgeEnableNotification (hetREG2、edge0);//上升输出引脚8 (5 msec 脉冲)
    // edgeEnableNotification (hetREG2、Edge1);//上升输出引脚11 (1秒脉冲)
    uint32 het2_intnas = hetREG2->INTENAS;
    hetREG2->INTENAS =~0;// hack:立即启用所有中断
    het2_intnas = hetREG2->INTENAS;
    _enable_FIQ ();
    _enable_IRQ ();
    Timer_delay (10);
    while (1);

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

    我已仔细检查 VIM 通道63 (HET2电平0)和 VIM 通道73 (HET2电平1)是否被启用。

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

    我假设一个1.6 μ s 的反向脉冲应该能够在上升沿触发一个中断。

    感兴趣的引脚是 hetm_watch_8.in。。。

    已缩放...

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

    虽然我不知道哪个 INTENAS 位会影响 hetNotification(),但看起来中断最终会发生。  可能必须执行一些盲区搜索。

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

    尊敬的 Peter:

    您的 N2HET 代码是否检测并捕捉引脚9上输入信号的边沿? 例如、您可以使用 ECNT、PCNT 来检测边沿。 如果指令的 IRQ 被启用、则在事件发生时将生成中断。

    HETFLG 寄存器在一个中断发生后被置位。 HETFLG 的位 xyz 是 N2HET 代码中指令地址的编号。

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

    您好、QJ、

    我的当前代码如下所示。

    我将 N2HET2_11 (1 PPS 输出)跳线连接到 N2HET2_9 (1 PPS 输入)、并且看到 N2HET2_11脉冲(启用中断以进行计数)。  但是、我看不到 N2HET2_9脉冲(当所有 HET2中断都通过 INTENAS 启用时、没有中断)。  我已经通过仪表检查了2个引脚(J9_24和 J9_27)之间的物理连接。

    通过实验、我看到生成的5msec 时钟(N2HET2_8)使用 INTENAS 中的0x2位、生成的1sec 时钟(N2HET2_11)使用 INTENAS 中的0x8位。  我不清楚 INTENAS 位如何与引脚(或 HET 程序)相关联,但它们与传递给 hetNotification()的 VEC 直接相关。

    由于我正在启用所有 INTENAS 位、我认为 N2HET2_9 (1 PPS 输入)应该触发一个中断(并且也导致5msec 时钟的重新同步)。  请注意、无论1PPS 输入是什么、5msec 时钟都会运行、但如果1PPS 输入未发生、则仅为"未对齐"。

    在 C 代码中、我看到 numVec[2]几乎是 numVec[4]的200倍、与1Hz 时钟相比、预计200Hz 时钟的频率也是如此。  我看不到其他 VEC 值上发生了任何其他 hetNotification()。

    我了解了大部分明显的 Halcogen 设置、但无法判断 N2HET2_9输入不正确的原因。  我已将引脚设置为"输入"、并将 PINMUX PIN_Mux 设置为 K17、并将 INPIN_PIN_Mux 设置为 K17 (不清楚它们的作用)。  L7上的 HET 程序具有 IRQ=ON,这大概会触发一个带有某些 VEC 值的 hetNotification()(不知道具体的 VEC 值(不知道已经使用的2或4)。

    我必须查看 HETFLG 寄存器。  但是、鉴于 N2HET2_9没有发生 hetNotification()(可以通过 numVec[*]看到)、我认为 HETFLG 不会显示任何其他情况。

    感谢您对可能出现的问题有任何看法。

    === HET 程序

    l0 CNT{reg=a、max=3124、data=0};
    L1 ECMP{hr_lr=low、en_pin_action=on、pin=8、action=PULSEHI、reg=a、irq=on、data=1563、hr_data=0};
    L2 CNT{reg=T、max=624999、data=0};
    L3 ECMP{hr_lr=low、en_pin_action=on、pin=11、action=PULSEHI、reg=T、IRQ=on、data=312500、hr_data=0};
    L4 sub{src1=B、src2=IMM、dest=B、data=1};
    L5 BR{COND_ADDR=L7、EVENT=NZ};
    L6 ECMP{hr_lr=low、en_pin_action=on、pin=6、action=clear、reg=none、data=0};
    L7 BR{NEX=L0、COND_ADDR=L8、PIN=9、EVENT=RISE、IRQ=ON};
    L8 ECMP{hr_lr=low、en_pin_action=on、pin=6、action=set、reg=none、data=0};
    L9 MOV32{type=IMTOREG、reg=B、data=625};
    L10 ECMP{hr_lr=low、en_pin_action=off、cond_addr=L12、pin=8、reg=a、data=3124、hr_data=0};
    L11 ADM32{NEX=L0、REMOTE=L1、TYPE=IM&REGTOREM、REG=A、DATA=1};
    L12 MOV32{NEXT = L0、REMOTE = L1、TYPE = IMTOREG&REM、reg =无、DATA = 1};

    === C 程序

    int main (空)

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

    timer_init();

    uint32 dir = hetPORT2>DIR;
    DIR |= 0x00000940U;//输出位6、8、11
    gioSetDirection (hetPORT2、dir);
    gioSetBit (hetPORT2、8、1);
    gioSetBit (hetPORT2、6、0);
    gioSetBit (hetPORT2、11、1);

    hetInit();
    // edgeEnableNotification (hetREG2、edge0);//上升输出引脚8 (5 msec 脉冲)
    // edgeEnableNotification (hetREG2、Edge1);//上升输出引脚11 (1秒脉冲)
    uint32 het2_intas = hetREG2->INTENAS;
    hetREG2->INTENAS =~0;// hack:立即启用所有中断
    ///hetREG2->INTENAS = het2_intas | 0xA;// 0x8 == 1秒脉冲输出、0x2 == 5毫秒脉冲
    // hetREG2->INTENAS = het2_intas | 0xA;// 0xx = 1秒脉冲输入、0x8 = 1秒脉冲输出、0x2 = 5毫秒脉冲输入
    het2_intas = hetREG2->INTENAS;
    _enable_FIQ ();
    _enable_IRQ ();
    Timer_delay (10);
    while (1);
    /*用户代码结束*/

    返回0;


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

    uint32 numNotifications;
    uint32 numBadNotifications;
    uint32 numVec[16];

    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]++;
    if (hetREG = hetREG2 && VEC = 2){//生成5毫秒时钟
    numNotifications ++;
    uint64 tmr_c_now = timer_creadx ();
    uint32 het2_6_first_5msec = gioGetBit (hetPORT2、6);// PPS 中的前5 ms
    if (het2_6_first_5msec = 0){
    if (tmr_c_start!= 0ULL){
    tmr_c_next = tmr_c_now - tmr_c_start;
    usec_next = timer_udiff (0ULL、tmr_c_next);
    TMR_c_start = 0ULL;

    tmr_c_current = tmr_c_now - tmr_c_start - tmr_c_next;
    usec_current = timer_udiff (0ULL、tmr_c_current);

    否则{
    tmr_c_start = tmr_c_now;
    usec_start = timer_udiff (0ULL、tmr_c_start);


    否则、如果(hetREG = hetREG2 && VEC = 4){//生成1秒时钟
    VEC = VEC;

    否则,如果(hetREG == hetREG2 && VEC ==0){//???
    VEC = VEC;

    其他
    numberBadNotifications ++;

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 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/4400936 #4400936"]我不清楚 INTENAS 位如何与引脚(或 HET 程序)相关联,[/quot]

    实际上、它与指令地址而不是引脚编号相关。 INTENAS 和 HETFLG 中的位编号(位1和位3)是 L1 (第2个)和 L3 (第4个)的地址

    l0 CNT{reg=a、max=3124、data=0};

    L1 ECMP{hr_lr=low、en_pin_action=on、pin=8、action=PULSEHI、reg=a、irq=on、data=1563、hr_data=0};

    L2 CNT{reg=T、max=624999、data=0};

    L3 ECMP{hr_lr=low、en_pin_action=on、pin=11、action=PULSEHI、reg=T、IRQ=on、data=312500、hr_data=0};

     N2HET2_9用于 L7 BR{NEX=L0、COND_ADDR=L8、PIN=9、EVENT=RISE、IRQ=ON}、INTENAS 的位7应该被置位。 当 L7指令检测到上升沿时、HETFLG[7]位被置位。

    L7指令是否检测到引脚9上的上升沿?  

       

    L16在 LC43x Launchpad 上用作 HET2_9。

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

    您好、QJ、

    非常感谢您提供的信息。

    当我将 HET2_9重新置于 L16上时、中断(实际上仅用于测试/sanity_check、稍后将在 IRQ =关闭时关闭)现在发生了良好的情况、并且输入1 PPS 现在与输出1 PPS 匹配(在 HET2_11上)。  现在我更好地掌握了 PINMUX、最后得到的是球状引脚是球栅阵列上的引脚。  对于 HET2_9、为什么 HET2_9的"引脚多路复用"具有 K17选择(这对于我的设置似乎无关紧要)、而 HET2_9的"输入引脚多路复用"具有 L16/K17选择?  我猜两个球可同时连接到 HET2_9 (在我的案例中未使用 K17)。  N2HET2[9]链接到 L16上的 N2HET2_9/9.3C 的图(如上所示)在哪里?  我以前在阅读文件时可能遇到过这种情况,但这种意义很可能使我无法理解。  我刚刚搜索了《技术参考手册》、但未找到任何此类图表(但 pdf 搜索不可靠)。

    我看到 L7中断、因此可能 HET2_9到达 HET 程序以影响 HET2_8和 HET2_6。  但是、我的 C 程序每秒没有看到 HET2_6激活1毫秒(如仿真所示)。  HET2_8 (5msec)通知处理程序应该会看到 HET2_6设置(每200次一次)、但这不会发生。  这可能是另一个 PINMUX 问题。  也许我将在 L8上启用中断来查看 HET2_6是否完全切换。  现在、我没有一个信号分析器可以方便地从外部观察活动。

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

    不、L8不会生成任何中断、表示 HET2_6不会切换(在仿真中是这样)。

    此外、如果 INTENAS 只有32位、则只能为 IRQ=on (如果可用/可用时)启用32条指令。  我看到 HET 在某个地方支持多达256条指令。  不适用于我的案例、只是好奇而已。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 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/4402082 #4402082"]在哪里可以找到 N2HET2[9]链接到 L16上的 N2HET2_9/9.3C 的图(如上所示)?

    第一个图来自 LaunchPad 原理图。 它显示了 launchpad 上 N2HET2_9使用的焊球(K17或 L16)。  

    TMS570LC43x 和 RM57Lx LaunchPad 原理图

    [引用 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/4402082 #4402082"]对于 HET2_9、为什么 HET2_9的"引脚复用"具有 K17选择(这对于我的设置似乎无关紧要)、而 HET2_9的"输入引脚复用"具有 L16/K17选择?

    K17和 L16都连接到 N2HET2_9、但 K17端子也连接到其他模块。 L16是 N2HET2_9的专用引脚。 如果在"引脚复用"中将 K17分配给 N2HET2_9、则 K17和 L16都可以输出 N2HET2_9信号。 但对于输入、只能接受一个输入、因此 L16和 K17的输入有一个多路复用器。

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

    您好、QJ、

    我有点困惑。  对于以下 HET 程序、如果 L7上的中断触发、L8将执行、因此 L8上的中断应该触发(与引脚6上的接线无关)。  L8是无条件的、AFADICT。

    L8是否会以某种方式_not _运行(因此 L8中断未触发、引脚6未设置)?  我看不到任何会阻止中断的 Halcogen 配置(INTENAS 设置为启用所有中断)。

    感谢您的建议。

    ===

    l0 CNT{reg=a、max=3124、data=0};
    L1 ECMP{hr_lr=low、en_pin_action=on、pin=8、action=PULSEHI、reg=a、irq=on、data=1563、hr_data=0};
    L2 CNT{reg=T、max=624999、data=0};
    L3 ECMP{hr_lr=low、en_pin_action=on、pin=11、action=PULSEHI、reg=T、IRQ=on、data=312500、hr_data=0};
    L4 sub{src1=B、src2=IMM、dest=B、data=1};
    L5 BR{COND_ADDR=L7、EVENT=NZ};
    L6 ECMP{hr_lr=low、en_pin_action=on、pin=6、action=clear、reg=none、data=0};
    L7 BR{NEX=L0、COND_ADDR=L8、PIN=9、EVENT=RISE、IRQ=ON};
    L8 ECMP{hr_lr=low、en_pin_action=on、pin=6、action=set、reg=none、irq=on、data=0};
    L9 MOV32{type=IMTOREG、reg=B、data=625};
    L10 ECMP{hr_lr=low、en_pin_action=off、cond_addr=L12、pin=8、reg=a、data=3124、hr_data=0};
    L11 ADM32{NEX=L0、REMOTE=L1、TYPE=IM&REGTOREM、REG=A、DATA=1};
    L12 MOV32{NEXT = L0、REMOTE = L1、TYPE = IMTOREG&REM、reg =无、DATA = 1};

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

    ECMP 的说明显示了寄存器和数据值相等时触发的中断。  如果注册为 none、我不知道比较成功还是失败。  我希望一个中断无条件发生、这样我就可以告诉 L8指令被执行(并且 PIN6也因此被置位)。  除了 ECMP 之外、是否还有任何将无条件地置位引脚6并无条件地生成中断的指令?

    似乎、如果 L7看到引脚9上升(并因此发出中断)、则 L8必须设置引脚6。  但电流证据是引脚6不会摆动。

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

    当我在 HET IDE/仿真器中执行单步 L8时、我看到 NHETFLG 从0x82变为0x182、这表示发生了中断。  但是、在实际的 Launchpad 中、我看不到 L8 (0x100)中断。

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

    在 CCS 中、当我随机停止执行时、我看到包含0x0000008A 或0x00000002的 Nhet2->IntFlg 寄存器、从未设置0x00000100。  这似乎表明 L8中断从未发生。

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

    如果我上传了 HETIDE 和 example_het 项目、以便您可以自己运行 HET 和 Launchpad 代码、会有所帮助吗?  这将消除我可能会产生的任何程序错误。

    非常感谢。

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

    我已将项目上载到:

    www.protonmail.com

    用户名:Shareuser1000

    密码:密码

    主题:aligned_5msec 时钟的 HET IDE 和 CCS 项目

    非常感谢。

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

    我添加了更多调试功能、实际上 L8不是在 Launchpad 中执行、而是在 HET 仿真器中执行、这会导致引脚6在前者中未设置、而 是在后者中设置。  L7a (VEC = 9)和 L8a (VEC = 11)会导致 C 程序中的中断读取引脚6输出。

    在 C 程序中、het2_6_pre 和 het2_6_post 都显示0 (读取 POST 后设置断点时)。  由于中断处理时间的原因、如果引脚6已经被置位(因为 L8必须已经被执行)、那么 PRE 可能会显示为0或1、但是 POST 肯定会显示为1。 我在下面添加了 HET2_6引脚 Halcogen 设置。

    C 程序中的 numVec[*]显示 L7a 和 L7b 中断、而 L8不中断(全部 IRQ =开)。

    我猜是在仿真器中触发了 reg=none 的 L8 ECMP、但在实际的 HET 微引擎中_不_。  这似乎不是引脚6设置的问题、因为首先由于 L8、C 代码不会中断。

    是否有一些其他指令+操作数将_无条件_设置引脚6?  这就是我在 L8中所想要的(显然 ECMP 在实际引擎中不能实现)。

    感谢您的建议。

    === HET 程序、调试 L7a 和 L8a、触发 C 代码中的中断、L8之前和之后

    l0 CNT{reg=a、max=3124、data=0};
    L1 ECMP{hr_lr=low、en_pin_action=on、pin=8、action=PULSEHI、reg=a、irq=on、data=1563、hr_data=0};
    L2 CNT{reg=T、max=624999、data=0};
    L3 ECMP{hr_lr=low、en_pin_action=on、pin=11、action=PULSEHI、reg=T、IRQ=on、data=312500、hr_data=0};
    L4 sub{src1=B、src2=IMM、dest=B、data=1};
    L5 BR{COND_ADDR=L7、EVENT=NZ};
    L6 ECMP{hr_lr=low、en_pin_action=on、pin=6、action=clear、reg=none、data=0};
    L7 BR{NEX=L0、COND_ADDR=L7a、PIN=9、EVENT=RISE、IRQ=ON};
    L7a DJZ{NEX=L8、COND_ADDR=L8、REG=NONE、IRQ=ON};
    L8 ECMP{hr_lr=low、en_pin_action=on、pin=6、action=set、reg=none、irq=on、data=0};
    L8a DJZ{NEX=L9、COND_ADDR=L9、REG=NONE、IRQ=ON};
    L9 MOV32{type=IMTOREG、reg=B、data=625};
    L10 ECMP{hr_lr=low、en_pin_action=off、cond_addr=L12、pin=8、reg=a、data=3124、hr_data=0};
    L11 ADM32{NEX=L0、REMOTE=L1、TYPE=IM&REGTOREM、REG=A、DATA=1};
    L12 MOV32{NEXT = L0、REMOTE = L1、TYPE = IMTOREG&REM、reg =无、DATA = 1};

    ===添加了调试功能的 C 程序,在 L8前后读取引脚6

    int main (空)

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

    timer_init();

    uint32 dir = hetPORT2>DIR;
    DIR |= 0x00000940U;//输出位6、8、11
    gioSetDirection (hetPORT2、dir);
    gioSetBit (hetPORT2、8、1);
    gioSetBit (hetPORT2、6、0);
    gioSetBit (hetPORT2、11、1);

    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;

    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]++;
    if (hetREG =hetREG2 && VEC == 2){//生成5毫秒时钟,HET 程序 L1
    numNotifications ++;
    uint64 tmr_c_now = timer_creadx ();
    uint32 het2_6_first_5msec = gioGetBit (hetPORT2、6);// PPS 中的前5 ms
    if (het2_6_first_5msec = 0){
    if (tmr_c_start!= 0ULL){
    tmr_c_next = tmr_c_now - tmr_c_start;
    usec_next = timer_udiff (0ULL、tmr_c_next);
    TMR_c_start = 0ULL;

    tmr_c_current = tmr_c_now - tmr_c_start - tmr_c_next;
    usec_current = timer_udiff (0ULL、tmr_c_current);

    否则{
    tmr_c_start = tmr_c_now;
    usec_start = timer_udiff (0ULL、tmr_c_start);


    否则、如果(hetREG = hetREG2 && VEC = 4){//生成1秒时钟、HET 程序 L3
    VEC = VEC;

    否则、如果(hetREG = hetREG2 && VEC = 8){//输入1秒时钟、HET 程序 L7
    VEC = VEC;

    否则、如果(hetREG = hetREG2 && VEC = 9){//xx // PPS 中的前5毫秒、HET 程序 L8
    het2_6_pre = gioGetBit (hetPORT2、6);
    VEC = VEC;

    否则、如果(hetREG =hetREG2 && VEC ==10 /*9*/){// PPS 中的前5毫秒,HET 程序 L8
    VEC = VEC;

    否则、如果(hetREG = hetREG2 && VEC = 11){//xx // PPS 中的前5毫秒、HET 程序 L8
    het2_6_post = gioGetBit (hetPORT2、6);
    VEC = VEC;

    其他
    numberBadNotifications ++;

    /*用户代码结束*/

    ==HET2_6引脚设置

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

    在 L7a 和 L8上进行以下更改(将 reg R 与0进行比较)时、L8会在 C 程序中引起中断。  假设引脚6由 L8设置。  我希望使用 reg R 不会导致任何不良的副作用。  因此、仿真器和实际引擎在处理 L8 ECMP 的方式上确实有所不同。 当 reg =none 时。

    但是、我看不到 C 程序中设置的引脚6。  Halcogen PINMUX 将 HET2[6]连接到 M1和 D11、而 Launchpad 将 D11连接到 N2HET2_6。  我尝试连接和断开 M1、以防万一、它在行为上没有任何影响。

    假设 L8实际设置了引脚6、那么还有什么可能导致引脚_not _变为活动状态?

    感谢您的建议。

    ===

    l0 CNT{reg=a、max=3124、data=0};
    L1 ECMP{hr_lr=low、en_pin_action=on、pin=8、action=PULSEHI、reg=a、irq=on、data=1563、hr_data=0};
    L2 CNT{reg=T、max=624999、data=0};
    L3 ECMP{hr_lr=low、en_pin_action=on、pin=11、action=PULSEHI、reg=T、IRQ=on、data=312500、hr_data=0};
    L4 sub{src1=B、src2=IMM、dest=B、data=1};
    L5 BR{COND_ADDR=L7、EVENT=NZ};
    L6 ECMP{hr_lr=low、en_pin_action=on、pin=6、action=clear、reg=none、data=0};
    L7 BR{NEX=L0、COND_ADDR=L7a、PIN=9、EVENT=RISE、IRQ=ON};
    l7a sub{src1=zero、src2=zero、dest=R、data=0};
    L8 ECMP{hr_lr=low、en_pin_action=on、pin=6、action=set、reg=R、irq=on、data=0};
    L8a DJZ{NEX=L9、COND_ADDR=L9、REG=NONE、IRQ=ON};
    L9 MOV32{type=IMTOREG、reg=B、data=625};
    L10 ECMP{hr_lr=low、en_pin_action=off、cond_addr=L12、pin=8、reg=a、data=3124、hr_data=0};
    L11 ADM32{NEX=L0、REMOTE=L1、TYPE=IM&REGTOREM、REG=A、DATA=1};
    L12 MOV32{NEXT = L0、REMOTE = L1、TYPE = IMTOREG&REM、reg =无、DATA = 1};

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

    尊敬的 Peter:

    我正在处理其他请求、今天没有时间检查您的项目。