制造商的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它不会?
再次感谢您的帮助。
加尔戈弗雷和马丁詹姆斯的评论提供了有用的提示。因此,我会尽量填补可能的差距:
void (*TMR2_InterruptHandler)(void);
是一个函数指针提供当前中断处理程序的全局变量。我会读
TMR2_ISR()
作为“中断服务程序”。从提供的代码中,不清楚它从何处被调用。怀疑它的名字,这是合理的,假设它在中断被触发时被调用。它检查全局中断处理函数指针TMR2_InterruptHandler
是否不是NULL
,并在成功时调用指向的函数。如果
TMR2_Initialize()
之前被调用然后TMR2_InterruptHandler
指向功能TMR2_DefaultInterruptHandler()
。因此,在这种情况下,后者被称为TMR2_ISR()
。void TMR2_SetInterruptHandler(void* InterruptHandler)
用于TMR2_Initialize()
。它设置当前的中断处理程序。 (惊喜)。
我有点疑惑,因为我想使它:void TMR2_SetInterruptHandler(void (*InterruptHandler)())
这是因为我与C++的日常工作钻出我要“干净打字”,但我记得C是更宽松关于这个。 (void*
是任何指针兼容)。由于加尔戈弗雷已经说了:“放在TMR2_DefaultInterruptHandler代码”
它是由评论推荐// add your TMR2 interrupt custom code
你知不知道一般中断如何工作以及它们的优点?什么触发中断处理程序? (可能有一个中断处理程序被调用来处理任何中断,在这种情况下,必须有某种规范(例如全局变量)来指示触发中断的原因。) – Scheff
使用它们提供的代码并将代码放入TMR2_DefaultInterruptHandler –
这只是一个骨架。你不明白什么位,因为这段代码没有任何用处。有关硬件寄存器的详细信息,请参阅用户手册。有关中断通信和信号,请参阅您的操作系统手册。 –