tianwen_4524 发表于 2013-4-18 10:42

TMS320F2812的中断优先级的控制

TMS320F2812的中断优先级,请问可以改变它们进入中断的顺序吗?

zhangmangui 发表于 2013-4-18 13:15

曾经看到过如何设置中断优先级的文档   我使用的过程中没有设置过

zhangmangui 发表于 2013-4-18 16:47

原以为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(); //你自己定义的中断处理程序,在此程序中写你自己的代码;
          // Next line for debug only (remove after inserting ISR Code):
                //ESTOP0; //仿真停止,仿真时可以用。

      // Restore registers saved:
      DINT; //关中断
      PieCtrlRegs.PIEIER9.all = TempPIEIER;
}   
#endif

其他中断的设置以此为例,只要在.h文件中设置好优先级,再将你自己的中断处理代码插入相应的中断函数即可。此时你就可以实现高优先级可以打断低优先级的中断。而且也可以中断嵌套。如果不想低优先级的程序不想被打断则不允许EINT即可。

tianwen_4524 发表于 2013-4-24 11:24

zhangmangui 发表于 2013-4-18 16:47 static/image/common/back.gif
原以为2812中断不能设置优先级。实际上硬件上优先级是做好的。但软件上有办法来设置优先级。请往下看:
1. ...

非常感谢版主的详细回答!

zhangmangui 发表于 2013-4-24 13:04

tianwen_4524 发表于 2013-4-24 11:24 static/image/common/back.gif
非常感谢版主的详细回答!

不谢多多提问

hello-J 发表于 2013-5-6 21:32

受教了,谢谢!

hello-J 发表于 2013-5-6 21:33

受教了,谢谢版主!

hello-J 发表于 2013-5-6 21:33

受教了,谢谢版主!

gongxd126com 发表于 2013-5-8 09:16

5509A可以设置优先级么没找到软件设置方法呢

zhangmangui 发表于 2014-3-7 09:14

gongxd126com 发表于 2013-5-8 09:16 static/image/common/back.gif
5509A可以设置优先级么没找到软件设置方法呢

我下来看看   

raoxianbin 发表于 2014-3-13 12:56

不错,学习了

lsky380 发表于 2014-4-15 15:41

版主,您好,您提供的这个资料非常有用,只是有两个问题不太明白,想请教一下,
1.为什么要在中断函数的结尾处关总中断?即执行 DINT语句? 这样做不是把所有可屏蔽中断都屏蔽掉了?那如何才能响应下一个中断呢?

2.PieCtrlRegs.PIEIER9.all = TempPIEIER;为什么要执行这一句?要把原先PIEIER9里面的值恢复?为什么这样做?

页: [1]
查看完整版本: TMS320F2812的中断优先级的控制