我的第一个PIC32MX ISR未触发,代码挂起

时间:2017-03-06 13:53:22

标签: mplab isr pic32

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

1 个答案:

答案 0 :(得分:1)

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

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

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

在可以编程HW之前,也可能需要一些HW初始化/复位。

希望其中一些有用。