制造商的C代码中断设置

问题描述:

下面的代码片段来自制造商。我对他们正在努力做什么感到困惑。特别是与InterruptHandler有关的任何事情。制造商的C代码中断设置

请对globals部分的代码发表评论。这看起来正确吗?

此外,包括各种API都有我的困难点。他们是否试图使用无效指针? ...很多人问,请评论他们如何建议timer2工作。

... 

/** 
    Section: Global Variables Definitions 
*/ 

void (*TMR2_InterruptHandler)(void); 

... 

/** 
    Section: TMR2 APIs 
*/ 

void TMR2_Initialize(void) 
{ 
    // Set TMR2 to the options selected in the User Interface 

    // T2CKPS 1:2; T2OUTPS 1:2; TMR2ON off; 
    T2CON = 0x11; 

    // T2CS LFINTOSC; 
    T2CLKCON = 0x04; 

    // T2PSYNC Not Synchronized; T2MODE Software control One shot; T2CKPOL Rising Edge; T2CKSYNC Not Synchronized; 
    T2HLT = 0x08; 

    // T2RSEL TMR4_postscaled; 
    T2RST = 0x02; 

    // PR2 8; 
    T2PR = 0x08; 

    // TMR2 0; 
    T2TMR = 0x00; 

    // Clearing IF flag before enabling the interrupt. 
    PIR4bits.TMR2IF = 0; 

    // Enabling TMR2 interrupt. 
    PIE4bits.TMR2IE = 1; 

    // Set Default Interrupt Handler 
    TMR2_SetInterruptHandler(TMR2_DefaultInterruptHandler); 

    // Start TMR2 
    TMR2_Start(); 
} 

void TMR2_ISR(void) 
{ 

    // clear the TMR2 interrupt flag 
    PIR4bits.TMR2IF = 0; 

    if(TMR2_InterruptHandler) 
    { 
     TMR2_InterruptHandler(); 
    } 
} 


void TMR2_SetInterruptHandler(void* InterruptHandler) 
{ 
    TMR2_InterruptHandler = InterruptHandler; 
} 

void TMR2_DefaultInterruptHandler(void) 
{ 
    // add your TMR2 interrupt custom code 
    // or set custom function using TMR2_SetInterruptHandler() 
} 

/** 
    End of File 
*/ 

谢谢你,史蒂夫

编辑: 制造商代码包括程序(我似乎无法在这里补充吧)管理的高级别中断调用,如果TMR2_ISR(PIE4bits.TMR2IE = = 1 & & PIR4bits.TMR2IF == 1)这似乎否定任何TMR2_DefaultInterruptHandler它不会?

再次感谢您的帮助。

+0

你知不知道一般中断如何工作以及它们的优点?什么触发中断处理程序? (可能有一个中断处理程序被调用来处理任何中断,在这种情况下,必须有某种规范(例如全局变量)来指示触发中断的原因。) – Scheff

+0

使用它们提供的代码并将代码放入TMR2_DefaultInterruptHandler –

+1

这只是一个骨架。你不明白什么位,因为这段代码没有任何用处。有关硬件寄存器的详细信息,请参阅用户手册。有关中断通信和信号,请参阅您的操作系统手册。 –

加尔戈弗雷和马丁詹姆斯的评论提供了有用的提示。因此,我会尽量填补可能的差距:

  1. void (*TMR2_InterruptHandler)(void);是一个函数指针提供当前中断处理程序的全局变量。

  2. 我会读TMR2_ISR()作为“中断服务程序”。从提供的代码中,不清楚它从何处被调用。怀疑它的名字,这是合理的,假设它在中断被触发时被调用。它检查全局中断处理函数指针TMR2_InterruptHandler是否不是NULL,并在成功时调用指向的函数。

  3. 如果TMR2_Initialize()之前被调用然后TMR2_InterruptHandler指向功能TMR2_DefaultInterruptHandler()。因此,在这种情况下,后者被称为TMR2_ISR()

  4. void TMR2_SetInterruptHandler(void* InterruptHandler)用于TMR2_Initialize()。它设置当前的中断处理程序。 (惊喜)。
    我有点疑惑,因为我想使它:
    void TMR2_SetInterruptHandler(void (*InterruptHandler)())
    这是因为我与C++的日常工作钻出我要“干净打字”,但我记得C是更宽松关于这个。 (void*是任何指针兼容)。

  5. 由于加尔戈弗雷已经说了:“放在TMR2_DefaultInterruptHandler代码”
    它是由评论推荐
    // add your TMR2 interrupt custom code

+0

*从调用的地方不清楚,但让let假设中断被触发时调用它*这是中断例程的目的,它们不被用户程序调用 – tilz0R

+0

@ tilz0R当然。我试图改进我的措辞。 – Scheff

+0

感谢您的回复。是的,它是MPLAB软件中用于PIC编程的MCC的自动生成代码。我仍然对环岛的方式感到非常困惑,因为事情被引用并在C中被调用。我想要做的是在一次性模式中使用TMR2。我在第一篇文章后做了什么就是去尝试在TMR2_ISR部分添加一些代码,但没有任何事情发生,所以我会去尝试使用TMR2_DefaultInterruptHandler例程。再次感谢您的回复。 – Clancy