PIC32中断

附录:P05



声明中断服务程序的替代方法

下面三个例子说明了如何将一个函数作为ISR来服务Timer 1中断。虽然方法“a”可能是最容易编写的,但提供方法“b”和“c”是因为它们可能被读者可能遇到的其他来源所使用。

使用中断

  1. 这种方法消除了对函数原型的需求。_ISR是一个宏,它被编译器扩展为下面的方法b。这个方法节省了一些输入。(MPLAB®XC32 Compiler UG第11.3.3节)

void __ISR(_TIMER_1_VECTOR, ipl2) Timer1Handler(void) {/* ISR代码插入这里*/}

  1. 使用属性声明(章节11.3.1 XC32 Compiler UG)。
  2. void __attribute__((中断(ipl2), vector(_TIMER_1_VECTOR))) Timer1Handler (void);Timer1Handler(void) {/* ISR代码插入这里*/}

    1. 使用pragma声明(不再推荐!)要求以数字形式输入矢量数。
    2. #pragma interrupt Timer1Handler ipl2 vector 4 void Timer1Handler(void){/*插入的ISR代码*/}

声明定时器中断的替代方法

有三种方法可以启用Timer 1中断。第一种方法是使用下面三个C程序语句,它们使用外设库提供的宏函数。

mT1SetIntPriority (p);//组优先级:1 <= p <= 7 mT1SetIntSubPriority(sp);//子组优先级:0 <= sp <= 3 mT1IntEnable();//开启T1中断

第二种方法是从外围库中使用系统三个系统函数。

INTSetPriority (_TIMER_1_VECTOR INT_PRIORITY_LEVEL_p);// 1 <= p <= 7 INTSetSubPriority(_TIMER_1_VECTOR, INT_SUB_PRIORITY_LEVEL_sp);// 0 <= sp <= 3 INTEnable(_TIMER_1_VECTOR, EN) // EN = 1表示启用,0表示禁用

第二种方法使用一条语句,该语句需要在配置参数中定义多个位,如下所示。

// x = 0,1,2,3,4,5,23,45个配置定义

定时器中断优先级(这些位字段互斥):

Tx_INT_PRIOR_7、Tx_INT_PRIOR_6、Tx_INT_PRIOR_5、Tx_INT_PRIOR_4、Tx_INT_PRIOR_3、Tx_INT_PRIOR_2、Tx_INT_PRIOR_1、Tx_INT_PRIOR_0

定时器中断子优先级(这些位字段是互斥的):

Tx_INT_SUB_PRIOR_3, Tx_INT_SUB_PRIOR_2, Tx_INT_SUB_PRIOR_1, Tx_INT_SUB_PRIOR_0