共6条
1/1 1 跳转至页
TMS320F2812的中断优先级的控制
原以为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即可。
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即可。
共6条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
【有奖活动】震撼来袭!这场直播将直击工程师的心灵! | |
“我想要一部加热台”活动,不花钱赢取开发好工具!活动开始了哦 | |
【有奖活动】伙伴们:您的“需求”解决了吗? | |
抽奖了,抽奖了,金升阳医疗电源 |
打赏帖 | |
---|---|
【换取手持数字示波器】+与同事对定时器输出相位可调PWM移相全桥控制分享被打赏50分 | |
【换取手持数字示波器】+LP-MSPM0L1306开发板试用体验+串口被打赏40分 | |
CC-RL编译器相关问题求助被打赏10分 | |
【换取手持数字示波器】+与同事对ESP-12开发调试经验分享被打赏50分 | |
【换取手持数字示波器】+同事tek示波器调试spi解析被打赏50分 | |
【换取手持数字示波器】+2.6寸墨水屏调试经验被打赏50分 | |
换取手持数字示波器+个人开关电源的设计经验被打赏50分 | |
【换取手持数字示波器】+【APT32F173测评】+URAT被打赏20分 | |
【换取手持数字示波器】CH32X035的定时器以及外部中断体验被打赏50分 | |
【换取手持数字示波器】CH32X035搭建开发环境(RISC-V)被打赏50分 |