2017-07-22 40 views
-5

下面的代碼片段來自制造商。我對他們正在努力做什麼感到困惑。特別是與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

這只是一個骨架。你不明白什麼位,因爲這段代碼沒有任何用處。有關硬件寄存器的詳細信息,請參閱用戶手冊。有關中斷通信和信號,請參閱您的操作系統手冊。 –

回答

2

加爾戈弗雷和馬丁詹姆斯的評論提供了有用的提示。因此,我會盡量填補可能的差距:

  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