随附代码使用 PWM2来生成一些固定频率、10kHz 和固定占空比(40%)的测试脉冲。
在 GPIO13上读取这些脉冲。 XINT1在 GPIO13上启用、上升沿检测打开。 因此、只要 PWM2脉冲变为高电平、就应该触发 XINT1中断。
我还启用了固定频率为500Hz 的 PWM1模块。 当 CNT=COMPA 时、PWM 引脚被驱动为高电平、 当 CNT=COMPB 时、PWM 引脚被驱动为低电平。
还在 XINT1中断中具有测试 GPIO21切换。
只要 XINT1中断被触发、它就会把 PWM1CNT 复位为0。 因此、基本而言、只要 PMW2正在生成脉冲、PWM1应该永远不会看到 CNT=PRD。
现在、如果我必须启用其他中断、那么以上所有操作都很好。 我在 XINT1中断 ISR 调用中看到了固定延迟、该延迟反映在 PWM1脉冲上、并在测试 GPIO21中看到。
只要我在附加的代码中引入另外一个中断、它的 Timer1中断就会开始变得糟糕。 与 XINT1中断优先级(5)、PIE 组1相比、CPU 优先级(17)非常低。
我看到 XINT1中断延迟中存在抖动、扩展时间大约为300ns。 在连接的 PWM1中看到的抖动是从 XINT1传播的抖动。 PMW1CNT 在 XINT 中复位为0、因此 XINT1 ISR 中的任何抖动都将显示在 PWM1脉冲中。
我在用于在 XINT1 ISR 中进行切换的测试 GPIO 输出引脚21中看到了相同的抖动。
我的问题是、为什么低优先级中断会导致高优先级中断延迟发生抖动? 附件是示波器上展示我的读数的一些视频。
源码:
/cfs-file/__key/communityserver-discussions-components-files/171/Example_5F00_2806xEPwmUpAQ.c
示波器视频:
D12上的 PMW1、D9上的 PWM2、D8上的 GPIO21
/cfs-file/__key/communityserver-discussions-components-files/171/JitterInPWM.MOV
/cfs-file/__key/communityserver-discussions-components-files/171/JitterInGpio21.MOV