以下一段话是在网上下载的,我看了下发现有点问题,望诸位指点一二:
/*-------------------------------------------------------------------------------------------------------------------------------------------------------------*/
网上原话:
原以为2812中断不能设置优先级。实际上硬件上优先级是做好的。但软件上有办法来设置优先级。请往下看: 1.首先要找到文件,DSP281x_SWPrioritizedDefaultIsr.c 和DSP281x_SWPrioritizedIsrLevels.h加载到你的程序当中。 2.在DSP281x_SWPrioritizedIsrLevels.h文件中先设置中断组的优先级级别。其中:0表示不使用;1表示优先级最高;16表示优先级最低; 比如:我设置第9组优先级最高,第3组次之,第2,4,6组优先级为第三。其他以此类推。0表示不用。 #define INT1PL 4 // Group1 Interrupts (PIEIER1) #define INT2PL 3 // Group2 Interrupts (PIEIER2) #define INT3PL 2 // Group3 Interrupts (PIEIER3) #define INT4PL 3 // Group4 Interrupts (PIEIER4) #define INT5PL 4 // Group5 Interrupts (PIEIER5) #define INT6PL 3 // Group6 Interrupts (PIEIER6) #define INT7PL 0 // reserved #define INT8PL 0 // reserved #define INT9PL 1 // Group9 Interrupts (PIEIER9) #define INT10PL 0 // reserved #define INT11PL 0 // reserved #define INT12PL 0 // reserved #define INT13PL 5 // XINT3 #define INT14PL 5 // INT14 (TINT2) #define INT15PL 5 // DATALOG #define INT16PL 5 // RTOSINT 3.级中断设置好以后,我们就要设置每一组里的中断优先级级别。其中:0表示不用;1表示优先级最高;8表示优先级最低; 以第9组为例说明:其中,ECAN0INTA优先级最高;ECAN1INTA为第2,SCIRXINTA为第3。其他自己数。 #define G91PL 3 // SCIRXINTA (SCI-A) #define G92PL 5 // SCITXINTA (SCI-A) #define G93PL 6 // SCIRXINTB (SCI-B) #define G94PL 4 // SCITXINTB (SCI-B) #define G95PL 1 // ECAN0INTA (ECAN-A) #define G96PL 2 // ECAN1INTA (ECAN-A) #define G97PL 0 // reserved #define G98PL 0 // reserved 4.由上可知所有组里第9组优先级最高,第9组中ECAN0INTA(G95PL)优先级最高。优先级设置好后到 DSP281x_SWPrioritizedDefaultIsr.c 文件中找到相应的函数。我这里就拿ECAN0INTA(ECAN-A)来作为例子说明; 这个中断对应的函数为(DSP281x_SWPrioritizedDefaultIsr.c 文件里可以找到)如下: //--------------------------------------------------------------------------- // eCAN-A Default ISRs: // // Connected to PIEIER9_5 (use MINT9 and MG95 masks): #if (G95PL != 0) interrupt void ECAN0INTA_ISR(void) // eCAN-A { // Set interrupt priority: volatile Uint16 TempPIEIER = PieCtrlRegs.PIEIER9.all;
/* 以下表示,大于第9组中断级别的中断使能,小于第9组中断级别的中断不使能*/ IER |= M_INT9; IER &= MINT; // Set "global" priority
/*优先级大于第9组中第5个中断的中断使能,否则不使能*/ PieCtrlRegs.PIEIER9.all &= MG95; // Set "group" priority
PieCtrlRegs.PIEACK.all = 0xFFFF; // Enable PIE interrupts EINT; //全局中断使能,但因为此中断优先级最高,所以其他一般中断不能打断它
// Insert ISR Code here....... CAN_ISR(); //你自己定义的中断处理程序,在此程序中写你自己的代码; // Restore registers saved: DINT; //关中断 PieCtrlRegs.PIEIER9.all = TempPIEIER; } #endif
/*------------------------------------------------------------------------------------------------------------------------------------------*/
讨论:
1.为什么要在中断函数的结尾处关总中断?即执行 DINT语句? 这样做不是把所有可屏蔽中断都屏蔽掉了?那如何才能响应下一个中断呢?
2. PieCtrlRegs.PIEIER9.all = TempPIEIER; 为什么要执行这一局?要把原先PIEIER9里面的值恢复?为什么这样做? 3. IER |= M_INT9; IER &= MINT; 这两句我推导过,的确是使 大于第9组中断级别的中断使能,小于第9组中断级别的中断不使能,但是这样之后小于第9组的中断级别的中断的IER使能位已经被写0了,那如何才能执行低级的中断?
主要为以上3个问题,望诸位给点建议,不甚感激!
|