外部中断(注重实际如何使用,具体寄存器等原理暂不详细记录)
一、F28335 中断概述
F28335 有很多资源很多外设,这些外设与相关资源都有可能发布新的任务让内核来判断与处理,也就是说 F28335 的可能中断源有很多。F28335 的中断源可分为片内外设中断源,比如 PWM、CAP、QEP、定时器等,片外中断源,外部中断输入引脚 XINT1、XINT2 引入的外部中断源。这些中断源将中断请求信号传递给内核就需要中断线,F28335 的中断线是有限的。
F28335 内部有 16 个中断线,其中包括 2 个不可屏蔽中断(RESET 和 NMI)与14 个可屏蔽中断。可屏蔽中断通过相应的中断使能寄存器使用或者禁止产生的中断,在这 14 个可屏蔽中断中,其中 TIM1 和 TIM2 产生的中断请求通过 INT13、INT14 中断线到达 CPU,这两个中断已经预留给了实时操作系统,因此剩下的 12 个可屏蔽中断可供外部中断和处理器内部单元使用。F28335 的外设中断源远远不止 12 个,共用 58 个。
二、F28335 中断机制
F28335 的中断采用的是 3 级中断机制,分别是外设级中断、PIE 级中断和 CPU级中断,最内核部分为 CPU 级中断,即 CPU 只能响应从 CPU 中断线上过来的中断 请求,但 F28335 中断源很多,CPU 没有那么多中断线,在有限中断线的情况下, 只能安排中断线进行复用,其复用管理就有了中间层的 PIE 级中断,外设要能够成功产生中断响应,就要首先经外设级中断允许,然后经 PIE 允许,最终 CPU做出响应。
三、中断分配表(非常重要)
四、F28335外部中断
F28335 外部中断有 7 个,外部中断 1-7,其中外部中断 1 和 2 只能对 GPIO0-GPIO31 配置;外部中断 3 和 4、5、6、7 只对 GPIO32-GPIO63 配置。
F28335 共 支 持 7 个 外 部中 断 XINT1-XINT7 , 其 中 XINT1-XINT2 只 能 对GPIO0-GPIO31 配置;XINT3-XINT7 只对 GPIO32-GPIO63 配置。XINT13 还有一个不可屏蔽的外部中断 XNMI 共用中断源。每一个外部中断可以被选择为正边沿或负边沿触发。
五、外部中断配置步骤(最重要一节)
1.失能 CPU 级中断,并初始化 PIE 控制器寄存器和 PIE 中断向量表
//==========1.中断控制配置函数==========// InitPieCtrl(); //初始化PIE控制寄存器 IER = 0x0000; //失能全部CPU中断 IFR = 0x0000; //清除CPU中断标志 InitPieVectTable(); //初始化PIE中断向量表
2.配置void EXTI1_Init(void)函数
void EXTI1_Init(void) { //========2.使能 IO 口时钟=========// EALLOW; SysCtrlRegs.PCLKCR3.bit.GPIOINENCLK = 1; // GPIO input clock EDIS; //==========3.配置IO口为输入输出===========// EALLOW; //KEY端口配置 GpioCtrlRegs.GPAMUX1.bit.GPIO13=0; //普通IO GpioCtrlRegs.GPADIR.bit.GPIO13=0; //输入 GpioCtrlRegs.GPAPUD.bit.GPIO13=0; //使能GPIO上拉电阻 GpioCtrlRegs.GPAQSEL1.bit.GPIO13 = 0; // 外部中断1(XINT1)与系统时钟SYSCLKOUT同步 EDIS; //==========4.设置 IO 口与中断线的映射关系===========// EALLOW; GpioIntRegs.GPIOXINT1SEL.bit.GPIOSEL = 13; // XINT1是GPIO13 EDIS; //==========5.指定中断向量表中断服务函数地址==========// EALLOW; // 修改被保护的寄存器,修改前应添加EALLOW语句 PieVectTable.XINT1 = &EXTI1_IRQn; EDIS; // EDIS的意思是不允许修改被保护的寄存器 //==========6.使能外设对应的 PIE 中断==========// PieCtrlRegs.PIEIER1.bit.INTx4 = 1; // 使能PIE组1的INT4 //==========7.设置外部中断触发方式并使能中断==========// XIntruptRegs.XINT1CR.bit.POLARITY = 0; // 0下降沿触发中断 1上升沿触发中断 XIntruptRegs.XINT1CR.bit.ENABLE= 1; // 使能XINT1 //==========8.使能 CPU 级中断及全局中断==========// IER |= M_INT1; // 使能CPU中断1(INT1) EINT; // 开全局中断 ERTM; }
3.配置中断服务函数 interrupt void EXTI1_IRQn(void)
interrupt void EXTI1_IRQn(void) { .......中断中的功能 PieCtrlRegs.PIEACK.bit.ACK1=1; //在中断函数执行完成前一定要记得将相应的PIEACKx 清零, //否则下次将不再进入中断 }
4.配置 void main(void)函数
void main() { InitSysCtrl(); //==========1.中断控制配置函数==========// InitPieCtrl(); //初始化PIE控制寄存器 IER = 0x0000; //失能全部CPU中断 IFR = 0x0000; //清除CPU中断标志 InitPieVectTable(); //初始化PIE中断向量表 //==========下载Flash==========// MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart); InitFlash(); EXTI1_Init(); //中断函数初始化 while(1) { } }
六、具体代码图片(中断服务函数中为自己的功能)
main函数:
exti.c文件
void EXTI1_Init(void)函数
interrupt void EXTI1_IRQn(void)
exti.h文件