我刚刚开始使用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;
}
答案 0 :(得分:1)
嵌入式系统有点专业化,这是我不熟悉的特定系统。
但是,通过使用其他系统,您可能必须将Int Handler函数地址(T1Handler)与它正在处理的中断相关联。 (除非你正在使用的框架在构建时为你做了这个?)
您使用的所有名称是否都由构建系统自动为您映射? 如果没有,您可能需要在使用它们之前在main的顶部调用某种类型的HW init或framework init。
在可以编程HW之前,也可能需要一些HW初始化/复位。
希望其中一些有用。