一、CPU进行正常程序处理的时候,有时会被要求接收更高级别指令或实时性要求更高的任务,不得不中断当前的程序处理,而去响应后者,即进入新的中断服务程序。当处理完这些任务后,要继续刚才的处理,因此在执行新的中断服务程序的时候,必须要保存执行现场以确保在完成更高级别任务或指令时能够再接着做刚才被打断的任务,整个过程就是CPU的中断响应机制。额外过来的任务未必是更高一级的任务,没必要一定要中断当前任务去响应它,当然有时候,过来的任务非立即执行不可,因此这些中断请求被分类管理。这些中断请求被分为可屏蔽中断,与不可屏蔽中断两大类。可屏蔽中断就是根据目前处理任务的优先级别来考虑其是否优先处理,或者是立即处理,可以根据实际情况来设置优先级别以及决定到底要不要响应此类中断,而不可屏蔽中断,只要接到中断请求,就要做出中断处理。同时多个任务到来,究竟先处理哪个中断请求,这就需要对各个中断进行优先级别排序。下边详细介绍F28335的中断机制。
二、F28335有很多的资源,有很多的外设,这些外设与相关资源都有可能发布新的任务让内核来判断与处理,也就是F28335的可能中断源有很多。F28335的中断源可分为片内外设中断源,如PWM、CAP、QEP、定时器等,片外中断源,外部中断输入引脚XINT1、XINT2引入的外部中断源。这些中断源将中断请求信号传递给内核就肯定需要中断线,F28335的中断线是有限的。
三、F28335内部有16个中断线,其中包括2个不可屏蔽中断(RESET和NMI)与14个可屏蔽中断。可屏蔽中断通过相应的中断使能寄存器使能或者禁止产生的中断,在这14个可屏蔽中断中,其中定时器1与定时器2产生的中断请求通过INT13、INT14中断线到达CPU,这两个中断已经预留给了实时操作系统,因此剩下12个可屏蔽中断可供外部中断和处理器内部的单元使用。F28335的外设中断源远不止12个,有58个,如何将这58个外设中断源分配给这12个中断线,这就需要F28335 PIE外设中断扩展模块来完成。F28335的中断源以及连接如图6.1所示:
图6.1
四、F28335的中断采用的是三级中断机制,分别为外设级中断、PIE级中断和CPU级中断,最内核部分为CPU级中断,也就是CPU只能响应从CPU中断线上过来的中断请求,但F28335中断源众多,CPU没有那么多中断线,在有限中断线的情况下,只能安排中断线进行复用,其复用管理就有了中间层的PIE级中断,外设要能够成功产生中断响应,就要首先经外设级中断允许,然后经PIE允许,然后经CPU允许,最终CPU做出响应。

五、F28335处理器内部集成了多种外设,每个外设都会产生一个或者多个外设级中断。由于CPU没有能力处理所有外设级的中断请求,因此F28335的CPU让出了12个中断线交给PIE模块进行复用管理。图6.4给出了中断扩展模块的结构图。

