ARM内核只有FIQ和IRQ两个中断线,如果要扩展中断,就须要用到中断向量控制器。
快速中断和IRQ中断使能,通过CPSR中的I标志位和F标志位设置1来使能中断。
中断寄存器的使用:
中断寄存器包括中断选择寄存器VICIntSelect 中断使能寄存器VICIntEnable 中断禁能寄存器VICIntEnClr。
中断选择寄存器共32位,分别对应32通道对应的中断(通道0 WDT 通道4 Timer0)的选择 0时为IRQ 1时FIQ。
中断使能寄存器,32位,写入1为使能,写入0无效。
例如使能Timer0中断 VICIntEnable=1<<Timer0_Num 因为写入0无效。
中断使能清零寄存器,写入1,禁止中断。
向量地址寄存器(VICCectAddr ),但发生IRQ后,CPU读取该寄存器并跳转到对应的地址,但是不能直接赋值,而是通过VIC
DefVectAddr或者VICVectAddr0~15中复制来的。
VICDefVectAddr用于分配非向量IRQ中断的地址。
向量地址寄存器0~15分别对应16个向量IRQ通道的响应地址。
向量控制寄存器0~15(VICVectCnt0~15)
重要知识点:中断通道号和IRQ通道的不同点
中断通道号(32个),例如Timer0等和向量IRQ通道0~15是不同的,通过VICVectCnt的设置0~4位,来分配IRQ中断通道,并设置其优先级。
例如分配中断通道号为4的定时器,分配IRQ0通道0.
VICIntSelect = 0x00;
VICVectCnt0=0x20|Timer0_Num;(4)
VICVectAddr0=(int)Timer0_ISR;
T0IR = 0x01;
VICIntEnable = (1<<Timer0_Num);
中断处理完成以后
void _irq Timer0_ISR(void)
{
{中断处理}
T0IR = 0x01; //清除中断标志(因该是状态寄存器)
VICVectAddr = 0x00;//清楚地址,因为下次要重新复制
}
外部中断寄存器。