声明:文章内容都是我在学习过程中的个人理解,然而本人水平有限,难免会存在错误,有错误还请海涵。
一、中断系统概述
F28335 内部有16 个中断线,其中包括2 个不可屏蔽中断(RESET 和NMI)与14 个可屏蔽中断。在这14 个可屏蔽中断中,其中TIM1 和TIM2 产生的中断请求通过INT13、INT14 中断线到达CPU,这两个中断已经预留给了实时操作系统,因此剩下的12个可屏蔽中断可供外部中断和处理器内部单元使用。而这12个中断线就是我们现在要讨论的。
F28335的中断系统可以分为三层:外设级中断、PIE级中断和CPU级中断,分别对应上图当中的序号1,2,3。外设级中断就是中断源,而PIE级中断就是管理这些中断源的。它将中断每八个分为一组,然后当这一组任何一个中断产生的时候都会向CPU申请中断。而这样的PIE一共有12个。很显然,这12个PIE就是直接连接到了CPU的12个可屏蔽中断线上。那么CPU最多可以通过PIE处理12x8=96个中断。实际上只用了58个,其他的留作未来的扩展使用。
在中断使能方面,分为4级,第一级(也就是最低级)是外设中断使能。就是产生的中断源需要使能,让它能够产生中断,也就是上图中的序号1。第二级就是PIE级中断使能。每一个PIE当中都有8个中断,每一个中断都有对应的使能位,这些使能位由PIEIERx(8:1)来设置,对应序号2。第三级是CPU级中断使能,上述说的12根可屏蔽中断线,每一根中断线都有对应的使能位,由IER寄存器来控制。第四级(也就是最高级)就是总中断INTM,当它为1时,所有的可屏蔽中断都不会相应,当它为0时可以响应中断。
二、外部中断概述
外部中断我们可以简单地将它理解为由于GPIO引脚的跳变从而产生中断。F28335 共支持7 个外部中断XINT1-XINT7。其中XINT1-XINT2 可以选择GPIO0-GPIO31 当中的任意两个;XINT3-XINT7 可以选择GPIO32-GPIO63 当中的任意两个。外部中断来自于哪一个GPIO引脚由GPIOXINTxSEL(4:0)来选择。每一个外部中断都可以设置为上升沿或者下降沿或者上升下降都触发,由XINT1CR(15:0)当中的POLARITY来控制(00 上升沿、01上升沿、10下降沿、11上升/下降沿都触发)。
三、软件配置
关于外部中断配置,它的步骤如下:
1、关闭总中断 DINT
2、配置外部中断的引脚为输入
3、选择外部中断是从哪一个引脚产生的 GpioIntRegs.GPIOXINT1SEL.bit.GPIOSEL=12; //选择外部中断1的来源
4、设置外部中断的触发方式 XIntruptRegs.XINT1CR.bit.POLARITY = 1; XIntruptRegs.XINT1CR.bit.ENABLE = 1; //1表示使能外部中断1,0表示失能外部中断
5、设置中断函数的地址 PieVectTable.XINT1 = &EXTI1_IRQn; //中断函数入口地址
6、使能pie相应的位 PieCtrlRegs.PIEIER1.bit.INTx4=1; //pie级中断使能设置
7、使能CPU级中断(12根中断线使能相应的位1使能0失能 IER |= M_INT1; //使能CPU级中断 8、开启总中断 EINT
四、配置外部中断例程
根据三当中的步骤进行配置
void EXTI1_Init(void)
{
EALLOW;
SysCtrlRegs.PCLKCR3.bit.GPIOINENCLK = 1;
GpioCtrlRegs.GPAMUX1.bit.GPIO12=0; //初始化产生中断的引脚
GpioCtrlRegs.GPADIR.bit.GPIO12=0;
GpioCtrlRegs.GPAPUD.bit.GPIO12=0;
GpioCtrlRegs.GPAQSEL1.bit.GPIO12=0;
GpioCtrlRegs.GPBMUX2.bit.GPIO48=0; //普中硬件要求引脚
GpioCtrlRegs.GPBDIR.bit.GPIO48=1;
GpioCtrlRegs.GPBPUD.bit.GPIO48=0;
GpioDataRegs.GPBCLEAR.bit.GPIO48=1;
GpioIntRegs.GPIOXINT1SEL.bit.GPIOSEL=12; //选择外部中断1的来源
XIntruptRegs.XINT1CR.bit.POLARITY = 1; //00 上升沿、01上升沿、10下降沿、11上升/下降沿都触发。
XIntruptRegs.XINT1CR.bit.ENABLE = 1; //1表示使能外部中断1,0表示失能外部中断1
//PIE级
PieVectTable.XINT1 = &EXTI1_IRQn; //中断函数入口地址
PieCtrlRegs.PIEIER1.bit.INTx4=1; //pie级中断使能设置
IER |= M_INT1; //使能CPU级中断
EINT; //开启全局中断
ERTM;
EDIS;
}