图6.4 PIE中断扩展模块
5.1 PIE将外设中断分成了12个组,分别对应着CPU的12个可屏蔽中断线,每1组由8个外设级中断组成,这8个外设中断分别对应相应外设接口的中断引脚,PIE通过一个8选1的多路选择器将这8个外设中断组成1组。具体连接关系如表6.1所列。实际有效外设中断为58个,其余为保留。PIE第一组中断分别为WAKE信号、TIMER0信号、ADC信号、XINT2、XINT1、第三个中断保留、SEQ2、SEQ1。
5.2 与外设级中断类似,在PIE模块内每组中断有相应的中断标志位(PIEIFRx)和使能位(PIE-IERx.y)。除此之外,每组PIE中断(INT1~INT12)有一个响应标志位(PIEACK)。图6.5给出了PIEIFR和PIEIER不同设置时的PIE硬件的操作流程。
5.3 一旦PIE控制器有中断产生,相应的中断标志位(PIEIFRx.y)将置1。如果相应的PIE中断使能位也置1,则PIE将检查相应的PIEACKx以确定CPU是否准备响应该中断。如果相应的PIEACKx位清零,PIE向CPU申请中断;如果PIEACKx置1,PIE将等待到相应的PIEACKx清零才向CPU申请中断。PIE通过对PIEACKx的位控制来控制每1组中只有1个中断能被响应,一旦响应后,就需要将PIEACKX相应为清零,以让它能够响应该组中后边过来的中断。
INTX | INTx.8 | INTx.7 | INTx.6 | INTx.5 | INTx.4 | INTx.3 | INTx.2 | INTx.1 |
1 | WAKE | TIMER0 | ADC | XINT2 | XINT1 | 保留 | SEQ2 | SEQ1 |
2 | 保留 | 保留 | EPWM6 _TZINT | EPWM5_TZINT | EPWM4_TZINT | EPWM3_TZINT | EPWM2_TZINT | EPWM1_TZINT |
3 | 保留 | 保留 | EPWM6_INT | EPWM5_INT | EPWM4_INT | EPWM3_INT | EPWM2_INT | EPWM1_INT |
4 | 保留 | 保留 | ECAP6_INT | ECAP5_INT | ECAP4_INT | ECAP3_INT | ECAP2_INT | ECAP1_INT |
5 | 保留 | 保留 | 保留 | 保留 | 保留 | 保留 | EQEP1 _INT | EQEP1_INT |
6 | 保留 | 保留 | MX INTB | MR INTB | MXI NTA | MRI NTA | SPITX INTA | SPIRXINTA |
7 | 保留 | 保留 | DINT CH6 | DINT CH5 | DINT CH4 | DINT CH3 | DINT CH2 | DINTCH1 |
8 | 保留 | 保留 | SCI TXINTC | SCI RXINTC | 保留 | 保留 | I2CIN T2A | I2CIN T1A |
9 | ECAN1 INTB | ECAN0 1NTB | ECAN1 INTA | ECAN01 NTA | SCITX INTB | SCI RXINT | SCI TXINTA | SCI RXINTA |
10 | 保留 | 保留 | 保留 | 保留 | 保留 | 保留 | 保留 | 保留 |
11 | 保留 | 保留 | 保留 | 保留 | 保留 | 保留 | 保留 | 保留 |
12 | LUF | LVF | 保留 | XINT7 | XINT6 | XINT5 | XINT4 | XINT3 |
5.4 一旦CPU申请中断,CPU级中断标志位(IFR)将置1。中断标志位锁存到标志寄存器后,只有CPU中断使能寄存器(IER)或中断调试使能寄存器(DBGIER)相应的使能位和全局中断屏蔽位(INTM)被使能时才会响应中断申请。
5.5 CPU级使能可屏蔽中断采用CPU中断使能寄存器(IER)还是中断调试使能寄存器(DBGIER)与中断处理方式有关。标准处理模式下,不使用中断调试使能寄存器(DBGIER)。只有当F28335使用实时调试(Real-time Debug)且CPU被停止(Halt)时,才使用中断调试使能寄存器(DBGIER),此时INTM不起作用。如果F28335使用实时调试而CPU仍然工作运行,则采用标准的中断处理。
5.6 CPU响应中断,就是CPU要去执行相应的中断服务程序,其响应过程是CPU将现执行程序的指令地址压入堆栈,跳转到中断服务程序入口地址,中断服务程序的入口地址就是中断向量表,这个中断向量表用2个16位寄存器存放。入口地址是22位的,地址的低16位保存在该向量的低16位;地址的高16位则保存在它的高6位,更高的10位保留。
名称 | 向量ID | 地址 | 长度/16位 | 描述 | CPU优先级 | PIE组优先级 |
Reset | 0 | 0x0000 0D00 | 2 | 复位 总是从地址位0x3FFFC0的Boot ROM 中获取 | 1最高 | |
INT1 | 1 | 0x0000 0D02 | 2 | 未使用,参考PIE组1 | 5 |
|
INT2 | 2 | 0x0000 0D04 | 2 | 未使用,参考PIE组2 | 6 |
|
INT3 | 3 | 0x0000 0D06 | 2 | 未使用,参考PIE组3 | 7 |
|
INT4 | 4 | 0x0000 0D08 | 2 | 未使用,参考PIE组4 | 8 |
|
INT5 | 5 | 0x0000 0D0A | 2 | 未使用,参考PIE组5 | 9 |
|
INT6 | 6 | 0x0000 0D0C | 2 | 未使用,参考PIE组6 | 10 |
|
INT7 | 7 | 0x0000 0D0E | 2 | 未使用,参考PIE组7 | 11 |
|
INT8 | 8 | 0x0000 0D10 | 2 | 未使用,参考PIE组8 | 12 |
|
INT9 | 9 | 0x0000 0D12 | 2 | 未使用,参考PIE组9 | 13 |
|
INT10 | 10 | 0x0000 0D14 | 2 | 未使用,参考PIE组10 | 14 |
|
INT11 | 11 | 0x0000 0D16 | 2 | 未使用,参考PIE组11 | 15 |
|
INT12 | 12 | 0x0000 0D18 | 2 | 未使用,参考PIE组12 | 16 |
|
INT13 | 13 | 0x0000 0D1A | 2 | XINT13或CPU定时器1 | 17 |
|
INT14 | 14 | 0x0000 0D1C | 2 | CPU定时器2(用于TI/RTOS) | 18 |
|
DATALOG | 15 | 0x0000 0D1E | 2 | CPU数据记录中断 | 19(最低) |
|
RTOSINT | 16 | 0x0000 0D20 | 2 | CPU实时操作系统中断 | 4 |
|
EMUINT | 17 | 0x0000 0D22 | 2 | CPU仿真中断 | 2 |
|
NMI | 18 | 0x0000 0D24 | 2 | 外部不可屏蔽中断 | 3 |
|
ILLEGAL | 19 | 0x0000 0D26 | 2 | 非法操作 |
|
|
USER1 | 20 | 0x0000 0D28 | 2 | 用户定义的软件操作(TRAP) |
|
|
USER2 | 21 | 0x0000 0D2A | 2 | 用户定义的软件操作(TRAP) |
|
|
USER3 | 22 | 0x0000 0D2C | 2 | 用户定义的软件操作(TRAP) |
|
|
USER4 | 23 | 0x0000 0D2E | 2 | 用户定义的软件操作(TRAP) |
|
|
USER5 | 24 | 0x0000 0D30 | 2 | 用户定义的软件操作(TRAP) |
|
|
USER6 | 25 | 0x0000 0D32 | 2 | 用户定义的软件操作(TRAP) |
|
|
USER7 | 26 | 0x0000 0D34 | 2 | 用户定义的软件操作(TRAP) |
|
|
USER8 | 27 | 0x0000 0D36 | 2 | 用户定义的软件操作(TRAP) |
|
|
USER9 | 28 | 0x0000 0D38 | 2 | 用户定义的软件操作(TRAP) |
|
|
USER10 | 29 | 0x0000 0D3A | 2 | 用户定义的软件操作(TRAP) |
|
|
USER11 | 30 | 0x0000 0D3C | 2 | 用户定义的软件操作(TRAP) |
|
|
USER12 | 31 | 0x0000 0D3E | 2 | 用户定义的软件操作(TRAP) |
| |
PIE组1向量-复用CPU的INT1中断 |
INT1.1 | 32 | 0x0000 0D40 | 2 | SEQ1INT(ADC) | 5 | 1(最高) |
INT1.2 | 33 | 0x0000 0D42 | 2 | SEQ2INT(ADC) | 5 | 2 |
INT1.3 | 34 | 0x0000 0D44 | 2 | 保留 | 5 | 3 |
INT1.4 | 35 | 0x0000 0D46 | 2 | XINT1 | 5 | 4 |
INT1.5 | 36 | 0x0000 0D48 | 2 | XINT2 | 5 | 5 |
INT1.6 | 37 | 0x0000 0D4A | 2 | ADCINT(ADC) | 5 | 6 |
INT1.7 | 38 | 0x0000 0D4C | 2 | TINT0(CPU定时器0) | 5 | 7 |
INT1.8 | 39 | 0x0000 0D4E | 2 | WAKEINT(LPM/WD) | 5 | 8(最低) |
PIE 组2 向量-复用CPU的INT2中断 |
INT1.1 | 32 | 0x0000 0D40 | 2 | SEQ1INT(ADC) | 5 | 1(最高) |
INT1.2 | 33 | 0x0000 0D42 | 2 | SEQ2INT(ADC) | 5 | 2 |
INT1.3 | 34 | 0x0000 0D44 | 2 | 保留 | 5 | 3 |
INT1.4 | 35 | 0x0000 0D46 | 2 | XINT1 | 5 | 4 |
INT1.5 | 36 | 0x0000 0D48 | 2 | XINT2 | 5 | 5 |
INT1.6 | 37 | 0x0000 0D4A | 2 | ADCINT(ADC) | 5 | 6 |
INT1.7 | 38 | 0x0000 0D4C | 2 | TINT0(CPU定时器0) | 5 | 7 |
INT1.8 | 39 | 0x0000 0D4E | 2 | WAKEINT(LPM/WD) | 5 | 8(最低) |
PIE 组3 向量-复用CPU的INT3中断 |
INT3.1 | 48 | 0x0000 0D60 | 2 | ePWM1_INT(ePWM1) | 7 | 1(最高) |
INT3.2 | 49 | 0x0000 0D62 | 2 | ePWM2_INT(ePWM2) | 7 | 2 |
INT3.3 | 50 | 0x0000 0D64 | 2 | ePWM3_INT(ePWM3) | 7 | 3 |
INT3.4 | 51 | 0x0000 0D66 | 2 | ePWM4_INT(ePWM4) | 7 | 4 |
INT3.5 | 52 | 0x0000 0D68 | 2 | ePWM5_INT(ePWM5) | 7 | 5 |
INT3.6 | 53 | 0x0000 0D6A | 2 | ePWM6_INT(ePWM6) | 7 | 6 |
INT3.7 | 54 | 0x0000 0D6C | 2 | 保留 | 7 | 7 |
INT3.8 | 55 | 0x0000 0D6E | 2 | 保留 | 7 | 8(最低) |
PIE 组4 向量-复用CPU的INT4中断 |
INT4.1 | 56 | 0x0000 0D70 | 2 | eCAP1_INT(eCAP1) | 8 | 1(最高) |
INT4.2 | 57 | 0x0000 0D72 | 2 | eCAP2_INT(eCAP2) | 8 | 2 |
INT4.3 | 58 | 0x0000 0D74 | 2 | eCAP3_INT(eCAP3) | 8 | 3 |
INT4.4 | 59 | 0x0000 0D76 | 2 | eCAP4_INT(eCAP4) | 8 | 4 |
INT4.5 | 60 | 0x0000 0D78 | 2 | eCAP5_INT(eCAP5) | 8 | 5 |
INT4.6 | 61 | 0x0000 0D7A | 2 | eCAP6_INT(eCAP6) | 8 | 6 |
INT4.7 | 62 | 0x0000 0D7C | 2 | 保留 | 8 | 7 |
INT4.8 | 63 | 0x0000 0D7E | 2 | 保留 | 8 | 8(最低) |
PIE 组5 向量-复用CPU的INT5中断 |
INT5.1 | 64 | 0x0000 0D80 | 2 | eQEP1_INT(eCAP1) | 9 | 1(最高) |
INT5.2 | 65 | 0x0000 0D82 | 2 | eQEP2_INT(eQEP2) | 9 | 2 |
INT5.3 | 66 | 0x0000 0D84 | 2 | 保留 | 9 | 3 |
INT5.4 | 67 | 0x0000 0D86 | 2 | 保留 | 9 | 4 |
INT5.5 | 68 | 0x0000 0D88 | 2 | 保留 | 9 | 5 |
INT5.6 | 69 | 0x0000 0D8A | 2 | 保留 | 9 | 6 |
INT5.7 | 70 | 0x0000 0D8C | 2 | 保留 | 9 | 7 |
INT5.8 | 71 | 0x0000 0D8E | 2 | 保留 | 9 | 8(最低) |
PIE 组6 向量-复用CPU的INT6中断 |
INT6.1 | 72 | 0x0000 0D90 | 2 | SPIRXINTA(SPI-A) | 10 | 1(最高) |
INT6.2 | 73 | 0x0000 0D92 | 2 | SPITXINTA(SPI-A) | 10 | 2 |
INT6.3 | 74 | 0x0000 0D94 | 2 | MRINTB(McBSP-B) | 10 | 3 |
INT6.4 | 75 | 0x0000 0D96 | 2 | (McBSP-B)(SPI-B) | 10 | 4 |
INT6.5 | 76 | 0x0000 0D98 | 2 | MRINTA(McBSP-A) | 10 | 5 |
INT6.6 | 77 | 0x0000 0D9A | 2 | MXINTA(McBSP-A) | 10 | 6 |
INT6.7 | 78 | 0x0000 0D9C | 2 | 保留 | 10 | 7 |
INT6.8 | 79 | 0x0000 0D9E | 2 | 保留 | 10 | 8(最低) |
PIE 组7 向量-复用CPU的INT7中断 |
INT7.1 | 80 | 0x0000 0DA0 | 2 | DINTCH1 DMA通道1 | 11 | 1(最高) |
INT7.2 | 81 | 0x0000 0DA2 | 2 | DINTCH2 DMA通道2 | 11 | 2 |
INT7.3 | 82 | 0x0000 0DA4 | 2 | DINTCH3 DMA通道3 | 11 | 3 |
INT7.4 | 83 | 0x0000 0DA6 | 2 | DINTCH4 DMA通道4 | 11 | 4 |
INT7.5 | 84 | 0x0000 0DA8 | 2 | DINTCH5 DMA通道5 | 11 | 5 |
INT7.6 | 85 | 0x0000 0DAA | 2 | DINTCH6 DMA通道6 | 11 | 6 |
INT7.7 | 86 | 0x0000 0DAC | 2 | 保留 | 11 | 7 |
INT7.8 | 87 | 0x0000 0DAE | 2 | 保留 | 11 | 8(最低) |
PIE 组8向量-复用CPU的INT8中断 |
INT8.1 | 88 | 0x0000 0DB0 | 2 | I2CINT1A(I2C-A) | 12 | 1(最高) |
INT8.2 | 89 | 0x0000 0DB2 | 2 | I2CINT2A(I2C-A) | 12 | 2 |
INT8.3 | 90 | 0x0000 0DB4 | 2 | 保留 | 12 | 3 |
INT8.4 | 91 | 0x0000 0DB6 | 2 | 保留 | 12 | 4 |
INT8.5 | 92 | 0x0000 0DB8 | 2 | SCIRXINTC(SCI-C) | 12 | 5 |
INT8.6 | 93 | 0x0000 0DBA | 2 | SCITXINTC(SCI-C) | 12 | 6 |
INT8.7 | 94 | 0x0000 0DBC | 2 | 保留 | 12 | 7 |
INT8.8 | 95 | 0x0000 0DBE | 2 | 保留 | 12 | 8(最低) |
PIE 组9向量-复用CPU的INT9中断 |
INT9.1 | 96 | 0x0000 0DC0 | 2 | SCIRXINTA(SCI-A) | 13 | 1(最高) |
INT9.2 | 97 | 0x0000 0DC2 | 2 | SCITXINTA(SCI-A) | 13 | 2 |
INT9.3 | 98 | 0x0000 0DC4 | 2 | SCIRXINTB(SCI-B) | 13 | 3 |
INT9.4 | 99 | 0x0000 0DC6 | 2 | SCITXINTB(SCI-B) | 13 | 4 |
INT9.5 | 100 | 0x0000 0DC8 | 2 | ECAN0INTA(eCAN-A) | 13 | 5 |
INT9.6 | 101 | 0x0000 0DCA | 2 | ECAN1INTA(eCAN-A) | 13 | 6 |
INT9.7 | 102 | 0x0000 0DCC | 2 | ECAN0INTB(eCAN-B) | 13 | 7 |
INT9.8 | 103 | 0x0000 0DCE | 2 | ECAN1INTB(eCAN-B) | 13 | 8(最低) |
PIE 组10向量-复用CPU的INT10中断 |
INT10.1 | 104 | 0x0000 0DD0 | 2 | 保留 | 14 | 1(最高) |
INT10.2 | 105 | 0x0000 0DD2 | 2 | 保留 | 14 | 2 |
INT10.3 | 106 | 0x0000 0DD4 | 2 | 保留 | 14 | 3 |
INT10.4 | 107 | 0x0000 0DD6 | 2 | 保留 | 14 | 4 |
INT10.5 | 108 | 0x0000 0DD8 | 2 | 保留 | 14 | 5 |
INT10.6 | 109 | 0x0000 0DDA | 2 | 保留 | 14 | 6 |
INT10.7 | 110 | 0x0000 0DDC | 2 | 保留 | 14 | 7 |
INT10.8 | 111 | 0x0000 0DDE | 2 | 保留 | 14 | 8(最低) |
PIE 组11向量-复用CPU的INT11中断 |
INT11.1 | 112 | 0x0000 0DE0 | 2 | 保留 | 15 | 1(最高) |
INT11.2 | 113 | 0x0000 0DE2 | 2 | 保留 | 15 | 2 |
INT11.3 | 114 | 0x0000 0DE4 | 2 | 保留 | 15 | 3 |
INT11.4 | 115 | 0x0000 0DE6 | 2 | 保留 | 15 | 4 |
INT11.5 | 116 | 0x0000 0DE8 | 2 | 保留 | 15 | 5 |
INT11.6 | 117 | 0x0000 0DEA | 2 | 保留 | 15 | 6 |
INT11.7 | 118 | 0x0000 0DEC | 2 | 保留 | 15 | 7 |
INT11.8 | 119 | 0x0000 0DEE | 2 | 保留 | 15 | 8(最低) |
PIE 组12向量-复用CPU的INT12中断 |
INT12.1 | 120 | 0x0000 0DF0 | 2 | XINT3 | 16 | 1(最高) |
INT12.2 | 121 | 0x0000 0DF2 | 2 | XINT4 | 16 | 2 |
INT12.3 | 122 | 0x0000 0DF4 | 2 | XINT5 | 16 | 3 |
INT12.4 | 123 | 0x0000 0DF6 | 2 | XINT6 | 16 | 4 |
INT12.5 | 124 | 0x0000 0DF8 | 2 | XINT7 | 16 | 5 |
INT12.6 | 125 | 0x0000 0DFA | 2 | 保留 | 16 | 6 |
INT12.7 | 126 | 0x0000 0DFC | 2 | LVF FPU | 16 | 7 |
INT12.8 | 127 | 0x0000 0DFE | 2 | LUF FPU | 16 | 8(最低) |
参考: