我正在使用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的后分割器从2更改为1 ,我发现可以达到2秒。 (现在CPU核心运行在160MHz而不是80MHz)。
但即使我将定时器周期更改为1,我也只能每隔2秒切换一次LED。
知道如何在这里进一步加快速度吗?
更新
子程序blink()
太慢了。
通过直接操作寄存器,它可以在1us
void __ISR(_TIMER_2_VECTOR, ipl1AUTO) IntHandlerDrvTmrInstance0(void)
{
LATBINV = 1<<8;
PLIB_INT_SourceFlagClear(INT_ID_0,INT_SOURCE_TIMER_2);
}
答案 0 :(得分:1)
我对这个特定的微控制器不是很熟悉,但是对于PIC PICs有很多工作,所以这里有一些你可能想看的点:
1-首先确保您的时钟(CPU和PBCLK)确实以您认为运行的速度运行。通常可以在外部引脚(通常是PIC32上的REFCLKO)上输出一些内部时钟。这样您就可以使用示波器测量它们并确保它们配置正确。
2-确保最小化中断的内部执行时间。检查PLIB_INT_SourceFlagClear()是否是类宏函数或实际函数调用。如果这是一个函数调用,您可能希望在寄存器级别工作以避免这种开销。
3-启用编译器优化。顺便说一句,在中断中使用全局变量将其声明为volatile(或在中断处理函数中声明为静态)时,这也是一种很好的做法。
4-除非Microchip明确记录,否则请确认是否应在中断处理程序的开头而不是结束时清除中断。在您的情况下可能发生的情况,特别是如果您将其周期设置为非常短的时间段,是您的计时器在您仍处于中断处理程序内但在清除其标志之前再次到期。在中断再次发生之前,这会导致额外的延迟。你想要的是尽快清除标志,所以如果计时器再次到期,它会设置一个标志,这将导致你的中断处理程序在完成执行后再次触发。当然,这不会给你的后台应用程序任何时间执行...
5-我也假设您的计时器已正确配置,即在周期到期时将其内部计数重新加载为0,但请注意确保是这种情况。
弗兰克