Hi WDY,
发现两个问题:
1. 您调用capGetSignal的方式不正确。
570系列中一般需要指定哪个het单元,所以参数中应该有hetRAM1或hetRAM2.
如 pulse = capGetSignal(hetRAM1, cap0);
2. capGetSignal自身的问题
的确,HALCoGen的捕获Capture功能接口是针对双pin捕获设计的。
也就是说,举个例子,测量从pin0输入的脉冲,HALCoGen生成的HET程序使用了一条汇编来测量pin0上的duty,而用另外一条语句来测量pin1上的period。
(可能是出于兼容旧方案的考虑吧,以前很多老的MCU都需要两个pin才能同时测量一个信号的周期和占空比。)
实际上,这样做没有必要,在HET中使用两条PCNT指令可以完成同一个引脚上的周期和占空比的测量。
解决眼下的问题,需要稍微修改HET的汇编指令,您可以在het.c的const hetINSTRUCTION_t het1PROGRAM[]数组中找到对应的PCNT指令位置。
比如,您使用cap0的指令应该是第25和26条指令。
如图:

可以看到,第26条指令在测量pin1而不是pin0上的信号........这样导致capGetSignal不能正常工作。
我们可以把这个1U去掉,让这条指令针对pin0.
另外,(0U<<6U)这里,是在配置目标脉冲的"极性",这里我把它改成"3U",即上升沿到上升沿之间的宽度。
而第25条指令处,这里我改为"1U",即上升沿到下降沿之间的宽度。
这样,就相当于对一个"正极性"的脉冲进行测量了。
修改之后如图
这样修改之后就可以正常使用了。
附件是我这个用来测试的例子。
需要注意的是,由于修改了HET的汇编代码,每次HALCoGen中有设置变化并生成源文件时,这部分的修改会被覆盖掉,所以用户要自己保存一下。
Hi WDY,
发现两个问题:
1. 您调用capGetSignal的方式不正确。
570系列中一般需要指定哪个het单元,所以参数中应该有hetRAM1或hetRAM2.
如 pulse = capGetSignal(hetRAM1, cap0);
2. capGetSignal自身的问题
的确,HALCoGen的捕获Capture功能接口是针对双pin捕获设计的。
也就是说,举个例子,测量从pin0输入的脉冲,HALCoGen生成的HET程序使用了一条汇编来测量pin0上的duty,而用另外一条语句来测量pin1上的period。
(可能是出于兼容旧方案的考虑吧,以前很多老的MCU都需要两个pin才能同时测量一个信号的周期和占空比。)
实际上,这样做没有必要,在HET中使用两条PCNT指令可以完成同一个引脚上的周期和占空比的测量。
解决眼下的问题,需要稍微修改HET的汇编指令,您可以在het.c的const hetINSTRUCTION_t het1PROGRAM[]数组中找到对应的PCNT指令位置。
比如,您使用cap0的指令应该是第25和26条指令。
如图:

可以看到,第26条指令在测量pin1而不是pin0上的信号........这样导致capGetSignal不能正常工作。
我们可以把这个1U去掉,让这条指令针对pin0.
另外,(0U<<6U)这里,是在配置目标脉冲的"极性",这里我把它改成"3U",即上升沿到上升沿之间的宽度。
而第25条指令处,这里我改为"1U",即上升沿到下降沿之间的宽度。
这样,就相当于对一个"正极性"的脉冲进行测量了。
修改之后如图
这样修改之后就可以正常使用了。
附件是我这个用来测试的例子。
需要注意的是,由于修改了HET的汇编代码,每次HALCoGen中有设置变化并生成源文件时,这部分的修改会被覆盖掉,所以用户要自己保存一下。
举报