下面的代码片段来自制造商。我对他们想做什么感到完全困惑。特别是与 InterruptHandler 有关的任何事情。
请对全局部分中的代码进行评论。这看起来合适吗?
此外,其中包含的各种 API 对我来说都有症结所在。他们是否尝试使用 void 指针? ...有很多问题要问,请主要评论他们建议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 if (PIE4bits.TMR2IE == 1 && PIR4bits.TMR2IF == 1) 的高级中断,这似乎否定了任何 TMR2_DefaultInterruptHandler 会不是吗?
再次感谢您的帮助。
最佳答案
加尔·戈弗雷 (Garr Godfrey) 和马丁·詹姆斯 (Martin James) 的评论提供了有用的提示。因此,我将尽力填补可能的空白:
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*
与任何指针兼容。)正如 Garr Godfrey 所说:“将代码放入 TMR2_DefaultInterruptHandler”
哪里有评论推荐
//添加您的 TMR2 中断自定义代码
关于制造商的 C 代码中断设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45251386/