1

我刚刚开始使用 PIC32MX340F12 和 MPLABX。我的第一次尝试是编写定时器中断,所以我使用了数据表、编译器手册和示例,并想出了以下内容。但它不起作用......中断永远不会触发,事实上,如果我同时保持定时器中断启用(T1IE = 1)和通用中断启用(“ei”),它会运行几秒钟然后挂起(在调试模式下说“目标停止”)。如果我删除其中任何一个,它只会无限期地运行,但仍然没有定时器中断。所以我的 ISR 语法中的某个地方似乎有一个非常糟糕的问题。它会跳出任何人吗?

就像我说的那样,我才刚刚开始,所以我确信这是一个非常愚蠢的疏忽。正如您可能注意到的那样,我喜欢尽可能直接地使用寄存器和编译器指令(而不是制造商提供的函数),我觉得我以这种方式学习得最多。

谢谢!

#include <stdio.h>
#include <stdlib.h>
#include "p32mx340f512h.h"
#include <stdint.h>

int x = 0;

int main(int argc, char** argv) 
{
    INTCONbits.MVEC = 1;  // turn on multi-vector interrupts
    T1CON = 0;            // set timer control to 0
    T1CONbits.TCKPS = 1;  // set T1 prescaler to 8
    PR1 = 62499;          // set t1 period
    TMR1 = 0;             // initialize the timer
    T1CONbits.ON = 1;     // activate the timer

    IPC1bits.T1IP = 5;    // T1 priority to 5
    IPC1bits.T1IS = 0;    // T1 secondary priority to 
    IFS0bits.T1IF = 0;    // clear the T1 flag
    IEC0bits.T1IE = 1;    // enable the T1 interrupts

    asm volatile("ei");   // enable interrupts

    while (1)
    {
         x++;   

         if (x > 10000)
         {
             x = 0;
         }
    }
    return (EXIT_SUCCESS);
}

bool zzz = false;

void __attribute__((interrupt(IPL5AUTO))) T1Handler(void)
{
    IFS0bits.T1IF = 0;
    zzz = true;
}
4

1 回答 1

1

嵌入式系统有点专业,这是我不熟悉的特定系统。

但是,在使用其他系统时,您可能必须将 Int Handler 函数地址 (T1Handler) 与其正在处理的中断相关联。(除非您使用的框架在构建时会在幕后为您做这件事?)

您使用的所有这些名称是否都由构建系统自动映射?如果没有,您可能需要在 main 顶部调用某种 HW init 或 framework init,然后再使用它们。

在对硬件进行编程之前,可能还需要一些硬件初始化/复位。

希望有些帮助。


于 2017-03-16T22:08:08.773 回答