制造商的 C 代码中断设置

标签 c handler microcontroller interrupt isr

下面的代码片段来自制造商。我对他们想做什么感到完全困惑。特别是与 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) 的评论提供了有用的提示。因此,我将尽力填补可能的空白:

  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. 正如 Garr Godfrey 所说:“将代码放入 TMR2_DefaultInterruptHandler”
    哪里有评论推荐
    //添加您的 TMR2 中断自定义代码

关于制造商的 C 代码中断设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45251386/

相关文章:

c++ - 希望开发自己的音乐库程序

java - 如何在 handleMessage 中使用类局部非静态变量时使 android 句柄静态

c - 为什么对象 (ELF) 文件中的 .bss 部分没有内容?

c - 与编译器优化结合的段错误

c - 调用函数并将另一个结构作为参数传递后,结构的元素将失去其值

java - 如何为给定的代码实现 Runnable ?

ios - UINavigationController "pushViewController:animated"的完成处理程序?

c - 如何在C中返回缓冲区地址

microcontroller - SPI 事务提前终止 - ESP-IDF

python - 是什么导致 C 程序不能在 Arduino 中正确地递增变量?