我刚刚开始使用 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;
}