1

我正在使用 MPLABX + Harmony 框架为 PIC32MZ1024EFK064 编写代码。

我的目标是每微秒触发一次 ISR。为了测试这一点,我在 ISR 1000000 次循环后切换了一个 LED:

uint32_t xxx = 0;

void __ISR(_TIMER_2_VECTOR, ipl1AUTO) IntHandlerDrvTmrInstance0(void)
{

    xxx++;

    if(xxx > 1000000){

        xxx = 0;
        blink();

    }

    PLIB_INT_SourceFlagClear(INT_ID_0,INT_SOURCE_TIMER_2);

}

Timer2 以 80MHz 运行,预分频器为 1,定时器周期为 80。

在我第一次尝试时,LED 每 4 秒切换一次(ISR = 每 4us)。

我发现通过将 PBCLK7 的Postscaler 从 2 更改为 1可以达到 2 秒。(现在 CPU 内核运行在 160MHz 而不是 80MHz)。

但即使我将计时器周期更改为 1,我的 LED 也只会每 2 秒切换一次。

知道如何在这里进一步加快速度吗?

更新:

子程序blink()太慢了。通过直接操作寄存器,它工作在1us

void __ISR(_TIMER_2_VECTOR, ipl1AUTO) IntHandlerDrvTmrInstance0(void)
{
    LATBINV = 1<<8;
    PLIB_INT_SourceFlagClear(INT_ID_0,INT_SOURCE_TIMER_2);
}
4

1 回答 1

1

我对那个特定的微控制器不是很熟悉,但我在 Microchip PIC 上做了很多工作,所以这里有一些你可能想看的点:

1- 首先确保您的时钟(CPU 和 PBCLK)确实以您认为它们运行的​​速度运行。您通常可以在外部引脚上输出一些内部时钟(通常是 PIC32 上的 REFCLKO)。这样您就可以用示波器测量它们并确保它们配置正确。

2-确保最小化中断的内部执行时间。检查 PLIB_INT_SourceFlagClear() 是类似宏的函数还是实际的函数调用。如果这是一个函数调用,您可能希望在寄存器级别工作以避免这种开销。

3-启用编译器优化。顺便说一句,在中断中使用全局变量将其声明为 volatile (或在中断处理函数中将其声明为静态)也是一个好习惯。

4- 除非 Microchip 明确说明,否则请验证是否应在中断处理程序的开头而不是结尾清除中断。在您的情况下可能会发生什么,特别是如果您将其周期设置为非常短的时间,当您仍在中断处理程序中但在清除其标志之前,您的计时器再次到期。在您的中断再次触发之前,这将导致额外的延迟。您想要的是尽快清除该标志,因此如果计时器再次到期,它会设置该标志,这将导致您的中断处理程序在它完成执行后立即再次触发。当然,这不会给您的后台应用程序执行任何时间......

5-我还假设您的计时器配置正确,也就是说,当期限到期时,它会将其内部计数重新加载为 0,但请查看以确保是这种情况。

弗兰克

于 2017-07-04T21:10:25.257 回答