⑴在主程序中:
①在VICIntSelect中将中断分配为FIQ中断;
②在VICIntEnable中使能外设中断。
⑵中断服务程序中:
①中断处理;
②清除相应的中断标志,以响应下一次中断。
2、向量IRQ
⑴主程序
①在VICIntSelect中将中断分配为IRQ中断;
②在VICVectCntlx中分配中断通道(优先级);
③在VICVectAddrx中设置中断服务程序的地址;
④通过VICIntEnable使能外设中断。
⑵中断服务程序
①中断处理;
②清除相应的中断标志,以响应下一次中断;
③对VICVectAddr寄存器执行写操作(通常为0x00),结束向量中断,以更新硬件优先级。
3、非向量IRQ
⑴主程序
①在VICDefVectAddr中设置中断服务程序的地址;
EXTINT外部中断流程
首先使用PINSEL0和PINSEL1来配置相应的I/O口工作模式,设置相应的中断位→设置相应的输入输出→使用VICIntSelect来选择使用FIQ或者IRQ(0)→VICIntEnable中断使用→使用EXTINT设置中断标志,写入1将方位清零→while(1)等等中断发生。
在中断子函数中,首先使用VICIRQStatus读出当前的中断状态→函数功能完成→清除相应中断→设置向量地址寄存器VICVectAddr(当任何分配给向量IRQ Slot的中断请求或软件中断使能,分配为IRQ并声明时,读取该寄存器将返回最高优先级微量地址寄存器中的地址。否则,返回默认微量地址寄存器中的地址。)
#include "config.h"
#define LEDCON 0x00000800
void __irq IRQ_Eint1(void)
{ uint32 i;
i=VICIRQStatus;//读出VICIRQStatus的值
i=IOSET;//读出当前LED2控制值
if((i&LEDCON)==0)//控制LED2控制值
{ IOSET=LEDCON;
}
else
{ IOCLR=LEDCON;
}
while((EXTINT&0x02)!=0)//等待外部中断信号恢复为高电平
{ EXTINT=0x02;//清除EINT1中断标志
}
VICVectAddr=0x00;
}
int main(void)
{
PINSEL0=0x20000000;//这里选择为外部中断1,
PINSEL1=0x00000000;
IODIR=LEDCON;//控制引脚输入输出
IOSET=LEDCON;//点亮相应的灯
IOCLR=LEDCON;//熄灭相应的灯,但上面那一句有什么作用,好象多余呀
VICIntSelect=0;//中断功能选择
VICIntEnable=0x00008000;//在某一位上使能中断
VICVectCntl1=0x 2F;
VICVectAddr1=(int)IRQ_Eint1;
EXTINT=0x07;
while(1);
}
说明:VICVectAddr(当任何分配给向量IRQ Slot的中断请求或软件中断使能,分配为IRQ并声明时,读取该寄存器将返回最高优先级微量地址寄存器中的地址。否则,返回默认微量地址寄存器中的地址。)
VICVectCntl每一个寄存器控制16个微量IRQ Slot中的一个,Slot0优先级最高。在VICVectCntl寄存器中禁止一个微量IRQ Slot不会禁止中断本身,中断只是变为非向量的形式。为1表示向量IRQ使能,
②通过VICIntEnable使能外设中断。
⑵中断服务程序
①中断处理;
②清除相应的中断标志,以响应下一次中断;
③对VICVectAddr寄存器执行写操作(通常为0x00),结束向量中断,以更新硬件优先级。